Razor 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234272352723627237272382723927240272412724227243272442724527246272472724827249272502725127252272532725427255272562725727258272592726027261272622726327264272652726627267272682726927270272712727227273272742727527276272772727827279272802728127282272832728427285272862728727288272892729027291272922729327294272952729627297272982729927300273012730227303273042730527306273072730827309273102731127312273132731427315273162731727318273192732027321273222732327324273252732627327273282732927330273312733227333273342733527336273372733827339273402734127342273432734427345273462734727348273492735027351273522735327354273552735627357273582735927360273612736227363273642736527366273672736827369273702737127372273732737427375273762737727378273792738027381273822738327384273852738627387273882738927390273912739227393273942739527396273972739827399274002740127402274032740427405274062740727408274092741027411274122741327414274152741627417274182741927420274212742227423274242742527426274272742827429274302743127432274332743427435274362743727438274392744027441274422744327444274452744627447274482744927450274512745227453274542745527456274572745827459274602746127462274632746427465274662746727468274692747027471274722747327474274752747627477274782747927480274812748227483274842748527486274872748827489274902749127492274932749427495274962749727498274992750027501275022750327504275052750627507275082750927510275112751227513275142751527516275172751827519275202752127522275232752427525275262752727528275292753027531275322753327534275352753627537275382753927540275412754227543275442754527546275472754827549275502755127552275532755427555275562755727558275592756027561275622756327564275652756627567275682756927570275712757227573275742757527576275772757827579275802758127582275832758427585275862758727588275892759027591275922759327594275952759627597275982759927600276012760227603276042760527606276072760827609276102761127612276132761427615276162761727618276192762027621276222762327624276252762627627276282762927630276312763227633276342763527636276372763827639276402764127642276432764427645276462764727648276492765027651276522765327654276552765627657276582765927660276612766227663276642766527666276672766827669276702767127672276732767427675276762767727678276792768027681276822768327684276852768627687276882768927690276912769227693276942769527696276972769827699277002770127702277032770427705277062770727708277092771027711277122771327714277152771627717277182771927720277212772227723277242772527726277272772827729277302773127732277332773427735277362773727738277392774027741277422774327744277452774627747277482774927750277512775227753277542775527756277572775827759277602776127762277632776427765277662776727768277692777027771277722777327774277752777627777277782777927780277812778227783277842778527786277872778827789277902779127792277932779427795277962779727798277992780027801278022780327804278052780627807278082780927810278112781227813278142781527816278172781827819278202782127822278232782427825278262782727828278292783027831278322783327834278352783627837278382783927840278412784227843278442784527846278472784827849278502785127852278532785427855278562785727858278592786027861278622786327864278652786627867278682786927870278712787227873278742787527876278772787827879278802788127882278832788427885278862788727888278892789027891278922789327894278952789627897278982789927900279012790227903279042790527906279072790827909279102791127912279132791427915279162791727918279192792027921279222792327924279252792627927279282792927930279312793227933279342793527936279372793827939279402794127942279432794427945279462794727948279492795027951279522795327954279552795627957279582795927960279612796227963279642796527966279672796827969279702797127972279732797427975279762797727978279792798027981279822798327984279852798627987279882798927990279912799227993279942799527996279972799827999280002800128002280032800428005280062800728008280092801028011280122801328014280152801628017280182801928020280212802228023280242802528026280272802828029280302803128032280332803428035280362803728038280392804028041280422804328044280452804628047280482804928050280512805228053280542805528056280572805828059280602806128062280632806428065280662806728068280692807028071280722807328074280752807628077280782807928080280812808228083280842808528086280872808828089280902809128092280932809428095280962809728098280992810028101281022810328104281052810628107281082810928110281112811228113281142811528116281172811828119281202812128122281232812428125281262812728128281292813028131281322813328134281352813628137281382813928140281412814228143281442814528146281472814828149281502815128152281532815428155281562815728158281592816028161281622816328164281652816628167281682816928170281712817228173281742817528176281772817828179281802818128182281832818428185281862818728188281892819028191281922819328194281952819628197281982819928200282012820228203282042820528206282072820828209282102821128212282132821428215282162821728218282192822028221282222822328224282252822628227282282822928230282312823228233282342823528236282372823828239282402824128242282432824428245282462824728248282492825028251282522825328254282552825628257282582825928260282612826228263282642826528266282672826828269282702827128272282732827428275282762827728278282792828028281282822828328284282852828628287282882828928290282912829228293282942829528296282972829828299283002830128302283032830428305283062830728308283092831028311283122831328314283152831628317283182831928320283212832228323283242832528326283272832828329283302833128332283332833428335283362833728338283392834028341283422834328344283452834628347283482834928350283512835228353283542835528356283572835828359283602836128362283632836428365283662836728368283692837028371283722837328374283752837628377283782837928380283812838228383283842838528386283872838828389283902839128392283932839428395283962839728398283992840028401284022840328404284052840628407284082840928410284112841228413284142841528416284172841828419284202842128422284232842428425284262842728428284292843028431284322843328434284352843628437284382843928440284412844228443284442844528446284472844828449284502845128452284532845428455284562845728458284592846028461284622846328464284652846628467284682846928470284712847228473284742847528476284772847828479284802848128482284832848428485284862848728488284892849028491284922849328494284952849628497284982849928500285012850228503285042850528506285072850828509285102851128512285132851428515285162851728518285192852028521285222852328524285252852628527285282852928530285312853228533285342853528536285372853828539285402854128542285432854428545285462854728548285492855028551285522855328554285552855628557285582855928560285612856228563285642856528566285672856828569285702857128572285732857428575285762857728578285792858028581285822858328584285852858628587285882858928590285912859228593285942859528596285972859828599286002860128602286032860428605286062860728608286092861028611286122861328614286152861628617286182861928620286212862228623286242862528626286272862828629286302863128632286332863428635286362863728638286392864028641286422864328644286452864628647286482864928650286512865228653286542865528656286572865828659286602866128662286632866428665286662866728668286692867028671286722867328674286752867628677286782867928680286812868228683286842868528686286872868828689286902869128692286932869428695286962869728698286992870028701287022870328704287052870628707287082870928710287112871228713287142871528716287172871828719287202872128722287232872428725287262872728728287292873028731287322873328734287352873628737287382873928740287412874228743287442874528746287472874828749287502875128752287532875428755287562875728758287592876028761287622876328764287652876628767287682876928770287712877228773287742877528776287772877828779287802878128782287832878428785287862878728788287892879028791287922879328794287952879628797287982879928800288012880228803288042880528806288072880828809288102881128812288132881428815288162881728818288192882028821288222882328824288252882628827288282882928830288312883228833288342883528836288372883828839288402884128842288432884428845288462884728848288492885028851288522885328854288552885628857288582885928860288612886228863288642886528866288672886828869288702887128872288732887428875288762887728878288792888028881288822888328884288852888628887288882888928890288912889228893288942889528896288972889828899289002890128902289032890428905289062890728908289092891028911289122891328914289152891628917289182891928920289212892228923289242892528926289272892828929289302893128932289332893428935289362893728938289392894028941289422894328944289452894628947289482894928950289512895228953289542895528956289572895828959289602896128962289632896428965289662896728968289692897028971289722897328974289752897628977289782897928980289812898228983289842898528986289872898828989289902899128992289932899428995289962899728998289992900029001290022900329004290052900629007290082900929010290112901229013290142901529016290172901829019290202902129022290232902429025290262902729028290292903029031290322903329034290352903629037290382903929040290412904229043290442904529046290472904829049290502905129052290532905429055290562905729058290592906029061290622906329064290652906629067290682906929070290712907229073290742907529076290772907829079290802908129082290832908429085290862908729088290892909029091290922909329094290952909629097290982909929100291012910229103291042910529106291072910829109291102911129112291132911429115291162911729118291192912029121291222912329124291252912629127291282912929130291312913229133291342913529136291372913829139291402914129142291432914429145291462914729148291492915029151291522915329154291552915629157291582915929160291612916229163291642916529166291672916829169291702917129172291732917429175291762917729178291792918029181291822918329184291852918629187291882918929190291912919229193291942919529196291972919829199292002920129202292032920429205292062920729208292092921029211292122921329214292152921629217292182921929220292212922229223292242922529226292272922829229292302923129232292332923429235292362923729238292392924029241292422924329244292452924629247292482924929250292512925229253292542925529256292572925829259292602926129262292632926429265292662926729268292692927029271292722927329274292752927629277292782927929280292812928229283292842928529286292872928829289292902929129292292932929429295292962929729298292992930029301293022930329304293052930629307293082930929310293112931229313293142931529316293172931829319293202932129322293232932429325293262932729328293292933029331293322933329334293352933629337293382933929340293412934229343293442934529346293472934829349293502935129352293532935429355293562935729358293592936029361293622936329364293652936629367293682936929370293712937229373293742937529376293772937829379293802938129382293832938429385293862938729388293892939029391293922939329394293952939629397293982939929400294012940229403294042940529406294072940829409294102941129412294132941429415294162941729418294192942029421294222942329424294252942629427294282942929430294312943229433294342943529436294372943829439294402944129442294432944429445294462944729448294492945029451294522945329454294552945629457294582945929460294612946229463294642946529466294672946829469294702947129472294732947429475294762947729478294792948029481294822948329484294852948629487294882948929490294912949229493294942949529496294972949829499295002950129502295032950429505295062950729508295092951029511295122951329514295152951629517295182951929520295212952229523295242952529526295272952829529295302953129532295332953429535295362953729538295392954029541295422954329544295452954629547295482954929550295512955229553295542955529556295572955829559295602956129562295632956429565295662956729568295692957029571295722957329574295752957629577295782957929580295812958229583295842958529586295872958829589295902959129592295932959429595295962959729598295992960029601296022960329604296052960629607296082960929610296112961229613296142961529616296172961829619296202962129622296232962429625296262962729628296292963029631296322963329634296352963629637296382963929640296412964229643296442964529646296472964829649296502965129652296532965429655296562965729658296592966029661296622966329664296652966629667296682966929670296712967229673296742967529676296772967829679296802968129682296832968429685296862968729688296892969029691296922969329694296952969629697296982969929700297012970229703297042970529706297072970829709297102971129712297132971429715297162971729718297192972029721297222972329724297252972629727297282972929730297312973229733297342973529736297372973829739297402974129742297432974429745297462974729748297492975029751297522975329754297552975629757297582975929760297612976229763297642976529766297672976829769297702977129772297732977429775297762977729778297792978029781297822978329784297852978629787297882978929790297912979229793297942979529796297972979829799298002980129802298032980429805298062980729808298092981029811298122981329814298152981629817298182981929820298212982229823298242982529826298272982829829298302983129832298332983429835298362983729838298392984029841298422984329844298452984629847298482984929850298512985229853298542985529856298572985829859298602986129862298632986429865298662986729868298692987029871298722987329874298752987629877298782987929880298812988229883298842988529886298872988829889298902989129892298932989429895298962989729898298992990029901299022990329904299052990629907299082990929910299112991229913299142991529916299172991829919299202992129922299232992429925299262992729928299292993029931299322993329934299352993629937299382993929940299412994229943299442994529946299472994829949299502995129952299532995429955299562995729958299592996029961299622996329964299652996629967299682996929970299712997229973299742997529976299772997829979299802998129982299832998429985299862998729988299892999029991299922999329994299952999629997299982999930000300013000230003300043000530006300073000830009300103001130012300133001430015300163001730018300193002030021300223002330024300253002630027300283002930030300313003230033300343003530036300373003830039300403004130042300433004430045300463004730048300493005030051300523005330054300553005630057300583005930060300613006230063300643006530066300673006830069300703007130072300733007430075300763007730078300793008030081300823008330084300853008630087300883008930090300913009230093300943009530096300973009830099301003010130102301033010430105301063010730108301093011030111301123011330114301153011630117301183011930120301213012230123301243012530126301273012830129301303013130132301333013430135301363013730138301393014030141301423014330144301453014630147301483014930150301513015230153301543015530156301573015830159301603016130162301633016430165301663016730168301693017030171301723017330174301753017630177301783017930180301813018230183301843018530186301873018830189301903019130192301933019430195301963019730198301993020030201302023020330204302053020630207302083020930210302113021230213302143021530216302173021830219302203022130222302233022430225302263022730228302293023030231302323023330234302353023630237302383023930240302413024230243302443024530246302473024830249302503025130252302533025430255302563025730258302593026030261302623026330264302653026630267302683026930270302713027230273302743027530276302773027830279302803028130282302833028430285302863028730288302893029030291302923029330294302953029630297302983029930300303013030230303303043030530306303073030830309303103031130312303133031430315303163031730318303193032030321303223032330324303253032630327303283032930330303313033230333303343033530336303373033830339303403034130342303433034430345303463034730348303493035030351303523035330354303553035630357303583035930360303613036230363303643036530366303673036830369303703037130372303733037430375303763037730378303793038030381303823038330384303853038630387303883038930390303913039230393303943039530396303973039830399304003040130402304033040430405304063040730408304093041030411304123041330414304153041630417304183041930420304213042230423304243042530426304273042830429304303043130432304333043430435304363043730438304393044030441304423044330444304453044630447304483044930450304513045230453304543045530456304573045830459304603046130462304633046430465304663046730468304693047030471304723047330474304753047630477304783047930480304813048230483304843048530486304873048830489304903049130492304933049430495304963049730498304993050030501305023050330504305053050630507305083050930510305113051230513305143051530516305173051830519305203052130522305233052430525305263052730528305293053030531305323053330534305353053630537305383053930540305413054230543305443054530546305473054830549305503055130552305533055430555305563055730558305593056030561305623056330564305653056630567305683056930570305713057230573305743057530576305773057830579305803058130582305833058430585305863058730588305893059030591305923059330594305953059630597305983059930600306013060230603306043060530606306073060830609306103061130612306133061430615306163061730618306193062030621306223062330624306253062630627306283062930630306313063230633306343063530636306373063830639306403064130642306433064430645306463064730648306493065030651306523065330654306553065630657306583065930660306613066230663306643066530666306673066830669306703067130672306733067430675306763067730678306793068030681306823068330684306853068630687306883068930690306913069230693306943069530696306973069830699307003070130702307033070430705307063070730708307093071030711307123071330714307153071630717307183071930720307213072230723307243072530726307273072830729307303073130732307333073430735307363073730738307393074030741307423074330744307453074630747307483074930750307513075230753307543075530756307573075830759307603076130762307633076430765307663076730768307693077030771307723077330774307753077630777307783077930780307813078230783307843078530786307873078830789307903079130792307933079430795307963079730798307993080030801308023080330804308053080630807308083080930810308113081230813308143081530816308173081830819308203082130822308233082430825308263082730828308293083030831308323083330834308353083630837308383083930840308413084230843308443084530846308473084830849308503085130852308533085430855308563085730858308593086030861308623086330864308653086630867308683086930870308713087230873308743087530876308773087830879308803088130882308833088430885308863088730888308893089030891308923089330894308953089630897308983089930900309013090230903309043090530906309073090830909309103091130912309133091430915309163091730918309193092030921309223092330924309253092630927309283092930930309313093230933309343093530936309373093830939309403094130942309433094430945309463094730948309493095030951309523095330954309553095630957309583095930960309613096230963309643096530966309673096830969309703097130972309733097430975309763097730978309793098030981309823098330984309853098630987309883098930990309913099230993309943099530996309973099830999310003100131002310033100431005310063100731008310093101031011310123101331014310153101631017310183101931020310213102231023310243102531026310273102831029310303103131032310333103431035310363103731038310393104031041310423104331044310453104631047310483104931050310513105231053310543105531056310573105831059310603106131062310633106431065310663106731068310693107031071310723107331074310753107631077310783107931080310813108231083310843108531086310873108831089310903109131092310933109431095310963109731098310993110031101311023110331104311053110631107311083110931110311113111231113311143111531116311173111831119311203112131122311233112431125311263112731128311293113031131311323113331134311353113631137311383113931140311413114231143311443114531146311473114831149311503115131152311533115431155311563115731158311593116031161311623116331164311653116631167311683116931170311713117231173311743117531176311773117831179311803118131182311833118431185311863118731188311893119031191311923119331194311953119631197311983119931200312013120231203312043120531206312073120831209312103121131212312133121431215312163121731218312193122031221312223122331224312253122631227312283122931230312313123231233312343123531236312373123831239312403124131242312433124431245312463124731248312493125031251312523125331254312553125631257312583125931260312613126231263312643126531266312673126831269312703127131272312733127431275312763127731278312793128031281312823128331284312853128631287312883128931290312913129231293312943129531296312973129831299313003130131302313033130431305313063130731308313093131031311313123131331314313153131631317313183131931320313213132231323313243132531326313273132831329313303133131332313333133431335313363133731338313393134031341313423134331344313453134631347313483134931350313513135231353313543135531356313573135831359313603136131362313633136431365313663136731368313693137031371313723137331374313753137631377313783137931380313813138231383313843138531386313873138831389313903139131392313933139431395313963139731398313993140031401314023140331404314053140631407314083140931410314113141231413314143141531416314173141831419314203142131422314233142431425314263142731428314293143031431314323143331434314353143631437314383143931440314413144231443314443144531446314473144831449314503145131452314533145431455314563145731458314593146031461314623146331464314653146631467314683146931470314713147231473314743147531476314773147831479314803148131482314833148431485314863148731488314893149031491314923149331494314953149631497314983149931500315013150231503315043150531506315073150831509315103151131512315133151431515315163151731518315193152031521315223152331524315253152631527315283152931530315313153231533315343153531536315373153831539315403154131542315433154431545315463154731548315493155031551315523155331554315553155631557315583155931560315613156231563315643156531566315673156831569315703157131572315733157431575315763157731578315793158031581315823158331584315853158631587315883158931590315913159231593315943159531596315973159831599316003160131602316033160431605316063160731608316093161031611316123161331614316153161631617316183161931620316213162231623316243162531626316273162831629316303163131632316333163431635316363163731638316393164031641316423164331644316453164631647316483164931650316513165231653316543165531656316573165831659316603166131662316633166431665316663166731668316693167031671316723167331674316753167631677316783167931680316813168231683316843168531686316873168831689316903169131692316933169431695316963169731698316993170031701317023170331704317053170631707317083170931710317113171231713317143171531716317173171831719317203172131722317233172431725317263172731728317293173031731317323173331734317353173631737317383173931740317413174231743317443174531746317473174831749317503175131752317533175431755317563175731758317593176031761317623176331764317653176631767317683176931770317713177231773317743177531776317773177831779317803178131782317833178431785317863178731788317893179031791317923179331794317953179631797317983179931800318013180231803318043180531806318073180831809318103181131812318133181431815318163181731818318193182031821318223182331824318253182631827318283182931830318313183231833318343183531836318373183831839318403184131842318433184431845318463184731848318493185031851318523185331854318553185631857318583185931860318613186231863318643186531866318673186831869318703187131872318733187431875318763187731878318793188031881318823188331884318853188631887318883188931890318913189231893318943189531896318973189831899319003190131902319033190431905319063190731908319093191031911319123191331914319153191631917319183191931920319213192231923319243192531926319273192831929319303193131932319333193431935319363193731938319393194031941319423194331944319453194631947319483194931950319513195231953319543195531956319573195831959319603196131962319633196431965319663196731968319693197031971319723197331974319753197631977319783197931980319813198231983319843198531986319873198831989319903199131992319933199431995319963199731998319993200032001320023200332004320053200632007320083200932010320113201232013320143201532016320173201832019320203202132022320233202432025320263202732028320293203032031320323203332034320353203632037320383203932040320413204232043320443204532046320473204832049320503205132052320533205432055320563205732058320593206032061320623206332064320653206632067320683206932070320713207232073320743207532076320773207832079320803208132082320833208432085320863208732088320893209032091320923209332094320953209632097320983209932100321013210232103321043210532106321073210832109321103211132112321133211432115321163211732118321193212032121321223212332124321253212632127321283212932130321313213232133321343213532136321373213832139321403214132142321433214432145321463214732148321493215032151321523215332154321553215632157321583215932160321613216232163321643216532166321673216832169321703217132172321733217432175321763217732178321793218032181321823218332184321853218632187321883218932190321913219232193321943219532196321973219832199322003220132202322033220432205322063220732208322093221032211322123221332214322153221632217322183221932220322213222232223322243222532226322273222832229322303223132232322333223432235322363223732238322393224032241322423224332244322453224632247322483224932250322513225232253322543225532256322573225832259322603226132262322633226432265322663226732268322693227032271322723227332274322753227632277322783227932280322813228232283322843228532286322873228832289322903229132292322933229432295322963229732298322993230032301323023230332304323053230632307323083230932310323113231232313323143231532316323173231832319323203232132322323233232432325323263232732328323293233032331323323233332334323353233632337323383233932340323413234232343323443234532346323473234832349323503235132352323533235432355323563235732358323593236032361323623236332364323653236632367323683236932370323713237232373323743237532376323773237832379323803238132382323833238432385323863238732388323893239032391323923239332394323953239632397323983239932400324013240232403324043240532406324073240832409324103241132412324133241432415324163241732418324193242032421324223242332424324253242632427324283242932430324313243232433324343243532436324373243832439324403244132442324433244432445324463244732448324493245032451324523245332454324553245632457324583245932460324613246232463324643246532466324673246832469324703247132472324733247432475324763247732478324793248032481324823248332484324853248632487324883248932490324913249232493324943249532496324973249832499325003250132502325033250432505325063250732508325093251032511325123251332514325153251632517325183251932520325213252232523325243252532526325273252832529325303253132532325333253432535325363253732538325393254032541325423254332544325453254632547325483254932550325513255232553325543255532556325573255832559325603256132562325633256432565325663256732568325693257032571325723257332574325753257632577325783257932580325813258232583325843258532586325873258832589325903259132592325933259432595325963259732598325993260032601326023260332604326053260632607326083260932610326113261232613326143261532616326173261832619326203262132622326233262432625326263262732628326293263032631326323263332634326353263632637326383263932640326413264232643326443264532646326473264832649326503265132652326533265432655326563265732658326593266032661326623266332664326653266632667326683266932670326713267232673326743267532676326773267832679326803268132682326833268432685326863268732688326893269032691326923269332694326953269632697326983269932700327013270232703327043270532706327073270832709327103271132712327133271432715327163271732718327193272032721327223272332724327253272632727327283272932730327313273232733327343273532736327373273832739327403274132742327433274432745327463274732748327493275032751327523275332754327553275632757327583275932760327613276232763327643276532766327673276832769327703277132772327733277432775327763277732778327793278032781327823278332784327853278632787327883278932790327913279232793327943279532796327973279832799328003280132802328033280432805328063280732808328093281032811328123281332814328153281632817328183281932820328213282232823328243282532826328273282832829328303283132832328333283432835328363283732838328393284032841328423284332844328453284632847328483284932850328513285232853328543285532856328573285832859328603286132862328633286432865328663286732868328693287032871328723287332874328753287632877328783287932880328813288232883328843288532886328873288832889328903289132892328933289432895328963289732898328993290032901329023290332904329053290632907329083290932910329113291232913329143291532916329173291832919329203292132922329233292432925329263292732928329293293032931329323293332934329353293632937329383293932940329413294232943329443294532946329473294832949329503295132952329533295432955329563295732958329593296032961329623296332964329653296632967329683296932970329713297232973329743297532976329773297832979329803298132982329833298432985329863298732988329893299032991329923299332994329953299632997329983299933000330013300233003330043300533006330073300833009330103301133012330133301433015330163301733018330193302033021330223302333024330253302633027330283302933030330313303233033330343303533036330373303833039330403304133042330433304433045330463304733048330493305033051330523305333054330553305633057330583305933060330613306233063330643306533066330673306833069330703307133072330733307433075330763307733078330793308033081330823308333084330853308633087330883308933090330913309233093330943309533096330973309833099331003310133102331033310433105331063310733108331093311033111331123311333114331153311633117331183311933120331213312233123331243312533126331273312833129331303313133132331333313433135331363313733138331393314033141331423314333144331453314633147331483314933150331513315233153331543315533156331573315833159331603316133162331633316433165331663316733168331693317033171331723317333174331753317633177331783317933180331813318233183331843318533186331873318833189331903319133192331933319433195331963319733198331993320033201332023320333204332053320633207332083320933210332113321233213332143321533216332173321833219332203322133222332233322433225332263322733228332293323033231332323323333234332353323633237332383323933240332413324233243332443324533246332473324833249332503325133252332533325433255332563325733258332593326033261332623326333264332653326633267332683326933270332713327233273332743327533276332773327833279332803328133282332833328433285332863328733288332893329033291332923329333294332953329633297332983329933300333013330233303333043330533306333073330833309333103331133312333133331433315333163331733318333193332033321333223332333324333253332633327333283332933330333313333233333333343333533336333373333833339333403334133342333433334433345333463334733348333493335033351333523335333354333553335633357333583335933360333613336233363333643336533366333673336833369333703337133372333733337433375333763337733378333793338033381333823338333384333853338633387333883338933390333913339233393333943339533396333973339833399334003340133402334033340433405334063340733408334093341033411334123341333414334153341633417334183341933420334213342233423334243342533426334273342833429334303343133432334333343433435334363343733438334393344033441334423344333444334453344633447334483344933450334513345233453334543345533456334573345833459334603346133462334633346433465334663346733468334693347033471334723347333474334753347633477334783347933480334813348233483334843348533486334873348833489334903349133492334933349433495334963349733498334993350033501335023350333504335053350633507335083350933510335113351233513335143351533516335173351833519335203352133522335233352433525335263352733528335293353033531335323353333534335353353633537335383353933540335413354233543335443354533546335473354833549335503355133552335533355433555335563355733558335593356033561335623356333564335653356633567335683356933570335713357233573335743357533576335773357833579335803358133582335833358433585335863358733588335893359033591335923359333594335953359633597335983359933600336013360233603336043360533606336073360833609336103361133612336133361433615336163361733618336193362033621336223362333624336253362633627336283362933630336313363233633336343363533636336373363833639336403364133642336433364433645336463364733648336493365033651336523365333654336553365633657336583365933660336613366233663336643366533666336673366833669336703367133672336733367433675336763367733678336793368033681336823368333684336853368633687336883368933690336913369233693336943369533696336973369833699337003370133702337033370433705337063370733708337093371033711337123371333714337153371633717337183371933720337213372233723337243372533726337273372833729337303373133732337333373433735337363373733738337393374033741337423374333744337453374633747337483374933750337513375233753337543375533756337573375833759337603376133762337633376433765337663376733768337693377033771337723377333774337753377633777337783377933780337813378233783337843378533786337873378833789337903379133792337933379433795337963379733798337993380033801338023380333804338053380633807338083380933810338113381233813338143381533816338173381833819338203382133822338233382433825338263382733828338293383033831338323383333834338353383633837338383383933840338413384233843338443384533846338473384833849338503385133852338533385433855338563385733858338593386033861338623386333864338653386633867338683386933870338713387233873338743387533876338773387833879338803388133882338833388433885338863388733888338893389033891338923389333894338953389633897338983389933900339013390233903339043390533906339073390833909339103391133912339133391433915339163391733918339193392033921339223392333924339253392633927339283392933930339313393233933339343393533936339373393833939339403394133942339433394433945339463394733948339493395033951339523395333954339553395633957339583395933960339613396233963339643396533966339673396833969339703397133972339733397433975339763397733978339793398033981339823398333984339853398633987339883398933990339913399233993339943399533996339973399833999340003400134002340033400434005340063400734008340093401034011340123401334014340153401634017340183401934020340213402234023340243402534026340273402834029340303403134032340333403434035340363403734038340393404034041340423404334044340453404634047340483404934050340513405234053340543405534056340573405834059340603406134062340633406434065340663406734068340693407034071340723407334074340753407634077340783407934080340813408234083340843408534086340873408834089340903409134092340933409434095340963409734098340993410034101341023410334104341053410634107341083410934110341113411234113341143411534116341173411834119341203412134122341233412434125341263412734128341293413034131341323413334134341353413634137341383413934140341413414234143341443414534146341473414834149341503415134152341533415434155341563415734158341593416034161341623416334164341653416634167341683416934170341713417234173341743417534176341773417834179341803418134182341833418434185341863418734188341893419034191341923419334194341953419634197341983419934200342013420234203342043420534206342073420834209342103421134212342133421434215342163421734218342193422034221342223422334224342253422634227342283422934230342313423234233342343423534236342373423834239342403424134242342433424434245342463424734248342493425034251342523425334254342553425634257342583425934260342613426234263342643426534266342673426834269342703427134272342733427434275342763427734278342793428034281342823428334284342853428634287342883428934290342913429234293342943429534296342973429834299343003430134302343033430434305343063430734308343093431034311343123431334314343153431634317343183431934320343213432234323343243432534326343273432834329343303433134332343333433434335343363433734338343393434034341343423434334344343453434634347343483434934350343513435234353343543435534356343573435834359343603436134362343633436434365343663436734368343693437034371343723437334374343753437634377343783437934380343813438234383343843438534386343873438834389343903439134392343933439434395343963439734398343993440034401344023440334404344053440634407344083440934410344113441234413344143441534416344173441834419344203442134422344233442434425344263442734428344293443034431344323443334434344353443634437344383443934440344413444234443344443444534446344473444834449344503445134452344533445434455344563445734458344593446034461344623446334464344653446634467344683446934470344713447234473344743447534476344773447834479344803448134482344833448434485344863448734488344893449034491344923449334494344953449634497344983449934500345013450234503345043450534506345073450834509345103451134512345133451434515345163451734518345193452034521345223452334524345253452634527345283452934530345313453234533345343453534536345373453834539345403454134542345433454434545345463454734548345493455034551345523455334554345553455634557345583455934560345613456234563345643456534566345673456834569345703457134572345733457434575345763457734578345793458034581345823458334584345853458634587345883458934590345913459234593345943459534596345973459834599346003460134602346033460434605346063460734608346093461034611346123461334614346153461634617346183461934620346213462234623346243462534626346273462834629346303463134632346333463434635346363463734638346393464034641346423464334644346453464634647346483464934650346513465234653346543465534656346573465834659346603466134662346633466434665346663466734668346693467034671346723467334674346753467634677346783467934680346813468234683346843468534686346873468834689346903469134692346933469434695346963469734698346993470034701347023470334704347053470634707347083470934710347113471234713347143471534716347173471834719347203472134722347233472434725347263472734728347293473034731347323473334734347353473634737347383473934740347413474234743347443474534746347473474834749347503475134752347533475434755347563475734758347593476034761347623476334764347653476634767347683476934770347713477234773347743477534776347773477834779347803478134782347833478434785347863478734788347893479034791347923479334794347953479634797347983479934800348013480234803348043480534806348073480834809348103481134812348133481434815348163481734818348193482034821348223482334824348253482634827348283482934830348313483234833348343483534836348373483834839348403484134842348433484434845348463484734848348493485034851348523485334854348553485634857348583485934860348613486234863348643486534866348673486834869348703487134872348733487434875348763487734878348793488034881348823488334884348853488634887348883488934890348913489234893348943489534896348973489834899349003490134902349033490434905349063490734908349093491034911349123491334914349153491634917349183491934920349213492234923349243492534926349273492834929349303493134932349333493434935349363493734938349393494034941349423494334944349453494634947349483494934950349513495234953349543495534956349573495834959349603496134962349633496434965349663496734968349693497034971349723497334974349753497634977349783497934980349813498234983349843498534986349873498834989349903499134992349933499434995349963499734998349993500035001350023500335004350053500635007350083500935010350113501235013350143501535016350173501835019350203502135022350233502435025350263502735028350293503035031350323503335034350353503635037350383503935040350413504235043350443504535046350473504835049350503505135052350533505435055350563505735058350593506035061350623506335064350653506635067350683506935070350713507235073350743507535076350773507835079350803508135082350833508435085350863508735088350893509035091350923509335094350953509635097350983509935100351013510235103351043510535106351073510835109351103511135112351133511435115351163511735118351193512035121351223512335124351253512635127351283512935130351313513235133351343513535136351373513835139351403514135142351433514435145351463514735148351493515035151351523515335154351553515635157351583515935160351613516235163351643516535166351673516835169351703517135172351733517435175351763517735178351793518035181351823518335184351853518635187351883518935190351913519235193351943519535196351973519835199352003520135202352033520435205352063520735208352093521035211352123521335214352153521635217352183521935220352213522235223352243522535226352273522835229352303523135232352333523435235352363523735238352393524035241352423524335244352453524635247352483524935250352513525235253352543525535256352573525835259352603526135262352633526435265352663526735268352693527035271352723527335274352753527635277352783527935280352813528235283352843528535286352873528835289352903529135292352933529435295352963529735298352993530035301353023530335304353053530635307353083530935310353113531235313353143531535316353173531835319353203532135322353233532435325353263532735328353293533035331353323533335334353353533635337353383533935340353413534235343353443534535346353473534835349353503535135352353533535435355353563535735358353593536035361353623536335364353653536635367353683536935370353713537235373353743537535376353773537835379353803538135382353833538435385353863538735388353893539035391353923539335394353953539635397353983539935400354013540235403354043540535406354073540835409354103541135412354133541435415354163541735418354193542035421354223542335424354253542635427354283542935430354313543235433354343543535436354373543835439354403544135442354433544435445354463544735448354493545035451354523545335454354553545635457354583545935460354613546235463354643546535466354673546835469354703547135472354733547435475354763547735478354793548035481354823548335484354853548635487354883548935490354913549235493354943549535496354973549835499355003550135502355033550435505355063550735508355093551035511355123551335514355153551635517355183551935520355213552235523355243552535526355273552835529355303553135532355333553435535355363553735538355393554035541355423554335544355453554635547355483554935550355513555235553355543555535556355573555835559355603556135562355633556435565355663556735568355693557035571355723557335574355753557635577355783557935580355813558235583355843558535586355873558835589355903559135592355933559435595355963559735598355993560035601356023560335604356053560635607356083560935610356113561235613356143561535616356173561835619356203562135622356233562435625356263562735628356293563035631356323563335634356353563635637356383563935640356413564235643356443564535646356473564835649356503565135652356533565435655356563565735658356593566035661356623566335664356653566635667356683566935670356713567235673356743567535676356773567835679356803568135682356833568435685356863568735688356893569035691356923569335694356953569635697356983569935700357013570235703357043570535706357073570835709357103571135712357133571435715357163571735718357193572035721357223572335724357253572635727357283572935730357313573235733357343573535736357373573835739357403574135742357433574435745357463574735748357493575035751357523575335754357553575635757357583575935760357613576235763357643576535766357673576835769357703577135772357733577435775357763577735778357793578035781357823578335784357853578635787357883578935790357913579235793357943579535796357973579835799358003580135802358033580435805358063580735808358093581035811358123581335814358153581635817358183581935820358213582235823358243582535826358273582835829358303583135832358333583435835358363583735838358393584035841358423584335844358453584635847358483584935850358513585235853358543585535856358573585835859358603586135862358633586435865358663586735868358693587035871358723587335874358753587635877358783587935880358813588235883358843588535886358873588835889358903589135892358933589435895358963589735898358993590035901359023590335904359053590635907359083590935910359113591235913359143591535916359173591835919359203592135922359233592435925359263592735928359293593035931359323593335934359353593635937359383593935940359413594235943359443594535946359473594835949359503595135952359533595435955359563595735958359593596035961359623596335964359653596635967359683596935970359713597235973359743597535976359773597835979359803598135982359833598435985359863598735988359893599035991359923599335994359953599635997359983599936000360013600236003360043600536006360073600836009360103601136012360133601436015360163601736018360193602036021360223602336024360253602636027360283602936030360313603236033360343603536036360373603836039360403604136042360433604436045360463604736048360493605036051360523605336054360553605636057360583605936060360613606236063360643606536066360673606836069360703607136072360733607436075360763607736078360793608036081360823608336084360853608636087360883608936090360913609236093360943609536096360973609836099361003610136102361033610436105361063610736108361093611036111361123611336114361153611636117361183611936120361213612236123361243612536126361273612836129361303613136132361333613436135361363613736138361393614036141361423614336144361453614636147361483614936150361513615236153361543615536156361573615836159361603616136162361633616436165361663616736168361693617036171361723617336174361753617636177361783617936180361813618236183361843618536186361873618836189361903619136192361933619436195361963619736198361993620036201362023620336204362053620636207362083620936210362113621236213362143621536216362173621836219362203622136222362233622436225362263622736228362293623036231362323623336234362353623636237362383623936240362413624236243362443624536246362473624836249362503625136252362533625436255362563625736258362593626036261362623626336264362653626636267362683626936270362713627236273362743627536276362773627836279362803628136282362833628436285362863628736288362893629036291362923629336294362953629636297362983629936300363013630236303363043630536306363073630836309363103631136312363133631436315363163631736318363193632036321363223632336324363253632636327363283632936330363313633236333363343633536336363373633836339363403634136342363433634436345363463634736348363493635036351363523635336354363553635636357363583635936360363613636236363363643636536366363673636836369363703637136372363733637436375363763637736378363793638036381363823638336384363853638636387363883638936390363913639236393363943639536396363973639836399364003640136402364033640436405364063640736408364093641036411364123641336414364153641636417364183641936420364213642236423364243642536426364273642836429364303643136432364333643436435364363643736438364393644036441364423644336444364453644636447364483644936450364513645236453364543645536456364573645836459364603646136462364633646436465364663646736468364693647036471364723647336474364753647636477364783647936480364813648236483364843648536486364873648836489364903649136492364933649436495364963649736498364993650036501365023650336504365053650636507365083650936510365113651236513365143651536516365173651836519365203652136522365233652436525365263652736528365293653036531365323653336534365353653636537365383653936540365413654236543365443654536546365473654836549365503655136552365533655436555365563655736558365593656036561365623656336564365653656636567365683656936570365713657236573365743657536576365773657836579365803658136582365833658436585365863658736588365893659036591365923659336594365953659636597365983659936600366013660236603366043660536606366073660836609366103661136612366133661436615366163661736618366193662036621366223662336624366253662636627366283662936630366313663236633366343663536636366373663836639366403664136642366433664436645366463664736648366493665036651366523665336654366553665636657366583665936660366613666236663366643666536666366673666836669366703667136672366733667436675366763667736678366793668036681366823668336684366853668636687366883668936690366913669236693366943669536696366973669836699367003670136702367033670436705367063670736708367093671036711367123671336714367153671636717367183671936720367213672236723367243672536726367273672836729367303673136732367333673436735367363673736738367393674036741367423674336744367453674636747367483674936750367513675236753367543675536756367573675836759367603676136762367633676436765367663676736768367693677036771367723677336774367753677636777367783677936780367813678236783367843678536786367873678836789367903679136792367933679436795367963679736798367993680036801368023680336804368053680636807368083680936810368113681236813368143681536816368173681836819368203682136822368233682436825368263682736828368293683036831368323683336834368353683636837368383683936840368413684236843368443684536846368473684836849368503685136852368533685436855368563685736858368593686036861368623686336864368653686636867368683686936870368713687236873368743687536876368773687836879368803688136882368833688436885368863688736888368893689036891368923689336894368953689636897368983689936900369013690236903369043690536906369073690836909369103691136912369133691436915369163691736918369193692036921369223692336924369253692636927369283692936930369313693236933369343693536936369373693836939369403694136942369433694436945369463694736948369493695036951369523695336954369553695636957369583695936960369613696236963369643696536966369673696836969369703697136972369733697436975369763697736978369793698036981369823698336984369853698636987369883698936990369913699236993369943699536996369973699836999370003700137002370033700437005370063700737008370093701037011370123701337014370153701637017370183701937020370213702237023370243702537026370273702837029370303703137032370333703437035370363703737038370393704037041370423704337044370453704637047370483704937050370513705237053370543705537056370573705837059370603706137062370633706437065370663706737068370693707037071370723707337074370753707637077370783707937080370813708237083370843708537086370873708837089370903709137092370933709437095370963709737098370993710037101371023710337104371053710637107371083710937110371113711237113371143711537116371173711837119371203712137122371233712437125371263712737128371293713037131371323713337134371353713637137371383713937140371413714237143371443714537146371473714837149371503715137152371533715437155371563715737158371593716037161371623716337164371653716637167371683716937170371713717237173371743717537176371773717837179371803718137182371833718437185371863718737188371893719037191371923719337194371953719637197371983719937200372013720237203372043720537206372073720837209372103721137212372133721437215372163721737218372193722037221372223722337224372253722637227372283722937230372313723237233372343723537236372373723837239372403724137242372433724437245372463724737248372493725037251372523725337254372553725637257372583725937260372613726237263372643726537266372673726837269372703727137272372733727437275372763727737278372793728037281372823728337284372853728637287372883728937290372913729237293372943729537296372973729837299373003730137302373033730437305373063730737308373093731037311373123731337314373153731637317373183731937320373213732237323373243732537326373273732837329373303733137332373333733437335373363733737338373393734037341373423734337344373453734637347373483734937350373513735237353373543735537356373573735837359373603736137362373633736437365373663736737368373693737037371373723737337374373753737637377373783737937380373813738237383373843738537386373873738837389373903739137392373933739437395373963739737398373993740037401374023740337404374053740637407374083740937410374113741237413374143741537416374173741837419374203742137422374233742437425374263742737428374293743037431374323743337434374353743637437374383743937440374413744237443374443744537446374473744837449374503745137452374533745437455374563745737458374593746037461374623746337464374653746637467374683746937470374713747237473374743747537476374773747837479374803748137482374833748437485374863748737488374893749037491374923749337494374953749637497374983749937500375013750237503375043750537506375073750837509375103751137512375133751437515375163751737518375193752037521375223752337524375253752637527375283752937530375313753237533375343753537536375373753837539375403754137542375433754437545375463754737548375493755037551375523755337554375553755637557375583755937560375613756237563375643756537566375673756837569375703757137572375733757437575375763757737578375793758037581375823758337584375853758637587375883758937590375913759237593375943759537596375973759837599376003760137602376033760437605376063760737608376093761037611376123761337614376153761637617376183761937620376213762237623376243762537626376273762837629376303763137632376333763437635376363763737638376393764037641376423764337644376453764637647376483764937650376513765237653376543765537656376573765837659376603766137662376633766437665376663766737668376693767037671376723767337674376753767637677376783767937680376813768237683376843768537686376873768837689376903769137692376933769437695376963769737698376993770037701377023770337704377053770637707377083770937710377113771237713377143771537716377173771837719377203772137722377233772437725377263772737728377293773037731377323773337734377353773637737377383773937740377413774237743377443774537746377473774837749377503775137752377533775437755377563775737758377593776037761377623776337764377653776637767377683776937770377713777237773377743777537776377773777837779377803778137782377833778437785377863778737788377893779037791377923779337794377953779637797377983779937800378013780237803378043780537806378073780837809378103781137812378133781437815378163781737818378193782037821378223782337824378253782637827378283782937830378313783237833378343783537836378373783837839378403784137842378433784437845378463784737848378493785037851378523785337854378553785637857378583785937860378613786237863378643786537866378673786837869378703787137872378733787437875378763787737878378793788037881378823788337884378853788637887378883788937890378913789237893378943789537896378973789837899379003790137902379033790437905379063790737908379093791037911379123791337914379153791637917379183791937920379213792237923379243792537926379273792837929379303793137932379333793437935379363793737938379393794037941379423794337944379453794637947379483794937950379513795237953379543795537956379573795837959379603796137962379633796437965379663796737968379693797037971379723797337974379753797637977379783797937980379813798237983379843798537986379873798837989379903799137992379933799437995379963799737998379993800038001380023800338004380053800638007380083800938010380113801238013380143801538016380173801838019380203802138022380233802438025380263802738028380293803038031380323803338034380353803638037380383803938040380413804238043380443804538046380473804838049380503805138052380533805438055380563805738058380593806038061380623806338064380653806638067380683806938070380713807238073380743807538076380773807838079380803808138082380833808438085380863808738088380893809038091380923809338094380953809638097380983809938100381013810238103381043810538106381073810838109381103811138112381133811438115381163811738118381193812038121381223812338124381253812638127381283812938130381313813238133381343813538136381373813838139381403814138142381433814438145381463814738148381493815038151381523815338154381553815638157381583815938160381613816238163381643816538166381673816838169381703817138172381733817438175381763817738178381793818038181381823818338184381853818638187381883818938190381913819238193381943819538196381973819838199382003820138202382033820438205382063820738208382093821038211382123821338214382153821638217382183821938220382213822238223382243822538226382273822838229382303823138232382333823438235382363823738238382393824038241382423824338244382453824638247382483824938250382513825238253382543825538256382573825838259382603826138262382633826438265382663826738268382693827038271382723827338274382753827638277382783827938280382813828238283382843828538286382873828838289382903829138292382933829438295382963829738298382993830038301383023830338304383053830638307383083830938310383113831238313383143831538316383173831838319383203832138322383233832438325383263832738328383293833038331383323833338334383353833638337383383833938340383413834238343383443834538346383473834838349383503835138352383533835438355383563835738358383593836038361383623836338364383653836638367383683836938370383713837238373383743837538376383773837838379383803838138382383833838438385383863838738388383893839038391383923839338394383953839638397383983839938400384013840238403384043840538406384073840838409384103841138412384133841438415384163841738418384193842038421384223842338424384253842638427384283842938430384313843238433384343843538436384373843838439384403844138442384433844438445384463844738448384493845038451384523845338454384553845638457384583845938460384613846238463384643846538466384673846838469384703847138472384733847438475384763847738478384793848038481384823848338484384853848638487384883848938490384913849238493384943849538496384973849838499385003850138502385033850438505385063850738508385093851038511385123851338514385153851638517385183851938520385213852238523385243852538526385273852838529385303853138532385333853438535385363853738538385393854038541385423854338544385453854638547385483854938550385513855238553385543855538556385573855838559385603856138562385633856438565385663856738568385693857038571385723857338574385753857638577385783857938580385813858238583385843858538586385873858838589385903859138592385933859438595385963859738598385993860038601386023860338604386053860638607386083860938610386113861238613386143861538616386173861838619386203862138622386233862438625386263862738628386293863038631386323863338634386353863638637386383863938640386413864238643386443864538646386473864838649386503865138652386533865438655386563865738658386593866038661386623866338664386653866638667386683866938670386713867238673386743867538676386773867838679386803868138682386833868438685386863868738688386893869038691386923869338694386953869638697386983869938700387013870238703387043870538706387073870838709387103871138712387133871438715387163871738718387193872038721387223872338724387253872638727387283872938730387313873238733387343873538736387373873838739387403874138742387433874438745387463874738748387493875038751387523875338754387553875638757387583875938760387613876238763387643876538766387673876838769387703877138772387733877438775387763877738778387793878038781387823878338784387853878638787387883878938790387913879238793387943879538796387973879838799388003880138802388033880438805388063880738808388093881038811388123881338814388153881638817388183881938820388213882238823388243882538826388273882838829388303883138832388333883438835388363883738838388393884038841388423884338844388453884638847388483884938850388513885238853388543885538856388573885838859388603886138862388633886438865388663886738868388693887038871388723887338874388753887638877388783887938880388813888238883388843888538886388873888838889388903889138892388933889438895388963889738898388993890038901389023890338904389053890638907389083890938910389113891238913389143891538916389173891838919389203892138922389233892438925389263892738928389293893038931389323893338934389353893638937389383893938940389413894238943389443894538946389473894838949389503895138952389533895438955389563895738958389593896038961389623896338964389653896638967389683896938970389713897238973389743897538976389773897838979389803898138982389833898438985389863898738988389893899038991389923899338994389953899638997389983899939000390013900239003390043900539006390073900839009390103901139012390133901439015390163901739018390193902039021390223902339024390253902639027390283902939030390313903239033390343903539036390373903839039390403904139042390433904439045390463904739048390493905039051390523905339054390553905639057390583905939060390613906239063390643906539066390673906839069390703907139072390733907439075390763907739078390793908039081390823908339084390853908639087390883908939090390913909239093390943909539096390973909839099391003910139102391033910439105391063910739108391093911039111391123911339114391153911639117391183911939120391213912239123391243912539126391273912839129391303913139132391333913439135391363913739138391393914039141391423914339144391453914639147391483914939150391513915239153391543915539156391573915839159391603916139162391633916439165391663916739168391693917039171391723917339174391753917639177391783917939180391813918239183391843918539186391873918839189391903919139192391933919439195391963919739198391993920039201392023920339204392053920639207392083920939210392113921239213392143921539216392173921839219392203922139222392233922439225392263922739228392293923039231392323923339234392353923639237392383923939240392413924239243392443924539246392473924839249392503925139252392533925439255392563925739258392593926039261392623926339264392653926639267392683926939270392713927239273392743927539276392773927839279392803928139282392833928439285392863928739288392893929039291392923929339294392953929639297392983929939300393013930239303393043930539306393073930839309393103931139312393133931439315393163931739318393193932039321393223932339324393253932639327393283932939330393313933239333393343933539336393373933839339393403934139342393433934439345393463934739348393493935039351393523935339354393553935639357393583935939360393613936239363393643936539366393673936839369393703937139372393733937439375393763937739378393793938039381393823938339384393853938639387393883938939390393913939239393393943939539396393973939839399394003940139402394033940439405394063940739408394093941039411394123941339414394153941639417394183941939420394213942239423394243942539426394273942839429394303943139432394333943439435394363943739438394393944039441394423944339444394453944639447394483944939450394513945239453394543945539456394573945839459394603946139462394633946439465394663946739468394693947039471394723947339474394753947639477394783947939480394813948239483394843948539486394873948839489394903949139492394933949439495394963949739498394993950039501395023950339504395053950639507395083950939510395113951239513395143951539516395173951839519395203952139522395233952439525395263952739528395293953039531395323953339534395353953639537395383953939540395413954239543395443954539546395473954839549395503955139552395533955439555395563955739558395593956039561395623956339564395653956639567395683956939570395713957239573395743957539576395773957839579395803958139582395833958439585395863958739588395893959039591395923959339594395953959639597395983959939600396013960239603396043960539606396073960839609396103961139612396133961439615396163961739618396193962039621396223962339624396253962639627396283962939630396313963239633396343963539636396373963839639396403964139642396433964439645396463964739648396493965039651396523965339654396553965639657396583965939660396613966239663396643966539666396673966839669396703967139672396733967439675396763967739678396793968039681396823968339684396853968639687396883968939690396913969239693396943969539696396973969839699397003970139702397033970439705397063970739708397093971039711397123971339714397153971639717397183971939720397213972239723397243972539726397273972839729397303973139732397333973439735397363973739738397393974039741397423974339744397453974639747397483974939750397513975239753397543975539756397573975839759397603976139762397633976439765397663976739768397693977039771397723977339774397753977639777397783977939780397813978239783397843978539786397873978839789397903979139792397933979439795397963979739798397993980039801398023980339804398053980639807398083980939810398113981239813398143981539816398173981839819398203982139822398233982439825398263982739828398293983039831398323983339834398353983639837398383983939840398413984239843398443984539846398473984839849398503985139852398533985439855398563985739858398593986039861398623986339864398653986639867398683986939870398713987239873398743987539876398773987839879398803988139882398833988439885398863988739888398893989039891398923989339894398953989639897398983989939900399013990239903399043990539906399073990839909399103991139912399133991439915399163991739918399193992039921399223992339924399253992639927399283992939930399313993239933399343993539936399373993839939399403994139942399433994439945399463994739948399493995039951399523995339954399553995639957399583995939960399613996239963399643996539966399673996839969399703997139972399733997439975399763997739978399793998039981399823998339984399853998639987399883998939990399913999239993399943999539996399973999839999400004000140002400034000440005400064000740008400094001040011400124001340014400154001640017400184001940020400214002240023400244002540026400274002840029400304003140032400334003440035400364003740038400394004040041400424004340044400454004640047400484004940050400514005240053400544005540056400574005840059400604006140062400634006440065400664006740068400694007040071400724007340074400754007640077400784007940080400814008240083400844008540086400874008840089400904009140092400934009440095400964009740098400994010040101401024010340104401054010640107401084010940110401114011240113401144011540116401174011840119401204012140122401234012440125401264012740128401294013040131401324013340134401354013640137401384013940140401414014240143401444014540146401474014840149401504015140152401534015440155401564015740158401594016040161401624016340164401654016640167401684016940170401714017240173401744017540176401774017840179401804018140182401834018440185401864018740188401894019040191401924019340194401954019640197401984019940200402014020240203402044020540206402074020840209402104021140212402134021440215402164021740218402194022040221402224022340224402254022640227402284022940230402314023240233402344023540236402374023840239402404024140242402434024440245402464024740248402494025040251402524025340254402554025640257402584025940260402614026240263402644026540266402674026840269402704027140272402734027440275402764027740278402794028040281402824028340284402854028640287402884028940290402914029240293402944029540296402974029840299403004030140302403034030440305403064030740308403094031040311403124031340314403154031640317403184031940320403214032240323403244032540326403274032840329403304033140332403334033440335403364033740338403394034040341403424034340344403454034640347403484034940350403514035240353403544035540356403574035840359403604036140362403634036440365403664036740368403694037040371403724037340374403754037640377403784037940380403814038240383403844038540386403874038840389403904039140392403934039440395403964039740398403994040040401404024040340404404054040640407404084040940410404114041240413404144041540416404174041840419404204042140422404234042440425404264042740428404294043040431404324043340434404354043640437404384043940440404414044240443404444044540446404474044840449404504045140452404534045440455404564045740458404594046040461404624046340464404654046640467404684046940470404714047240473404744047540476404774047840479404804048140482404834048440485404864048740488404894049040491404924049340494404954049640497404984049940500405014050240503405044050540506405074050840509405104051140512405134051440515405164051740518405194052040521405224052340524405254052640527405284052940530405314053240533405344053540536405374053840539405404054140542405434054440545405464054740548405494055040551405524055340554405554055640557405584055940560405614056240563405644056540566405674056840569405704057140572405734057440575405764057740578405794058040581405824058340584405854058640587405884058940590405914059240593405944059540596405974059840599406004060140602406034060440605406064060740608406094061040611406124061340614406154061640617406184061940620406214062240623406244062540626406274062840629406304063140632406334063440635406364063740638406394064040641406424064340644406454064640647406484064940650406514065240653406544065540656406574065840659406604066140662406634066440665406664066740668406694067040671406724067340674406754067640677406784067940680406814068240683406844068540686406874068840689406904069140692406934069440695406964069740698406994070040701407024070340704407054070640707407084070940710407114071240713407144071540716407174071840719407204072140722407234072440725407264072740728407294073040731407324073340734407354073640737407384073940740407414074240743407444074540746407474074840749407504075140752407534075440755407564075740758407594076040761407624076340764407654076640767407684076940770407714077240773407744077540776407774077840779407804078140782407834078440785407864078740788407894079040791407924079340794407954079640797407984079940800408014080240803408044080540806408074080840809408104081140812408134081440815408164081740818408194082040821408224082340824408254082640827408284082940830408314083240833408344083540836408374083840839408404084140842408434084440845408464084740848408494085040851408524085340854408554085640857408584085940860408614086240863408644086540866408674086840869408704087140872408734087440875408764087740878408794088040881408824088340884408854088640887408884088940890408914089240893408944089540896408974089840899409004090140902409034090440905409064090740908409094091040911409124091340914409154091640917409184091940920409214092240923409244092540926409274092840929409304093140932409334093440935409364093740938409394094040941409424094340944409454094640947409484094940950409514095240953409544095540956409574095840959409604096140962409634096440965409664096740968409694097040971409724097340974409754097640977409784097940980409814098240983409844098540986409874098840989409904099140992409934099440995409964099740998409994100041001410024100341004410054100641007410084100941010410114101241013410144101541016410174101841019410204102141022410234102441025410264102741028410294103041031410324103341034410354103641037410384103941040410414104241043410444104541046410474104841049410504105141052410534105441055410564105741058410594106041061410624106341064410654106641067410684106941070410714107241073410744107541076410774107841079410804108141082410834108441085410864108741088410894109041091410924109341094410954109641097410984109941100411014110241103411044110541106411074110841109411104111141112411134111441115411164111741118411194112041121411224112341124411254112641127411284112941130411314113241133411344113541136411374113841139411404114141142411434114441145411464114741148411494115041151411524115341154411554115641157411584115941160411614116241163411644116541166411674116841169411704117141172411734117441175411764117741178411794118041181411824118341184411854118641187411884118941190411914119241193411944119541196411974119841199412004120141202412034120441205412064120741208412094121041211412124121341214412154121641217412184121941220412214122241223412244122541226412274122841229412304123141232412334123441235412364123741238412394124041241412424124341244412454124641247412484124941250412514125241253412544125541256412574125841259412604126141262412634126441265412664126741268412694127041271412724127341274412754127641277412784127941280412814128241283412844128541286412874128841289412904129141292412934129441295412964129741298412994130041301413024130341304413054130641307413084130941310413114131241313413144131541316413174131841319413204132141322413234132441325413264132741328413294133041331413324133341334413354133641337413384133941340413414134241343413444134541346413474134841349413504135141352413534135441355413564135741358413594136041361413624136341364413654136641367413684136941370413714137241373413744137541376413774137841379413804138141382413834138441385413864138741388413894139041391413924139341394413954139641397413984139941400414014140241403414044140541406414074140841409414104141141412414134141441415414164141741418414194142041421414224142341424414254142641427414284142941430414314143241433414344143541436414374143841439414404144141442414434144441445414464144741448414494145041451414524145341454414554145641457414584145941460414614146241463414644146541466414674146841469414704147141472414734147441475414764147741478414794148041481414824148341484414854148641487414884148941490414914149241493414944149541496414974149841499415004150141502415034150441505415064150741508415094151041511415124151341514415154151641517415184151941520415214152241523415244152541526415274152841529415304153141532415334153441535415364153741538415394154041541415424154341544415454154641547415484154941550415514155241553415544155541556415574155841559415604156141562415634156441565415664156741568415694157041571415724157341574415754157641577415784157941580415814158241583415844158541586415874158841589415904159141592415934159441595415964159741598415994160041601416024160341604416054160641607416084160941610416114161241613416144161541616416174161841619416204162141622416234162441625416264162741628416294163041631416324163341634416354163641637416384163941640416414164241643416444164541646416474164841649416504165141652416534165441655416564165741658416594166041661416624166341664416654166641667416684166941670416714167241673416744167541676416774167841679416804168141682416834168441685416864168741688416894169041691416924169341694416954169641697416984169941700417014170241703417044170541706417074170841709417104171141712417134171441715417164171741718417194172041721417224172341724417254172641727417284172941730417314173241733417344173541736417374173841739417404174141742417434174441745417464174741748417494175041751417524175341754417554175641757417584175941760417614176241763417644176541766417674176841769417704177141772417734177441775417764177741778417794178041781417824178341784417854178641787417884178941790417914179241793417944179541796417974179841799418004180141802418034180441805418064180741808418094181041811418124181341814418154181641817418184181941820418214182241823418244182541826418274182841829418304183141832418334183441835418364183741838418394184041841418424184341844418454184641847418484184941850418514185241853418544185541856418574185841859418604186141862418634186441865418664186741868418694187041871418724187341874418754187641877418784187941880418814188241883418844188541886418874188841889418904189141892418934189441895418964189741898418994190041901419024190341904419054190641907419084190941910419114191241913419144191541916419174191841919419204192141922419234192441925419264192741928419294193041931419324193341934419354193641937419384193941940419414194241943419444194541946419474194841949419504195141952419534195441955419564195741958419594196041961419624196341964419654196641967419684196941970419714197241973419744197541976419774197841979419804198141982419834198441985419864198741988419894199041991419924199341994419954199641997419984199942000420014200242003420044200542006420074200842009420104201142012420134201442015420164201742018420194202042021420224202342024420254202642027420284202942030420314203242033420344203542036420374203842039420404204142042420434204442045420464204742048420494205042051420524205342054420554205642057420584205942060420614206242063420644206542066420674206842069420704207142072420734207442075420764207742078420794208042081420824208342084420854208642087420884208942090420914209242093420944209542096420974209842099421004210142102421034210442105421064210742108421094211042111421124211342114421154211642117421184211942120421214212242123421244212542126421274212842129421304213142132421334213442135421364213742138421394214042141421424214342144421454214642147421484214942150421514215242153421544215542156421574215842159421604216142162421634216442165421664216742168421694217042171421724217342174421754217642177421784217942180421814218242183421844218542186421874218842189421904219142192421934219442195421964219742198421994220042201422024220342204422054220642207422084220942210422114221242213422144221542216422174221842219422204222142222422234222442225422264222742228422294223042231422324223342234422354223642237422384223942240422414224242243422444224542246422474224842249422504225142252422534225442255422564225742258422594226042261422624226342264422654226642267422684226942270422714227242273422744227542276422774227842279422804228142282422834228442285422864228742288422894229042291422924229342294422954229642297422984229942300423014230242303423044230542306423074230842309423104231142312423134231442315423164231742318423194232042321423224232342324423254232642327423284232942330423314233242333423344233542336423374233842339423404234142342423434234442345423464234742348423494235042351423524235342354423554235642357423584235942360423614236242363423644236542366423674236842369423704237142372423734237442375423764237742378423794238042381423824238342384423854238642387423884238942390423914239242393423944239542396423974239842399424004240142402424034240442405424064240742408424094241042411424124241342414424154241642417424184241942420424214242242423424244242542426424274242842429424304243142432424334243442435424364243742438424394244042441424424244342444424454244642447424484244942450424514245242453424544245542456424574245842459424604246142462424634246442465424664246742468424694247042471424724247342474424754247642477424784247942480424814248242483424844248542486424874248842489424904249142492424934249442495424964249742498424994250042501425024250342504425054250642507425084250942510425114251242513425144251542516425174251842519425204252142522425234252442525425264252742528425294253042531425324253342534425354253642537425384253942540425414254242543425444254542546425474254842549425504255142552425534255442555425564255742558425594256042561425624256342564425654256642567425684256942570425714257242573425744257542576425774257842579425804258142582425834258442585425864258742588425894259042591425924259342594425954259642597425984259942600426014260242603426044260542606426074260842609426104261142612426134261442615426164261742618426194262042621426224262342624426254262642627426284262942630426314263242633426344263542636426374263842639426404264142642426434264442645426464264742648426494265042651426524265342654426554265642657426584265942660426614266242663426644266542666426674266842669426704267142672426734267442675426764267742678426794268042681426824268342684426854268642687426884268942690426914269242693426944269542696426974269842699427004270142702427034270442705427064270742708427094271042711427124271342714427154271642717427184271942720427214272242723427244272542726427274272842729427304273142732427334273442735427364273742738427394274042741427424274342744427454274642747427484274942750427514275242753427544275542756427574275842759427604276142762427634276442765427664276742768427694277042771427724277342774427754277642777427784277942780427814278242783427844278542786427874278842789427904279142792427934279442795427964279742798427994280042801428024280342804428054280642807428084280942810428114281242813428144281542816428174281842819428204282142822428234282442825428264282742828428294283042831428324283342834428354283642837428384283942840428414284242843428444284542846428474284842849428504285142852428534285442855428564285742858428594286042861428624286342864428654286642867428684286942870428714287242873428744287542876428774287842879428804288142882428834288442885428864288742888428894289042891428924289342894428954289642897428984289942900429014290242903429044290542906429074290842909429104291142912429134291442915429164291742918429194292042921429224292342924429254292642927429284292942930429314293242933429344293542936429374293842939429404294142942429434294442945429464294742948429494295042951429524295342954429554295642957429584295942960429614296242963429644296542966429674296842969429704297142972429734297442975429764297742978429794298042981429824298342984429854298642987429884298942990429914299242993429944299542996429974299842999430004300143002430034300443005430064300743008430094301043011430124301343014430154301643017430184301943020430214302243023430244302543026430274302843029430304303143032430334303443035430364303743038430394304043041430424304343044430454304643047430484304943050430514305243053430544305543056430574305843059430604306143062430634306443065430664306743068430694307043071430724307343074430754307643077430784307943080430814308243083430844308543086430874308843089430904309143092430934309443095430964309743098430994310043101431024310343104431054310643107431084310943110431114311243113431144311543116431174311843119431204312143122431234312443125431264312743128431294313043131431324313343134431354313643137431384313943140431414314243143431444314543146431474314843149431504315143152431534315443155431564315743158431594316043161431624316343164431654316643167431684316943170431714317243173431744317543176431774317843179431804318143182431834318443185431864318743188431894319043191431924319343194431954319643197431984319943200432014320243203432044320543206432074320843209432104321143212432134321443215432164321743218432194322043221432224322343224432254322643227432284322943230432314323243233432344323543236432374323843239432404324143242432434324443245432464324743248432494325043251432524325343254432554325643257432584325943260432614326243263432644326543266432674326843269432704327143272432734327443275432764327743278432794328043281432824328343284432854328643287432884328943290432914329243293432944329543296432974329843299433004330143302433034330443305433064330743308433094331043311433124331343314433154331643317433184331943320433214332243323433244332543326433274332843329433304333143332433334333443335433364333743338433394334043341433424334343344433454334643347433484334943350433514335243353433544335543356433574335843359433604336143362433634336443365433664336743368433694337043371433724337343374433754337643377433784337943380433814338243383433844338543386433874338843389433904339143392433934339443395433964339743398433994340043401434024340343404434054340643407434084340943410434114341243413434144341543416434174341843419434204342143422434234342443425434264342743428434294343043431434324343343434434354343643437434384343943440434414344243443434444344543446434474344843449434504345143452434534345443455434564345743458434594346043461434624346343464434654346643467434684346943470434714347243473434744347543476434774347843479434804348143482434834348443485434864348743488434894349043491434924349343494434954349643497434984349943500435014350243503435044350543506435074350843509435104351143512435134351443515435164351743518435194352043521435224352343524435254352643527435284352943530435314353243533435344353543536435374353843539435404354143542435434354443545435464354743548435494355043551435524355343554435554355643557435584355943560435614356243563435644356543566435674356843569435704357143572435734357443575435764357743578435794358043581435824358343584435854358643587435884358943590435914359243593435944359543596435974359843599436004360143602436034360443605436064360743608436094361043611436124361343614436154361643617436184361943620436214362243623436244362543626436274362843629436304363143632436334363443635436364363743638436394364043641436424364343644436454364643647436484364943650436514365243653436544365543656436574365843659436604366143662436634366443665436664366743668436694367043671436724367343674436754367643677436784367943680436814368243683436844368543686436874368843689436904369143692436934369443695436964369743698436994370043701437024370343704437054370643707437084370943710437114371243713437144371543716437174371843719437204372143722437234372443725437264372743728437294373043731437324373343734437354373643737437384373943740437414374243743437444374543746437474374843749437504375143752437534375443755437564375743758437594376043761437624376343764437654376643767437684376943770437714377243773437744377543776437774377843779437804378143782437834378443785437864378743788437894379043791437924379343794437954379643797437984379943800438014380243803438044380543806438074380843809438104381143812438134381443815438164381743818438194382043821438224382343824438254382643827438284382943830438314383243833438344383543836438374383843839438404384143842438434384443845438464384743848438494385043851438524385343854438554385643857438584385943860438614386243863438644386543866438674386843869438704387143872438734387443875438764387743878438794388043881438824388343884438854388643887438884388943890438914389243893438944389543896438974389843899439004390143902439034390443905439064390743908439094391043911439124391343914439154391643917439184391943920439214392243923439244392543926439274392843929439304393143932439334393443935439364393743938439394394043941439424394343944439454394643947439484394943950439514395243953439544395543956439574395843959439604396143962439634396443965439664396743968439694397043971439724397343974439754397643977439784397943980439814398243983439844398543986439874398843989439904399143992439934399443995439964399743998439994400044001440024400344004440054400644007440084400944010440114401244013440144401544016440174401844019440204402144022440234402444025440264402744028440294403044031440324403344034440354403644037440384403944040440414404244043440444404544046440474404844049440504405144052440534405444055440564405744058440594406044061440624406344064440654406644067440684406944070440714407244073440744407544076440774407844079440804408144082440834408444085440864408744088440894409044091440924409344094440954409644097440984409944100441014410244103441044410544106441074410844109441104411144112441134411444115441164411744118441194412044121441224412344124441254412644127441284412944130441314413244133441344413544136441374413844139441404414144142441434414444145441464414744148441494415044151441524415344154441554415644157441584415944160441614416244163441644416544166441674416844169441704417144172441734417444175441764417744178441794418044181441824418344184441854418644187441884418944190441914419244193441944419544196441974419844199442004420144202442034420444205442064420744208442094421044211442124421344214442154421644217442184421944220442214422244223442244422544226442274422844229442304423144232442334423444235442364423744238442394424044241442424424344244442454424644247442484424944250442514425244253442544425544256442574425844259442604426144262442634426444265442664426744268442694427044271442724427344274442754427644277442784427944280442814428244283442844428544286442874428844289442904429144292442934429444295442964429744298442994430044301443024430344304443054430644307443084430944310443114431244313443144431544316443174431844319443204432144322443234432444325443264432744328443294433044331443324433344334443354433644337443384433944340443414434244343443444434544346443474434844349443504435144352443534435444355443564435744358443594436044361443624436344364443654436644367443684436944370443714437244373443744437544376443774437844379443804438144382443834438444385443864438744388443894439044391443924439344394443954439644397443984439944400444014440244403444044440544406444074440844409444104441144412444134441444415444164441744418444194442044421444224442344424444254442644427444284442944430444314443244433444344443544436444374443844439444404444144442444434444444445444464444744448444494445044451444524445344454444554445644457444584445944460444614446244463444644446544466444674446844469444704447144472444734447444475444764447744478444794448044481444824448344484444854448644487444884448944490444914449244493444944449544496444974449844499445004450144502445034450444505445064450744508445094451044511445124451344514445154451644517445184451944520445214452244523445244452544526445274452844529445304453144532445334453444535445364453744538445394454044541445424454344544445454454644547445484454944550445514455244553445544455544556445574455844559445604456144562445634456444565445664456744568445694457044571445724457344574445754457644577445784457944580445814458244583445844458544586445874458844589445904459144592445934459444595445964459744598445994460044601446024460344604446054460644607446084460944610446114461244613446144461544616446174461844619446204462144622446234462444625446264462744628446294463044631446324463344634446354463644637446384463944640446414464244643446444464544646446474464844649446504465144652446534465444655446564465744658446594466044661446624466344664446654466644667446684466944670446714467244673446744467544676446774467844679446804468144682446834468444685446864468744688446894469044691446924469344694446954469644697446984469944700447014470244703447044470544706447074470844709447104471144712447134471444715447164471744718447194472044721447224472344724447254472644727447284472944730447314473244733447344473544736447374473844739447404474144742447434474444745447464474744748447494475044751447524475344754447554475644757447584475944760447614476244763447644476544766447674476844769447704477144772447734477444775447764477744778447794478044781447824478344784447854478644787447884478944790447914479244793447944479544796447974479844799448004480144802448034480444805448064480744808448094481044811448124481344814448154481644817448184481944820448214482244823448244482544826448274482844829448304483144832448334483444835448364483744838448394484044841448424484344844448454484644847448484484944850448514485244853448544485544856448574485844859448604486144862448634486444865448664486744868448694487044871448724487344874448754487644877448784487944880448814488244883448844488544886448874488844889448904489144892448934489444895448964489744898448994490044901449024490344904449054490644907449084490944910449114491244913449144491544916449174491844919449204492144922449234492444925449264492744928449294493044931449324493344934449354493644937449384493944940449414494244943449444494544946449474494844949449504495144952449534495444955449564495744958449594496044961449624496344964449654496644967449684496944970449714497244973449744497544976449774497844979449804498144982449834498444985449864498744988449894499044991449924499344994449954499644997449984499945000450014500245003450044500545006450074500845009450104501145012450134501445015450164501745018450194502045021450224502345024450254502645027450284502945030450314503245033450344503545036450374503845039450404504145042450434504445045450464504745048450494505045051450524505345054450554505645057450584505945060450614506245063450644506545066450674506845069450704507145072450734507445075450764507745078450794508045081450824508345084450854508645087450884508945090450914509245093450944509545096450974509845099451004510145102451034510445105451064510745108451094511045111451124511345114451154511645117451184511945120451214512245123451244512545126451274512845129451304513145132451334513445135451364513745138451394514045141451424514345144451454514645147451484514945150451514515245153451544515545156451574515845159451604516145162451634516445165451664516745168451694517045171451724517345174451754517645177451784517945180451814518245183451844518545186451874518845189451904519145192451934519445195451964519745198451994520045201452024520345204452054520645207452084520945210452114521245213452144521545216452174521845219452204522145222452234522445225452264522745228452294523045231452324523345234452354523645237452384523945240452414524245243452444524545246452474524845249452504525145252452534525445255452564525745258452594526045261452624526345264452654526645267452684526945270452714527245273452744527545276452774527845279452804528145282452834528445285452864528745288452894529045291452924529345294452954529645297452984529945300453014530245303453044530545306453074530845309453104531145312453134531445315453164531745318453194532045321453224532345324453254532645327453284532945330453314533245333453344533545336453374533845339453404534145342453434534445345453464534745348453494535045351453524535345354453554535645357453584535945360453614536245363453644536545366453674536845369453704537145372453734537445375453764537745378453794538045381453824538345384453854538645387453884538945390453914539245393453944539545396453974539845399454004540145402454034540445405454064540745408454094541045411454124541345414454154541645417454184541945420454214542245423454244542545426454274542845429454304543145432454334543445435454364543745438454394544045441454424544345444454454544645447454484544945450454514545245453454544545545456454574545845459454604546145462454634546445465454664546745468454694547045471454724547345474454754547645477454784547945480454814548245483454844548545486454874548845489454904549145492454934549445495454964549745498454994550045501455024550345504455054550645507455084550945510455114551245513455144551545516455174551845519455204552145522455234552445525455264552745528455294553045531455324553345534455354553645537455384553945540455414554245543455444554545546455474554845549455504555145552455534555445555455564555745558455594556045561455624556345564455654556645567455684556945570455714557245573455744557545576455774557845579455804558145582455834558445585455864558745588455894559045591455924559345594455954559645597455984559945600456014560245603456044560545606456074560845609456104561145612456134561445615456164561745618456194562045621456224562345624456254562645627456284562945630456314563245633456344563545636456374563845639456404564145642456434564445645456464564745648456494565045651456524565345654456554565645657456584565945660456614566245663456644566545666456674566845669456704567145672456734567445675456764567745678456794568045681456824568345684456854568645687456884568945690456914569245693456944569545696456974569845699457004570145702457034570445705457064570745708457094571045711457124571345714457154571645717457184571945720457214572245723457244572545726457274572845729457304573145732457334573445735457364573745738457394574045741457424574345744457454574645747457484574945750457514575245753457544575545756457574575845759457604576145762457634576445765457664576745768457694577045771457724577345774457754577645777457784577945780457814578245783457844578545786457874578845789457904579145792457934579445795457964579745798457994580045801458024580345804458054580645807458084580945810458114581245813458144581545816458174581845819458204582145822458234582445825458264582745828458294583045831458324583345834458354583645837458384583945840458414584245843458444584545846458474584845849458504585145852458534585445855458564585745858458594586045861458624586345864458654586645867458684586945870458714587245873458744587545876458774587845879458804588145882458834588445885458864588745888458894589045891458924589345894458954589645897458984589945900459014590245903459044590545906459074590845909459104591145912459134591445915459164591745918459194592045921459224592345924459254592645927459284592945930459314593245933459344593545936459374593845939459404594145942459434594445945459464594745948459494595045951459524595345954459554595645957459584595945960459614596245963459644596545966459674596845969459704597145972459734597445975459764597745978459794598045981459824598345984459854598645987459884598945990459914599245993459944599545996459974599845999460004600146002460034600446005460064600746008460094601046011460124601346014460154601646017460184601946020460214602246023460244602546026460274602846029460304603146032460334603446035460364603746038460394604046041460424604346044460454604646047460484604946050460514605246053460544605546056460574605846059460604606146062460634606446065460664606746068460694607046071460724607346074460754607646077460784607946080460814608246083460844608546086460874608846089460904609146092460934609446095460964609746098460994610046101461024610346104461054610646107461084610946110461114611246113461144611546116461174611846119461204612146122461234612446125461264612746128461294613046131461324613346134461354613646137461384613946140461414614246143461444614546146461474614846149461504615146152461534615446155461564615746158461594616046161461624616346164461654616646167461684616946170461714617246173461744617546176461774617846179461804618146182461834618446185461864618746188461894619046191461924619346194461954619646197461984619946200462014620246203462044620546206462074620846209462104621146212462134621446215462164621746218462194622046221462224622346224462254622646227462284622946230462314623246233462344623546236462374623846239462404624146242462434624446245462464624746248462494625046251462524625346254462554625646257462584625946260462614626246263462644626546266462674626846269462704627146272462734627446275462764627746278462794628046281462824628346284462854628646287462884628946290462914629246293462944629546296462974629846299463004630146302463034630446305463064630746308463094631046311463124631346314463154631646317463184631946320463214632246323463244632546326463274632846329463304633146332463334633446335463364633746338463394634046341463424634346344463454634646347463484634946350463514635246353463544635546356463574635846359463604636146362463634636446365463664636746368463694637046371463724637346374463754637646377463784637946380463814638246383463844638546386463874638846389463904639146392463934639446395463964639746398463994640046401464024640346404464054640646407464084640946410464114641246413464144641546416464174641846419464204642146422464234642446425464264642746428464294643046431464324643346434464354643646437464384643946440464414644246443464444644546446464474644846449464504645146452464534645446455464564645746458464594646046461464624646346464464654646646467464684646946470464714647246473464744647546476464774647846479464804648146482464834648446485464864648746488464894649046491464924649346494464954649646497464984649946500465014650246503465044650546506465074650846509465104651146512465134651446515465164651746518465194652046521465224652346524465254652646527465284652946530465314653246533465344653546536465374653846539465404654146542465434654446545465464654746548465494655046551465524655346554465554655646557465584655946560465614656246563465644656546566465674656846569465704657146572465734657446575465764657746578465794658046581465824658346584465854658646587465884658946590465914659246593465944659546596465974659846599466004660146602466034660446605466064660746608466094661046611466124661346614466154661646617466184661946620466214662246623466244662546626466274662846629466304663146632466334663446635466364663746638466394664046641466424664346644466454664646647466484664946650466514665246653466544665546656466574665846659466604666146662466634666446665466664666746668466694667046671466724667346674466754667646677466784667946680466814668246683466844668546686466874668846689466904669146692466934669446695466964669746698466994670046701467024670346704467054670646707467084670946710467114671246713467144671546716467174671846719467204672146722467234672446725467264672746728467294673046731467324673346734467354673646737467384673946740467414674246743467444674546746467474674846749467504675146752467534675446755467564675746758467594676046761467624676346764467654676646767467684676946770467714677246773467744677546776467774677846779467804678146782467834678446785467864678746788467894679046791467924679346794467954679646797467984679946800468014680246803468044680546806468074680846809468104681146812468134681446815468164681746818468194682046821468224682346824468254682646827468284682946830468314683246833468344683546836468374683846839468404684146842468434684446845468464684746848468494685046851468524685346854468554685646857468584685946860468614686246863468644686546866468674686846869468704687146872468734687446875468764687746878468794688046881468824688346884468854688646887468884688946890468914689246893468944689546896468974689846899469004690146902469034690446905469064690746908469094691046911469124691346914469154691646917469184691946920469214692246923469244692546926469274692846929469304693146932469334693446935469364693746938469394694046941469424694346944469454694646947469484694946950469514695246953469544695546956469574695846959469604696146962469634696446965469664696746968469694697046971469724697346974469754697646977469784697946980469814698246983469844698546986469874698846989469904699146992469934699446995469964699746998469994700047001470024700347004470054700647007470084700947010470114701247013470144701547016470174701847019470204702147022470234702447025470264702747028470294703047031470324703347034470354703647037470384703947040470414704247043470444704547046470474704847049470504705147052470534705447055470564705747058470594706047061470624706347064470654706647067470684706947070470714707247073470744707547076470774707847079470804708147082470834708447085470864708747088470894709047091470924709347094470954709647097470984709947100471014710247103471044710547106471074710847109471104711147112471134711447115471164711747118471194712047121471224712347124471254712647127471284712947130471314713247133471344713547136471374713847139471404714147142471434714447145471464714747148471494715047151471524715347154471554715647157471584715947160471614716247163471644716547166471674716847169471704717147172471734717447175471764717747178471794718047181471824718347184471854718647187471884718947190471914719247193471944719547196471974719847199472004720147202472034720447205472064720747208472094721047211472124721347214472154721647217472184721947220472214722247223472244722547226472274722847229472304723147232472334723447235472364723747238472394724047241472424724347244472454724647247472484724947250472514725247253472544725547256472574725847259472604726147262472634726447265472664726747268472694727047271472724727347274472754727647277472784727947280472814728247283472844728547286472874728847289472904729147292472934729447295472964729747298472994730047301473024730347304473054730647307473084730947310473114731247313473144731547316473174731847319473204732147322473234732447325473264732747328473294733047331473324733347334473354733647337473384733947340473414734247343473444734547346473474734847349473504735147352473534735447355473564735747358473594736047361473624736347364473654736647367473684736947370473714737247373473744737547376473774737847379473804738147382473834738447385473864738747388473894739047391473924739347394473954739647397473984739947400474014740247403474044740547406474074740847409474104741147412474134741447415474164741747418474194742047421474224742347424474254742647427474284742947430474314743247433474344743547436474374743847439474404744147442474434744447445474464744747448474494745047451474524745347454474554745647457474584745947460474614746247463474644746547466474674746847469474704747147472474734747447475474764747747478474794748047481474824748347484474854748647487474884748947490474914749247493474944749547496474974749847499475004750147502475034750447505475064750747508475094751047511475124751347514475154751647517475184751947520475214752247523475244752547526475274752847529475304753147532475334753447535475364753747538475394754047541475424754347544475454754647547475484754947550475514755247553475544755547556475574755847559475604756147562475634756447565475664756747568475694757047571475724757347574475754757647577475784757947580475814758247583475844758547586475874758847589475904759147592475934759447595475964759747598475994760047601476024760347604476054760647607476084760947610476114761247613476144761547616476174761847619476204762147622476234762447625476264762747628476294763047631476324763347634476354763647637476384763947640476414764247643476444764547646476474764847649476504765147652476534765447655476564765747658476594766047661476624766347664476654766647667476684766947670476714767247673476744767547676476774767847679476804768147682476834768447685476864768747688476894769047691476924769347694476954769647697476984769947700477014770247703477044770547706477074770847709477104771147712477134771447715477164771747718477194772047721477224772347724477254772647727477284772947730477314773247733477344773547736477374773847739477404774147742477434774447745477464774747748477494775047751477524775347754477554775647757477584775947760477614776247763477644776547766477674776847769477704777147772477734777447775477764777747778477794778047781477824778347784477854778647787477884778947790477914779247793477944779547796477974779847799478004780147802478034780447805478064780747808478094781047811478124781347814478154781647817478184781947820478214782247823478244782547826478274782847829478304783147832478334783447835478364783747838478394784047841478424784347844478454784647847478484784947850478514785247853478544785547856478574785847859478604786147862478634786447865478664786747868478694787047871478724787347874478754787647877478784787947880478814788247883478844788547886478874788847889478904789147892478934789447895478964789747898478994790047901479024790347904479054790647907479084790947910479114791247913479144791547916479174791847919479204792147922479234792447925479264792747928479294793047931479324793347934479354793647937479384793947940479414794247943479444794547946479474794847949479504795147952479534795447955479564795747958479594796047961479624796347964479654796647967479684796947970479714797247973479744797547976479774797847979479804798147982479834798447985479864798747988479894799047991479924799347994479954799647997479984799948000480014800248003480044800548006480074800848009480104801148012480134801448015480164801748018480194802048021480224802348024480254802648027480284802948030480314803248033480344803548036480374803848039480404804148042480434804448045480464804748048480494805048051480524805348054480554805648057480584805948060480614806248063480644806548066480674806848069480704807148072480734807448075480764807748078480794808048081480824808348084480854808648087480884808948090480914809248093480944809548096480974809848099481004810148102481034810448105481064810748108481094811048111481124811348114481154811648117481184811948120481214812248123481244812548126481274812848129481304813148132481334813448135481364813748138481394814048141481424814348144481454814648147481484814948150481514815248153481544815548156481574815848159481604816148162481634816448165481664816748168481694817048171481724817348174481754817648177481784817948180481814818248183481844818548186481874818848189481904819148192481934819448195481964819748198481994820048201482024820348204482054820648207482084820948210482114821248213482144821548216482174821848219482204822148222482234822448225482264822748228482294823048231482324823348234482354823648237482384823948240482414824248243482444824548246482474824848249482504825148252482534825448255482564825748258482594826048261482624826348264482654826648267482684826948270482714827248273482744827548276482774827848279482804828148282482834828448285482864828748288482894829048291482924829348294482954829648297482984829948300483014830248303483044830548306483074830848309483104831148312483134831448315483164831748318483194832048321483224832348324483254832648327483284832948330483314833248333483344833548336483374833848339483404834148342483434834448345483464834748348483494835048351483524835348354483554835648357483584835948360483614836248363483644836548366483674836848369483704837148372483734837448375483764837748378483794838048381483824838348384483854838648387483884838948390483914839248393483944839548396483974839848399484004840148402484034840448405484064840748408484094841048411484124841348414484154841648417484184841948420484214842248423484244842548426484274842848429484304843148432484334843448435484364843748438484394844048441484424844348444484454844648447484484844948450484514845248453484544845548456484574845848459484604846148462484634846448465484664846748468484694847048471484724847348474484754847648477484784847948480484814848248483484844848548486484874848848489484904849148492484934849448495484964849748498484994850048501485024850348504485054850648507485084850948510485114851248513485144851548516485174851848519485204852148522485234852448525485264852748528485294853048531485324853348534485354853648537485384853948540485414854248543485444854548546485474854848549485504855148552485534855448555485564855748558485594856048561485624856348564485654856648567485684856948570485714857248573485744857548576485774857848579485804858148582485834858448585485864858748588485894859048591485924859348594485954859648597485984859948600486014860248603486044860548606486074860848609486104861148612486134861448615486164861748618486194862048621486224862348624486254862648627486284862948630486314863248633486344863548636486374863848639486404864148642486434864448645486464864748648486494865048651486524865348654486554865648657486584865948660486614866248663486644866548666486674866848669486704867148672486734867448675486764867748678486794868048681486824868348684486854868648687486884868948690486914869248693486944869548696486974869848699487004870148702487034870448705487064870748708487094871048711487124871348714487154871648717487184871948720487214872248723487244872548726487274872848729487304873148732487334873448735487364873748738487394874048741487424874348744487454874648747487484874948750487514875248753487544875548756487574875848759487604876148762487634876448765487664876748768487694877048771487724877348774487754877648777487784877948780487814878248783487844878548786487874878848789487904879148792487934879448795487964879748798487994880048801488024880348804488054880648807488084880948810488114881248813488144881548816488174881848819488204882148822488234882448825488264882748828488294883048831488324883348834488354883648837488384883948840488414884248843488444884548846488474884848849488504885148852488534885448855488564885748858488594886048861488624886348864488654886648867488684886948870488714887248873488744887548876488774887848879488804888148882488834888448885488864888748888488894889048891488924889348894488954889648897488984889948900489014890248903489044890548906489074890848909489104891148912489134891448915489164891748918489194892048921489224892348924489254892648927489284892948930489314893248933489344893548936489374893848939489404894148942489434894448945489464894748948489494895048951489524895348954489554895648957489584895948960489614896248963489644896548966489674896848969489704897148972489734897448975489764897748978489794898048981489824898348984489854898648987489884898948990489914899248993489944899548996489974899848999490004900149002490034900449005490064900749008490094901049011490124901349014490154901649017490184901949020490214902249023490244902549026490274902849029490304903149032490334903449035490364903749038490394904049041490424904349044490454904649047490484904949050490514905249053490544905549056490574905849059490604906149062490634906449065490664906749068490694907049071490724907349074490754907649077490784907949080490814908249083490844908549086490874908849089490904909149092490934909449095490964909749098490994910049101491024910349104491054910649107491084910949110491114911249113491144911549116491174911849119491204912149122491234912449125491264912749128491294913049131491324913349134491354913649137491384913949140491414914249143491444914549146491474914849149491504915149152491534915449155491564915749158491594916049161491624916349164491654916649167491684916949170491714917249173491744917549176491774917849179491804918149182491834918449185491864918749188491894919049191491924919349194491954919649197491984919949200492014920249203492044920549206492074920849209492104921149212492134921449215492164921749218492194922049221492224922349224492254922649227492284922949230492314923249233492344923549236492374923849239492404924149242492434924449245492464924749248492494925049251492524925349254492554925649257492584925949260492614926249263492644926549266492674926849269492704927149272492734927449275492764927749278492794928049281492824928349284492854928649287492884928949290492914929249293492944929549296492974929849299493004930149302493034930449305493064930749308493094931049311493124931349314493154931649317493184931949320493214932249323493244932549326493274932849329493304933149332493334933449335493364933749338493394934049341493424934349344493454934649347493484934949350493514935249353493544935549356493574935849359493604936149362493634936449365493664936749368493694937049371493724937349374493754937649377493784937949380493814938249383493844938549386493874938849389493904939149392493934939449395493964939749398493994940049401494024940349404494054940649407494084940949410494114941249413494144941549416494174941849419494204942149422494234942449425494264942749428494294943049431494324943349434494354943649437494384943949440494414944249443494444944549446494474944849449494504945149452494534945449455494564945749458494594946049461494624946349464494654946649467494684946949470494714947249473494744947549476494774947849479494804948149482494834948449485494864948749488494894949049491494924949349494494954949649497494984949949500495014950249503495044950549506495074950849509495104951149512495134951449515495164951749518495194952049521495224952349524495254952649527495284952949530495314953249533495344953549536495374953849539495404954149542495434954449545495464954749548495494955049551495524955349554495554955649557495584955949560495614956249563495644956549566495674956849569495704957149572495734957449575495764957749578495794958049581495824958349584495854958649587495884958949590495914959249593495944959549596495974959849599496004960149602496034960449605496064960749608496094961049611496124961349614496154961649617496184961949620496214962249623496244962549626496274962849629496304963149632496334963449635496364963749638496394964049641496424964349644496454964649647496484964949650496514965249653496544965549656496574965849659496604966149662496634966449665496664966749668496694967049671496724967349674496754967649677496784967949680496814968249683496844968549686496874968849689496904969149692496934969449695496964969749698496994970049701497024970349704497054970649707497084970949710497114971249713497144971549716497174971849719497204972149722497234972449725497264972749728497294973049731497324973349734497354973649737497384973949740497414974249743497444974549746497474974849749497504975149752497534975449755497564975749758497594976049761497624976349764497654976649767497684976949770497714977249773497744977549776497774977849779497804978149782497834978449785497864978749788497894979049791497924979349794497954979649797497984979949800498014980249803498044980549806498074980849809498104981149812498134981449815498164981749818498194982049821498224982349824498254982649827498284982949830498314983249833498344983549836498374983849839498404984149842498434984449845498464984749848498494985049851498524985349854498554985649857498584985949860498614986249863498644986549866498674986849869498704987149872498734987449875498764987749878498794988049881498824988349884498854988649887498884988949890498914989249893498944989549896498974989849899499004990149902499034990449905499064990749908499094991049911499124991349914499154991649917499184991949920499214992249923499244992549926499274992849929499304993149932499334993449935499364993749938499394994049941499424994349944499454994649947499484994949950499514995249953499544995549956499574995849959499604996149962499634996449965499664996749968499694997049971499724997349974499754997649977499784997949980499814998249983499844998549986499874998849989499904999149992499934999449995499964999749998499995000050001500025000350004500055000650007500085000950010500115001250013500145001550016500175001850019500205002150022500235002450025500265002750028500295003050031500325003350034500355003650037500385003950040500415004250043500445004550046500475004850049500505005150052500535005450055500565005750058500595006050061500625006350064500655006650067500685006950070500715007250073500745007550076500775007850079500805008150082500835008450085500865008750088500895009050091500925009350094500955009650097500985009950100501015010250103501045010550106501075010850109501105011150112501135011450115501165011750118501195012050121501225012350124501255012650127501285012950130501315013250133501345013550136501375013850139501405014150142501435014450145501465014750148501495015050151501525015350154501555015650157501585015950160501615016250163501645016550166501675016850169501705017150172501735017450175501765017750178501795018050181501825018350184501855018650187501885018950190501915019250193501945019550196501975019850199502005020150202502035020450205502065020750208502095021050211502125021350214502155021650217502185021950220502215022250223502245022550226502275022850229502305023150232502335023450235502365023750238502395024050241502425024350244502455024650247502485024950250502515025250253502545025550256502575025850259502605026150262502635026450265502665026750268502695027050271502725027350274502755027650277502785027950280502815028250283502845028550286502875028850289502905029150292502935029450295502965029750298502995030050301503025030350304503055030650307503085030950310503115031250313503145031550316503175031850319503205032150322503235032450325503265032750328503295033050331503325033350334503355033650337503385033950340503415034250343503445034550346503475034850349503505035150352503535035450355503565035750358503595036050361503625036350364503655036650367503685036950370503715037250373503745037550376503775037850379503805038150382503835038450385503865038750388503895039050391503925039350394503955039650397503985039950400504015040250403504045040550406504075040850409504105041150412504135041450415504165041750418504195042050421504225042350424504255042650427504285042950430504315043250433504345043550436504375043850439504405044150442504435044450445504465044750448504495045050451504525045350454504555045650457504585045950460504615046250463504645046550466504675046850469504705047150472504735047450475504765047750478504795048050481504825048350484504855048650487504885048950490504915049250493504945049550496504975049850499505005050150502505035050450505505065050750508505095051050511505125051350514505155051650517505185051950520505215052250523505245052550526505275052850529505305053150532505335053450535505365053750538505395054050541505425054350544505455054650547505485054950550505515055250553505545055550556505575055850559505605056150562505635056450565505665056750568505695057050571505725057350574505755057650577505785057950580505815058250583505845058550586505875058850589505905059150592505935059450595505965059750598505995060050601506025060350604506055060650607506085060950610506115061250613506145061550616506175061850619506205062150622506235062450625506265062750628506295063050631506325063350634506355063650637506385063950640506415064250643506445064550646506475064850649506505065150652506535065450655506565065750658506595066050661506625066350664506655066650667506685066950670506715067250673506745067550676506775067850679506805068150682506835068450685506865068750688506895069050691506925069350694506955069650697506985069950700507015070250703507045070550706507075070850709507105071150712507135071450715507165071750718507195072050721507225072350724507255072650727507285072950730507315073250733507345073550736507375073850739507405074150742507435074450745507465074750748507495075050751507525075350754507555075650757507585075950760507615076250763507645076550766507675076850769507705077150772507735077450775507765077750778507795078050781507825078350784507855078650787507885078950790507915079250793507945079550796507975079850799508005080150802508035080450805508065080750808508095081050811508125081350814508155081650817508185081950820508215082250823508245082550826508275082850829508305083150832508335083450835508365083750838508395084050841508425084350844508455084650847508485084950850508515085250853508545085550856508575085850859508605086150862508635086450865508665086750868508695087050871508725087350874508755087650877508785087950880508815088250883508845088550886508875088850889508905089150892508935089450895508965089750898508995090050901509025090350904509055090650907509085090950910509115091250913509145091550916509175091850919509205092150922509235092450925509265092750928509295093050931509325093350934509355093650937509385093950940509415094250943509445094550946509475094850949509505095150952509535095450955509565095750958509595096050961509625096350964509655096650967509685096950970509715097250973509745097550976509775097850979509805098150982509835098450985509865098750988509895099050991509925099350994509955099650997509985099951000510015100251003510045100551006510075100851009510105101151012510135101451015510165101751018510195102051021510225102351024510255102651027510285102951030510315103251033510345103551036510375103851039510405104151042510435104451045510465104751048510495105051051510525105351054510555105651057510585105951060510615106251063510645106551066510675106851069510705107151072510735107451075510765107751078510795108051081510825108351084510855108651087510885108951090510915109251093510945109551096510975109851099511005110151102511035110451105511065110751108511095111051111511125111351114511155111651117511185111951120511215112251123511245112551126511275112851129511305113151132511335113451135511365113751138511395114051141511425114351144511455114651147511485114951150511515115251153511545115551156511575115851159511605116151162511635116451165511665116751168511695117051171511725117351174511755117651177511785117951180511815118251183511845118551186511875118851189511905119151192511935119451195511965119751198511995120051201512025120351204512055120651207512085120951210512115121251213512145121551216512175121851219512205122151222512235122451225512265122751228512295123051231512325123351234512355123651237512385123951240512415124251243512445124551246512475124851249512505125151252512535125451255512565125751258512595126051261512625126351264512655126651267512685126951270512715127251273512745127551276512775127851279512805128151282512835128451285512865128751288512895129051291512925129351294512955129651297512985129951300513015130251303513045130551306513075130851309513105131151312513135131451315513165131751318513195132051321513225132351324513255132651327513285132951330513315133251333513345133551336513375133851339513405134151342513435134451345513465134751348513495135051351513525135351354513555135651357513585135951360513615136251363513645136551366513675136851369513705137151372513735137451375513765137751378513795138051381513825138351384513855138651387513885138951390513915139251393513945139551396513975139851399514005140151402514035140451405514065140751408514095141051411514125141351414514155141651417514185141951420514215142251423514245142551426514275142851429514305143151432514335143451435514365143751438514395144051441514425144351444514455144651447514485144951450514515145251453514545145551456514575145851459514605146151462514635146451465514665146751468514695147051471514725147351474514755147651477514785147951480514815148251483514845148551486514875148851489514905149151492514935149451495514965149751498514995150051501515025150351504515055150651507515085150951510515115151251513515145151551516515175151851519515205152151522515235152451525515265152751528515295153051531515325153351534515355153651537515385153951540515415154251543515445154551546515475154851549515505155151552515535155451555515565155751558515595156051561515625156351564515655156651567515685156951570515715157251573515745157551576515775157851579515805158151582515835158451585515865158751588515895159051591515925159351594515955159651597515985159951600516015160251603516045160551606516075160851609516105161151612516135161451615516165161751618516195162051621516225162351624516255162651627516285162951630516315163251633516345163551636516375163851639516405164151642516435164451645516465164751648516495165051651516525165351654516555165651657516585165951660516615166251663516645166551666516675166851669516705167151672516735167451675516765167751678516795168051681516825168351684516855168651687516885168951690516915169251693516945169551696516975169851699517005170151702517035170451705517065170751708517095171051711517125171351714517155171651717517185171951720517215172251723517245172551726517275172851729517305173151732517335173451735517365173751738517395174051741517425174351744517455174651747517485174951750517515175251753517545175551756517575175851759517605176151762517635176451765517665176751768517695177051771517725177351774517755177651777517785177951780517815178251783517845178551786517875178851789517905179151792517935179451795517965179751798517995180051801518025180351804518055180651807518085180951810518115181251813518145181551816518175181851819518205182151822518235182451825518265182751828518295183051831518325183351834518355183651837518385183951840518415184251843518445184551846518475184851849518505185151852518535185451855518565185751858518595186051861518625186351864518655186651867518685186951870518715187251873518745187551876518775187851879518805188151882518835188451885518865188751888518895189051891518925189351894518955189651897518985189951900519015190251903519045190551906519075190851909519105191151912519135191451915519165191751918519195192051921519225192351924519255192651927519285192951930519315193251933519345193551936519375193851939519405194151942519435194451945519465194751948519495195051951519525195351954519555195651957519585195951960519615196251963519645196551966519675196851969519705197151972519735197451975519765197751978519795198051981519825198351984519855198651987519885198951990519915199251993519945199551996519975199851999520005200152002520035200452005520065200752008520095201052011520125201352014520155201652017520185201952020520215202252023520245202552026520275202852029520305203152032520335203452035520365203752038520395204052041520425204352044520455204652047520485204952050520515205252053520545205552056520575205852059520605206152062520635206452065520665206752068520695207052071520725207352074520755207652077520785207952080520815208252083520845208552086520875208852089520905209152092520935209452095520965209752098520995210052101521025210352104521055210652107521085210952110521115211252113521145211552116521175211852119521205212152122521235212452125521265212752128521295213052131521325213352134521355213652137521385213952140521415214252143521445214552146521475214852149521505215152152521535215452155521565215752158521595216052161521625216352164521655216652167521685216952170521715217252173521745217552176521775217852179521805218152182521835218452185521865218752188521895219052191521925219352194521955219652197521985219952200522015220252203522045220552206522075220852209522105221152212522135221452215522165221752218522195222052221522225222352224522255222652227522285222952230522315223252233522345223552236522375223852239522405224152242522435224452245522465224752248522495225052251522525225352254522555225652257522585225952260522615226252263522645226552266522675226852269522705227152272522735227452275522765227752278522795228052281522825228352284522855228652287522885228952290522915229252293522945229552296522975229852299523005230152302523035230452305523065230752308523095231052311523125231352314523155231652317523185231952320523215232252323523245232552326523275232852329523305233152332523335233452335523365233752338523395234052341523425234352344523455234652347523485234952350523515235252353523545235552356523575235852359523605236152362523635236452365523665236752368523695237052371523725237352374523755237652377523785237952380523815238252383523845238552386523875238852389523905239152392523935239452395523965239752398523995240052401524025240352404524055240652407524085240952410524115241252413524145241552416524175241852419524205242152422524235242452425524265242752428524295243052431524325243352434524355243652437524385243952440524415244252443524445244552446524475244852449524505245152452524535245452455524565245752458524595246052461524625246352464524655246652467524685246952470524715247252473524745247552476524775247852479524805248152482524835248452485524865248752488524895249052491524925249352494524955249652497524985249952500525015250252503525045250552506525075250852509525105251152512525135251452515525165251752518525195252052521525225252352524525255252652527525285252952530525315253252533525345253552536525375253852539525405254152542525435254452545525465254752548525495255052551525525255352554525555255652557525585255952560525615256252563525645256552566525675256852569525705257152572525735257452575525765257752578525795258052581525825258352584525855258652587525885258952590525915259252593525945259552596525975259852599526005260152602526035260452605526065260752608526095261052611526125261352614526155261652617526185261952620526215262252623526245262552626526275262852629526305263152632526335263452635526365263752638526395264052641526425264352644526455264652647526485264952650526515265252653526545265552656526575265852659526605266152662526635266452665526665266752668526695267052671526725267352674526755267652677526785267952680526815268252683526845268552686526875268852689526905269152692526935269452695526965269752698526995270052701527025270352704527055270652707527085270952710527115271252713527145271552716527175271852719527205272152722527235272452725527265272752728527295273052731527325273352734527355273652737527385273952740527415274252743527445274552746527475274852749527505275152752527535275452755527565275752758527595276052761527625276352764527655276652767527685276952770527715277252773527745277552776527775277852779527805278152782527835278452785527865278752788527895279052791527925279352794527955279652797527985279952800528015280252803528045280552806528075280852809528105281152812528135281452815528165281752818528195282052821528225282352824528255282652827528285282952830528315283252833528345283552836528375283852839528405284152842528435284452845528465284752848528495285052851528525285352854528555285652857528585285952860528615286252863528645286552866528675286852869528705287152872528735287452875528765287752878528795288052881528825288352884528855288652887528885288952890528915289252893528945289552896528975289852899529005290152902529035290452905529065290752908529095291052911529125291352914529155291652917529185291952920529215292252923529245292552926529275292852929529305293152932529335293452935529365293752938529395294052941529425294352944529455294652947529485294952950529515295252953529545295552956529575295852959529605296152962529635296452965529665296752968529695297052971529725297352974529755297652977529785297952980529815298252983529845298552986529875298852989529905299152992529935299452995529965299752998529995300053001530025300353004530055300653007530085300953010530115301253013530145301553016530175301853019530205302153022530235302453025530265302753028530295303053031530325303353034530355303653037530385303953040530415304253043530445304553046530475304853049530505305153052530535305453055530565305753058530595306053061530625306353064530655306653067530685306953070530715307253073530745307553076530775307853079530805308153082530835308453085530865308753088530895309053091530925309353094530955309653097530985309953100531015310253103531045310553106531075310853109531105311153112531135311453115531165311753118531195312053121531225312353124531255312653127531285312953130531315313253133531345313553136531375313853139531405314153142531435314453145531465314753148531495315053151531525315353154531555315653157531585315953160531615316253163531645316553166531675316853169531705317153172531735317453175531765317753178531795318053181531825318353184531855318653187531885318953190531915319253193531945319553196531975319853199532005320153202532035320453205532065320753208532095321053211532125321353214532155321653217532185321953220532215322253223532245322553226532275322853229532305323153232532335323453235532365323753238532395324053241532425324353244532455324653247532485324953250532515325253253532545325553256532575325853259532605326153262532635326453265532665326753268532695327053271532725327353274532755327653277532785327953280532815328253283532845328553286532875328853289532905329153292532935329453295532965329753298532995330053301533025330353304533055330653307533085330953310533115331253313533145331553316533175331853319533205332153322533235332453325533265332753328533295333053331533325333353334533355333653337533385333953340533415334253343533445334553346533475334853349533505335153352533535335453355533565335753358533595336053361533625336353364533655336653367533685336953370533715337253373533745337553376533775337853379533805338153382533835338453385533865338753388533895339053391533925339353394533955339653397533985339953400534015340253403534045340553406534075340853409534105341153412534135341453415534165341753418534195342053421534225342353424534255342653427534285342953430534315343253433534345343553436534375343853439534405344153442534435344453445534465344753448534495345053451534525345353454534555345653457534585345953460534615346253463534645346553466534675346853469534705347153472534735347453475534765347753478534795348053481534825348353484534855348653487534885348953490534915349253493534945349553496534975349853499535005350153502535035350453505535065350753508535095351053511535125351353514535155351653517535185351953520535215352253523535245352553526535275352853529535305353153532535335353453535535365353753538535395354053541535425354353544535455354653547535485354953550535515355253553535545355553556535575355853559535605356153562535635356453565535665356753568535695357053571535725357353574535755357653577535785357953580535815358253583535845358553586535875358853589535905359153592535935359453595535965359753598535995360053601536025360353604536055360653607536085360953610536115361253613536145361553616536175361853619536205362153622536235362453625536265362753628536295363053631536325363353634536355363653637536385363953640536415364253643536445364553646536475364853649536505365153652536535365453655536565365753658536595366053661536625366353664536655366653667536685366953670536715367253673536745367553676536775367853679536805368153682536835368453685536865368753688536895369053691536925369353694536955369653697536985369953700537015370253703537045370553706537075370853709537105371153712537135371453715537165371753718537195372053721537225372353724537255372653727537285372953730537315373253733537345373553736537375373853739537405374153742537435374453745537465374753748537495375053751537525375353754537555375653757537585375953760537615376253763537645376553766537675376853769537705377153772537735377453775537765377753778537795378053781537825378353784537855378653787537885378953790537915379253793537945379553796537975379853799538005380153802538035380453805538065380753808538095381053811538125381353814538155381653817538185381953820538215382253823538245382553826538275382853829538305383153832538335383453835538365383753838538395384053841538425384353844538455384653847538485384953850538515385253853538545385553856538575385853859538605386153862538635386453865538665386753868538695387053871538725387353874538755387653877538785387953880538815388253883538845388553886538875388853889538905389153892538935389453895538965389753898538995390053901539025390353904539055390653907539085390953910539115391253913539145391553916539175391853919539205392153922539235392453925539265392753928539295393053931539325393353934539355393653937539385393953940539415394253943539445394553946539475394853949539505395153952539535395453955539565395753958539595396053961539625396353964539655396653967539685396953970539715397253973539745397553976539775397853979539805398153982539835398453985539865398753988539895399053991539925399353994539955399653997539985399954000540015400254003540045400554006540075400854009540105401154012540135401454015540165401754018540195402054021540225402354024540255402654027540285402954030540315403254033540345403554036540375403854039540405404154042540435404454045540465404754048540495405054051540525405354054540555405654057540585405954060540615406254063540645406554066540675406854069540705407154072540735407454075540765407754078540795408054081540825408354084540855408654087540885408954090540915409254093540945409554096540975409854099541005410154102541035410454105541065410754108541095411054111541125411354114541155411654117541185411954120541215412254123541245412554126541275412854129541305413154132541335413454135541365413754138541395414054141541425414354144541455414654147541485414954150541515415254153541545415554156541575415854159541605416154162541635416454165541665416754168541695417054171541725417354174541755417654177541785417954180541815418254183541845418554186541875418854189541905419154192541935419454195541965419754198541995420054201542025420354204542055420654207542085420954210542115421254213542145421554216542175421854219542205422154222542235422454225542265422754228542295423054231542325423354234542355423654237542385423954240542415424254243542445424554246542475424854249542505425154252542535425454255542565425754258542595426054261542625426354264542655426654267542685426954270542715427254273542745427554276542775427854279542805428154282542835428454285542865428754288542895429054291542925429354294542955429654297542985429954300543015430254303543045430554306543075430854309543105431154312543135431454315543165431754318543195432054321543225432354324543255432654327543285432954330543315433254333543345433554336543375433854339543405434154342543435434454345543465434754348543495435054351543525435354354543555435654357543585435954360543615436254363543645436554366543675436854369543705437154372543735437454375543765437754378543795438054381543825438354384543855438654387543885438954390543915439254393543945439554396543975439854399544005440154402544035440454405544065440754408544095441054411544125441354414544155441654417544185441954420544215442254423544245442554426544275442854429544305443154432544335443454435544365443754438544395444054441544425444354444544455444654447544485444954450544515445254453544545445554456544575445854459544605446154462544635446454465544665446754468544695447054471544725447354474544755447654477544785447954480544815448254483544845448554486544875448854489544905449154492544935449454495544965449754498544995450054501545025450354504545055450654507545085450954510545115451254513545145451554516545175451854519545205452154522545235452454525545265452754528545295453054531545325453354534545355453654537545385453954540545415454254543545445454554546545475454854549545505455154552545535455454555545565455754558545595456054561545625456354564545655456654567545685456954570545715457254573545745457554576545775457854579545805458154582545835458454585545865458754588545895459054591545925459354594545955459654597545985459954600546015460254603546045460554606546075460854609546105461154612546135461454615546165461754618546195462054621546225462354624546255462654627546285462954630546315463254633546345463554636546375463854639546405464154642546435464454645546465464754648546495465054651546525465354654546555465654657546585465954660546615466254663546645466554666546675466854669546705467154672546735467454675546765467754678546795468054681546825468354684546855468654687546885468954690546915469254693546945469554696546975469854699547005470154702547035470454705547065470754708547095471054711547125471354714547155471654717547185471954720547215472254723547245472554726547275472854729547305473154732547335473454735547365473754738547395474054741547425474354744547455474654747547485474954750547515475254753547545475554756547575475854759547605476154762547635476454765547665476754768547695477054771547725477354774547755477654777547785477954780547815478254783547845478554786547875478854789547905479154792547935479454795547965479754798547995480054801548025480354804548055480654807548085480954810548115481254813548145481554816548175481854819548205482154822548235482454825548265482754828548295483054831548325483354834548355483654837548385483954840548415484254843548445484554846548475484854849548505485154852548535485454855548565485754858548595486054861548625486354864548655486654867548685486954870548715487254873548745487554876548775487854879548805488154882548835488454885548865488754888548895489054891548925489354894548955489654897548985489954900549015490254903549045490554906549075490854909549105491154912549135491454915549165491754918549195492054921549225492354924549255492654927549285492954930549315493254933549345493554936549375493854939549405494154942549435494454945549465494754948549495495054951549525495354954549555495654957549585495954960549615496254963549645496554966549675496854969549705497154972549735497454975549765497754978549795498054981549825498354984549855498654987549885498954990549915499254993549945499554996549975499854999550005500155002550035500455005550065500755008550095501055011550125501355014550155501655017550185501955020550215502255023550245502555026550275502855029550305503155032550335503455035550365503755038550395504055041550425504355044550455504655047550485504955050550515505255053550545505555056550575505855059550605506155062550635506455065550665506755068550695507055071550725507355074550755507655077550785507955080550815508255083550845508555086550875508855089550905509155092550935509455095550965509755098550995510055101551025510355104551055510655107551085510955110551115511255113551145511555116551175511855119551205512155122551235512455125551265512755128551295513055131551325513355134551355513655137551385513955140551415514255143551445514555146551475514855149551505515155152551535515455155551565515755158551595516055161551625516355164551655516655167551685516955170551715517255173551745517555176551775517855179551805518155182551835518455185551865518755188551895519055191551925519355194551955519655197551985519955200552015520255203552045520555206552075520855209552105521155212552135521455215552165521755218552195522055221552225522355224552255522655227552285522955230552315523255233552345523555236552375523855239552405524155242552435524455245552465524755248552495525055251552525525355254552555525655257552585525955260552615526255263552645526555266552675526855269552705527155272552735527455275552765527755278552795528055281552825528355284552855528655287552885528955290552915529255293552945529555296552975529855299553005530155302553035530455305553065530755308553095531055311553125531355314553155531655317553185531955320553215532255323553245532555326553275532855329553305533155332553335533455335553365533755338553395534055341553425534355344553455534655347553485534955350553515535255353553545535555356553575535855359553605536155362553635536455365553665536755368553695537055371553725537355374553755537655377553785537955380553815538255383553845538555386553875538855389553905539155392553935539455395553965539755398553995540055401554025540355404554055540655407554085540955410554115541255413554145541555416554175541855419554205542155422554235542455425554265542755428554295543055431554325543355434554355543655437554385543955440554415544255443554445544555446554475544855449554505545155452554535545455455554565545755458554595546055461554625546355464554655546655467554685546955470554715547255473554745547555476554775547855479554805548155482554835548455485554865548755488554895549055491554925549355494554955549655497554985549955500555015550255503555045550555506555075550855509555105551155512555135551455515555165551755518555195552055521555225552355524555255552655527555285552955530555315553255533555345553555536555375553855539555405554155542555435554455545555465554755548555495555055551555525555355554555555555655557555585555955560555615556255563555645556555566555675556855569555705557155572555735557455575555765557755578555795558055581555825558355584555855558655587555885558955590555915559255593555945559555596555975559855599556005560155602556035560455605556065560755608556095561055611556125561355614556155561655617556185561955620556215562255623556245562555626556275562855629556305563155632556335563455635556365563755638556395564055641556425564355644556455564655647556485564955650556515565255653556545565555656556575565855659556605566155662556635566455665556665566755668556695567055671556725567355674556755567655677556785567955680556815568255683556845568555686556875568855689556905569155692556935569455695556965569755698556995570055701557025570355704557055570655707557085570955710557115571255713557145571555716557175571855719557205572155722557235572455725557265572755728557295573055731557325573355734557355573655737557385573955740557415574255743557445574555746557475574855749557505575155752557535575455755557565575755758557595576055761557625576355764557655576655767557685576955770557715577255773557745577555776557775577855779557805578155782557835578455785557865578755788557895579055791557925579355794557955579655797557985579955800558015580255803558045580555806558075580855809558105581155812558135581455815558165581755818558195582055821558225582355824558255582655827558285582955830558315583255833558345583555836558375583855839558405584155842558435584455845558465584755848558495585055851558525585355854558555585655857558585585955860558615586255863558645586555866558675586855869558705587155872558735587455875558765587755878558795588055881558825588355884558855588655887558885588955890558915589255893558945589555896558975589855899559005590155902559035590455905559065590755908559095591055911559125591355914559155591655917559185591955920559215592255923559245592555926559275592855929559305593155932559335593455935559365593755938559395594055941559425594355944559455594655947559485594955950559515595255953559545595555956559575595855959559605596155962559635596455965559665596755968559695597055971559725597355974559755597655977559785597955980559815598255983559845598555986559875598855989559905599155992559935599455995559965599755998559995600056001560025600356004560055600656007560085600956010560115601256013560145601556016560175601856019560205602156022560235602456025560265602756028560295603056031560325603356034560355603656037560385603956040560415604256043560445604556046560475604856049560505605156052560535605456055560565605756058560595606056061560625606356064560655606656067560685606956070560715607256073560745607556076560775607856079560805608156082560835608456085560865608756088560895609056091560925609356094560955609656097560985609956100561015610256103561045610556106561075610856109561105611156112561135611456115561165611756118561195612056121561225612356124561255612656127561285612956130561315613256133561345613556136561375613856139561405614156142561435614456145561465614756148561495615056151561525615356154561555615656157561585615956160561615616256163561645616556166561675616856169561705617156172561735617456175561765617756178561795618056181561825618356184561855618656187561885618956190561915619256193561945619556196561975619856199562005620156202562035620456205562065620756208562095621056211562125621356214562155621656217562185621956220562215622256223562245622556226562275622856229562305623156232562335623456235562365623756238562395624056241562425624356244562455624656247562485624956250562515625256253562545625556256562575625856259562605626156262562635626456265562665626756268562695627056271562725627356274562755627656277562785627956280562815628256283562845628556286562875628856289562905629156292562935629456295562965629756298562995630056301563025630356304563055630656307563085630956310563115631256313563145631556316563175631856319563205632156322563235632456325563265632756328563295633056331563325633356334563355633656337563385633956340563415634256343563445634556346563475634856349563505635156352563535635456355563565635756358563595636056361563625636356364563655636656367563685636956370563715637256373563745637556376563775637856379563805638156382563835638456385563865638756388563895639056391563925639356394563955639656397563985639956400564015640256403564045640556406564075640856409564105641156412564135641456415564165641756418564195642056421564225642356424564255642656427564285642956430564315643256433564345643556436564375643856439564405644156442564435644456445564465644756448564495645056451564525645356454564555645656457564585645956460564615646256463564645646556466564675646856469564705647156472564735647456475564765647756478564795648056481564825648356484564855648656487564885648956490564915649256493564945649556496564975649856499565005650156502565035650456505565065650756508565095651056511565125651356514565155651656517565185651956520565215652256523565245652556526565275652856529565305653156532565335653456535565365653756538565395654056541565425654356544565455654656547565485654956550565515655256553565545655556556565575655856559565605656156562565635656456565565665656756568565695657056571565725657356574565755657656577565785657956580565815658256583565845658556586565875658856589565905659156592565935659456595565965659756598565995660056601566025660356604566055660656607566085660956610566115661256613566145661556616566175661856619566205662156622566235662456625566265662756628566295663056631566325663356634566355663656637566385663956640566415664256643566445664556646566475664856649566505665156652566535665456655566565665756658566595666056661566625666356664566655666656667566685666956670566715667256673566745667556676566775667856679566805668156682566835668456685566865668756688566895669056691566925669356694566955669656697566985669956700567015670256703567045670556706567075670856709567105671156712567135671456715567165671756718567195672056721567225672356724567255672656727567285672956730567315673256733567345673556736567375673856739567405674156742567435674456745567465674756748567495675056751567525675356754567555675656757567585675956760567615676256763567645676556766567675676856769567705677156772567735677456775567765677756778567795678056781567825678356784567855678656787567885678956790567915679256793567945679556796567975679856799568005680156802568035680456805568065680756808568095681056811568125681356814568155681656817568185681956820568215682256823568245682556826568275682856829568305683156832568335683456835568365683756838568395684056841568425684356844568455684656847568485684956850568515685256853568545685556856568575685856859568605686156862568635686456865568665686756868568695687056871568725687356874568755687656877568785687956880568815688256883568845688556886568875688856889568905689156892568935689456895568965689756898568995690056901569025690356904569055690656907569085690956910569115691256913569145691556916569175691856919569205692156922569235692456925569265692756928569295693056931569325693356934569355693656937569385693956940569415694256943569445694556946569475694856949569505695156952569535695456955569565695756958569595696056961569625696356964569655696656967569685696956970569715697256973569745697556976569775697856979569805698156982569835698456985569865698756988569895699056991569925699356994569955699656997569985699957000570015700257003570045700557006570075700857009570105701157012570135701457015570165701757018570195702057021570225702357024570255702657027570285702957030570315703257033570345703557036570375703857039570405704157042570435704457045570465704757048570495705057051570525705357054570555705657057570585705957060570615706257063570645706557066570675706857069570705707157072570735707457075570765707757078570795708057081570825708357084570855708657087570885708957090570915709257093570945709557096570975709857099571005710157102571035710457105571065710757108571095711057111571125711357114571155711657117571185711957120571215712257123571245712557126571275712857129571305713157132571335713457135571365713757138571395714057141571425714357144571455714657147571485714957150571515715257153571545715557156571575715857159571605716157162571635716457165571665716757168571695717057171571725717357174571755717657177571785717957180571815718257183571845718557186571875718857189571905719157192571935719457195571965719757198571995720057201572025720357204572055720657207572085720957210572115721257213572145721557216572175721857219572205722157222572235722457225572265722757228572295723057231572325723357234572355723657237572385723957240572415724257243572445724557246572475724857249572505725157252572535725457255572565725757258572595726057261572625726357264572655726657267572685726957270572715727257273572745727557276572775727857279572805728157282572835728457285572865728757288572895729057291572925729357294572955729657297572985729957300573015730257303573045730557306573075730857309573105731157312573135731457315573165731757318573195732057321573225732357324573255732657327573285732957330573315733257333573345733557336573375733857339573405734157342573435734457345573465734757348573495735057351573525735357354573555735657357573585735957360573615736257363573645736557366573675736857369573705737157372573735737457375573765737757378573795738057381573825738357384573855738657387573885738957390573915739257393573945739557396573975739857399574005740157402574035740457405574065740757408574095741057411574125741357414574155741657417574185741957420574215742257423574245742557426574275742857429574305743157432574335743457435574365743757438574395744057441574425744357444574455744657447574485744957450574515745257453574545745557456574575745857459574605746157462574635746457465574665746757468574695747057471574725747357474574755747657477574785747957480574815748257483574845748557486574875748857489574905749157492574935749457495574965749757498574995750057501575025750357504575055750657507575085750957510575115751257513575145751557516575175751857519575205752157522575235752457525575265752757528575295753057531575325753357534575355753657537575385753957540575415754257543575445754557546575475754857549575505755157552575535755457555575565755757558575595756057561575625756357564575655756657567575685756957570575715757257573575745757557576575775757857579575805758157582575835758457585575865758757588575895759057591575925759357594575955759657597575985759957600576015760257603576045760557606576075760857609576105761157612576135761457615576165761757618576195762057621576225762357624576255762657627576285762957630576315763257633576345763557636576375763857639576405764157642576435764457645576465764757648576495765057651576525765357654576555765657657576585765957660576615766257663576645766557666576675766857669576705767157672576735767457675576765767757678576795768057681576825768357684576855768657687576885768957690576915769257693576945769557696576975769857699577005770157702577035770457705577065770757708577095771057711577125771357714577155771657717577185771957720577215772257723577245772557726577275772857729577305773157732577335773457735577365773757738577395774057741577425774357744577455774657747577485774957750577515775257753577545775557756577575775857759577605776157762577635776457765577665776757768577695777057771577725777357774577755777657777577785777957780577815778257783577845778557786577875778857789577905779157792577935779457795577965779757798577995780057801578025780357804578055780657807578085780957810578115781257813578145781557816578175781857819578205782157822578235782457825578265782757828578295783057831578325783357834578355783657837578385783957840578415784257843578445784557846578475784857849578505785157852578535785457855578565785757858578595786057861578625786357864578655786657867578685786957870578715787257873578745787557876578775787857879578805788157882578835788457885578865788757888578895789057891578925789357894578955789657897578985789957900579015790257903579045790557906579075790857909579105791157912579135791457915579165791757918579195792057921579225792357924579255792657927579285792957930579315793257933579345793557936579375793857939579405794157942579435794457945579465794757948579495795057951579525795357954579555795657957579585795957960579615796257963579645796557966579675796857969579705797157972579735797457975579765797757978579795798057981579825798357984579855798657987579885798957990579915799257993579945799557996579975799857999580005800158002580035800458005580065800758008580095801058011580125801358014580155801658017580185801958020580215802258023580245802558026580275802858029580305803158032580335803458035580365803758038580395804058041580425804358044580455804658047580485804958050580515805258053580545805558056580575805858059580605806158062580635806458065580665806758068580695807058071580725807358074580755807658077580785807958080580815808258083580845808558086580875808858089580905809158092580935809458095580965809758098580995810058101581025810358104581055810658107581085810958110581115811258113581145811558116581175811858119581205812158122581235812458125581265812758128581295813058131581325813358134581355813658137581385813958140581415814258143581445814558146581475814858149581505815158152581535815458155581565815758158581595816058161581625816358164581655816658167581685816958170581715817258173581745817558176581775817858179581805818158182581835818458185581865818758188581895819058191581925819358194581955819658197581985819958200582015820258203582045820558206582075820858209582105821158212582135821458215582165821758218582195822058221582225822358224582255822658227582285822958230582315823258233582345823558236582375823858239582405824158242582435824458245582465824758248582495825058251582525825358254582555825658257582585825958260582615826258263582645826558266582675826858269582705827158272582735827458275582765827758278582795828058281582825828358284582855828658287582885828958290582915829258293582945829558296582975829858299583005830158302583035830458305583065830758308583095831058311583125831358314583155831658317583185831958320583215832258323583245832558326583275832858329583305833158332583335833458335583365833758338583395834058341583425834358344583455834658347583485834958350583515835258353583545835558356583575835858359583605836158362583635836458365583665836758368583695837058371583725837358374583755837658377583785837958380583815838258383583845838558386583875838858389583905839158392583935839458395583965839758398583995840058401584025840358404584055840658407584085840958410584115841258413584145841558416584175841858419584205842158422584235842458425584265842758428584295843058431584325843358434584355843658437584385843958440584415844258443584445844558446584475844858449584505845158452584535845458455584565845758458584595846058461584625846358464584655846658467584685846958470584715847258473584745847558476584775847858479584805848158482584835848458485584865848758488584895849058491584925849358494584955849658497584985849958500585015850258503585045850558506585075850858509585105851158512585135851458515585165851758518585195852058521585225852358524585255852658527585285852958530585315853258533585345853558536585375853858539585405854158542585435854458545585465854758548585495855058551585525855358554585555855658557585585855958560585615856258563585645856558566585675856858569585705857158572585735857458575585765857758578585795858058581585825858358584585855858658587585885858958590585915859258593585945859558596585975859858599586005860158602586035860458605586065860758608586095861058611586125861358614586155861658617586185861958620586215862258623586245862558626586275862858629586305863158632586335863458635586365863758638586395864058641586425864358644586455864658647586485864958650586515865258653586545865558656586575865858659586605866158662586635866458665586665866758668586695867058671586725867358674586755867658677586785867958680586815868258683586845868558686586875868858689586905869158692586935869458695586965869758698586995870058701587025870358704587055870658707587085870958710587115871258713587145871558716587175871858719587205872158722587235872458725587265872758728587295873058731587325873358734587355873658737587385873958740587415874258743587445874558746587475874858749587505875158752587535875458755587565875758758587595876058761587625876358764587655876658767587685876958770587715877258773587745877558776587775877858779587805878158782587835878458785587865878758788587895879058791587925879358794587955879658797587985879958800588015880258803588045880558806588075880858809588105881158812588135881458815588165881758818588195882058821588225882358824588255882658827588285882958830588315883258833588345883558836588375883858839588405884158842588435884458845588465884758848588495885058851588525885358854588555885658857588585885958860588615886258863588645886558866588675886858869588705887158872588735887458875588765887758878588795888058881588825888358884588855888658887588885888958890588915889258893588945889558896588975889858899589005890158902589035890458905589065890758908589095891058911589125891358914589155891658917589185891958920589215892258923589245892558926589275892858929589305893158932589335893458935589365893758938589395894058941589425894358944589455894658947589485894958950589515895258953589545895558956589575895858959589605896158962589635896458965589665896758968589695897058971589725897358974589755897658977589785897958980589815898258983589845898558986589875898858989589905899158992589935899458995589965899758998589995900059001590025900359004590055900659007590085900959010590115901259013590145901559016590175901859019590205902159022590235902459025590265902759028590295903059031590325903359034590355903659037590385903959040590415904259043590445904559046590475904859049590505905159052590535905459055590565905759058590595906059061590625906359064590655906659067590685906959070590715907259073590745907559076590775907859079590805908159082590835908459085590865908759088590895909059091590925909359094590955909659097590985909959100591015910259103591045910559106591075910859109591105911159112591135911459115591165911759118591195912059121591225912359124591255912659127591285912959130591315913259133591345913559136591375913859139591405914159142591435914459145591465914759148591495915059151591525915359154591555915659157591585915959160591615916259163591645916559166591675916859169591705917159172591735917459175591765917759178591795918059181591825918359184591855918659187591885918959190591915919259193591945919559196591975919859199592005920159202592035920459205592065920759208592095921059211592125921359214592155921659217592185921959220592215922259223592245922559226592275922859229592305923159232592335923459235592365923759238592395924059241592425924359244592455924659247592485924959250592515925259253592545925559256592575925859259592605926159262592635926459265592665926759268592695927059271592725927359274592755927659277592785927959280592815928259283592845928559286592875928859289592905929159292592935929459295592965929759298592995930059301593025930359304593055930659307593085930959310593115931259313593145931559316593175931859319593205932159322593235932459325593265932759328593295933059331593325933359334593355933659337593385933959340593415934259343593445934559346593475934859349593505935159352593535935459355593565935759358593595936059361593625936359364593655936659367593685936959370593715937259373593745937559376593775937859379593805938159382593835938459385593865938759388593895939059391593925939359394593955939659397593985939959400594015940259403594045940559406594075940859409594105941159412594135941459415594165941759418594195942059421594225942359424594255942659427594285942959430594315943259433594345943559436594375943859439594405944159442594435944459445594465944759448594495945059451594525945359454594555945659457594585945959460594615946259463594645946559466594675946859469594705947159472594735947459475594765947759478594795948059481594825948359484594855948659487594885948959490594915949259493594945949559496594975949859499595005950159502595035950459505595065950759508595095951059511595125951359514595155951659517595185951959520595215952259523595245952559526595275952859529595305953159532595335953459535595365953759538595395954059541595425954359544595455954659547595485954959550595515955259553595545955559556595575955859559595605956159562595635956459565595665956759568595695957059571595725957359574595755957659577595785957959580595815958259583595845958559586595875958859589595905959159592595935959459595595965959759598595995960059601596025960359604596055960659607596085960959610596115961259613596145961559616596175961859619596205962159622596235962459625596265962759628596295963059631596325963359634596355963659637596385963959640596415964259643596445964559646596475964859649596505965159652596535965459655596565965759658596595966059661596625966359664596655966659667596685966959670596715967259673596745967559676596775967859679596805968159682596835968459685596865968759688596895969059691596925969359694596955969659697596985969959700597015970259703597045970559706597075970859709597105971159712597135971459715597165971759718597195972059721597225972359724597255972659727597285972959730597315973259733597345973559736597375973859739597405974159742597435974459745597465974759748597495975059751597525975359754597555975659757597585975959760597615976259763597645976559766597675976859769597705977159772597735977459775597765977759778597795978059781597825978359784597855978659787597885978959790597915979259793597945979559796597975979859799598005980159802598035980459805598065980759808598095981059811598125981359814598155981659817598185981959820598215982259823598245982559826598275982859829598305983159832598335983459835598365983759838598395984059841598425984359844598455984659847598485984959850598515985259853598545985559856598575985859859598605986159862598635986459865598665986759868598695987059871598725987359874598755987659877598785987959880598815988259883598845988559886598875988859889598905989159892598935989459895598965989759898598995990059901599025990359904599055990659907599085990959910599115991259913599145991559916599175991859919599205992159922599235992459925599265992759928599295993059931599325993359934599355993659937599385993959940599415994259943599445994559946599475994859949599505995159952599535995459955599565995759958599595996059961599625996359964599655996659967599685996959970599715997259973599745997559976599775997859979599805998159982599835998459985599865998759988599895999059991599925999359994599955999659997599985999960000600016000260003600046000560006600076000860009600106001160012600136001460015600166001760018600196002060021600226002360024600256002660027600286002960030600316003260033600346003560036600376003860039600406004160042600436004460045600466004760048600496005060051600526005360054600556005660057600586005960060600616006260063600646006560066600676006860069600706007160072600736007460075600766007760078600796008060081600826008360084600856008660087600886008960090600916009260093600946009560096600976009860099601006010160102601036010460105601066010760108601096011060111601126011360114601156011660117601186011960120601216012260123601246012560126601276012860129601306013160132601336013460135601366013760138601396014060141601426014360144601456014660147601486014960150601516015260153601546015560156601576015860159601606016160162601636016460165601666016760168601696017060171601726017360174601756017660177601786017960180601816018260183601846018560186601876018860189601906019160192601936019460195601966019760198601996020060201602026020360204602056020660207602086020960210602116021260213602146021560216602176021860219602206022160222602236022460225602266022760228602296023060231602326023360234602356023660237602386023960240602416024260243602446024560246602476024860249602506025160252602536025460255602566025760258602596026060261602626026360264602656026660267602686026960270602716027260273602746027560276602776027860279602806028160282602836028460285602866028760288602896029060291602926029360294602956029660297602986029960300603016030260303603046030560306603076030860309603106031160312603136031460315603166031760318603196032060321603226032360324603256032660327603286032960330603316033260333603346033560336603376033860339603406034160342603436034460345603466034760348603496035060351603526035360354603556035660357603586035960360603616036260363603646036560366603676036860369603706037160372603736037460375603766037760378603796038060381603826038360384603856038660387603886038960390603916039260393603946039560396603976039860399604006040160402604036040460405604066040760408604096041060411604126041360414604156041660417604186041960420604216042260423604246042560426604276042860429604306043160432604336043460435604366043760438604396044060441604426044360444604456044660447604486044960450604516045260453604546045560456604576045860459604606046160462604636046460465604666046760468604696047060471604726047360474604756047660477604786047960480604816048260483604846048560486604876048860489604906049160492604936049460495604966049760498604996050060501605026050360504605056050660507605086050960510605116051260513605146051560516605176051860519605206052160522605236052460525605266052760528605296053060531605326053360534605356053660537605386053960540605416054260543605446054560546605476054860549605506055160552605536055460555605566055760558605596056060561605626056360564605656056660567605686056960570605716057260573605746057560576605776057860579605806058160582605836058460585605866058760588605896059060591605926059360594605956059660597605986059960600606016060260603606046060560606606076060860609606106061160612606136061460615606166061760618606196062060621606226062360624606256062660627606286062960630606316063260633606346063560636606376063860639606406064160642606436064460645606466064760648606496065060651606526065360654606556065660657606586065960660606616066260663606646066560666606676066860669606706067160672606736067460675606766067760678606796068060681606826068360684606856068660687606886068960690606916069260693606946069560696606976069860699607006070160702607036070460705607066070760708607096071060711607126071360714607156071660717607186071960720607216072260723607246072560726607276072860729607306073160732607336073460735607366073760738607396074060741607426074360744607456074660747607486074960750607516075260753607546075560756607576075860759607606076160762607636076460765607666076760768607696077060771607726077360774607756077660777607786077960780607816078260783607846078560786607876078860789607906079160792607936079460795607966079760798607996080060801608026080360804608056080660807608086080960810608116081260813608146081560816608176081860819608206082160822608236082460825608266082760828608296083060831608326083360834608356083660837608386083960840608416084260843608446084560846608476084860849608506085160852608536085460855608566085760858608596086060861608626086360864608656086660867608686086960870608716087260873608746087560876608776087860879608806088160882608836088460885608866088760888608896089060891608926089360894608956089660897608986089960900609016090260903609046090560906609076090860909609106091160912609136091460915609166091760918609196092060921609226092360924609256092660927609286092960930609316093260933609346093560936609376093860939609406094160942609436094460945609466094760948609496095060951609526095360954609556095660957609586095960960609616096260963609646096560966609676096860969609706097160972609736097460975609766097760978609796098060981609826098360984609856098660987609886098960990609916099260993609946099560996609976099860999610006100161002610036100461005610066100761008610096101061011610126101361014610156101661017610186101961020610216102261023610246102561026610276102861029610306103161032610336103461035610366103761038610396104061041610426104361044610456104661047610486104961050610516105261053610546105561056610576105861059610606106161062610636106461065610666106761068610696107061071610726107361074610756107661077610786107961080610816108261083610846108561086610876108861089610906109161092610936109461095610966109761098610996110061101611026110361104611056110661107611086110961110611116111261113611146111561116611176111861119611206112161122611236112461125611266112761128611296113061131611326113361134611356113661137611386113961140611416114261143611446114561146611476114861149611506115161152611536115461155611566115761158611596116061161611626116361164611656116661167611686116961170611716117261173611746117561176611776117861179611806118161182611836118461185611866118761188611896119061191611926119361194611956119661197611986119961200612016120261203612046120561206612076120861209612106121161212612136121461215612166121761218612196122061221612226122361224612256122661227612286122961230612316123261233612346123561236612376123861239612406124161242612436124461245612466124761248612496125061251612526125361254612556125661257612586125961260612616126261263612646126561266612676126861269612706127161272612736127461275612766127761278612796128061281612826128361284612856128661287612886128961290612916129261293612946129561296612976129861299613006130161302613036130461305613066130761308613096131061311613126131361314613156131661317613186131961320613216132261323613246132561326613276132861329613306133161332613336133461335613366133761338613396134061341613426134361344613456134661347613486134961350613516135261353613546135561356613576135861359613606136161362613636136461365613666136761368613696137061371613726137361374613756137661377613786137961380613816138261383613846138561386613876138861389613906139161392613936139461395613966139761398613996140061401614026140361404614056140661407614086140961410614116141261413614146141561416614176141861419614206142161422614236142461425614266142761428614296143061431614326143361434614356143661437614386143961440614416144261443614446144561446614476144861449614506145161452614536145461455614566145761458614596146061461614626146361464614656146661467614686146961470614716147261473614746147561476614776147861479614806148161482614836148461485614866148761488614896149061491614926149361494614956149661497614986149961500615016150261503615046150561506615076150861509615106151161512615136151461515615166151761518615196152061521615226152361524615256152661527615286152961530615316153261533615346153561536615376153861539615406154161542615436154461545615466154761548615496155061551615526155361554615556155661557615586155961560615616156261563615646156561566615676156861569615706157161572615736157461575615766157761578615796158061581615826158361584615856158661587615886158961590615916159261593615946159561596615976159861599616006160161602616036160461605616066160761608616096161061611616126161361614616156161661617616186161961620616216162261623616246162561626616276162861629616306163161632616336163461635616366163761638616396164061641616426164361644616456164661647616486164961650616516165261653616546165561656616576165861659616606166161662616636166461665616666166761668616696167061671616726167361674616756167661677616786167961680616816168261683616846168561686616876168861689616906169161692616936169461695616966169761698616996170061701617026170361704617056170661707617086170961710617116171261713617146171561716617176171861719617206172161722617236172461725617266172761728617296173061731617326173361734617356173661737617386173961740617416174261743617446174561746617476174861749617506175161752617536175461755617566175761758617596176061761617626176361764617656176661767617686176961770617716177261773617746177561776617776177861779617806178161782617836178461785617866178761788617896179061791617926179361794617956179661797617986179961800618016180261803618046180561806618076180861809618106181161812618136181461815618166181761818618196182061821618226182361824618256182661827618286182961830618316183261833618346183561836618376183861839618406184161842618436184461845618466184761848618496185061851618526185361854618556185661857618586185961860618616186261863618646186561866618676186861869618706187161872618736187461875618766187761878618796188061881618826188361884618856188661887618886188961890618916189261893618946189561896618976189861899619006190161902619036190461905619066190761908619096191061911619126191361914619156191661917619186191961920619216192261923619246192561926619276192861929619306193161932619336193461935619366193761938619396194061941619426194361944619456194661947619486194961950619516195261953619546195561956619576195861959619606196161962619636196461965619666196761968619696197061971619726197361974619756197661977619786197961980619816198261983619846198561986619876198861989619906199161992619936199461995619966199761998619996200062001620026200362004620056200662007620086200962010620116201262013620146201562016620176201862019620206202162022620236202462025620266202762028620296203062031620326203362034620356203662037620386203962040620416204262043620446204562046620476204862049620506205162052620536205462055620566205762058620596206062061620626206362064620656206662067620686206962070620716207262073620746207562076620776207862079620806208162082620836208462085620866208762088620896209062091620926209362094620956209662097620986209962100621016210262103621046210562106621076210862109621106211162112621136211462115621166211762118621196212062121621226212362124621256212662127621286212962130621316213262133621346213562136621376213862139621406214162142621436214462145621466214762148621496215062151621526215362154621556215662157621586215962160621616216262163621646216562166621676216862169621706217162172621736217462175621766217762178621796218062181621826218362184621856218662187621886218962190621916219262193621946219562196621976219862199622006220162202622036220462205622066220762208622096221062211622126221362214622156221662217622186221962220622216222262223622246222562226622276222862229622306223162232622336223462235622366223762238622396224062241622426224362244622456224662247622486224962250622516225262253622546225562256622576225862259622606226162262622636226462265622666226762268622696227062271622726227362274622756227662277622786227962280622816228262283622846228562286622876228862289622906229162292622936229462295622966229762298622996230062301623026230362304623056230662307623086230962310623116231262313623146231562316623176231862319623206232162322623236232462325623266232762328623296233062331623326233362334623356233662337623386233962340623416234262343623446234562346623476234862349623506235162352623536235462355623566235762358623596236062361623626236362364623656236662367623686236962370623716237262373623746237562376623776237862379623806238162382623836238462385623866238762388623896239062391623926239362394623956239662397623986239962400624016240262403624046240562406624076240862409624106241162412624136241462415624166241762418624196242062421624226242362424624256242662427624286242962430624316243262433624346243562436624376243862439624406244162442624436244462445624466244762448624496245062451624526245362454624556245662457624586245962460624616246262463624646246562466624676246862469624706247162472624736247462475624766247762478624796248062481624826248362484624856248662487624886248962490624916249262493624946249562496624976249862499625006250162502625036250462505625066250762508625096251062511625126251362514625156251662517625186251962520625216252262523625246252562526625276252862529625306253162532625336253462535625366253762538625396254062541625426254362544625456254662547625486254962550625516255262553625546255562556625576255862559625606256162562625636256462565625666256762568625696257062571625726257362574625756257662577625786257962580625816258262583625846258562586625876258862589625906259162592625936259462595625966259762598625996260062601626026260362604626056260662607626086260962610626116261262613626146261562616626176261862619626206262162622626236262462625626266262762628626296263062631626326263362634626356263662637626386263962640626416264262643626446264562646626476264862649626506265162652626536265462655626566265762658626596266062661626626266362664626656266662667626686266962670626716267262673626746267562676626776267862679626806268162682626836268462685626866268762688626896269062691626926269362694626956269662697626986269962700627016270262703627046270562706627076270862709627106271162712627136271462715627166271762718627196272062721627226272362724627256272662727627286272962730627316273262733627346273562736627376273862739627406274162742627436274462745627466274762748627496275062751627526275362754627556275662757627586275962760627616276262763627646276562766627676276862769627706277162772627736277462775627766277762778627796278062781627826278362784627856278662787627886278962790627916279262793627946279562796627976279862799628006280162802628036280462805628066280762808628096281062811628126281362814628156281662817628186281962820628216282262823628246282562826628276282862829628306283162832628336283462835628366283762838628396284062841628426284362844628456284662847628486284962850628516285262853628546285562856628576285862859628606286162862628636286462865628666286762868628696287062871628726287362874628756287662877628786287962880628816288262883628846288562886628876288862889628906289162892628936289462895628966289762898628996290062901629026290362904629056290662907629086290962910629116291262913629146291562916629176291862919629206292162922629236292462925629266292762928629296293062931629326293362934629356293662937629386293962940629416294262943629446294562946629476294862949629506295162952629536295462955629566295762958629596296062961629626296362964629656296662967629686296962970629716297262973629746297562976629776297862979629806298162982629836298462985629866298762988629896299062991629926299362994629956299662997629986299963000630016300263003630046300563006630076300863009630106301163012630136301463015630166301763018630196302063021630226302363024630256302663027630286302963030630316303263033630346303563036630376303863039630406304163042630436304463045630466304763048630496305063051630526305363054630556305663057630586305963060630616306263063630646306563066630676306863069630706307163072630736307463075630766307763078630796308063081630826308363084630856308663087630886308963090630916309263093630946309563096630976309863099631006310163102631036310463105631066310763108631096311063111631126311363114631156311663117631186311963120631216312263123631246312563126631276312863129631306313163132631336313463135631366313763138631396314063141631426314363144631456314663147631486314963150631516315263153631546315563156631576315863159631606316163162631636316463165631666316763168631696317063171631726317363174631756317663177631786317963180631816318263183631846318563186631876318863189631906319163192631936319463195631966319763198631996320063201632026320363204632056320663207632086320963210632116321263213632146321563216632176321863219632206322163222632236322463225632266322763228632296323063231632326323363234632356323663237632386323963240632416324263243632446324563246632476324863249632506325163252632536325463255632566325763258632596326063261632626326363264632656326663267632686326963270632716327263273632746327563276632776327863279632806328163282632836328463285632866328763288632896329063291632926329363294632956329663297632986329963300633016330263303633046330563306633076330863309633106331163312633136331463315633166331763318633196332063321633226332363324633256332663327633286332963330633316333263333633346333563336633376333863339633406334163342633436334463345633466334763348633496335063351633526335363354633556335663357633586335963360633616336263363633646336563366633676336863369633706337163372633736337463375633766337763378633796338063381633826338363384633856338663387633886338963390633916339263393633946339563396633976339863399634006340163402634036340463405634066340763408634096341063411634126341363414634156341663417634186341963420634216342263423634246342563426634276342863429634306343163432634336343463435634366343763438634396344063441634426344363444634456344663447634486344963450634516345263453634546345563456634576345863459634606346163462634636346463465634666346763468634696347063471634726347363474634756347663477634786347963480634816348263483634846348563486634876348863489634906349163492634936349463495634966349763498634996350063501635026350363504635056350663507635086350963510635116351263513635146351563516635176351863519635206352163522635236352463525635266352763528635296353063531635326353363534635356353663537635386353963540635416354263543635446354563546635476354863549635506355163552635536355463555635566355763558635596356063561635626356363564635656356663567635686356963570635716357263573635746357563576635776357863579635806358163582635836358463585635866358763588635896359063591635926359363594635956359663597635986359963600636016360263603636046360563606636076360863609636106361163612636136361463615636166361763618636196362063621636226362363624636256362663627636286362963630636316363263633636346363563636636376363863639636406364163642636436364463645636466364763648636496365063651636526365363654636556365663657636586365963660636616366263663636646366563666636676366863669636706367163672636736367463675636766367763678636796368063681636826368363684636856368663687636886368963690636916369263693636946369563696636976369863699637006370163702637036370463705637066370763708637096371063711637126371363714637156371663717637186371963720637216372263723637246372563726637276372863729637306373163732637336373463735637366373763738637396374063741637426374363744637456374663747637486374963750637516375263753637546375563756637576375863759637606376163762637636376463765637666376763768637696377063771637726377363774637756377663777637786377963780637816378263783637846378563786637876378863789637906379163792637936379463795637966379763798637996380063801638026380363804638056380663807638086380963810638116381263813638146381563816638176381863819638206382163822638236382463825638266382763828638296383063831638326383363834638356383663837638386383963840638416384263843638446384563846638476384863849638506385163852638536385463855638566385763858638596386063861638626386363864638656386663867638686386963870638716387263873638746387563876638776387863879638806388163882638836388463885638866388763888638896389063891638926389363894638956389663897638986389963900639016390263903639046390563906639076390863909639106391163912639136391463915639166391763918639196392063921639226392363924639256392663927639286392963930639316393263933639346393563936639376393863939639406394163942639436394463945639466394763948639496395063951639526395363954639556395663957639586395963960639616396263963639646396563966639676396863969639706397163972639736397463975639766397763978639796398063981639826398363984639856398663987639886398963990639916399263993639946399563996639976399863999640006400164002640036400464005640066400764008640096401064011640126401364014640156401664017640186401964020640216402264023640246402564026640276402864029640306403164032640336403464035640366403764038640396404064041640426404364044640456404664047640486404964050640516405264053640546405564056640576405864059640606406164062640636406464065640666406764068640696407064071640726407364074640756407664077640786407964080640816408264083640846408564086640876408864089640906409164092640936409464095640966409764098640996410064101641026410364104641056410664107641086410964110641116411264113641146411564116641176411864119641206412164122641236412464125641266412764128641296413064131641326413364134641356413664137641386413964140641416414264143641446414564146641476414864149641506415164152641536415464155641566415764158641596416064161641626416364164641656416664167641686416964170641716417264173641746417564176641776417864179641806418164182641836418464185641866418764188641896419064191641926419364194641956419664197641986419964200642016420264203642046420564206642076420864209642106421164212642136421464215642166421764218642196422064221642226422364224642256422664227642286422964230642316423264233642346423564236642376423864239642406424164242642436424464245642466424764248642496425064251642526425364254642556425664257642586425964260642616426264263642646426564266642676426864269642706427164272642736427464275642766427764278642796428064281642826428364284642856428664287642886428964290642916429264293642946429564296642976429864299643006430164302643036430464305643066430764308643096431064311643126431364314643156431664317643186431964320643216432264323643246432564326643276432864329643306433164332643336433464335643366433764338643396434064341643426434364344643456434664347643486434964350643516435264353643546435564356643576435864359643606436164362643636436464365643666436764368643696437064371643726437364374643756437664377643786437964380643816438264383643846438564386643876438864389643906439164392643936439464395643966439764398643996440064401644026440364404644056440664407644086440964410644116441264413644146441564416644176441864419644206442164422644236442464425644266442764428644296443064431644326443364434644356443664437644386443964440644416444264443644446444564446644476444864449644506445164452644536445464455644566445764458644596446064461644626446364464644656446664467644686446964470644716447264473644746447564476644776447864479644806448164482644836448464485644866448764488644896449064491644926449364494644956449664497644986449964500645016450264503645046450564506645076450864509645106451164512645136451464515645166451764518645196452064521645226452364524645256452664527645286452964530645316453264533645346453564536645376453864539645406454164542645436454464545645466454764548645496455064551645526455364554645556455664557645586455964560645616456264563645646456564566645676456864569645706457164572645736457464575645766457764578645796458064581645826458364584645856458664587645886458964590645916459264593645946459564596645976459864599646006460164602646036460464605646066460764608646096461064611646126461364614646156461664617646186461964620646216462264623646246462564626646276462864629646306463164632646336463464635646366463764638646396464064641646426464364644646456464664647646486464964650646516465264653646546465564656646576465864659646606466164662646636466464665646666466764668646696467064671646726467364674646756467664677646786467964680646816468264683646846468564686646876468864689646906469164692646936469464695646966469764698646996470064701647026470364704647056470664707647086470964710647116471264713647146471564716647176471864719647206472164722647236472464725647266472764728647296473064731647326473364734647356473664737647386473964740647416474264743647446474564746647476474864749647506475164752647536475464755647566475764758647596476064761647626476364764647656476664767647686476964770647716477264773647746477564776647776477864779647806478164782647836478464785647866478764788647896479064791647926479364794647956479664797647986479964800648016480264803648046480564806648076480864809648106481164812648136481464815648166481764818648196482064821648226482364824648256482664827648286482964830648316483264833648346483564836648376483864839648406484164842648436484464845648466484764848648496485064851648526485364854648556485664857648586485964860648616486264863648646486564866648676486864869648706487164872648736487464875648766487764878648796488064881648826488364884648856488664887648886488964890648916489264893648946489564896648976489864899649006490164902649036490464905649066490764908649096491064911649126491364914649156491664917649186491964920649216492264923649246492564926649276492864929649306493164932649336493464935649366493764938649396494064941649426494364944649456494664947649486494964950649516495264953649546495564956649576495864959649606496164962649636496464965649666496764968649696497064971649726497364974649756497664977649786497964980649816498264983649846498564986649876498864989649906499164992649936499464995649966499764998649996500065001650026500365004650056500665007650086500965010650116501265013650146501565016650176501865019650206502165022650236502465025650266502765028650296503065031650326503365034650356503665037650386503965040650416504265043650446504565046650476504865049650506505165052650536505465055650566505765058650596506065061650626506365064650656506665067650686506965070650716507265073650746507565076650776507865079650806508165082650836508465085650866508765088650896509065091650926509365094650956509665097650986509965100651016510265103651046510565106651076510865109651106511165112651136511465115651166511765118651196512065121651226512365124651256512665127651286512965130651316513265133651346513565136651376513865139651406514165142651436514465145651466514765148651496515065151651526515365154651556515665157651586515965160651616516265163651646516565166651676516865169651706517165172651736517465175651766517765178651796518065181651826518365184651856518665187651886518965190651916519265193651946519565196651976519865199652006520165202652036520465205652066520765208652096521065211652126521365214652156521665217652186521965220652216522265223652246522565226652276522865229652306523165232652336523465235652366523765238652396524065241652426524365244652456524665247652486524965250652516525265253652546525565256652576525865259652606526165262652636526465265652666526765268652696527065271652726527365274652756527665277652786527965280652816528265283652846528565286652876528865289652906529165292652936529465295652966529765298652996530065301653026530365304653056530665307653086530965310653116531265313653146531565316653176531865319653206532165322653236532465325653266532765328653296533065331653326533365334653356533665337653386533965340653416534265343653446534565346653476534865349653506535165352653536535465355653566535765358653596536065361653626536365364653656536665367653686536965370653716537265373653746537565376653776537865379653806538165382653836538465385653866538765388653896539065391653926539365394653956539665397653986539965400654016540265403654046540565406654076540865409654106541165412654136541465415654166541765418654196542065421654226542365424654256542665427654286542965430654316543265433654346543565436654376543865439654406544165442654436544465445654466544765448654496545065451654526545365454654556545665457654586545965460654616546265463654646546565466654676546865469654706547165472654736547465475654766547765478654796548065481654826548365484654856548665487654886548965490654916549265493654946549565496654976549865499655006550165502655036550465505655066550765508655096551065511655126551365514655156551665517655186551965520655216552265523655246552565526655276552865529655306553165532655336553465535655366553765538655396554065541655426554365544655456554665547655486554965550655516555265553655546555565556655576555865559655606556165562655636556465565655666556765568655696557065571655726557365574655756557665577655786557965580655816558265583655846558565586655876558865589655906559165592655936559465595655966559765598655996560065601656026560365604656056560665607656086560965610656116561265613656146561565616656176561865619656206562165622656236562465625656266562765628656296563065631656326563365634656356563665637656386563965640656416564265643656446564565646656476564865649656506565165652656536565465655656566565765658656596566065661656626566365664656656566665667656686566965670656716567265673656746567565676656776567865679656806568165682656836568465685656866568765688656896569065691656926569365694656956569665697656986569965700657016570265703657046570565706657076570865709657106571165712657136571465715657166571765718657196572065721657226572365724657256572665727657286572965730657316573265733657346573565736657376573865739657406574165742657436574465745657466574765748657496575065751657526575365754657556575665757657586575965760657616576265763657646576565766657676576865769657706577165772657736577465775657766577765778657796578065781657826578365784657856578665787657886578965790657916579265793657946579565796657976579865799658006580165802658036580465805658066580765808658096581065811658126581365814658156581665817658186581965820658216582265823658246582565826658276582865829658306583165832658336583465835658366583765838658396584065841658426584365844658456584665847658486584965850658516585265853658546585565856658576585865859658606586165862658636586465865658666586765868658696587065871658726587365874658756587665877658786587965880658816588265883658846588565886658876588865889658906589165892658936589465895658966589765898658996590065901659026590365904659056590665907659086590965910659116591265913659146591565916659176591865919659206592165922659236592465925659266592765928659296593065931659326593365934659356593665937659386593965940659416594265943659446594565946659476594865949659506595165952659536595465955659566595765958659596596065961659626596365964659656596665967659686596965970659716597265973659746597565976659776597865979659806598165982659836598465985659866598765988659896599065991659926599365994659956599665997659986599966000660016600266003660046600566006660076600866009660106601166012660136601466015660166601766018660196602066021660226602366024660256602666027660286602966030660316603266033660346603566036660376603866039660406604166042660436604466045660466604766048660496605066051660526605366054660556605666057660586605966060660616606266063660646606566066660676606866069660706607166072660736607466075660766607766078660796608066081660826608366084660856608666087660886608966090660916609266093660946609566096660976609866099661006610166102661036610466105661066610766108661096611066111661126611366114661156611666117661186611966120661216612266123661246612566126661276612866129661306613166132661336613466135661366613766138661396614066141661426614366144661456614666147661486614966150661516615266153661546615566156661576615866159661606616166162661636616466165661666616766168661696617066171661726617366174661756617666177661786617966180661816618266183661846618566186661876618866189661906619166192661936619466195661966619766198661996620066201662026620366204662056620666207662086620966210662116621266213662146621566216662176621866219662206622166222662236622466225662266622766228662296623066231662326623366234662356623666237662386623966240662416624266243662446624566246662476624866249662506625166252662536625466255662566625766258662596626066261662626626366264662656626666267662686626966270662716627266273662746627566276662776627866279662806628166282662836628466285662866628766288662896629066291662926629366294662956629666297662986629966300663016630266303663046630566306663076630866309663106631166312663136631466315663166631766318663196632066321663226632366324663256632666327663286632966330663316633266333663346633566336663376633866339663406634166342663436634466345663466634766348663496635066351663526635366354663556635666357663586635966360663616636266363663646636566366663676636866369663706637166372663736637466375663766637766378663796638066381663826638366384663856638666387663886638966390663916639266393663946639566396663976639866399664006640166402664036640466405664066640766408664096641066411664126641366414664156641666417664186641966420664216642266423664246642566426664276642866429664306643166432664336643466435664366643766438664396644066441664426644366444664456644666447664486644966450664516645266453664546645566456664576645866459664606646166462664636646466465664666646766468664696647066471664726647366474664756647666477664786647966480664816648266483664846648566486664876648866489664906649166492664936649466495664966649766498664996650066501665026650366504665056650666507665086650966510665116651266513665146651566516665176651866519665206652166522665236652466525665266652766528665296653066531665326653366534665356653666537665386653966540665416654266543665446654566546665476654866549665506655166552665536655466555665566655766558665596656066561665626656366564665656656666567665686656966570665716657266573665746657566576665776657866579665806658166582665836658466585665866658766588665896659066591665926659366594665956659666597665986659966600666016660266603666046660566606666076660866609666106661166612666136661466615666166661766618666196662066621666226662366624666256662666627666286662966630666316663266633666346663566636666376663866639666406664166642666436664466645666466664766648666496665066651666526665366654666556665666657666586665966660666616666266663666646666566666666676666866669666706667166672666736667466675666766667766678666796668066681666826668366684666856668666687666886668966690666916669266693666946669566696666976669866699667006670166702667036670466705667066670766708667096671066711667126671366714667156671666717667186671966720667216672266723667246672566726667276672866729667306673166732667336673466735667366673766738667396674066741667426674366744667456674666747667486674966750667516675266753667546675566756667576675866759667606676166762667636676466765667666676766768667696677066771667726677366774667756677666777667786677966780667816678266783667846678566786667876678866789667906679166792667936679466795667966679766798667996680066801668026680366804668056680666807668086680966810668116681266813668146681566816668176681866819668206682166822668236682466825668266682766828668296683066831668326683366834668356683666837668386683966840668416684266843668446684566846668476684866849668506685166852668536685466855668566685766858668596686066861668626686366864668656686666867668686686966870668716687266873668746687566876668776687866879668806688166882668836688466885668866688766888668896689066891668926689366894668956689666897668986689966900669016690266903669046690566906669076690866909669106691166912669136691466915669166691766918669196692066921669226692366924669256692666927669286692966930669316693266933669346693566936669376693866939669406694166942669436694466945669466694766948669496695066951669526695366954669556695666957669586695966960669616696266963669646696566966669676696866969669706697166972669736697466975669766697766978669796698066981669826698366984669856698666987669886698966990669916699266993669946699566996669976699866999670006700167002670036700467005670066700767008670096701067011670126701367014670156701667017670186701967020670216702267023670246702567026670276702867029670306703167032670336703467035670366703767038670396704067041670426704367044670456704667047670486704967050670516705267053670546705567056670576705867059670606706167062670636706467065670666706767068670696707067071670726707367074670756707667077670786707967080670816708267083670846708567086670876708867089670906709167092670936709467095670966709767098670996710067101671026710367104671056710667107671086710967110671116711267113671146711567116671176711867119671206712167122671236712467125671266712767128671296713067131671326713367134671356713667137671386713967140671416714267143671446714567146671476714867149671506715167152671536715467155671566715767158671596716067161671626716367164671656716667167671686716967170671716717267173671746717567176671776717867179671806718167182671836718467185671866718767188671896719067191671926719367194671956719667197671986719967200672016720267203672046720567206672076720867209672106721167212672136721467215672166721767218672196722067221672226722367224672256722667227672286722967230672316723267233672346723567236672376723867239672406724167242672436724467245672466724767248672496725067251672526725367254672556725667257672586725967260672616726267263672646726567266672676726867269672706727167272672736727467275672766727767278672796728067281672826728367284672856728667287672886728967290672916729267293672946729567296672976729867299673006730167302673036730467305673066730767308673096731067311673126731367314673156731667317673186731967320673216732267323673246732567326673276732867329673306733167332673336733467335673366733767338673396734067341673426734367344673456734667347673486734967350673516735267353673546735567356673576735867359673606736167362673636736467365673666736767368673696737067371673726737367374673756737667377673786737967380673816738267383673846738567386673876738867389673906739167392673936739467395673966739767398673996740067401674026740367404674056740667407674086740967410674116741267413674146741567416674176741867419674206742167422674236742467425674266742767428674296743067431674326743367434674356743667437674386743967440674416744267443674446744567446674476744867449674506745167452674536745467455674566745767458674596746067461674626746367464674656746667467674686746967470674716747267473674746747567476674776747867479674806748167482674836748467485674866748767488674896749067491674926749367494674956749667497674986749967500675016750267503675046750567506675076750867509675106751167512675136751467515675166751767518675196752067521675226752367524675256752667527675286752967530675316753267533675346753567536675376753867539675406754167542675436754467545675466754767548675496755067551675526755367554675556755667557675586755967560675616756267563675646756567566675676756867569675706757167572675736757467575675766757767578675796758067581675826758367584675856758667587675886758967590675916759267593675946759567596675976759867599676006760167602676036760467605676066760767608676096761067611676126761367614676156761667617676186761967620676216762267623676246762567626676276762867629676306763167632676336763467635676366763767638676396764067641676426764367644676456764667647676486764967650676516765267653676546765567656676576765867659676606766167662676636766467665676666766767668676696767067671676726767367674676756767667677676786767967680676816768267683676846768567686676876768867689676906769167692676936769467695676966769767698676996770067701677026770367704677056770667707677086770967710677116771267713677146771567716677176771867719677206772167722677236772467725677266772767728677296773067731677326773367734677356773667737677386773967740677416774267743677446774567746677476774867749677506775167752677536775467755677566775767758677596776067761677626776367764677656776667767677686776967770677716777267773677746777567776677776777867779677806778167782677836778467785677866778767788677896779067791677926779367794677956779667797677986779967800678016780267803678046780567806678076780867809678106781167812678136781467815678166781767818678196782067821678226782367824678256782667827678286782967830678316783267833678346783567836678376783867839678406784167842678436784467845678466784767848678496785067851678526785367854678556785667857678586785967860678616786267863678646786567866678676786867869678706787167872678736787467875678766787767878678796788067881678826788367884678856788667887678886788967890678916789267893678946789567896678976789867899679006790167902679036790467905679066790767908679096791067911679126791367914679156791667917679186791967920679216792267923679246792567926679276792867929679306793167932679336793467935679366793767938679396794067941679426794367944679456794667947679486794967950679516795267953679546795567956679576795867959679606796167962679636796467965679666796767968679696797067971679726797367974679756797667977679786797967980679816798267983679846798567986679876798867989679906799167992679936799467995679966799767998679996800068001680026800368004680056800668007680086800968010680116801268013680146801568016680176801868019680206802168022680236802468025680266802768028680296803068031680326803368034680356803668037680386803968040680416804268043680446804568046680476804868049680506805168052680536805468055680566805768058680596806068061680626806368064680656806668067680686806968070680716807268073680746807568076680776807868079680806808168082680836808468085680866808768088680896809068091680926809368094680956809668097680986809968100681016810268103681046810568106681076810868109681106811168112681136811468115681166811768118681196812068121681226812368124681256812668127681286812968130681316813268133681346813568136681376813868139681406814168142681436814468145681466814768148681496815068151681526815368154681556815668157681586815968160681616816268163681646816568166681676816868169681706817168172681736817468175681766817768178681796818068181681826818368184681856818668187681886818968190681916819268193681946819568196681976819868199682006820168202682036820468205682066820768208682096821068211682126821368214682156821668217682186821968220682216822268223682246822568226682276822868229682306823168232682336823468235682366823768238682396824068241682426824368244682456824668247682486824968250682516825268253682546825568256682576825868259682606826168262682636826468265682666826768268682696827068271682726827368274682756827668277682786827968280682816828268283682846828568286682876828868289682906829168292682936829468295682966829768298682996830068301683026830368304683056830668307683086830968310683116831268313683146831568316683176831868319683206832168322683236832468325683266832768328683296833068331683326833368334683356833668337683386833968340683416834268343683446834568346683476834868349683506835168352683536835468355683566835768358683596836068361683626836368364683656836668367683686836968370683716837268373683746837568376683776837868379683806838168382683836838468385683866838768388683896839068391683926839368394683956839668397683986839968400684016840268403684046840568406684076840868409684106841168412684136841468415684166841768418684196842068421684226842368424684256842668427684286842968430684316843268433684346843568436684376843868439684406844168442684436844468445684466844768448684496845068451684526845368454684556845668457684586845968460684616846268463684646846568466684676846868469684706847168472684736847468475684766847768478684796848068481684826848368484684856848668487684886848968490684916849268493684946849568496684976849868499685006850168502685036850468505685066850768508685096851068511685126851368514685156851668517685186851968520685216852268523685246852568526685276852868529685306853168532685336853468535685366853768538685396854068541685426854368544685456854668547685486854968550685516855268553685546855568556685576855868559685606856168562685636856468565685666856768568685696857068571685726857368574685756857668577685786857968580685816858268583685846858568586685876858868589685906859168592685936859468595685966859768598685996860068601686026860368604686056860668607686086860968610686116861268613686146861568616686176861868619686206862168622686236862468625686266862768628686296863068631686326863368634686356863668637686386863968640686416864268643686446864568646686476864868649686506865168652686536865468655686566865768658686596866068661686626866368664686656866668667686686866968670686716867268673686746867568676686776867868679686806868168682686836868468685686866868768688686896869068691686926869368694686956869668697686986869968700687016870268703687046870568706687076870868709687106871168712687136871468715687166871768718687196872068721687226872368724687256872668727687286872968730687316873268733687346873568736687376873868739687406874168742687436874468745687466874768748687496875068751687526875368754687556875668757687586875968760687616876268763687646876568766687676876868769687706877168772687736877468775687766877768778687796878068781687826878368784687856878668787687886878968790687916879268793687946879568796687976879868799688006880168802688036880468805688066880768808688096881068811688126881368814688156881668817688186881968820688216882268823688246882568826688276882868829688306883168832688336883468835688366883768838688396884068841688426884368844688456884668847688486884968850688516885268853688546885568856688576885868859688606886168862688636886468865688666886768868688696887068871688726887368874688756887668877688786887968880688816888268883688846888568886688876888868889688906889168892688936889468895688966889768898688996890068901689026890368904689056890668907689086890968910689116891268913689146891568916689176891868919689206892168922689236892468925689266892768928689296893068931689326893368934689356893668937689386893968940689416894268943689446894568946689476894868949689506895168952689536895468955689566895768958689596896068961689626896368964689656896668967689686896968970689716897268973689746897568976689776897868979689806898168982689836898468985689866898768988689896899068991689926899368994689956899668997689986899969000690016900269003690046900569006690076900869009690106901169012690136901469015690166901769018690196902069021690226902369024690256902669027690286902969030690316903269033690346903569036690376903869039690406904169042690436904469045690466904769048690496905069051690526905369054690556905669057690586905969060690616906269063690646906569066690676906869069690706907169072690736907469075690766907769078690796908069081690826908369084690856908669087690886908969090690916909269093690946909569096690976909869099691006910169102691036910469105691066910769108691096911069111691126911369114691156911669117691186911969120691216912269123691246912569126691276912869129691306913169132691336913469135691366913769138691396914069141691426914369144691456914669147691486914969150691516915269153691546915569156691576915869159691606916169162691636916469165691666916769168691696917069171691726917369174691756917669177691786917969180691816918269183691846918569186691876918869189691906919169192691936919469195691966919769198691996920069201692026920369204692056920669207692086920969210692116921269213692146921569216692176921869219692206922169222692236922469225692266922769228692296923069231692326923369234692356923669237692386923969240692416924269243692446924569246692476924869249692506925169252692536925469255692566925769258692596926069261692626926369264692656926669267692686926969270692716927269273692746927569276692776927869279692806928169282692836928469285692866928769288692896929069291692926929369294692956929669297692986929969300693016930269303693046930569306693076930869309693106931169312693136931469315693166931769318693196932069321693226932369324693256932669327693286932969330693316933269333693346933569336693376933869339693406934169342693436934469345693466934769348693496935069351693526935369354693556935669357693586935969360693616936269363693646936569366693676936869369693706937169372693736937469375693766937769378693796938069381693826938369384693856938669387693886938969390693916939269393693946939569396693976939869399694006940169402694036940469405694066940769408694096941069411694126941369414694156941669417694186941969420694216942269423694246942569426694276942869429694306943169432694336943469435694366943769438694396944069441694426944369444694456944669447694486944969450694516945269453694546945569456694576945869459694606946169462694636946469465694666946769468694696947069471694726947369474694756947669477694786947969480694816948269483694846948569486694876948869489694906949169492694936949469495694966949769498694996950069501695026950369504695056950669507695086950969510695116951269513695146951569516695176951869519695206952169522695236952469525695266952769528695296953069531695326953369534695356953669537695386953969540695416954269543695446954569546695476954869549695506955169552695536955469555695566955769558695596956069561695626956369564695656956669567695686956969570695716957269573695746957569576695776957869579695806958169582695836958469585695866958769588695896959069591695926959369594695956959669597695986959969600696016960269603696046960569606696076960869609696106961169612696136961469615696166961769618696196962069621696226962369624696256962669627696286962969630696316963269633696346963569636696376963869639696406964169642696436964469645696466964769648696496965069651696526965369654696556965669657696586965969660696616966269663696646966569666696676966869669696706967169672696736967469675696766967769678696796968069681696826968369684696856968669687696886968969690696916969269693696946969569696696976969869699697006970169702697036970469705697066970769708697096971069711697126971369714697156971669717697186971969720697216972269723697246972569726697276972869729697306973169732697336973469735697366973769738697396974069741697426974369744697456974669747697486974969750697516975269753697546975569756697576975869759697606976169762697636976469765697666976769768697696977069771697726977369774697756977669777697786977969780697816978269783697846978569786697876978869789697906979169792697936979469795697966979769798697996980069801698026980369804698056980669807698086980969810698116981269813698146981569816698176981869819698206982169822698236982469825698266982769828698296983069831698326983369834698356983669837698386983969840698416984269843698446984569846698476984869849698506985169852698536985469855698566985769858698596986069861698626986369864698656986669867698686986969870698716987269873698746987569876698776987869879698806988169882698836988469885698866988769888698896989069891698926989369894698956989669897698986989969900699016990269903699046990569906699076990869909699106991169912699136991469915699166991769918699196992069921699226992369924699256992669927699286992969930699316993269933699346993569936699376993869939699406994169942699436994469945699466994769948699496995069951699526995369954699556995669957699586995969960699616996269963699646996569966699676996869969699706997169972699736997469975699766997769978699796998069981699826998369984699856998669987699886998969990699916999269993699946999569996699976999869999700007000170002700037000470005700067000770008700097001070011700127001370014700157001670017700187001970020700217002270023700247002570026700277002870029700307003170032700337003470035700367003770038700397004070041700427004370044700457004670047700487004970050700517005270053700547005570056700577005870059700607006170062700637006470065700667006770068700697007070071700727007370074700757007670077700787007970080700817008270083700847008570086700877008870089700907009170092700937009470095700967009770098700997010070101701027010370104701057010670107701087010970110701117011270113701147011570116701177011870119701207012170122701237012470125701267012770128701297013070131701327013370134701357013670137701387013970140701417014270143701447014570146701477014870149701507015170152701537015470155701567015770158701597016070161701627016370164701657016670167701687016970170701717017270173701747017570176701777017870179701807018170182701837018470185701867018770188701897019070191701927019370194701957019670197701987019970200702017020270203702047020570206702077020870209702107021170212702137021470215702167021770218702197022070221702227022370224702257022670227702287022970230702317023270233702347023570236702377023870239702407024170242702437024470245702467024770248702497025070251702527025370254702557025670257702587025970260702617026270263702647026570266702677026870269702707027170272702737027470275702767027770278702797028070281702827028370284702857028670287702887028970290702917029270293702947029570296702977029870299703007030170302703037030470305703067030770308703097031070311703127031370314703157031670317703187031970320703217032270323703247032570326703277032870329703307033170332703337033470335703367033770338703397034070341703427034370344703457034670347703487034970350703517035270353703547035570356703577035870359703607036170362703637036470365703667036770368703697037070371703727037370374703757037670377703787037970380703817038270383703847038570386703877038870389703907039170392703937039470395703967039770398703997040070401704027040370404704057040670407704087040970410704117041270413704147041570416704177041870419704207042170422704237042470425704267042770428704297043070431704327043370434704357043670437704387043970440704417044270443704447044570446704477044870449704507045170452704537045470455704567045770458704597046070461704627046370464704657046670467704687046970470704717047270473704747047570476704777047870479704807048170482704837048470485704867048770488704897049070491704927049370494704957049670497704987049970500705017050270503705047050570506705077050870509705107051170512705137051470515705167051770518705197052070521705227052370524705257052670527705287052970530705317053270533705347053570536705377053870539705407054170542705437054470545705467054770548705497055070551705527055370554705557055670557705587055970560705617056270563705647056570566705677056870569705707057170572705737057470575705767057770578705797058070581705827058370584705857058670587705887058970590705917059270593705947059570596705977059870599706007060170602706037060470605706067060770608706097061070611706127061370614706157061670617706187061970620706217062270623706247062570626706277062870629706307063170632706337063470635706367063770638706397064070641706427064370644706457064670647706487064970650706517065270653706547065570656706577065870659706607066170662706637066470665706667066770668706697067070671706727067370674706757067670677706787067970680706817068270683706847068570686706877068870689706907069170692706937069470695706967069770698706997070070701707027070370704707057070670707707087070970710707117071270713707147071570716707177071870719707207072170722707237072470725707267072770728707297073070731707327073370734707357073670737707387073970740707417074270743707447074570746707477074870749707507075170752707537075470755707567075770758707597076070761707627076370764707657076670767707687076970770707717077270773707747077570776707777077870779707807078170782707837078470785707867078770788707897079070791707927079370794707957079670797707987079970800708017080270803708047080570806708077080870809708107081170812708137081470815708167081770818708197082070821708227082370824708257082670827708287082970830708317083270833708347083570836708377083870839708407084170842708437084470845708467084770848708497085070851708527085370854708557085670857708587085970860708617086270863708647086570866708677086870869708707087170872708737087470875708767087770878708797088070881708827088370884708857088670887708887088970890708917089270893708947089570896708977089870899709007090170902709037090470905709067090770908709097091070911709127091370914709157091670917709187091970920709217092270923709247092570926709277092870929709307093170932709337093470935709367093770938709397094070941709427094370944709457094670947709487094970950709517095270953709547095570956709577095870959709607096170962709637096470965709667096770968709697097070971709727097370974709757097670977709787097970980709817098270983709847098570986709877098870989709907099170992709937099470995709967099770998709997100071001710027100371004710057100671007710087100971010710117101271013710147101571016710177101871019710207102171022710237102471025710267102771028710297103071031710327103371034710357103671037710387103971040710417104271043710447104571046710477104871049710507105171052710537105471055710567105771058710597106071061710627106371064710657106671067710687106971070710717107271073710747107571076710777107871079710807108171082710837108471085710867108771088710897109071091710927109371094710957109671097710987109971100711017110271103711047110571106711077110871109711107111171112711137111471115711167111771118711197112071121711227112371124711257112671127711287112971130711317113271133711347113571136711377113871139711407114171142711437114471145711467114771148711497115071151711527115371154711557115671157711587115971160711617116271163711647116571166711677116871169711707117171172711737117471175711767117771178711797118071181711827118371184711857118671187711887118971190711917119271193711947119571196711977119871199712007120171202712037120471205712067120771208712097121071211712127121371214712157121671217712187121971220712217122271223712247122571226712277122871229712307123171232712337123471235712367123771238712397124071241712427124371244712457124671247712487124971250712517125271253712547125571256712577125871259712607126171262712637126471265712667126771268712697127071271712727127371274712757127671277712787127971280712817128271283712847128571286712877128871289712907129171292712937129471295712967129771298712997130071301713027130371304713057130671307713087130971310713117131271313713147131571316713177131871319713207132171322713237132471325713267132771328713297133071331713327133371334713357133671337713387133971340713417134271343713447134571346713477134871349713507135171352713537135471355713567135771358713597136071361713627136371364713657136671367713687136971370713717137271373713747137571376713777137871379713807138171382713837138471385713867138771388713897139071391713927139371394713957139671397713987139971400714017140271403714047140571406714077140871409714107141171412714137141471415714167141771418714197142071421714227142371424714257142671427714287142971430714317143271433714347143571436714377143871439714407144171442714437144471445714467144771448714497145071451714527145371454714557145671457714587145971460714617146271463714647146571466714677146871469714707147171472714737147471475714767147771478714797148071481714827148371484714857148671487714887148971490714917149271493714947149571496714977149871499715007150171502715037150471505715067150771508715097151071511715127151371514715157151671517715187151971520715217152271523715247152571526715277152871529715307153171532715337153471535715367153771538715397154071541715427154371544715457154671547715487154971550715517155271553715547155571556715577155871559715607156171562715637156471565715667156771568715697157071571715727157371574715757157671577715787157971580715817158271583715847158571586715877158871589715907159171592715937159471595715967159771598715997160071601716027160371604716057160671607716087160971610716117161271613716147161571616716177161871619716207162171622716237162471625716267162771628716297163071631716327163371634716357163671637716387163971640716417164271643716447164571646716477164871649716507165171652716537165471655716567165771658716597166071661716627166371664716657166671667716687166971670716717167271673716747167571676716777167871679716807168171682716837168471685716867168771688716897169071691716927169371694716957169671697716987169971700717017170271703717047170571706717077170871709717107171171712717137171471715717167171771718717197172071721717227172371724717257172671727717287172971730717317173271733717347173571736717377173871739717407174171742717437174471745717467174771748717497175071751717527175371754717557175671757717587175971760717617176271763717647176571766717677176871769717707177171772717737177471775717767177771778717797178071781717827178371784717857178671787717887178971790717917179271793717947179571796717977179871799718007180171802718037180471805718067180771808718097181071811718127181371814718157181671817718187181971820718217182271823718247182571826718277182871829718307183171832718337183471835718367183771838718397184071841718427184371844718457184671847718487184971850718517185271853718547185571856718577185871859718607186171862718637186471865718667186771868718697187071871718727187371874718757187671877718787187971880718817188271883718847188571886718877188871889718907189171892718937189471895718967189771898718997190071901719027190371904719057190671907719087190971910719117191271913719147191571916719177191871919719207192171922719237192471925719267192771928719297193071931719327193371934719357193671937719387193971940719417194271943719447194571946719477194871949719507195171952719537195471955719567195771958719597196071961719627196371964719657196671967719687196971970719717197271973719747197571976719777197871979719807198171982719837198471985719867198771988719897199071991719927199371994719957199671997719987199972000720017200272003720047200572006720077200872009720107201172012720137201472015720167201772018720197202072021720227202372024720257202672027720287202972030720317203272033720347203572036720377203872039720407204172042720437204472045720467204772048720497205072051720527205372054720557205672057720587205972060720617206272063720647206572066720677206872069720707207172072720737207472075720767207772078720797208072081720827208372084720857208672087720887208972090720917209272093720947209572096720977209872099721007210172102721037210472105721067210772108721097211072111721127211372114721157211672117721187211972120721217212272123721247212572126721277212872129721307213172132721337213472135721367213772138721397214072141721427214372144721457214672147721487214972150721517215272153721547215572156721577215872159721607216172162721637216472165721667216772168721697217072171721727217372174721757217672177721787217972180721817218272183721847218572186721877218872189721907219172192721937219472195721967219772198721997220072201722027220372204722057220672207722087220972210722117221272213722147221572216722177221872219722207222172222722237222472225722267222772228722297223072231722327223372234722357223672237722387223972240722417224272243722447224572246722477224872249722507225172252722537225472255722567225772258722597226072261722627226372264722657226672267722687226972270722717227272273722747227572276722777227872279722807228172282722837228472285722867228772288722897229072291722927229372294722957229672297722987229972300723017230272303723047230572306723077230872309723107231172312723137231472315723167231772318723197232072321723227232372324723257232672327723287232972330723317233272333723347233572336723377233872339723407234172342723437234472345723467234772348723497235072351723527235372354723557235672357723587235972360723617236272363723647236572366723677236872369723707237172372723737237472375723767237772378723797238072381723827238372384723857238672387723887238972390723917239272393723947239572396723977239872399724007240172402724037240472405724067240772408724097241072411724127241372414724157241672417724187241972420724217242272423724247242572426724277242872429724307243172432724337243472435724367243772438724397244072441724427244372444724457244672447724487244972450724517245272453724547245572456724577245872459724607246172462724637246472465724667246772468724697247072471724727247372474724757247672477724787247972480724817248272483724847248572486724877248872489724907249172492724937249472495724967249772498724997250072501725027250372504725057250672507725087250972510725117251272513725147251572516725177251872519725207252172522725237252472525725267252772528725297253072531725327253372534725357253672537725387253972540725417254272543725447254572546725477254872549725507255172552725537255472555725567255772558725597256072561725627256372564725657256672567725687256972570725717257272573725747257572576725777257872579725807258172582725837258472585725867258772588725897259072591725927259372594725957259672597725987259972600726017260272603726047260572606726077260872609726107261172612726137261472615726167261772618726197262072621726227262372624726257262672627726287262972630726317263272633726347263572636726377263872639726407264172642726437264472645726467264772648726497265072651726527265372654726557265672657726587265972660726617266272663726647266572666726677266872669726707267172672726737267472675726767267772678726797268072681726827268372684726857268672687726887268972690726917269272693726947269572696726977269872699727007270172702727037270472705727067270772708727097271072711727127271372714727157271672717727187271972720727217272272723727247272572726727277272872729727307273172732727337273472735727367273772738727397274072741727427274372744727457274672747727487274972750727517275272753727547275572756727577275872759727607276172762727637276472765727667276772768727697277072771727727277372774727757277672777727787277972780727817278272783727847278572786727877278872789727907279172792727937279472795727967279772798727997280072801728027280372804728057280672807728087280972810728117281272813728147281572816728177281872819728207282172822728237282472825728267282772828728297283072831728327283372834728357283672837728387283972840728417284272843728447284572846728477284872849728507285172852728537285472855728567285772858728597286072861728627286372864728657286672867728687286972870728717287272873728747287572876728777287872879728807288172882728837288472885728867288772888728897289072891728927289372894728957289672897728987289972900729017290272903729047290572906729077290872909729107291172912729137291472915729167291772918729197292072921729227292372924729257292672927729287292972930729317293272933729347293572936729377293872939729407294172942729437294472945729467294772948729497295072951729527295372954729557295672957729587295972960729617296272963729647296572966729677296872969729707297172972729737297472975729767297772978729797298072981729827298372984729857298672987729887298972990729917299272993729947299572996729977299872999730007300173002730037300473005730067300773008730097301073011730127301373014730157301673017730187301973020730217302273023730247302573026730277302873029730307303173032730337303473035730367303773038730397304073041730427304373044730457304673047730487304973050730517305273053730547305573056730577305873059730607306173062730637306473065730667306773068730697307073071730727307373074730757307673077730787307973080730817308273083730847308573086730877308873089730907309173092730937309473095730967309773098730997310073101731027310373104731057310673107731087310973110731117311273113731147311573116731177311873119731207312173122731237312473125731267312773128731297313073131731327313373134731357313673137731387313973140731417314273143731447314573146731477314873149731507315173152731537315473155731567315773158731597316073161731627316373164731657316673167731687316973170731717317273173731747317573176731777317873179731807318173182731837318473185731867318773188731897319073191731927319373194731957319673197731987319973200732017320273203732047320573206732077320873209732107321173212732137321473215732167321773218732197322073221732227322373224732257322673227732287322973230732317323273233732347323573236732377323873239732407324173242732437324473245732467324773248732497325073251732527325373254732557325673257732587325973260732617326273263732647326573266732677326873269732707327173272732737327473275732767327773278732797328073281732827328373284732857328673287732887328973290732917329273293732947329573296732977329873299733007330173302733037330473305733067330773308733097331073311733127331373314733157331673317733187331973320733217332273323733247332573326733277332873329733307333173332733337333473335733367333773338733397334073341733427334373344733457334673347733487334973350733517335273353733547335573356733577335873359733607336173362733637336473365733667336773368733697337073371733727337373374733757337673377733787337973380733817338273383733847338573386733877338873389733907339173392733937339473395733967339773398733997340073401734027340373404734057340673407734087340973410734117341273413734147341573416734177341873419734207342173422734237342473425734267342773428734297343073431734327343373434734357343673437734387343973440734417344273443734447344573446734477344873449734507345173452734537345473455734567345773458734597346073461734627346373464734657346673467734687346973470734717347273473734747347573476734777347873479734807348173482734837348473485734867348773488734897349073491734927349373494734957349673497734987349973500735017350273503735047350573506735077350873509735107351173512735137351473515735167351773518735197352073521735227352373524735257352673527735287352973530735317353273533735347353573536735377353873539735407354173542735437354473545735467354773548735497355073551735527355373554735557355673557735587355973560735617356273563735647356573566735677356873569735707357173572735737357473575735767357773578735797358073581735827358373584735857358673587735887358973590735917359273593735947359573596735977359873599736007360173602736037360473605736067360773608736097361073611736127361373614736157361673617736187361973620736217362273623736247362573626736277362873629736307363173632736337363473635736367363773638736397364073641736427364373644736457364673647736487364973650736517365273653736547365573656736577365873659736607366173662736637366473665736667366773668736697367073671736727367373674736757367673677736787367973680736817368273683736847368573686736877368873689736907369173692736937369473695736967369773698736997370073701737027370373704737057370673707737087370973710737117371273713737147371573716737177371873719737207372173722737237372473725737267372773728737297373073731737327373373734737357373673737737387373973740737417374273743737447374573746737477374873749737507375173752737537375473755737567375773758737597376073761737627376373764737657376673767737687376973770737717377273773737747377573776737777377873779737807378173782737837378473785737867378773788737897379073791737927379373794737957379673797737987379973800738017380273803738047380573806738077380873809738107381173812738137381473815738167381773818738197382073821738227382373824738257382673827738287382973830738317383273833738347383573836738377383873839738407384173842738437384473845738467384773848738497385073851738527385373854738557385673857738587385973860738617386273863738647386573866738677386873869738707387173872738737387473875738767387773878738797388073881738827388373884738857388673887738887388973890738917389273893738947389573896738977389873899739007390173902739037390473905739067390773908739097391073911739127391373914739157391673917739187391973920739217392273923739247392573926739277392873929739307393173932739337393473935739367393773938739397394073941739427394373944739457394673947739487394973950739517395273953739547395573956739577395873959739607396173962739637396473965739667396773968739697397073971739727397373974739757397673977739787397973980739817398273983739847398573986739877398873989739907399173992739937399473995739967399773998739997400074001740027400374004740057400674007740087400974010740117401274013740147401574016740177401874019740207402174022740237402474025740267402774028740297403074031740327403374034740357403674037740387403974040740417404274043740447404574046740477404874049740507405174052740537405474055740567405774058740597406074061740627406374064740657406674067740687406974070740717407274073740747407574076740777407874079740807408174082740837408474085740867408774088740897409074091740927409374094740957409674097740987409974100741017410274103741047410574106741077410874109741107411174112741137411474115741167411774118741197412074121741227412374124741257412674127741287412974130741317413274133741347413574136741377413874139741407414174142741437414474145741467414774148741497415074151741527415374154741557415674157741587415974160741617416274163741647416574166741677416874169741707417174172741737417474175741767417774178741797418074181741827418374184741857418674187741887418974190741917419274193741947419574196741977419874199742007420174202742037420474205742067420774208742097421074211742127421374214742157421674217742187421974220742217422274223742247422574226742277422874229742307423174232742337423474235742367423774238742397424074241742427424374244742457424674247742487424974250742517425274253742547425574256742577425874259742607426174262742637426474265742667426774268742697427074271742727427374274742757427674277742787427974280742817428274283742847428574286742877428874289742907429174292742937429474295742967429774298742997430074301743027430374304743057430674307743087430974310743117431274313743147431574316743177431874319743207432174322743237432474325743267432774328743297433074331743327433374334743357433674337743387433974340743417434274343743447434574346743477434874349743507435174352743537435474355743567435774358743597436074361743627436374364743657436674367743687436974370743717437274373743747437574376743777437874379743807438174382743837438474385743867438774388743897439074391743927439374394743957439674397743987439974400744017440274403744047440574406744077440874409744107441174412744137441474415744167441774418744197442074421744227442374424744257442674427744287442974430744317443274433744347443574436744377443874439744407444174442744437444474445744467444774448744497445074451744527445374454744557445674457744587445974460744617446274463744647446574466744677446874469744707447174472744737447474475744767447774478744797448074481744827448374484744857448674487744887448974490744917449274493744947449574496744977449874499745007450174502745037450474505745067450774508745097451074511745127451374514745157451674517745187451974520745217452274523745247452574526745277452874529745307453174532745337453474535745367453774538745397454074541745427454374544745457454674547745487454974550745517455274553745547455574556745577455874559745607456174562745637456474565745667456774568745697457074571745727457374574745757457674577745787457974580745817458274583745847458574586745877458874589745907459174592745937459474595745967459774598745997460074601746027460374604746057460674607746087460974610746117461274613746147461574616746177461874619746207462174622746237462474625746267462774628746297463074631746327463374634746357463674637746387463974640746417464274643746447464574646746477464874649746507465174652746537465474655746567465774658746597466074661746627466374664746657466674667746687466974670746717467274673746747467574676746777467874679746807468174682746837468474685746867468774688746897469074691746927469374694746957469674697746987469974700747017470274703747047470574706747077470874709747107471174712747137471474715747167471774718747197472074721747227472374724747257472674727747287472974730747317473274733747347473574736747377473874739747407474174742747437474474745747467474774748747497475074751747527475374754747557475674757747587475974760747617476274763747647476574766747677476874769747707477174772747737477474775747767477774778747797478074781747827478374784747857478674787747887478974790747917479274793747947479574796747977479874799748007480174802748037480474805748067480774808748097481074811748127481374814748157481674817748187481974820748217482274823748247482574826748277482874829748307483174832748337483474835748367483774838748397484074841748427484374844748457484674847748487484974850748517485274853748547485574856748577485874859748607486174862748637486474865748667486774868748697487074871748727487374874748757487674877748787487974880748817488274883748847488574886748877488874889748907489174892748937489474895748967489774898748997490074901749027490374904749057490674907749087490974910749117491274913749147491574916749177491874919749207492174922749237492474925749267492774928749297493074931749327493374934749357493674937749387493974940749417494274943749447494574946749477494874949749507495174952749537495474955749567495774958749597496074961749627496374964749657496674967749687496974970749717497274973749747497574976749777497874979749807498174982749837498474985749867498774988749897499074991749927499374994749957499674997749987499975000750017500275003750047500575006750077500875009750107501175012750137501475015750167501775018750197502075021750227502375024750257502675027750287502975030750317503275033750347503575036750377503875039750407504175042750437504475045750467504775048750497505075051750527505375054750557505675057750587505975060750617506275063750647506575066750677506875069750707507175072750737507475075750767507775078750797508075081750827508375084750857508675087750887508975090750917509275093750947509575096750977509875099751007510175102751037510475105751067510775108751097511075111751127511375114751157511675117751187511975120751217512275123751247512575126751277512875129751307513175132751337513475135751367513775138751397514075141751427514375144751457514675147751487514975150751517515275153751547515575156751577515875159751607516175162751637516475165751667516775168751697517075171751727517375174751757517675177751787517975180751817518275183751847518575186751877518875189751907519175192751937519475195751967519775198751997520075201752027520375204752057520675207752087520975210752117521275213752147521575216752177521875219752207522175222752237522475225752267522775228752297523075231752327523375234752357523675237752387523975240752417524275243752447524575246752477524875249752507525175252752537525475255752567525775258752597526075261752627526375264752657526675267752687526975270752717527275273752747527575276752777527875279752807528175282752837528475285752867528775288752897529075291752927529375294752957529675297752987529975300753017530275303753047530575306753077530875309753107531175312753137531475315753167531775318753197532075321753227532375324753257532675327753287532975330753317533275333753347533575336753377533875339753407534175342753437534475345753467534775348753497535075351753527535375354753557535675357753587535975360753617536275363753647536575366753677536875369753707537175372753737537475375753767537775378753797538075381753827538375384753857538675387753887538975390753917539275393753947539575396753977539875399754007540175402754037540475405754067540775408754097541075411754127541375414754157541675417754187541975420754217542275423754247542575426754277542875429754307543175432754337543475435754367543775438754397544075441754427544375444754457544675447754487544975450754517545275453754547545575456754577545875459754607546175462754637546475465754667546775468754697547075471754727547375474754757547675477754787547975480754817548275483754847548575486754877548875489754907549175492754937549475495754967549775498754997550075501755027550375504755057550675507755087550975510755117551275513755147551575516755177551875519755207552175522755237552475525755267552775528755297553075531755327553375534755357553675537755387553975540755417554275543755447554575546755477554875549755507555175552755537555475555755567555775558755597556075561755627556375564755657556675567755687556975570755717557275573755747557575576755777557875579755807558175582755837558475585755867558775588755897559075591755927559375594755957559675597755987559975600756017560275603756047560575606756077560875609756107561175612756137561475615756167561775618756197562075621756227562375624756257562675627756287562975630756317563275633756347563575636756377563875639756407564175642756437564475645756467564775648756497565075651756527565375654756557565675657756587565975660756617566275663756647566575666756677566875669756707567175672756737567475675756767567775678756797568075681756827568375684756857568675687756887568975690756917569275693756947569575696756977569875699757007570175702757037570475705757067570775708757097571075711757127571375714757157571675717757187571975720757217572275723757247572575726757277572875729757307573175732757337573475735757367573775738757397574075741757427574375744757457574675747757487574975750757517575275753757547575575756757577575875759757607576175762757637576475765757667576775768757697577075771757727577375774757757577675777757787577975780757817578275783757847578575786757877578875789757907579175792757937579475795757967579775798757997580075801758027580375804758057580675807758087580975810758117581275813758147581575816758177581875819758207582175822758237582475825758267582775828758297583075831758327583375834758357583675837758387583975840758417584275843758447584575846758477584875849758507585175852758537585475855758567585775858758597586075861758627586375864758657586675867758687586975870758717587275873758747587575876758777587875879758807588175882758837588475885758867588775888758897589075891758927589375894758957589675897758987589975900759017590275903759047590575906759077590875909759107591175912759137591475915759167591775918759197592075921759227592375924759257592675927759287592975930759317593275933759347593575936759377593875939759407594175942759437594475945759467594775948759497595075951759527595375954759557595675957759587595975960759617596275963759647596575966759677596875969759707597175972759737597475975759767597775978759797598075981759827598375984759857598675987759887598975990759917599275993759947599575996759977599875999760007600176002760037600476005760067600776008760097601076011760127601376014760157601676017760187601976020760217602276023760247602576026760277602876029760307603176032760337603476035760367603776038760397604076041760427604376044760457604676047760487604976050760517605276053760547605576056760577605876059760607606176062760637606476065760667606776068760697607076071760727607376074760757607676077760787607976080760817608276083760847608576086760877608876089760907609176092760937609476095760967609776098760997610076101761027610376104761057610676107761087610976110761117611276113761147611576116761177611876119761207612176122761237612476125761267612776128761297613076131761327613376134761357613676137761387613976140761417614276143761447614576146761477614876149761507615176152761537615476155761567615776158761597616076161761627616376164761657616676167761687616976170761717617276173761747617576176761777617876179761807618176182761837618476185761867618776188761897619076191761927619376194761957619676197761987619976200762017620276203762047620576206762077620876209762107621176212762137621476215762167621776218762197622076221762227622376224762257622676227762287622976230762317623276233762347623576236762377623876239762407624176242762437624476245762467624776248762497625076251762527625376254762557625676257762587625976260762617626276263762647626576266762677626876269762707627176272762737627476275762767627776278762797628076281762827628376284762857628676287762887628976290762917629276293762947629576296762977629876299763007630176302763037630476305763067630776308763097631076311763127631376314763157631676317763187631976320763217632276323763247632576326763277632876329763307633176332763337633476335763367633776338763397634076341763427634376344763457634676347763487634976350763517635276353763547635576356763577635876359763607636176362763637636476365763667636776368763697637076371763727637376374763757637676377763787637976380763817638276383763847638576386763877638876389763907639176392763937639476395763967639776398763997640076401764027640376404764057640676407764087640976410764117641276413764147641576416764177641876419764207642176422764237642476425764267642776428764297643076431764327643376434764357643676437764387643976440764417644276443764447644576446764477644876449764507645176452764537645476455764567645776458764597646076461764627646376464764657646676467764687646976470764717647276473764747647576476764777647876479764807648176482764837648476485764867648776488764897649076491764927649376494764957649676497764987649976500765017650276503765047650576506765077650876509765107651176512765137651476515765167651776518765197652076521765227652376524765257652676527765287652976530765317653276533765347653576536765377653876539765407654176542765437654476545765467654776548765497655076551765527655376554765557655676557765587655976560765617656276563765647656576566765677656876569765707657176572765737657476575765767657776578765797658076581765827658376584765857658676587765887658976590765917659276593765947659576596765977659876599766007660176602766037660476605766067660776608766097661076611766127661376614766157661676617766187661976620766217662276623766247662576626766277662876629766307663176632766337663476635766367663776638766397664076641766427664376644766457664676647766487664976650766517665276653766547665576656766577665876659766607666176662766637666476665766667666776668766697667076671766727667376674766757667676677766787667976680766817668276683766847668576686766877668876689766907669176692766937669476695766967669776698766997670076701767027670376704767057670676707767087670976710767117671276713767147671576716767177671876719767207672176722767237672476725767267672776728767297673076731767327673376734767357673676737767387673976740767417674276743767447674576746767477674876749767507675176752767537675476755767567675776758767597676076761767627676376764767657676676767767687676976770767717677276773767747677576776767777677876779767807678176782767837678476785767867678776788767897679076791767927679376794767957679676797767987679976800768017680276803768047680576806768077680876809768107681176812768137681476815768167681776818768197682076821768227682376824768257682676827768287682976830768317683276833768347683576836768377683876839768407684176842768437684476845768467684776848768497685076851768527685376854768557685676857768587685976860768617686276863768647686576866768677686876869768707687176872768737687476875768767687776878768797688076881768827688376884768857688676887768887688976890768917689276893768947689576896768977689876899769007690176902769037690476905769067690776908769097691076911769127691376914769157691676917769187691976920769217692276923769247692576926769277692876929769307693176932769337693476935769367693776938769397694076941769427694376944769457694676947769487694976950769517695276953769547695576956769577695876959769607696176962769637696476965769667696776968769697697076971769727697376974769757697676977769787697976980769817698276983769847698576986769877698876989769907699176992769937699476995769967699776998769997700077001770027700377004770057700677007770087700977010770117701277013770147701577016770177701877019770207702177022770237702477025770267702777028770297703077031770327703377034770357703677037770387703977040770417704277043770447704577046770477704877049770507705177052770537705477055770567705777058770597706077061770627706377064770657706677067770687706977070770717707277073770747707577076770777707877079770807708177082770837708477085770867708777088770897709077091770927709377094770957709677097770987709977100771017710277103771047710577106771077710877109771107711177112771137711477115771167711777118771197712077121771227712377124771257712677127771287712977130771317713277133771347713577136771377713877139771407714177142771437714477145771467714777148771497715077151771527715377154771557715677157771587715977160771617716277163771647716577166771677716877169771707717177172771737717477175771767717777178771797718077181771827718377184771857718677187771887718977190771917719277193771947719577196771977719877199772007720177202772037720477205772067720777208772097721077211772127721377214772157721677217772187721977220772217722277223772247722577226772277722877229772307723177232772337723477235772367723777238772397724077241772427724377244772457724677247772487724977250772517725277253772547725577256772577725877259772607726177262772637726477265772667726777268772697727077271772727727377274772757727677277772787727977280772817728277283772847728577286772877728877289772907729177292772937729477295772967729777298772997730077301773027730377304773057730677307773087730977310773117731277313773147731577316773177731877319773207732177322773237732477325773267732777328773297733077331773327733377334773357733677337773387733977340773417734277343773447734577346773477734877349773507735177352773537735477355773567735777358773597736077361773627736377364773657736677367773687736977370773717737277373773747737577376773777737877379773807738177382773837738477385773867738777388773897739077391773927739377394773957739677397773987739977400774017740277403774047740577406774077740877409774107741177412774137741477415774167741777418774197742077421774227742377424774257742677427774287742977430774317743277433774347743577436774377743877439774407744177442774437744477445774467744777448774497745077451774527745377454774557745677457774587745977460774617746277463774647746577466774677746877469774707747177472774737747477475774767747777478774797748077481774827748377484774857748677487774887748977490774917749277493774947749577496774977749877499775007750177502775037750477505775067750777508775097751077511775127751377514775157751677517775187751977520775217752277523775247752577526775277752877529775307753177532775337753477535775367753777538775397754077541775427754377544775457754677547775487754977550775517755277553775547755577556775577755877559775607756177562775637756477565775667756777568775697757077571775727757377574775757757677577775787757977580775817758277583775847758577586775877758877589775907759177592775937759477595775967759777598775997760077601776027760377604776057760677607776087760977610776117761277613776147761577616776177761877619776207762177622776237762477625776267762777628776297763077631776327763377634776357763677637776387763977640776417764277643776447764577646776477764877649776507765177652776537765477655776567765777658776597766077661776627766377664776657766677667776687766977670776717767277673776747767577676776777767877679776807768177682776837768477685776867768777688776897769077691776927769377694776957769677697776987769977700777017770277703777047770577706777077770877709777107771177712777137771477715777167771777718777197772077721777227772377724777257772677727777287772977730777317773277733777347773577736777377773877739777407774177742777437774477745777467774777748777497775077751777527775377754777557775677757777587775977760777617776277763777647776577766777677776877769777707777177772777737777477775777767777777778777797778077781777827778377784777857778677787777887778977790777917779277793777947779577796777977779877799778007780177802778037780477805778067780777808778097781077811778127781377814778157781677817778187781977820778217782277823778247782577826778277782877829778307783177832778337783477835778367783777838778397784077841778427784377844778457784677847778487784977850778517785277853778547785577856778577785877859778607786177862778637786477865778667786777868778697787077871778727787377874778757787677877778787787977880778817788277883778847788577886778877788877889778907789177892778937789477895778967789777898778997790077901779027790377904779057790677907779087790977910779117791277913779147791577916779177791877919779207792177922779237792477925779267792777928779297793077931779327793377934779357793677937779387793977940779417794277943779447794577946779477794877949779507795177952779537795477955779567795777958779597796077961779627796377964779657796677967779687796977970779717797277973779747797577976779777797877979779807798177982779837798477985779867798777988779897799077991779927799377994779957799677997779987799978000780017800278003780047800578006780077800878009780107801178012780137801478015780167801778018780197802078021780227802378024780257802678027780287802978030780317803278033780347803578036780377803878039780407804178042780437804478045780467804778048780497805078051780527805378054780557805678057780587805978060780617806278063780647806578066780677806878069780707807178072780737807478075780767807778078780797808078081780827808378084780857808678087780887808978090780917809278093780947809578096780977809878099781007810178102781037810478105781067810778108781097811078111781127811378114781157811678117781187811978120781217812278123781247812578126781277812878129781307813178132781337813478135781367813778138781397814078141781427814378144781457814678147781487814978150781517815278153781547815578156781577815878159781607816178162781637816478165781667816778168781697817078171781727817378174781757817678177781787817978180781817818278183781847818578186781877818878189781907819178192781937819478195781967819778198781997820078201782027820378204782057820678207782087820978210782117821278213782147821578216782177821878219782207822178222782237822478225782267822778228782297823078231782327823378234782357823678237782387823978240782417824278243782447824578246782477824878249782507825178252782537825478255782567825778258782597826078261782627826378264782657826678267782687826978270782717827278273782747827578276782777827878279782807828178282782837828478285782867828778288782897829078291782927829378294782957829678297782987829978300783017830278303783047830578306783077830878309783107831178312783137831478315783167831778318783197832078321783227832378324783257832678327783287832978330783317833278333783347833578336783377833878339783407834178342783437834478345783467834778348783497835078351783527835378354783557835678357783587835978360783617836278363783647836578366783677836878369783707837178372783737837478375783767837778378783797838078381783827838378384783857838678387783887838978390783917839278393783947839578396783977839878399784007840178402784037840478405784067840778408784097841078411784127841378414784157841678417784187841978420784217842278423784247842578426784277842878429784307843178432784337843478435784367843778438784397844078441784427844378444784457844678447784487844978450784517845278453784547845578456784577845878459784607846178462784637846478465784667846778468784697847078471784727847378474784757847678477784787847978480784817848278483784847848578486784877848878489784907849178492784937849478495784967849778498784997850078501785027850378504785057850678507785087850978510785117851278513785147851578516785177851878519785207852178522785237852478525785267852778528785297853078531785327853378534785357853678537785387853978540785417854278543785447854578546785477854878549785507855178552785537855478555785567855778558785597856078561785627856378564785657856678567785687856978570785717857278573785747857578576785777857878579785807858178582785837858478585785867858778588785897859078591785927859378594785957859678597785987859978600786017860278603786047860578606786077860878609786107861178612786137861478615786167861778618786197862078621786227862378624786257862678627786287862978630786317863278633786347863578636786377863878639786407864178642786437864478645786467864778648786497865078651786527865378654786557865678657786587865978660786617866278663786647866578666786677866878669786707867178672786737867478675786767867778678786797868078681786827868378684786857868678687786887868978690786917869278693786947869578696786977869878699787007870178702787037870478705787067870778708787097871078711787127871378714787157871678717787187871978720787217872278723787247872578726787277872878729787307873178732787337873478735787367873778738787397874078741787427874378744787457874678747787487874978750787517875278753787547875578756787577875878759787607876178762787637876478765787667876778768787697877078771787727877378774787757877678777787787877978780787817878278783787847878578786787877878878789787907879178792787937879478795787967879778798787997880078801788027880378804788057880678807788087880978810788117881278813788147881578816788177881878819788207882178822788237882478825788267882778828788297883078831788327883378834788357883678837788387883978840788417884278843788447884578846788477884878849788507885178852788537885478855788567885778858788597886078861788627886378864788657886678867788687886978870788717887278873788747887578876788777887878879788807888178882788837888478885788867888778888788897889078891788927889378894788957889678897788987889978900789017890278903789047890578906789077890878909789107891178912789137891478915789167891778918789197892078921789227892378924789257892678927789287892978930789317893278933789347893578936789377893878939789407894178942789437894478945789467894778948789497895078951789527895378954789557895678957789587895978960789617896278963789647896578966789677896878969789707897178972789737897478975789767897778978789797898078981789827898378984789857898678987789887898978990789917899278993789947899578996789977899878999790007900179002790037900479005790067900779008790097901079011790127901379014790157901679017790187901979020790217902279023790247902579026790277902879029790307903179032790337903479035790367903779038790397904079041790427904379044790457904679047790487904979050790517905279053790547905579056790577905879059790607906179062790637906479065790667906779068790697907079071790727907379074790757907679077790787907979080790817908279083790847908579086790877908879089790907909179092790937909479095790967909779098790997910079101791027910379104791057910679107791087910979110791117911279113791147911579116791177911879119791207912179122791237912479125791267912779128791297913079131791327913379134791357913679137791387913979140791417914279143791447914579146791477914879149791507915179152791537915479155791567915779158791597916079161791627916379164791657916679167791687916979170791717917279173791747917579176791777917879179791807918179182791837918479185791867918779188791897919079191791927919379194791957919679197791987919979200792017920279203792047920579206792077920879209792107921179212792137921479215792167921779218792197922079221792227922379224792257922679227792287922979230792317923279233792347923579236792377923879239792407924179242792437924479245792467924779248792497925079251792527925379254792557925679257792587925979260792617926279263792647926579266792677926879269792707927179272792737927479275792767927779278792797928079281792827928379284792857928679287792887928979290792917929279293792947929579296792977929879299793007930179302793037930479305793067930779308793097931079311793127931379314793157931679317793187931979320793217932279323793247932579326793277932879329793307933179332793337933479335793367933779338793397934079341793427934379344793457934679347793487934979350793517935279353793547935579356793577935879359793607936179362793637936479365793667936779368793697937079371793727937379374793757937679377793787937979380793817938279383793847938579386793877938879389793907939179392793937939479395793967939779398793997940079401794027940379404794057940679407794087940979410794117941279413794147941579416794177941879419794207942179422794237942479425794267942779428794297943079431794327943379434794357943679437794387943979440794417944279443794447944579446794477944879449794507945179452794537945479455794567945779458794597946079461794627946379464794657946679467794687946979470794717947279473794747947579476794777947879479794807948179482794837948479485794867948779488794897949079491794927949379494794957949679497794987949979500795017950279503795047950579506795077950879509795107951179512795137951479515795167951779518795197952079521795227952379524795257952679527795287952979530795317953279533795347953579536795377953879539795407954179542795437954479545795467954779548795497955079551795527955379554795557955679557795587955979560795617956279563795647956579566795677956879569795707957179572795737957479575795767957779578795797958079581795827958379584795857958679587795887958979590795917959279593795947959579596795977959879599796007960179602796037960479605796067960779608796097961079611796127961379614796157961679617796187961979620796217962279623796247962579626796277962879629796307963179632796337963479635796367963779638796397964079641796427964379644796457964679647796487964979650796517965279653796547965579656796577965879659796607966179662796637966479665796667966779668796697967079671796727967379674796757967679677796787967979680796817968279683796847968579686796877968879689796907969179692796937969479695796967969779698796997970079701797027970379704797057970679707797087970979710797117971279713797147971579716797177971879719797207972179722797237972479725797267972779728797297973079731797327973379734797357973679737797387973979740797417974279743797447974579746797477974879749797507975179752797537975479755797567975779758797597976079761797627976379764797657976679767797687976979770797717977279773797747977579776797777977879779797807978179782797837978479785797867978779788797897979079791797927979379794797957979679797797987979979800798017980279803798047980579806798077980879809798107981179812798137981479815798167981779818798197982079821798227982379824798257982679827798287982979830798317983279833798347983579836798377983879839798407984179842798437984479845798467984779848798497985079851798527985379854798557985679857798587985979860798617986279863798647986579866798677986879869798707987179872798737987479875798767987779878798797988079881798827988379884798857988679887798887988979890798917989279893798947989579896798977989879899799007990179902799037990479905799067990779908799097991079911799127991379914799157991679917799187991979920799217992279923799247992579926799277992879929799307993179932799337993479935799367993779938799397994079941799427994379944799457994679947799487994979950799517995279953799547995579956799577995879959799607996179962799637996479965799667996779968799697997079971799727997379974799757997679977799787997979980799817998279983799847998579986799877998879989799907999179992799937999479995799967999779998799998000080001800028000380004800058000680007800088000980010800118001280013800148001580016800178001880019800208002180022800238002480025800268002780028800298003080031800328003380034800358003680037800388003980040800418004280043800448004580046800478004880049800508005180052800538005480055800568005780058800598006080061800628006380064800658006680067800688006980070800718007280073800748007580076800778007880079800808008180082800838008480085800868008780088800898009080091800928009380094800958009680097800988009980100801018010280103801048010580106801078010880109801108011180112801138011480115801168011780118801198012080121801228012380124801258012680127801288012980130801318013280133801348013580136801378013880139801408014180142801438014480145801468014780148801498015080151801528015380154801558015680157801588015980160801618016280163801648016580166801678016880169801708017180172801738017480175801768017780178801798018080181801828018380184801858018680187801888018980190801918019280193801948019580196801978019880199802008020180202802038020480205802068020780208802098021080211802128021380214802158021680217802188021980220802218022280223802248022580226802278022880229802308023180232802338023480235802368023780238802398024080241802428024380244802458024680247802488024980250802518025280253802548025580256802578025880259802608026180262802638026480265802668026780268802698027080271802728027380274802758027680277802788027980280802818028280283802848028580286802878028880289802908029180292802938029480295802968029780298802998030080301803028030380304803058030680307803088030980310803118031280313803148031580316803178031880319803208032180322803238032480325803268032780328803298033080331803328033380334803358033680337803388033980340803418034280343803448034580346803478034880349803508035180352803538035480355803568035780358803598036080361803628036380364803658036680367803688036980370803718037280373803748037580376803778037880379803808038180382803838038480385803868038780388803898039080391803928039380394803958039680397803988039980400804018040280403804048040580406804078040880409804108041180412804138041480415804168041780418804198042080421804228042380424804258042680427804288042980430804318043280433804348043580436804378043880439804408044180442804438044480445804468044780448804498045080451804528045380454804558045680457804588045980460804618046280463804648046580466804678046880469804708047180472804738047480475804768047780478804798048080481804828048380484804858048680487804888048980490804918049280493804948049580496804978049880499805008050180502805038050480505805068050780508805098051080511805128051380514805158051680517805188051980520805218052280523805248052580526805278052880529805308053180532805338053480535805368053780538805398054080541805428054380544805458054680547805488054980550805518055280553805548055580556805578055880559805608056180562805638056480565805668056780568805698057080571805728057380574805758057680577805788057980580805818058280583805848058580586805878058880589805908059180592805938059480595805968059780598805998060080601806028060380604806058060680607806088060980610806118061280613806148061580616806178061880619806208062180622806238062480625806268062780628806298063080631806328063380634806358063680637806388063980640806418064280643806448064580646806478064880649806508065180652806538065480655806568065780658806598066080661806628066380664806658066680667806688066980670806718067280673806748067580676806778067880679806808068180682806838068480685806868068780688806898069080691806928069380694806958069680697806988069980700807018070280703807048070580706807078070880709807108071180712807138071480715807168071780718807198072080721807228072380724807258072680727807288072980730807318073280733807348073580736807378073880739807408074180742807438074480745807468074780748807498075080751807528075380754807558075680757807588075980760807618076280763807648076580766807678076880769807708077180772807738077480775807768077780778807798078080781807828078380784807858078680787807888078980790807918079280793807948079580796807978079880799808008080180802808038080480805808068080780808808098081080811808128081380814808158081680817808188081980820808218082280823808248082580826808278082880829808308083180832808338083480835808368083780838808398084080841808428084380844808458084680847808488084980850808518085280853808548085580856808578085880859808608086180862808638086480865808668086780868808698087080871808728087380874808758087680877808788087980880808818088280883808848088580886808878088880889808908089180892808938089480895808968089780898808998090080901809028090380904809058090680907809088090980910809118091280913809148091580916809178091880919809208092180922809238092480925809268092780928809298093080931809328093380934809358093680937809388093980940809418094280943809448094580946809478094880949809508095180952809538095480955809568095780958809598096080961809628096380964809658096680967809688096980970809718097280973809748097580976809778097880979809808098180982809838098480985809868098780988809898099080991809928099380994809958099680997809988099981000810018100281003810048100581006810078100881009810108101181012810138101481015810168101781018810198102081021810228102381024810258102681027810288102981030810318103281033810348103581036810378103881039810408104181042810438104481045810468104781048810498105081051810528105381054810558105681057810588105981060810618106281063810648106581066810678106881069810708107181072810738107481075810768107781078810798108081081810828108381084810858108681087810888108981090810918109281093810948109581096810978109881099811008110181102811038110481105811068110781108811098111081111811128111381114811158111681117811188111981120811218112281123811248112581126811278112881129811308113181132811338113481135811368113781138811398114081141811428114381144811458114681147811488114981150811518115281153811548115581156811578115881159811608116181162811638116481165811668116781168811698117081171811728117381174811758117681177811788117981180811818118281183811848118581186811878118881189811908119181192811938119481195811968119781198811998120081201812028120381204812058120681207812088120981210812118121281213812148121581216812178121881219812208122181222812238122481225812268122781228812298123081231812328123381234812358123681237812388123981240812418124281243812448124581246812478124881249812508125181252812538125481255812568125781258812598126081261812628126381264812658126681267812688126981270812718127281273812748127581276812778127881279812808128181282812838128481285812868128781288812898129081291812928129381294812958129681297812988129981300813018130281303813048130581306813078130881309813108131181312813138131481315813168131781318813198132081321813228132381324813258132681327813288132981330813318133281333813348133581336813378133881339813408134181342813438134481345813468134781348813498135081351813528135381354813558135681357813588135981360813618136281363813648136581366813678136881369813708137181372813738137481375813768137781378813798138081381813828138381384813858138681387813888138981390813918139281393813948139581396813978139881399814008140181402814038140481405814068140781408814098141081411814128141381414814158141681417814188141981420814218142281423814248142581426814278142881429814308143181432814338143481435814368143781438814398144081441814428144381444814458144681447814488144981450814518145281453814548145581456814578145881459814608146181462814638146481465814668146781468814698147081471814728147381474814758147681477814788147981480814818148281483814848148581486814878148881489814908149181492814938149481495814968149781498814998150081501815028150381504815058150681507815088150981510815118151281513815148151581516815178151881519815208152181522815238152481525815268152781528815298153081531815328153381534815358153681537815388153981540815418154281543815448154581546815478154881549815508155181552815538155481555815568155781558815598156081561815628156381564815658156681567815688156981570815718157281573815748157581576815778157881579815808158181582815838158481585815868158781588815898159081591815928159381594815958159681597815988159981600816018160281603816048160581606816078160881609816108161181612816138161481615816168161781618816198162081621816228162381624816258162681627816288162981630816318163281633816348163581636816378163881639816408164181642816438164481645816468164781648816498165081651816528165381654816558165681657816588165981660816618166281663816648166581666816678166881669816708167181672816738167481675816768167781678816798168081681816828168381684816858168681687816888168981690816918169281693816948169581696816978169881699817008170181702817038170481705817068170781708817098171081711817128171381714817158171681717817188171981720817218172281723817248172581726817278172881729817308173181732817338173481735817368173781738817398174081741817428174381744817458174681747817488174981750817518175281753817548175581756817578175881759817608176181762817638176481765817668176781768817698177081771817728177381774817758177681777817788177981780817818178281783817848178581786817878178881789817908179181792817938179481795817968179781798817998180081801818028180381804818058180681807818088180981810818118181281813818148181581816818178181881819818208182181822818238182481825818268182781828818298183081831818328183381834818358183681837818388183981840818418184281843818448184581846818478184881849818508185181852818538185481855818568185781858818598186081861818628186381864818658186681867818688186981870818718187281873818748187581876818778187881879818808188181882818838188481885818868188781888818898189081891818928189381894818958189681897818988189981900819018190281903819048190581906819078190881909819108191181912819138191481915819168191781918819198192081921819228192381924819258192681927819288192981930819318193281933819348193581936819378193881939819408194181942819438194481945819468194781948819498195081951819528195381954819558195681957819588195981960819618196281963819648196581966819678196881969819708197181972819738197481975819768197781978819798198081981819828198381984819858198681987819888198981990819918199281993819948199581996819978199881999820008200182002820038200482005820068200782008820098201082011820128201382014820158201682017820188201982020820218202282023820248202582026820278202882029820308203182032820338203482035820368203782038820398204082041820428204382044820458204682047820488204982050820518205282053820548205582056820578205882059820608206182062820638206482065820668206782068820698207082071820728207382074820758207682077820788207982080820818208282083820848208582086820878208882089820908209182092820938209482095820968209782098820998210082101821028210382104821058210682107821088210982110821118211282113821148211582116821178211882119821208212182122821238212482125821268212782128821298213082131821328213382134821358213682137821388213982140821418214282143821448214582146821478214882149821508215182152821538215482155821568215782158821598216082161821628216382164821658216682167821688216982170821718217282173821748217582176821778217882179821808218182182821838218482185821868218782188821898219082191821928219382194821958219682197821988219982200822018220282203822048220582206822078220882209822108221182212822138221482215822168221782218822198222082221822228222382224822258222682227822288222982230822318223282233822348223582236822378223882239822408224182242822438224482245822468224782248822498225082251822528225382254822558225682257822588225982260822618226282263822648226582266822678226882269822708227182272822738227482275822768227782278822798228082281822828228382284822858228682287822888228982290822918229282293822948229582296822978229882299823008230182302823038230482305823068230782308823098231082311823128231382314823158231682317823188231982320823218232282323823248232582326823278232882329823308233182332823338233482335823368233782338823398234082341823428234382344823458234682347823488234982350823518235282353823548235582356823578235882359823608236182362823638236482365823668236782368823698237082371823728237382374823758237682377823788237982380823818238282383823848238582386823878238882389823908239182392823938239482395823968239782398823998240082401824028240382404824058240682407824088240982410824118241282413824148241582416824178241882419824208242182422824238242482425824268242782428824298243082431824328243382434824358243682437824388243982440824418244282443824448244582446824478244882449824508245182452824538245482455824568245782458824598246082461824628246382464824658246682467824688246982470824718247282473824748247582476824778247882479824808248182482824838248482485824868248782488824898249082491824928249382494824958249682497824988249982500825018250282503825048250582506825078250882509825108251182512825138251482515825168251782518825198252082521825228252382524825258252682527825288252982530825318253282533825348253582536825378253882539825408254182542825438254482545825468254782548825498255082551825528255382554825558255682557825588255982560825618256282563825648256582566825678256882569825708257182572825738257482575825768257782578825798258082581825828258382584825858258682587825888258982590825918259282593825948259582596825978259882599826008260182602826038260482605826068260782608826098261082611826128261382614826158261682617826188261982620826218262282623826248262582626826278262882629826308263182632826338263482635826368263782638826398264082641826428264382644826458264682647826488264982650826518265282653826548265582656826578265882659826608266182662826638266482665826668266782668826698267082671826728267382674826758267682677826788267982680826818268282683826848268582686826878268882689826908269182692826938269482695826968269782698826998270082701827028270382704827058270682707827088270982710827118271282713827148271582716827178271882719827208272182722827238272482725827268272782728827298273082731827328273382734827358273682737827388273982740827418274282743827448274582746827478274882749827508275182752827538275482755827568275782758827598276082761827628276382764827658276682767827688276982770827718277282773827748277582776827778277882779827808278182782827838278482785827868278782788827898279082791827928279382794827958279682797827988279982800828018280282803828048280582806828078280882809828108281182812828138281482815828168281782818828198282082821828228282382824828258282682827828288282982830828318283282833828348283582836828378283882839828408284182842828438284482845828468284782848828498285082851828528285382854828558285682857828588285982860828618286282863828648286582866828678286882869828708287182872828738287482875828768287782878828798288082881828828288382884828858288682887828888288982890828918289282893828948289582896828978289882899829008290182902829038290482905829068290782908829098291082911829128291382914829158291682917829188291982920829218292282923829248292582926829278292882929829308293182932829338293482935829368293782938829398294082941829428294382944829458294682947829488294982950829518295282953829548295582956829578295882959829608296182962829638296482965829668296782968829698297082971829728297382974829758297682977829788297982980829818298282983829848298582986829878298882989829908299182992829938299482995829968299782998829998300083001830028300383004830058300683007830088300983010830118301283013830148301583016830178301883019830208302183022830238302483025830268302783028830298303083031830328303383034830358303683037830388303983040830418304283043830448304583046830478304883049830508305183052830538305483055830568305783058830598306083061830628306383064830658306683067830688306983070830718307283073830748307583076830778307883079830808308183082830838308483085830868308783088830898309083091830928309383094830958309683097830988309983100831018310283103831048310583106831078310883109831108311183112831138311483115831168311783118831198312083121831228312383124831258312683127831288312983130831318313283133831348313583136831378313883139831408314183142831438314483145831468314783148831498315083151831528315383154831558315683157831588315983160831618316283163831648316583166831678316883169831708317183172831738317483175831768317783178831798318083181831828318383184831858318683187831888318983190831918319283193831948319583196831978319883199832008320183202832038320483205832068320783208832098321083211832128321383214832158321683217832188321983220832218322283223832248322583226832278322883229832308323183232832338323483235832368323783238832398324083241832428324383244832458324683247832488324983250832518325283253832548325583256832578325883259832608326183262832638326483265832668326783268832698327083271832728327383274832758327683277832788327983280832818328283283832848328583286832878328883289832908329183292832938329483295832968329783298832998330083301833028330383304833058330683307833088330983310833118331283313833148331583316833178331883319833208332183322833238332483325833268332783328833298333083331833328333383334833358333683337833388333983340833418334283343833448334583346833478334883349833508335183352833538335483355833568335783358833598336083361833628336383364833658336683367833688336983370833718337283373833748337583376833778337883379833808338183382833838338483385833868338783388833898339083391833928339383394833958339683397833988339983400834018340283403834048340583406834078340883409834108341183412834138341483415834168341783418834198342083421834228342383424834258342683427834288342983430834318343283433834348343583436834378343883439834408344183442834438344483445834468344783448834498345083451834528345383454834558345683457834588345983460834618346283463834648346583466834678346883469834708347183472834738347483475834768347783478834798348083481834828348383484834858348683487834888348983490834918349283493834948349583496834978349883499835008350183502835038350483505835068350783508835098351083511835128351383514835158351683517835188351983520835218352283523835248352583526835278352883529835308353183532835338353483535835368353783538835398354083541835428354383544835458354683547835488354983550835518355283553835548355583556835578355883559835608356183562835638356483565835668356783568835698357083571835728357383574835758357683577835788357983580835818358283583835848358583586835878358883589835908359183592835938359483595835968359783598835998360083601836028360383604836058360683607836088360983610836118361283613836148361583616836178361883619836208362183622836238362483625836268362783628836298363083631836328363383634836358363683637836388363983640836418364283643836448364583646836478364883649836508365183652836538365483655836568365783658836598366083661836628366383664836658366683667836688366983670836718367283673836748367583676836778367883679836808368183682836838368483685836868368783688836898369083691836928369383694836958369683697836988369983700837018370283703837048370583706837078370883709837108371183712837138371483715837168371783718837198372083721837228372383724837258372683727837288372983730837318373283733837348373583736837378373883739837408374183742837438374483745837468374783748837498375083751837528375383754837558375683757837588375983760837618376283763837648376583766837678376883769837708377183772837738377483775837768377783778837798378083781837828378383784837858378683787837888378983790837918379283793837948379583796837978379883799838008380183802838038380483805838068380783808838098381083811838128381383814838158381683817838188381983820838218382283823838248382583826838278382883829838308383183832838338383483835838368383783838838398384083841838428384383844838458384683847838488384983850838518385283853838548385583856838578385883859838608386183862838638386483865838668386783868838698387083871838728387383874838758387683877838788387983880838818388283883838848388583886838878388883889838908389183892838938389483895838968389783898838998390083901839028390383904839058390683907839088390983910839118391283913839148391583916839178391883919839208392183922839238392483925839268392783928839298393083931839328393383934839358393683937839388393983940839418394283943839448394583946839478394883949839508395183952839538395483955839568395783958839598396083961839628396383964839658396683967839688396983970839718397283973839748397583976839778397883979839808398183982839838398483985839868398783988839898399083991839928399383994839958399683997839988399984000840018400284003840048400584006840078400884009840108401184012840138401484015840168401784018840198402084021840228402384024840258402684027840288402984030840318403284033840348403584036840378403884039840408404184042840438404484045840468404784048840498405084051840528405384054840558405684057840588405984060840618406284063840648406584066840678406884069840708407184072840738407484075840768407784078840798408084081840828408384084840858408684087840888408984090840918409284093840948409584096840978409884099841008410184102841038410484105841068410784108841098411084111841128411384114841158411684117841188411984120841218412284123841248412584126841278412884129841308413184132841338413484135841368413784138841398414084141841428414384144841458414684147841488414984150841518415284153841548415584156841578415884159841608416184162841638416484165841668416784168841698417084171841728417384174841758417684177841788417984180841818418284183841848418584186841878418884189841908419184192841938419484195841968419784198841998420084201842028420384204842058420684207842088420984210842118421284213842148421584216842178421884219842208422184222842238422484225842268422784228842298423084231842328423384234842358423684237842388423984240842418424284243842448424584246842478424884249842508425184252842538425484255842568425784258842598426084261842628426384264842658426684267842688426984270842718427284273842748427584276842778427884279842808428184282842838428484285842868428784288842898429084291842928429384294842958429684297842988429984300843018430284303843048430584306843078430884309843108431184312843138431484315843168431784318843198432084321843228432384324843258432684327843288432984330843318433284333843348433584336843378433884339843408434184342843438434484345843468434784348843498435084351843528435384354843558435684357843588435984360843618436284363843648436584366843678436884369843708437184372843738437484375843768437784378843798438084381843828438384384843858438684387843888438984390843918439284393843948439584396843978439884399844008440184402844038440484405844068440784408844098441084411844128441384414844158441684417844188441984420844218442284423844248442584426844278442884429844308443184432844338443484435844368443784438844398444084441844428444384444844458444684447844488444984450844518445284453844548445584456844578445884459844608446184462844638446484465844668446784468844698447084471844728447384474844758447684477844788447984480844818448284483844848448584486844878448884489844908449184492844938449484495844968449784498844998450084501845028450384504845058450684507845088450984510845118451284513845148451584516845178451884519845208452184522845238452484525845268452784528845298453084531845328453384534845358453684537845388453984540845418454284543845448454584546845478454884549845508455184552845538455484555845568455784558845598456084561845628456384564845658456684567845688456984570845718457284573845748457584576845778457884579845808458184582845838458484585845868458784588845898459084591845928459384594845958459684597845988459984600846018460284603846048460584606846078460884609846108461184612846138461484615846168461784618846198462084621846228462384624846258462684627846288462984630846318463284633846348463584636846378463884639846408464184642846438464484645846468464784648846498465084651846528465384654846558465684657846588465984660846618466284663846648466584666846678466884669846708467184672846738467484675846768467784678846798468084681846828468384684846858468684687846888468984690846918469284693846948469584696846978469884699847008470184702847038470484705847068470784708847098471084711847128471384714847158471684717847188471984720847218472284723847248472584726847278472884729847308473184732847338473484735847368473784738847398474084741847428474384744847458474684747847488474984750847518475284753847548475584756847578475884759847608476184762847638476484765847668476784768847698477084771847728477384774847758477684777847788477984780847818478284783847848478584786847878478884789847908479184792847938479484795847968479784798847998480084801848028480384804848058480684807848088480984810848118481284813848148481584816848178481884819848208482184822848238482484825848268482784828848298483084831848328483384834848358483684837848388483984840848418484284843848448484584846848478484884849848508485184852848538485484855848568485784858848598486084861848628486384864848658486684867848688486984870848718487284873848748487584876848778487884879848808488184882848838488484885848868488784888848898489084891848928489384894848958489684897848988489984900849018490284903849048490584906849078490884909849108491184912849138491484915849168491784918849198492084921849228492384924849258492684927849288492984930849318493284933849348493584936849378493884939849408494184942849438494484945849468494784948849498495084951849528495384954849558495684957849588495984960849618496284963849648496584966849678496884969849708497184972849738497484975849768497784978849798498084981849828498384984849858498684987849888498984990849918499284993849948499584996849978499884999850008500185002850038500485005850068500785008850098501085011850128501385014850158501685017850188501985020850218502285023850248502585026850278502885029850308503185032850338503485035850368503785038850398504085041850428504385044850458504685047850488504985050850518505285053850548505585056850578505885059850608506185062850638506485065850668506785068850698507085071850728507385074850758507685077850788507985080850818508285083850848508585086850878508885089850908509185092850938509485095850968509785098850998510085101851028510385104851058510685107851088510985110851118511285113851148511585116851178511885119851208512185122851238512485125851268512785128851298513085131851328513385134851358513685137851388513985140851418514285143851448514585146851478514885149851508515185152851538515485155851568515785158851598516085161851628516385164851658516685167851688516985170851718517285173851748517585176851778517885179851808518185182851838518485185851868518785188851898519085191851928519385194851958519685197851988519985200852018520285203852048520585206852078520885209852108521185212852138521485215852168521785218852198522085221852228522385224852258522685227852288522985230852318523285233852348523585236852378523885239852408524185242852438524485245852468524785248852498525085251852528525385254852558525685257852588525985260852618526285263852648526585266852678526885269852708527185272852738527485275852768527785278852798528085281852828528385284852858528685287852888528985290852918529285293852948529585296852978529885299853008530185302853038530485305853068530785308853098531085311853128531385314853158531685317853188531985320853218532285323853248532585326853278532885329853308533185332853338533485335853368533785338853398534085341853428534385344853458534685347853488534985350853518535285353853548535585356853578535885359853608536185362853638536485365853668536785368853698537085371853728537385374853758537685377853788537985380853818538285383853848538585386853878538885389853908539185392853938539485395853968539785398853998540085401854028540385404854058540685407854088540985410854118541285413854148541585416854178541885419854208542185422854238542485425854268542785428854298543085431854328543385434854358543685437854388543985440854418544285443854448544585446854478544885449854508545185452854538545485455854568545785458854598546085461854628546385464854658546685467854688546985470854718547285473854748547585476854778547885479854808548185482854838548485485854868548785488854898549085491854928549385494854958549685497854988549985500855018550285503855048550585506855078550885509855108551185512855138551485515855168551785518855198552085521855228552385524855258552685527855288552985530855318553285533855348553585536855378553885539855408554185542855438554485545855468554785548855498555085551855528555385554855558555685557855588555985560855618556285563855648556585566855678556885569855708557185572855738557485575855768557785578855798558085581855828558385584855858558685587855888558985590855918559285593855948559585596855978559885599856008560185602856038560485605856068560785608856098561085611856128561385614856158561685617856188561985620856218562285623856248562585626856278562885629856308563185632856338563485635856368563785638856398564085641856428564385644856458564685647856488564985650856518565285653856548565585656856578565885659856608566185662856638566485665856668566785668856698567085671856728567385674856758567685677856788567985680856818568285683856848568585686856878568885689856908569185692856938569485695856968569785698856998570085701857028570385704857058570685707857088570985710857118571285713857148571585716857178571885719857208572185722857238572485725857268572785728857298573085731857328573385734857358573685737857388573985740857418574285743857448574585746857478574885749857508575185752857538575485755857568575785758857598576085761857628576385764857658576685767857688576985770857718577285773857748577585776857778577885779857808578185782857838578485785857868578785788857898579085791857928579385794857958579685797857988579985800858018580285803858048580585806858078580885809858108581185812858138581485815858168581785818858198582085821858228582385824858258582685827858288582985830858318583285833858348583585836858378583885839858408584185842858438584485845858468584785848858498585085851858528585385854858558585685857858588585985860858618586285863858648586585866858678586885869858708587185872858738587485875858768587785878858798588085881858828588385884858858588685887858888588985890858918589285893858948589585896858978589885899859008590185902859038590485905859068590785908859098591085911859128591385914859158591685917859188591985920859218592285923859248592585926859278592885929859308593185932859338593485935859368593785938859398594085941859428594385944859458594685947859488594985950859518595285953859548595585956859578595885959859608596185962859638596485965859668596785968859698597085971859728597385974859758597685977859788597985980859818598285983859848598585986859878598885989859908599185992859938599485995859968599785998859998600086001860028600386004860058600686007860088600986010860118601286013860148601586016860178601886019860208602186022860238602486025860268602786028860298603086031860328603386034860358603686037860388603986040860418604286043860448604586046860478604886049860508605186052860538605486055860568605786058860598606086061860628606386064860658606686067860688606986070860718607286073860748607586076860778607886079860808608186082860838608486085860868608786088860898609086091860928609386094860958609686097860988609986100861018610286103861048610586106861078610886109861108611186112861138611486115861168611786118861198612086121861228612386124861258612686127861288612986130861318613286133861348613586136861378613886139861408614186142861438614486145861468614786148861498615086151861528615386154861558615686157861588615986160861618616286163861648616586166861678616886169861708617186172861738617486175861768617786178861798618086181861828618386184861858618686187861888618986190861918619286193861948619586196861978619886199862008620186202862038620486205862068620786208862098621086211862128621386214862158621686217862188621986220862218622286223862248622586226862278622886229862308623186232862338623486235862368623786238862398624086241862428624386244862458624686247862488624986250862518625286253862548625586256862578625886259862608626186262862638626486265862668626786268862698627086271862728627386274862758627686277862788627986280862818628286283862848628586286862878628886289862908629186292862938629486295862968629786298862998630086301863028630386304863058630686307863088630986310863118631286313863148631586316863178631886319863208632186322863238632486325863268632786328863298633086331863328633386334863358633686337863388633986340863418634286343863448634586346863478634886349863508635186352863538635486355863568635786358863598636086361863628636386364863658636686367863688636986370863718637286373863748637586376863778637886379863808638186382863838638486385863868638786388863898639086391863928639386394863958639686397863988639986400864018640286403864048640586406864078640886409864108641186412864138641486415864168641786418864198642086421864228642386424864258642686427864288642986430864318643286433864348643586436864378643886439864408644186442864438644486445864468644786448864498645086451864528645386454864558645686457864588645986460864618646286463864648646586466864678646886469864708647186472864738647486475864768647786478864798648086481864828648386484864858648686487864888648986490864918649286493864948649586496864978649886499865008650186502865038650486505865068650786508865098651086511865128651386514865158651686517865188651986520865218652286523865248652586526865278652886529865308653186532865338653486535865368653786538865398654086541865428654386544865458654686547865488654986550865518655286553865548655586556865578655886559865608656186562865638656486565865668656786568865698657086571865728657386574865758657686577865788657986580865818658286583865848658586586865878658886589865908659186592865938659486595865968659786598865998660086601866028660386604866058660686607866088660986610866118661286613866148661586616866178661886619866208662186622866238662486625866268662786628866298663086631866328663386634866358663686637866388663986640866418664286643866448664586646866478664886649866508665186652866538665486655866568665786658866598666086661866628666386664866658666686667866688666986670866718667286673866748667586676866778667886679866808668186682866838668486685866868668786688866898669086691866928669386694866958669686697866988669986700867018670286703867048670586706867078670886709867108671186712867138671486715867168671786718867198672086721867228672386724867258672686727867288672986730867318673286733867348673586736867378673886739867408674186742867438674486745867468674786748867498675086751867528675386754867558675686757867588675986760867618676286763867648676586766867678676886769867708677186772867738677486775867768677786778867798678086781867828678386784867858678686787867888678986790867918679286793867948679586796867978679886799868008680186802868038680486805868068680786808868098681086811868128681386814868158681686817868188681986820868218682286823868248682586826868278682886829868308683186832868338683486835868368683786838868398684086841868428684386844868458684686847868488684986850868518685286853868548685586856868578685886859868608686186862868638686486865868668686786868868698687086871868728687386874868758687686877868788687986880868818688286883868848688586886868878688886889868908689186892868938689486895868968689786898868998690086901869028690386904869058690686907869088690986910869118691286913869148691586916869178691886919869208692186922869238692486925869268692786928869298693086931869328693386934869358693686937869388693986940869418694286943869448694586946869478694886949869508695186952869538695486955869568695786958869598696086961869628696386964869658696686967869688696986970869718697286973869748697586976869778697886979869808698186982869838698486985869868698786988869898699086991869928699386994869958699686997869988699987000870018700287003870048700587006870078700887009870108701187012870138701487015870168701787018870198702087021870228702387024870258702687027870288702987030870318703287033870348703587036870378703887039870408704187042870438704487045870468704787048870498705087051870528705387054870558705687057870588705987060870618706287063870648706587066870678706887069870708707187072870738707487075870768707787078870798708087081870828708387084870858708687087870888708987090870918709287093870948709587096870978709887099871008710187102871038710487105871068710787108871098711087111871128711387114871158711687117871188711987120871218712287123871248712587126871278712887129871308713187132871338713487135871368713787138871398714087141871428714387144871458714687147871488714987150871518715287153871548715587156871578715887159871608716187162871638716487165871668716787168871698717087171871728717387174871758717687177871788717987180871818718287183871848718587186871878718887189871908719187192871938719487195871968719787198871998720087201872028720387204872058720687207872088720987210872118721287213872148721587216872178721887219872208722187222872238722487225872268722787228872298723087231872328723387234872358723687237872388723987240872418724287243872448724587246872478724887249872508725187252872538725487255872568725787258872598726087261872628726387264872658726687267872688726987270872718727287273872748727587276872778727887279872808728187282872838728487285872868728787288872898729087291872928729387294872958729687297872988729987300873018730287303873048730587306873078730887309873108731187312873138731487315873168731787318873198732087321873228732387324873258732687327873288732987330873318733287333873348733587336873378733887339873408734187342873438734487345873468734787348873498735087351873528735387354873558735687357873588735987360873618736287363873648736587366873678736887369873708737187372873738737487375873768737787378873798738087381873828738387384873858738687387873888738987390873918739287393873948739587396873978739887399874008740187402874038740487405874068740787408874098741087411874128741387414874158741687417874188741987420874218742287423874248742587426874278742887429874308743187432874338743487435874368743787438874398744087441874428744387444874458744687447874488744987450874518745287453874548745587456874578745887459874608746187462874638746487465874668746787468874698747087471874728747387474874758747687477874788747987480874818748287483874848748587486874878748887489874908749187492874938749487495874968749787498874998750087501875028750387504875058750687507875088750987510875118751287513875148751587516875178751887519875208752187522875238752487525875268752787528875298753087531875328753387534875358753687537875388753987540875418754287543875448754587546875478754887549875508755187552875538755487555875568755787558875598756087561875628756387564875658756687567875688756987570875718757287573875748757587576875778757887579875808758187582875838758487585875868758787588875898759087591875928759387594875958759687597875988759987600876018760287603876048760587606876078760887609876108761187612876138761487615876168761787618876198762087621876228762387624876258762687627876288762987630876318763287633876348763587636876378763887639876408764187642876438764487645876468764787648876498765087651876528765387654876558765687657876588765987660876618766287663876648766587666876678766887669876708767187672876738767487675876768767787678876798768087681876828768387684876858768687687876888768987690876918769287693876948769587696876978769887699877008770187702877038770487705877068770787708877098771087711877128771387714877158771687717877188771987720877218772287723877248772587726877278772887729877308773187732877338773487735877368773787738877398774087741877428774387744877458774687747877488774987750877518775287753877548775587756877578775887759877608776187762877638776487765877668776787768877698777087771877728777387774877758777687777877788777987780877818778287783877848778587786877878778887789877908779187792877938779487795877968779787798877998780087801878028780387804878058780687807878088780987810878118781287813878148781587816878178781887819878208782187822878238782487825878268782787828878298783087831878328783387834878358783687837878388783987840878418784287843878448784587846878478784887849878508785187852878538785487855878568785787858878598786087861878628786387864878658786687867878688786987870878718787287873878748787587876878778787887879878808788187882878838788487885878868788787888878898789087891878928789387894878958789687897878988789987900879018790287903879048790587906879078790887909879108791187912879138791487915879168791787918879198792087921879228792387924879258792687927879288792987930879318793287933879348793587936879378793887939879408794187942879438794487945879468794787948879498795087951879528795387954879558795687957879588795987960879618796287963879648796587966879678796887969879708797187972879738797487975879768797787978879798798087981879828798387984879858798687987879888798987990879918799287993879948799587996879978799887999880008800188002880038800488005880068800788008880098801088011880128801388014880158801688017880188801988020880218802288023880248802588026880278802888029880308803188032880338803488035880368803788038880398804088041880428804388044880458804688047880488804988050880518805288053880548805588056880578805888059880608806188062880638806488065880668806788068880698807088071880728807388074880758807688077880788807988080880818808288083880848808588086880878808888089880908809188092880938809488095880968809788098880998810088101881028810388104881058810688107881088810988110881118811288113881148811588116881178811888119881208812188122881238812488125881268812788128881298813088131881328813388134881358813688137881388813988140881418814288143881448814588146881478814888149881508815188152881538815488155881568815788158881598816088161881628816388164881658816688167881688816988170881718817288173881748817588176881778817888179881808818188182881838818488185881868818788188881898819088191881928819388194881958819688197881988819988200882018820288203882048820588206882078820888209882108821188212882138821488215882168821788218882198822088221882228822388224882258822688227882288822988230882318823288233882348823588236882378823888239882408824188242882438824488245882468824788248882498825088251882528825388254882558825688257882588825988260882618826288263882648826588266882678826888269882708827188272882738827488275882768827788278882798828088281882828828388284882858828688287882888828988290882918829288293882948829588296882978829888299883008830188302883038830488305883068830788308883098831088311883128831388314883158831688317883188831988320883218832288323883248832588326883278832888329883308833188332883338833488335883368833788338883398834088341883428834388344883458834688347883488834988350883518835288353883548835588356883578835888359883608836188362883638836488365883668836788368883698837088371883728837388374883758837688377883788837988380883818838288383883848838588386883878838888389883908839188392883938839488395883968839788398883998840088401884028840388404884058840688407884088840988410884118841288413884148841588416884178841888419884208842188422884238842488425884268842788428884298843088431884328843388434884358843688437884388843988440884418844288443884448844588446884478844888449884508845188452884538845488455884568845788458884598846088461884628846388464884658846688467884688846988470884718847288473884748847588476884778847888479884808848188482884838848488485884868848788488884898849088491884928849388494884958849688497884988849988500885018850288503885048850588506885078850888509885108851188512885138851488515885168851788518885198852088521885228852388524885258852688527885288852988530885318853288533885348853588536885378853888539885408854188542885438854488545885468854788548885498855088551885528855388554885558855688557885588855988560885618856288563885648856588566885678856888569885708857188572885738857488575885768857788578885798858088581885828858388584885858858688587885888858988590885918859288593885948859588596885978859888599886008860188602886038860488605886068860788608886098861088611886128861388614886158861688617886188861988620886218862288623886248862588626886278862888629886308863188632886338863488635886368863788638886398864088641886428864388644886458864688647886488864988650886518865288653886548865588656886578865888659886608866188662886638866488665886668866788668886698867088671886728867388674886758867688677886788867988680886818868288683886848868588686886878868888689886908869188692886938869488695886968869788698886998870088701887028870388704887058870688707887088870988710887118871288713887148871588716887178871888719887208872188722887238872488725887268872788728887298873088731887328873388734887358873688737887388873988740887418874288743887448874588746887478874888749887508875188752887538875488755887568875788758887598876088761887628876388764887658876688767887688876988770887718877288773887748877588776887778877888779887808878188782887838878488785887868878788788887898879088791887928879388794887958879688797887988879988800888018880288803888048880588806888078880888809888108881188812888138881488815888168881788818888198882088821888228882388824888258882688827888288882988830888318883288833888348883588836888378883888839888408884188842888438884488845888468884788848888498885088851888528885388854888558885688857888588885988860888618886288863888648886588866888678886888869888708887188872888738887488875888768887788878888798888088881888828888388884888858888688887888888888988890888918889288893888948889588896888978889888899889008890188902889038890488905889068890788908889098891088911889128891388914889158891688917889188891988920889218892288923889248892588926889278892888929889308893188932889338893488935889368893788938889398894088941889428894388944889458894688947889488894988950889518895288953889548895588956889578895888959889608896188962889638896488965889668896788968889698897088971889728897388974889758897688977889788897988980889818898288983889848898588986889878898888989889908899188992889938899488995889968899788998889998900089001890028900389004890058900689007890088900989010890118901289013890148901589016890178901889019890208902189022890238902489025890268902789028890298903089031890328903389034890358903689037890388903989040890418904289043890448904589046890478904889049890508905189052890538905489055890568905789058890598906089061890628906389064890658906689067890688906989070890718907289073890748907589076890778907889079890808908189082890838908489085890868908789088890898909089091890928909389094890958909689097890988909989100891018910289103891048910589106891078910889109891108911189112891138911489115891168911789118891198912089121891228912389124891258912689127891288912989130891318913289133891348913589136891378913889139891408914189142891438914489145891468914789148891498915089151891528915389154891558915689157891588915989160891618916289163891648916589166891678916889169891708917189172891738917489175891768917789178891798918089181891828918389184891858918689187891888918989190891918919289193891948919589196891978919889199892008920189202892038920489205892068920789208892098921089211892128921389214892158921689217892188921989220892218922289223892248922589226892278922889229892308923189232892338923489235892368923789238892398924089241892428924389244892458924689247892488924989250892518925289253892548925589256892578925889259892608926189262892638926489265892668926789268892698927089271892728927389274892758927689277892788927989280892818928289283892848928589286892878928889289892908929189292892938929489295892968929789298892998930089301893028930389304893058930689307893088930989310893118931289313893148931589316893178931889319893208932189322893238932489325893268932789328893298933089331893328933389334893358933689337893388933989340893418934289343893448934589346893478934889349893508935189352893538935489355893568935789358893598936089361893628936389364893658936689367893688936989370893718937289373893748937589376893778937889379893808938189382893838938489385893868938789388893898939089391893928939389394893958939689397893988939989400894018940289403894048940589406894078940889409894108941189412894138941489415894168941789418894198942089421894228942389424894258942689427894288942989430894318943289433894348943589436894378943889439894408944189442894438944489445894468944789448894498945089451894528945389454894558945689457894588945989460894618946289463894648946589466894678946889469894708947189472894738947489475894768947789478894798948089481894828948389484894858948689487894888948989490894918949289493894948949589496894978949889499895008950189502895038950489505895068950789508895098951089511895128951389514895158951689517895188951989520895218952289523895248952589526895278952889529895308953189532895338953489535895368953789538895398954089541895428954389544895458954689547895488954989550895518955289553895548955589556895578955889559895608956189562895638956489565895668956789568895698957089571895728957389574895758957689577895788957989580895818958289583895848958589586895878958889589895908959189592895938959489595895968959789598895998960089601896028960389604896058960689607896088960989610896118961289613896148961589616896178961889619896208962189622896238962489625896268962789628896298963089631896328963389634896358963689637896388963989640896418964289643896448964589646896478964889649896508965189652896538965489655896568965789658896598966089661896628966389664896658966689667896688966989670896718967289673896748967589676896778967889679896808968189682896838968489685896868968789688896898969089691896928969389694896958969689697896988969989700897018970289703897048970589706897078970889709897108971189712897138971489715897168971789718897198972089721897228972389724897258972689727897288972989730897318973289733897348973589736897378973889739897408974189742897438974489745897468974789748897498975089751897528975389754897558975689757897588975989760897618976289763897648976589766897678976889769897708977189772897738977489775897768977789778897798978089781897828978389784897858978689787897888978989790897918979289793897948979589796897978979889799898008980189802898038980489805898068980789808898098981089811898128981389814898158981689817898188981989820898218982289823898248982589826898278982889829898308983189832898338983489835898368983789838898398984089841898428984389844898458984689847898488984989850898518985289853898548985589856898578985889859898608986189862898638986489865898668986789868898698987089871898728987389874898758987689877898788987989880898818988289883898848988589886898878988889889898908989189892898938989489895898968989789898898998990089901899028990389904899058990689907899088990989910899118991289913899148991589916899178991889919899208992189922899238992489925899268992789928899298993089931899328993389934899358993689937899388993989940899418994289943899448994589946899478994889949899508995189952899538995489955899568995789958899598996089961899628996389964899658996689967899688996989970899718997289973899748997589976899778997889979899808998189982899838998489985899868998789988899898999089991899928999389994899958999689997899988999990000900019000290003900049000590006900079000890009900109001190012900139001490015900169001790018900199002090021900229002390024900259002690027900289002990030900319003290033900349003590036900379003890039900409004190042900439004490045900469004790048900499005090051900529005390054900559005690057900589005990060900619006290063900649006590066900679006890069900709007190072900739007490075900769007790078900799008090081900829008390084900859008690087900889008990090900919009290093900949009590096900979009890099901009010190102901039010490105901069010790108901099011090111901129011390114901159011690117901189011990120901219012290123901249012590126901279012890129901309013190132901339013490135901369013790138901399014090141901429014390144901459014690147901489014990150901519015290153901549015590156901579015890159901609016190162901639016490165901669016790168901699017090171901729017390174901759017690177901789017990180901819018290183901849018590186901879018890189901909019190192901939019490195901969019790198901999020090201902029020390204902059020690207902089020990210902119021290213902149021590216902179021890219902209022190222902239022490225902269022790228902299023090231902329023390234902359023690237902389023990240902419024290243902449024590246902479024890249902509025190252902539025490255902569025790258902599026090261902629026390264902659026690267902689026990270902719027290273902749027590276902779027890279902809028190282902839028490285902869028790288902899029090291902929029390294902959029690297902989029990300903019030290303903049030590306903079030890309903109031190312903139031490315903169031790318903199032090321903229032390324903259032690327903289032990330903319033290333903349033590336903379033890339903409034190342903439034490345903469034790348903499035090351903529035390354903559035690357903589035990360903619036290363903649036590366903679036890369903709037190372903739037490375903769037790378903799038090381903829038390384903859038690387903889038990390903919039290393903949039590396903979039890399904009040190402904039040490405904069040790408904099041090411904129041390414904159041690417904189041990420904219042290423904249042590426904279042890429904309043190432904339043490435904369043790438904399044090441904429044390444904459044690447904489044990450904519045290453904549045590456904579045890459904609046190462904639046490465904669046790468904699047090471904729047390474904759047690477904789047990480904819048290483904849048590486904879048890489904909049190492904939049490495904969049790498904999050090501905029050390504905059050690507905089050990510905119051290513905149051590516905179051890519905209052190522905239052490525905269052790528905299053090531905329053390534905359053690537905389053990540905419054290543905449054590546905479054890549905509055190552905539055490555905569055790558905599056090561905629056390564905659056690567905689056990570905719057290573905749057590576905779057890579905809058190582905839058490585905869058790588905899059090591905929059390594905959059690597905989059990600906019060290603906049060590606906079060890609906109061190612906139061490615906169061790618906199062090621906229062390624906259062690627906289062990630906319063290633906349063590636906379063890639906409064190642906439064490645906469064790648906499065090651906529065390654906559065690657906589065990660906619066290663906649066590666906679066890669906709067190672906739067490675906769067790678906799068090681906829068390684906859068690687906889068990690906919069290693906949069590696906979069890699907009070190702907039070490705907069070790708907099071090711907129071390714907159071690717907189071990720907219072290723907249072590726907279072890729907309073190732907339073490735907369073790738907399074090741907429074390744907459074690747907489074990750907519075290753907549075590756907579075890759907609076190762907639076490765907669076790768907699077090771907729077390774907759077690777907789077990780907819078290783907849078590786907879078890789907909079190792907939079490795907969079790798907999080090801908029080390804908059080690807908089080990810908119081290813908149081590816908179081890819908209082190822908239082490825908269082790828908299083090831908329083390834908359083690837908389083990840908419084290843908449084590846908479084890849908509085190852908539085490855908569085790858908599086090861908629086390864908659086690867908689086990870908719087290873908749087590876908779087890879908809088190882908839088490885908869088790888908899089090891908929089390894908959089690897908989089990900909019090290903909049090590906909079090890909909109091190912909139091490915909169091790918909199092090921909229092390924909259092690927909289092990930909319093290933909349093590936909379093890939909409094190942909439094490945909469094790948909499095090951909529095390954909559095690957909589095990960909619096290963909649096590966909679096890969909709097190972909739097490975909769097790978909799098090981909829098390984909859098690987909889098990990909919099290993909949099590996909979099890999910009100191002910039100491005910069100791008910099101091011910129101391014910159101691017910189101991020910219102291023910249102591026910279102891029910309103191032910339103491035910369103791038910399104091041910429104391044910459104691047910489104991050910519105291053910549105591056910579105891059910609106191062910639106491065910669106791068910699107091071910729107391074910759107691077910789107991080910819108291083910849108591086910879108891089910909109191092910939109491095910969109791098910999110091101911029110391104911059110691107911089110991110911119111291113911149111591116911179111891119911209112191122911239112491125911269112791128911299113091131911329113391134911359113691137911389113991140911419114291143911449114591146911479114891149911509115191152911539115491155911569115791158911599116091161911629116391164911659116691167911689116991170911719117291173911749117591176911779117891179911809118191182911839118491185911869118791188911899119091191911929119391194911959119691197911989119991200912019120291203912049120591206912079120891209912109121191212912139121491215912169121791218912199122091221912229122391224912259122691227912289122991230912319123291233912349123591236912379123891239912409124191242912439124491245912469124791248912499125091251912529125391254912559125691257912589125991260912619126291263912649126591266912679126891269912709127191272912739127491275912769127791278912799128091281912829128391284912859128691287912889128991290912919129291293912949129591296912979129891299913009130191302913039130491305913069130791308913099131091311913129131391314913159131691317913189131991320913219132291323913249132591326913279132891329913309133191332913339133491335913369133791338913399134091341913429134391344913459134691347913489134991350913519135291353913549135591356913579135891359913609136191362913639136491365913669136791368913699137091371913729137391374913759137691377913789137991380913819138291383913849138591386913879138891389913909139191392913939139491395913969139791398913999140091401914029140391404914059140691407914089140991410914119141291413914149141591416914179141891419914209142191422914239142491425914269142791428914299143091431914329143391434914359143691437914389143991440914419144291443914449144591446914479144891449914509145191452914539145491455914569145791458914599146091461914629146391464914659146691467914689146991470914719147291473914749147591476914779147891479914809148191482914839148491485914869148791488914899149091491914929149391494914959149691497914989149991500915019150291503915049150591506915079150891509915109151191512915139151491515915169151791518915199152091521915229152391524915259152691527915289152991530915319153291533915349153591536915379153891539915409154191542915439154491545915469154791548915499155091551915529155391554915559155691557915589155991560915619156291563915649156591566915679156891569915709157191572915739157491575915769157791578915799158091581915829158391584915859158691587915889158991590915919159291593915949159591596915979159891599916009160191602916039160491605916069160791608916099161091611916129161391614916159161691617916189161991620916219162291623916249162591626916279162891629916309163191632916339163491635916369163791638916399164091641916429164391644916459164691647916489164991650916519165291653916549165591656916579165891659916609166191662916639166491665916669166791668916699167091671916729167391674916759167691677916789167991680916819168291683916849168591686916879168891689916909169191692916939169491695916969169791698916999170091701917029170391704917059170691707917089170991710917119171291713917149171591716917179171891719917209172191722917239172491725917269172791728917299173091731917329173391734917359173691737917389173991740917419174291743917449174591746917479174891749917509175191752917539175491755917569175791758917599176091761917629176391764917659176691767917689176991770917719177291773917749177591776917779177891779917809178191782917839178491785917869178791788917899179091791917929179391794917959179691797917989179991800918019180291803918049180591806918079180891809918109181191812918139181491815918169181791818918199182091821918229182391824918259182691827918289182991830918319183291833918349183591836918379183891839918409184191842918439184491845918469184791848918499185091851918529185391854918559185691857918589185991860918619186291863918649186591866918679186891869918709187191872918739187491875918769187791878918799188091881918829188391884918859188691887918889188991890918919189291893918949189591896918979189891899919009190191902919039190491905919069190791908919099191091911919129191391914919159191691917919189191991920919219192291923919249192591926919279192891929919309193191932919339193491935919369193791938919399194091941919429194391944919459194691947919489194991950919519195291953919549195591956919579195891959919609196191962919639196491965919669196791968919699197091971919729197391974919759197691977919789197991980919819198291983919849198591986919879198891989919909199191992919939199491995919969199791998919999200092001920029200392004920059200692007920089200992010920119201292013920149201592016920179201892019920209202192022920239202492025920269202792028920299203092031920329203392034920359203692037920389203992040920419204292043920449204592046920479204892049920509205192052920539205492055920569205792058920599206092061920629206392064920659206692067920689206992070920719207292073920749207592076920779207892079920809208192082920839208492085920869208792088920899209092091920929209392094920959209692097920989209992100921019210292103921049210592106921079210892109921109211192112921139211492115921169211792118921199212092121921229212392124921259212692127921289212992130921319213292133921349213592136921379213892139921409214192142921439214492145921469214792148921499215092151921529215392154921559215692157921589215992160921619216292163921649216592166921679216892169921709217192172921739217492175921769217792178921799218092181921829218392184921859218692187921889218992190921919219292193921949219592196921979219892199922009220192202922039220492205922069220792208922099221092211922129221392214922159221692217922189221992220922219222292223922249222592226922279222892229922309223192232922339223492235922369223792238922399224092241922429224392244922459224692247922489224992250922519225292253922549225592256922579225892259922609226192262922639226492265922669226792268922699227092271922729227392274922759227692277922789227992280922819228292283922849228592286922879228892289922909229192292922939229492295922969229792298922999230092301923029230392304923059230692307923089230992310923119231292313923149231592316923179231892319923209232192322923239232492325923269232792328923299233092331923329233392334923359233692337923389233992340923419234292343923449234592346923479234892349923509235192352923539235492355923569235792358923599236092361923629236392364923659236692367923689236992370923719237292373923749237592376923779237892379923809238192382923839238492385923869238792388923899239092391923929239392394923959239692397923989239992400924019240292403924049240592406924079240892409924109241192412924139241492415924169241792418924199242092421924229242392424924259242692427924289242992430924319243292433924349243592436924379243892439924409244192442924439244492445924469244792448924499245092451924529245392454924559245692457924589245992460924619246292463924649246592466924679246892469924709247192472924739247492475924769247792478924799248092481924829248392484924859248692487924889248992490924919249292493924949249592496924979249892499925009250192502925039250492505925069250792508925099251092511925129251392514925159251692517925189251992520925219252292523925249252592526925279252892529925309253192532925339253492535925369253792538925399254092541925429254392544925459254692547925489254992550925519255292553925549255592556925579255892559925609256192562925639256492565925669256792568925699257092571925729257392574925759257692577925789257992580925819258292583925849258592586925879258892589925909259192592925939259492595925969259792598925999260092601926029260392604926059260692607926089260992610926119261292613926149261592616926179261892619926209262192622926239262492625926269262792628926299263092631926329263392634926359263692637926389263992640926419264292643926449264592646926479264892649926509265192652926539265492655926569265792658926599266092661926629266392664926659266692667926689266992670926719267292673926749267592676926779267892679926809268192682926839268492685926869268792688926899269092691926929269392694926959269692697926989269992700927019270292703927049270592706927079270892709927109271192712927139271492715927169271792718927199272092721927229272392724927259272692727927289272992730927319273292733927349273592736927379273892739927409274192742927439274492745927469274792748927499275092751927529275392754927559275692757927589275992760927619276292763927649276592766927679276892769927709277192772927739277492775927769277792778927799278092781927829278392784927859278692787927889278992790927919279292793927949279592796927979279892799928009280192802928039280492805928069280792808928099281092811928129281392814928159281692817928189281992820928219282292823928249282592826928279282892829928309283192832928339283492835928369283792838928399284092841928429284392844928459284692847928489284992850928519285292853928549285592856928579285892859928609286192862928639286492865928669286792868928699287092871928729287392874928759287692877928789287992880928819288292883928849288592886928879288892889928909289192892928939289492895928969289792898928999290092901929029290392904929059290692907929089290992910929119291292913929149291592916929179291892919929209292192922929239292492925929269292792928929299293092931929329293392934929359293692937929389293992940929419294292943929449294592946929479294892949929509295192952929539295492955929569295792958929599296092961929629296392964929659296692967929689296992970929719297292973929749297592976929779297892979929809298192982929839298492985929869298792988929899299092991929929299392994929959299692997929989299993000930019300293003930049300593006930079300893009930109301193012930139301493015930169301793018930199302093021930229302393024930259302693027930289302993030930319303293033930349303593036930379303893039930409304193042930439304493045930469304793048930499305093051930529305393054930559305693057930589305993060930619306293063930649306593066930679306893069930709307193072930739307493075930769307793078930799308093081930829308393084930859308693087930889308993090930919309293093930949309593096930979309893099931009310193102931039310493105931069310793108931099311093111931129311393114931159311693117931189311993120931219312293123931249312593126931279312893129931309313193132931339313493135931369313793138931399314093141931429314393144931459314693147931489314993150931519315293153931549315593156931579315893159931609316193162931639316493165931669316793168931699317093171931729317393174931759317693177931789317993180931819318293183931849318593186931879318893189931909319193192931939319493195931969319793198931999320093201932029320393204932059320693207932089320993210932119321293213932149321593216932179321893219932209322193222932239322493225932269322793228932299323093231932329323393234932359323693237932389323993240932419324293243932449324593246932479324893249932509325193252932539325493255932569325793258932599326093261932629326393264932659326693267932689326993270932719327293273932749327593276932779327893279932809328193282932839328493285932869328793288932899329093291932929329393294932959329693297932989329993300933019330293303933049330593306933079330893309933109331193312933139331493315933169331793318933199332093321933229332393324933259332693327933289332993330933319333293333933349333593336933379333893339933409334193342933439334493345933469334793348933499335093351933529335393354933559335693357933589335993360933619336293363933649336593366933679336893369933709337193372933739337493375933769337793378933799338093381933829338393384933859338693387933889338993390933919339293393933949339593396933979339893399934009340193402934039340493405934069340793408934099341093411934129341393414934159341693417934189341993420934219342293423934249342593426934279342893429934309343193432934339343493435934369343793438934399344093441934429344393444934459344693447934489344993450934519345293453934549345593456934579345893459934609346193462934639346493465934669346793468934699347093471934729347393474934759347693477934789347993480934819348293483934849348593486934879348893489934909349193492934939349493495934969349793498934999350093501935029350393504935059350693507935089350993510935119351293513935149351593516935179351893519935209352193522935239352493525935269352793528935299353093531935329353393534935359353693537935389353993540935419354293543935449354593546935479354893549935509355193552935539355493555935569355793558935599356093561935629356393564935659356693567935689356993570935719357293573935749357593576935779357893579935809358193582935839358493585935869358793588935899359093591935929359393594935959359693597935989359993600936019360293603936049360593606936079360893609936109361193612936139361493615936169361793618936199362093621936229362393624936259362693627936289362993630936319363293633936349363593636936379363893639936409364193642936439364493645936469364793648936499365093651936529365393654936559365693657936589365993660936619366293663936649366593666936679366893669936709367193672936739367493675936769367793678936799368093681936829368393684936859368693687936889368993690936919369293693936949369593696936979369893699937009370193702937039370493705937069370793708937099371093711937129371393714937159371693717937189371993720937219372293723937249372593726937279372893729937309373193732937339373493735937369373793738937399374093741937429374393744937459374693747937489374993750937519375293753937549375593756937579375893759937609376193762937639376493765937669376793768937699377093771937729377393774937759377693777937789377993780937819378293783937849378593786937879378893789937909379193792937939379493795937969379793798937999380093801938029380393804938059380693807938089380993810938119381293813938149381593816938179381893819938209382193822938239382493825938269382793828938299383093831938329383393834938359383693837938389383993840938419384293843938449384593846938479384893849938509385193852938539385493855938569385793858938599386093861938629386393864938659386693867938689386993870938719387293873938749387593876938779387893879938809388193882938839388493885938869388793888938899389093891938929389393894938959389693897938989389993900939019390293903939049390593906939079390893909939109391193912939139391493915939169391793918939199392093921939229392393924939259392693927939289392993930939319393293933939349393593936939379393893939939409394193942939439394493945939469394793948939499395093951939529395393954939559395693957939589395993960939619396293963939649396593966939679396893969939709397193972939739397493975939769397793978939799398093981939829398393984939859398693987939889398993990939919399293993939949399593996939979399893999940009400194002940039400494005940069400794008940099401094011940129401394014940159401694017940189401994020940219402294023940249402594026940279402894029940309403194032940339403494035940369403794038940399404094041940429404394044940459404694047940489404994050940519405294053940549405594056940579405894059940609406194062940639406494065940669406794068940699407094071940729407394074940759407694077940789407994080940819408294083940849408594086940879408894089940909409194092940939409494095940969409794098940999410094101941029410394104941059410694107941089410994110941119411294113941149411594116941179411894119941209412194122941239412494125941269412794128941299413094131941329413394134941359413694137941389413994140941419414294143941449414594146941479414894149941509415194152941539415494155941569415794158941599416094161941629416394164941659416694167941689416994170941719417294173941749417594176941779417894179941809418194182941839418494185941869418794188941899419094191941929419394194941959419694197941989419994200942019420294203942049420594206942079420894209942109421194212942139421494215942169421794218942199422094221942229422394224942259422694227942289422994230942319423294233942349423594236942379423894239942409424194242942439424494245942469424794248942499425094251942529425394254942559425694257942589425994260942619426294263942649426594266942679426894269942709427194272942739427494275942769427794278942799428094281942829428394284942859428694287942889428994290942919429294293942949429594296942979429894299943009430194302943039430494305943069430794308943099431094311943129431394314943159431694317943189431994320943219432294323943249432594326943279432894329943309433194332943339433494335943369433794338943399434094341943429434394344943459434694347943489434994350943519435294353943549435594356943579435894359943609436194362943639436494365943669436794368943699437094371943729437394374943759437694377943789437994380943819438294383943849438594386943879438894389943909439194392943939439494395943969439794398943999440094401944029440394404944059440694407944089440994410944119441294413944149441594416944179441894419944209442194422944239442494425944269442794428944299443094431944329443394434944359443694437944389443994440944419444294443944449444594446944479444894449944509445194452944539445494455944569445794458944599446094461944629446394464944659446694467944689446994470944719447294473944749447594476944779447894479944809448194482944839448494485944869448794488944899449094491944929449394494944959449694497944989449994500945019450294503945049450594506945079450894509945109451194512945139451494515945169451794518945199452094521945229452394524945259452694527945289452994530945319453294533945349453594536945379453894539945409454194542945439454494545945469454794548945499455094551945529455394554945559455694557945589455994560945619456294563945649456594566945679456894569945709457194572945739457494575945769457794578945799458094581945829458394584945859458694587945889458994590945919459294593945949459594596945979459894599946009460194602946039460494605946069460794608946099461094611946129461394614946159461694617946189461994620946219462294623946249462594626946279462894629946309463194632946339463494635946369463794638946399464094641946429464394644946459464694647946489464994650946519465294653946549465594656946579465894659946609466194662946639466494665946669466794668946699467094671946729467394674946759467694677946789467994680946819468294683946849468594686946879468894689946909469194692946939469494695946969469794698946999470094701947029470394704947059470694707947089470994710947119471294713947149471594716947179471894719947209472194722947239472494725947269472794728947299473094731947329473394734947359473694737947389473994740947419474294743947449474594746947479474894749947509475194752947539475494755947569475794758947599476094761947629476394764947659476694767947689476994770947719477294773947749477594776947779477894779947809478194782947839478494785947869478794788947899479094791947929479394794947959479694797947989479994800948019480294803948049480594806948079480894809948109481194812948139481494815948169481794818948199482094821948229482394824948259482694827948289482994830948319483294833948349483594836948379483894839948409484194842948439484494845948469484794848948499485094851948529485394854948559485694857948589485994860948619486294863948649486594866948679486894869948709487194872948739487494875948769487794878948799488094881948829488394884948859488694887948889488994890948919489294893948949489594896948979489894899949009490194902949039490494905949069490794908949099491094911949129491394914949159491694917949189491994920949219492294923949249492594926949279492894929949309493194932949339493494935949369493794938949399494094941949429494394944949459494694947949489494994950949519495294953949549495594956949579495894959949609496194962949639496494965949669496794968949699497094971949729497394974949759497694977949789497994980949819498294983949849498594986949879498894989949909499194992949939499494995949969499794998949999500095001950029500395004950059500695007950089500995010950119501295013950149501595016950179501895019950209502195022950239502495025950269502795028950299503095031950329503395034950359503695037950389503995040950419504295043950449504595046950479504895049950509505195052950539505495055950569505795058950599506095061950629506395064950659506695067950689506995070950719507295073950749507595076950779507895079950809508195082950839508495085950869508795088950899509095091950929509395094950959509695097950989509995100951019510295103951049510595106951079510895109951109511195112951139511495115951169511795118951199512095121951229512395124951259512695127951289512995130951319513295133951349513595136951379513895139951409514195142951439514495145951469514795148951499515095151951529515395154951559515695157951589515995160951619516295163951649516595166951679516895169951709517195172951739517495175951769517795178951799518095181951829518395184951859518695187951889518995190951919519295193951949519595196951979519895199952009520195202952039520495205952069520795208952099521095211952129521395214952159521695217952189521995220952219522295223952249522595226952279522895229952309523195232952339523495235952369523795238952399524095241952429524395244952459524695247952489524995250952519525295253952549525595256952579525895259952609526195262952639526495265952669526795268952699527095271952729527395274952759527695277952789527995280952819528295283952849528595286952879528895289952909529195292952939529495295952969529795298952999530095301953029530395304953059530695307953089530995310953119531295313953149531595316953179531895319953209532195322953239532495325953269532795328953299533095331953329533395334953359533695337953389533995340953419534295343953449534595346953479534895349953509535195352953539535495355953569535795358953599536095361953629536395364953659536695367953689536995370953719537295373953749537595376953779537895379953809538195382953839538495385953869538795388953899539095391953929539395394953959539695397953989539995400954019540295403954049540595406954079540895409954109541195412954139541495415954169541795418954199542095421954229542395424954259542695427954289542995430954319543295433954349543595436954379543895439954409544195442954439544495445954469544795448954499545095451954529545395454954559545695457954589545995460954619546295463954649546595466954679546895469954709547195472954739547495475954769547795478954799548095481954829548395484954859548695487954889548995490954919549295493954949549595496954979549895499955009550195502955039550495505955069550795508955099551095511955129551395514955159551695517955189551995520955219552295523955249552595526955279552895529955309553195532955339553495535955369553795538955399554095541955429554395544955459554695547955489554995550955519555295553955549555595556955579555895559955609556195562955639556495565955669556795568955699557095571955729557395574955759557695577955789557995580955819558295583955849558595586955879558895589955909559195592955939559495595955969559795598955999560095601956029560395604956059560695607956089560995610956119561295613956149561595616956179561895619956209562195622956239562495625956269562795628956299563095631956329563395634956359563695637956389563995640956419564295643956449564595646956479564895649956509565195652956539565495655956569565795658956599566095661956629566395664956659566695667956689566995670956719567295673956749567595676956779567895679956809568195682956839568495685956869568795688956899569095691956929569395694956959569695697956989569995700957019570295703957049570595706957079570895709957109571195712957139571495715957169571795718957199572095721957229572395724957259572695727957289572995730957319573295733957349573595736957379573895739957409574195742957439574495745957469574795748957499575095751957529575395754957559575695757957589575995760957619576295763957649576595766957679576895769957709577195772957739577495775957769577795778957799578095781957829578395784957859578695787957889578995790957919579295793957949579595796957979579895799958009580195802958039580495805958069580795808958099581095811958129581395814958159581695817958189581995820958219582295823958249582595826958279582895829958309583195832958339583495835958369583795838958399584095841958429584395844958459584695847958489584995850958519585295853958549585595856958579585895859958609586195862958639586495865958669586795868958699587095871958729587395874958759587695877958789587995880958819588295883958849588595886958879588895889958909589195892958939589495895958969589795898958999590095901959029590395904959059590695907959089590995910959119591295913959149591595916959179591895919959209592195922959239592495925959269592795928959299593095931959329593395934959359593695937959389593995940959419594295943959449594595946959479594895949959509595195952959539595495955959569595795958959599596095961959629596395964959659596695967959689596995970959719597295973959749597595976959779597895979959809598195982959839598495985959869598795988959899599095991959929599395994959959599695997959989599996000960019600296003960049600596006960079600896009960109601196012960139601496015960169601796018960199602096021960229602396024960259602696027960289602996030960319603296033960349603596036960379603896039960409604196042960439604496045960469604796048960499605096051960529605396054960559605696057960589605996060960619606296063960649606596066960679606896069960709607196072960739607496075960769607796078960799608096081960829608396084960859608696087960889608996090960919609296093960949609596096960979609896099961009610196102961039610496105961069610796108961099611096111961129611396114961159611696117961189611996120961219612296123961249612596126961279612896129961309613196132961339613496135961369613796138961399614096141961429614396144961459614696147961489614996150961519615296153961549615596156961579615896159961609616196162961639616496165961669616796168961699617096171961729617396174961759617696177961789617996180961819618296183961849618596186961879618896189961909619196192961939619496195961969619796198961999620096201962029620396204962059620696207962089620996210962119621296213962149621596216962179621896219962209622196222962239622496225962269622796228962299623096231962329623396234962359623696237962389623996240962419624296243962449624596246962479624896249962509625196252962539625496255962569625796258962599626096261962629626396264962659626696267962689626996270962719627296273962749627596276962779627896279962809628196282962839628496285962869628796288962899629096291962929629396294962959629696297962989629996300963019630296303963049630596306963079630896309963109631196312963139631496315963169631796318963199632096321963229632396324963259632696327963289632996330963319633296333963349633596336963379633896339963409634196342963439634496345963469634796348963499635096351963529635396354963559635696357963589635996360963619636296363963649636596366963679636896369963709637196372963739637496375963769637796378963799638096381963829638396384963859638696387963889638996390963919639296393963949639596396963979639896399964009640196402964039640496405964069640796408964099641096411964129641396414964159641696417964189641996420964219642296423964249642596426964279642896429964309643196432964339643496435964369643796438964399644096441964429644396444964459644696447964489644996450964519645296453964549645596456964579645896459964609646196462964639646496465964669646796468964699647096471964729647396474964759647696477964789647996480964819648296483964849648596486964879648896489964909649196492964939649496495964969649796498964999650096501965029650396504965059650696507965089650996510965119651296513965149651596516965179651896519965209652196522965239652496525965269652796528965299653096531965329653396534965359653696537965389653996540965419654296543965449654596546965479654896549965509655196552965539655496555965569655796558965599656096561965629656396564965659656696567965689656996570965719657296573965749657596576965779657896579965809658196582965839658496585965869658796588965899659096591965929659396594965959659696597965989659996600966019660296603966049660596606966079660896609966109661196612966139661496615966169661796618966199662096621966229662396624966259662696627966289662996630966319663296633966349663596636966379663896639966409664196642966439664496645966469664796648966499665096651966529665396654966559665696657966589665996660966619666296663966649666596666966679666896669966709667196672966739667496675966769667796678966799668096681966829668396684966859668696687966889668996690966919669296693966949669596696966979669896699967009670196702967039670496705967069670796708967099671096711967129671396714967159671696717967189671996720967219672296723967249672596726967279672896729967309673196732967339673496735967369673796738967399674096741967429674396744967459674696747967489674996750967519675296753967549675596756967579675896759967609676196762967639676496765967669676796768967699677096771967729677396774967759677696777967789677996780967819678296783967849678596786967879678896789967909679196792967939679496795967969679796798967999680096801968029680396804968059680696807968089680996810968119681296813968149681596816968179681896819968209682196822968239682496825968269682796828968299683096831968329683396834968359683696837968389683996840968419684296843968449684596846968479684896849968509685196852968539685496855968569685796858968599686096861968629686396864968659686696867968689686996870968719687296873968749687596876968779687896879968809688196882968839688496885968869688796888968899689096891968929689396894968959689696897968989689996900969019690296903969049690596906969079690896909969109691196912969139691496915969169691796918969199692096921969229692396924969259692696927969289692996930969319693296933969349693596936969379693896939969409694196942969439694496945969469694796948969499695096951969529695396954969559695696957969589695996960969619696296963969649696596966969679696896969969709697196972969739697496975969769697796978969799698096981969829698396984969859698696987969889698996990969919699296993969949699596996969979699896999970009700197002970039700497005970069700797008970099701097011970129701397014970159701697017970189701997020970219702297023970249702597026970279702897029970309703197032970339703497035970369703797038970399704097041970429704397044970459704697047970489704997050970519705297053970549705597056970579705897059970609706197062970639706497065970669706797068970699707097071970729707397074970759707697077970789707997080970819708297083970849708597086970879708897089970909709197092970939709497095970969709797098970999710097101971029710397104971059710697107971089710997110971119711297113971149711597116971179711897119971209712197122971239712497125971269712797128971299713097131971329713397134971359713697137971389713997140971419714297143971449714597146971479714897149971509715197152971539715497155971569715797158971599716097161971629716397164971659716697167971689716997170971719717297173971749717597176971779717897179971809718197182971839718497185971869718797188971899719097191971929719397194971959719697197971989719997200972019720297203972049720597206972079720897209972109721197212972139721497215972169721797218972199722097221972229722397224972259722697227972289722997230972319723297233972349723597236972379723897239972409724197242972439724497245972469724797248972499725097251972529725397254972559725697257972589725997260972619726297263972649726597266972679726897269972709727197272972739727497275972769727797278972799728097281972829728397284972859728697287972889728997290972919729297293972949729597296972979729897299973009730197302973039730497305973069730797308973099731097311973129731397314973159731697317973189731997320973219732297323973249732597326973279732897329973309733197332973339733497335973369733797338973399734097341973429734397344973459734697347973489734997350973519735297353973549735597356973579735897359973609736197362973639736497365973669736797368973699737097371973729737397374973759737697377973789737997380973819738297383973849738597386973879738897389973909739197392973939739497395973969739797398973999740097401974029740397404974059740697407974089740997410974119741297413974149741597416974179741897419974209742197422974239742497425974269742797428974299743097431974329743397434974359743697437974389743997440974419744297443974449744597446974479744897449974509745197452974539745497455974569745797458974599746097461974629746397464974659746697467974689746997470974719747297473974749747597476974779747897479974809748197482974839748497485974869748797488974899749097491974929749397494974959749697497974989749997500975019750297503975049750597506975079750897509975109751197512975139751497515975169751797518975199752097521975229752397524975259752697527975289752997530975319753297533975349753597536975379753897539975409754197542975439754497545975469754797548975499755097551975529755397554975559755697557975589755997560975619756297563975649756597566975679756897569975709757197572975739757497575975769757797578975799758097581975829758397584975859758697587975889758997590975919759297593975949759597596975979759897599976009760197602976039760497605976069760797608976099761097611976129761397614976159761697617976189761997620976219762297623976249762597626976279762897629976309763197632976339763497635976369763797638976399764097641976429764397644976459764697647976489764997650976519765297653976549765597656976579765897659976609766197662976639766497665976669766797668976699767097671976729767397674976759767697677976789767997680976819768297683976849768597686976879768897689976909769197692976939769497695976969769797698976999770097701977029770397704977059770697707977089770997710977119771297713977149771597716977179771897719977209772197722977239772497725977269772797728977299773097731977329773397734977359773697737977389773997740977419774297743977449774597746977479774897749977509775197752977539775497755977569775797758977599776097761977629776397764977659776697767977689776997770977719777297773977749777597776977779777897779977809778197782977839778497785977869778797788977899779097791977929779397794977959779697797977989779997800978019780297803978049780597806978079780897809978109781197812978139781497815978169781797818978199782097821978229782397824978259782697827978289782997830978319783297833978349783597836978379783897839978409784197842978439784497845978469784797848978499785097851978529785397854978559785697857978589785997860978619786297863978649786597866978679786897869978709787197872978739787497875978769787797878978799788097881978829788397884978859788697887978889788997890978919789297893978949789597896978979789897899979009790197902979039790497905979069790797908979099791097911979129791397914979159791697917979189791997920979219792297923979249792597926979279792897929979309793197932979339793497935979369793797938979399794097941979429794397944979459794697947979489794997950979519795297953979549795597956979579795897959979609796197962979639796497965979669796797968979699797097971979729797397974979759797697977979789797997980979819798297983979849798597986979879798897989979909799197992979939799497995979969799797998979999800098001980029800398004980059800698007980089800998010980119801298013980149801598016980179801898019980209802198022980239802498025980269802798028980299803098031980329803398034980359803698037980389803998040980419804298043980449804598046980479804898049980509805198052980539805498055980569805798058980599806098061980629806398064980659806698067980689806998070980719807298073980749807598076980779807898079980809808198082980839808498085980869808798088980899809098091980929809398094980959809698097980989809998100981019810298103981049810598106981079810898109981109811198112981139811498115981169811798118981199812098121981229812398124981259812698127981289812998130981319813298133981349813598136981379813898139981409814198142981439814498145981469814798148981499815098151981529815398154981559815698157981589815998160981619816298163981649816598166981679816898169981709817198172981739817498175981769817798178981799818098181981829818398184981859818698187981889818998190981919819298193981949819598196981979819898199982009820198202982039820498205982069820798208982099821098211982129821398214982159821698217982189821998220982219822298223982249822598226982279822898229982309823198232982339823498235982369823798238982399824098241982429824398244982459824698247982489824998250982519825298253982549825598256982579825898259982609826198262982639826498265982669826798268982699827098271982729827398274982759827698277982789827998280982819828298283982849828598286982879828898289982909829198292982939829498295982969829798298982999830098301983029830398304983059830698307983089830998310983119831298313983149831598316983179831898319983209832198322983239832498325983269832798328983299833098331983329833398334983359833698337983389833998340983419834298343983449834598346983479834898349983509835198352983539835498355983569835798358983599836098361983629836398364983659836698367983689836998370983719837298373983749837598376983779837898379983809838198382983839838498385983869838798388983899839098391983929839398394983959839698397983989839998400984019840298403984049840598406984079840898409984109841198412984139841498415984169841798418984199842098421984229842398424984259842698427984289842998430984319843298433984349843598436984379843898439984409844198442984439844498445984469844798448984499845098451984529845398454984559845698457984589845998460984619846298463984649846598466984679846898469984709847198472984739847498475984769847798478984799848098481984829848398484984859848698487984889848998490984919849298493984949849598496984979849898499985009850198502985039850498505985069850798508985099851098511985129851398514985159851698517985189851998520985219852298523985249852598526985279852898529985309853198532985339853498535985369853798538985399854098541985429854398544985459854698547985489854998550985519855298553985549855598556985579855898559985609856198562985639856498565985669856798568985699857098571985729857398574985759857698577985789857998580985819858298583985849858598586985879858898589985909859198592985939859498595985969859798598985999860098601986029860398604986059860698607986089860998610986119861298613986149861598616986179861898619986209862198622986239862498625986269862798628986299863098631986329863398634986359863698637986389863998640986419864298643986449864598646986479864898649986509865198652986539865498655986569865798658986599866098661986629866398664986659866698667986689866998670986719867298673986749867598676986779867898679986809868198682986839868498685986869868798688986899869098691986929869398694986959869698697986989869998700987019870298703987049870598706987079870898709987109871198712987139871498715987169871798718987199872098721987229872398724987259872698727987289872998730987319873298733987349873598736987379873898739987409874198742987439874498745987469874798748987499875098751987529875398754987559875698757987589875998760987619876298763987649876598766987679876898769987709877198772987739877498775987769877798778987799878098781987829878398784987859878698787987889878998790987919879298793987949879598796987979879898799988009880198802988039880498805988069880798808988099881098811988129881398814988159881698817988189881998820988219882298823988249882598826988279882898829988309883198832988339883498835988369883798838988399884098841988429884398844988459884698847988489884998850988519885298853988549885598856988579885898859988609886198862988639886498865988669886798868988699887098871988729887398874988759887698877988789887998880988819888298883988849888598886988879888898889988909889198892988939889498895988969889798898988999890098901989029890398904989059890698907989089890998910989119891298913989149891598916989179891898919989209892198922989239892498925989269892798928989299893098931989329893398934989359893698937989389893998940989419894298943989449894598946989479894898949989509895198952989539895498955989569895798958989599896098961989629896398964989659896698967989689896998970989719897298973989749897598976989779897898979989809898198982989839898498985989869898798988989899899098991989929899398994989959899698997989989899999000990019900299003990049900599006990079900899009990109901199012990139901499015990169901799018990199902099021990229902399024990259902699027990289902999030990319903299033990349903599036990379903899039990409904199042990439904499045990469904799048990499905099051990529905399054990559905699057990589905999060990619906299063990649906599066990679906899069990709907199072990739907499075990769907799078990799908099081990829908399084990859908699087990889908999090990919909299093990949909599096990979909899099991009910199102991039910499105991069910799108991099911099111991129911399114991159911699117991189911999120991219912299123991249912599126991279912899129991309913199132991339913499135991369913799138991399914099141991429914399144991459914699147991489914999150991519915299153991549915599156991579915899159991609916199162991639916499165991669916799168991699917099171991729917399174991759917699177991789917999180991819918299183991849918599186991879918899189991909919199192991939919499195991969919799198991999920099201992029920399204992059920699207992089920999210992119921299213992149921599216992179921899219992209922199222992239922499225992269922799228992299923099231992329923399234992359923699237992389923999240992419924299243992449924599246992479924899249992509925199252992539925499255992569925799258992599926099261992629926399264992659926699267992689926999270992719927299273992749927599276992779927899279992809928199282992839928499285992869928799288992899929099291992929929399294992959929699297992989929999300993019930299303993049930599306993079930899309993109931199312993139931499315993169931799318993199932099321993229932399324993259932699327993289932999330993319933299333993349933599336993379933899339993409934199342993439934499345993469934799348993499935099351993529935399354993559935699357993589935999360993619936299363993649936599366993679936899369993709937199372993739937499375993769937799378993799938099381993829938399384993859938699387993889938999390993919939299393993949939599396993979939899399994009940199402994039940499405994069940799408994099941099411994129941399414994159941699417994189941999420994219942299423994249942599426994279942899429994309943199432994339943499435994369943799438994399944099441994429944399444994459944699447994489944999450994519945299453994549945599456994579945899459994609946199462994639946499465994669946799468994699947099471994729947399474994759947699477994789947999480994819948299483994849948599486994879948899489994909949199492994939949499495994969949799498994999950099501995029950399504995059950699507995089950999510995119951299513995149951599516995179951899519995209952199522995239952499525995269952799528995299953099531995329953399534995359953699537995389953999540995419954299543995449954599546995479954899549995509955199552995539955499555995569955799558995599956099561995629956399564995659956699567995689956999570995719957299573995749957599576995779957899579995809958199582995839958499585995869958799588995899959099591995929959399594995959959699597995989959999600996019960299603996049960599606996079960899609996109961199612996139961499615996169961799618996199962099621996229962399624996259962699627996289962999630996319963299633996349963599636996379963899639996409964199642996439964499645996469964799648996499965099651996529965399654996559965699657996589965999660996619966299663996649966599666996679966899669996709967199672996739967499675996769967799678996799968099681996829968399684996859968699687996889968999690996919969299693996949969599696996979969899699997009970199702997039970499705997069970799708997099971099711997129971399714997159971699717997189971999720997219972299723997249972599726997279972899729997309973199732997339973499735997369973799738997399974099741997429974399744997459974699747997489974999750997519975299753997549975599756997579975899759997609976199762997639976499765997669976799768997699977099771997729977399774997759977699777997789977999780997819978299783997849978599786997879978899789997909979199792997939979499795997969979799798997999980099801998029980399804998059980699807998089980999810998119981299813998149981599816998179981899819998209982199822998239982499825998269982799828998299983099831998329983399834998359983699837998389983999840998419984299843998449984599846998479984899849998509985199852998539985499855998569985799858998599986099861998629986399864998659986699867998689986999870998719987299873998749987599876998779987899879998809988199882998839988499885998869988799888998899989099891998929989399894998959989699897998989989999900999019990299903999049990599906999079990899909999109991199912999139991499915999169991799918999199992099921999229992399924999259992699927999289992999930999319993299933999349993599936999379993899939999409994199942999439994499945999469994799948999499995099951999529995399954999559995699957999589995999960999619996299963999649996599966999679996899969999709997199972999739997499975999769997799978999799998099981999829998399984999859998699987999889998999990999919999299993999949999599996999979999899999100000100001100002100003100004100005100006100007100008100009100010100011100012100013100014100015100016100017100018100019100020100021100022100023100024100025100026100027100028100029100030100031100032100033100034100035100036100037100038100039100040100041100042100043100044100045100046100047100048100049100050100051100052100053100054100055100056100057100058100059100060100061100062100063100064100065100066100067100068100069100070100071100072100073100074100075100076100077100078100079100080100081100082100083100084100085100086100087100088100089100090100091100092100093100094100095100096100097100098100099100100100101100102100103100104100105100106100107100108100109100110100111100112100113100114100115100116100117100118100119100120100121100122100123100124100125100126100127100128100129100130100131100132100133100134100135100136100137100138100139100140100141100142100143100144100145100146100147100148100149100150100151100152100153100154100155100156100157100158100159100160100161100162100163100164100165100166100167100168100169100170100171100172100173100174100175100176100177100178100179100180100181100182100183100184100185100186100187100188100189100190100191100192100193100194100195100196100197100198100199100200100201100202100203100204100205100206100207100208100209100210100211100212100213100214100215100216100217100218100219100220100221100222100223100224100225100226100227100228100229100230100231100232100233100234100235100236100237100238100239100240100241100242100243100244100245100246100247100248100249100250100251100252100253100254100255100256100257100258100259100260100261100262100263100264100265100266100267100268100269100270100271100272100273100274100275100276100277100278100279100280100281100282100283100284100285100286100287100288100289100290100291100292100293100294100295100296100297100298100299100300100301100302100303100304100305100306100307100308100309100310100311100312100313100314100315100316100317100318100319100320100321100322100323100324100325100326100327100328100329100330100331100332100333100334100335100336100337100338100339100340100341100342100343100344100345100346100347100348100349100350100351100352100353100354100355100356100357100358100359100360100361100362100363100364100365100366100367100368100369100370100371100372100373100374100375100376100377100378100379100380100381100382100383100384100385100386100387100388100389100390100391100392100393100394100395100396100397100398100399100400100401100402100403100404100405100406100407100408100409100410100411100412100413100414100415100416100417100418100419100420100421100422100423100424100425100426100427100428100429100430100431100432100433100434100435100436100437100438100439100440100441100442100443100444100445100446100447100448100449100450100451100452100453100454100455100456100457100458100459100460100461100462100463100464100465100466100467100468100469100470100471100472100473100474100475100476100477100478100479100480100481100482100483100484100485100486100487100488100489100490100491100492100493100494100495100496100497100498100499100500100501100502100503100504100505100506100507100508100509100510100511100512100513100514100515100516100517100518100519100520100521100522100523100524100525100526100527100528100529100530100531100532100533100534100535100536100537100538100539100540100541100542100543100544100545100546100547100548100549100550100551100552100553100554100555100556100557100558100559100560100561100562100563100564100565100566100567100568100569100570100571100572100573100574100575100576100577100578100579100580100581100582100583100584100585100586100587100588100589100590100591100592100593100594100595100596100597100598100599100600100601100602100603100604100605100606100607100608100609100610100611100612100613100614100615100616100617100618100619100620100621100622100623100624100625100626100627100628100629100630100631100632100633100634100635100636100637100638100639100640100641100642100643100644100645100646100647100648100649100650100651100652100653100654100655100656100657100658100659100660100661100662100663100664100665100666100667100668100669100670100671100672100673100674100675100676100677100678100679100680100681100682100683100684100685100686100687100688100689100690100691100692100693100694100695100696100697100698100699100700100701100702100703100704100705100706100707100708100709100710100711100712100713100714100715100716100717100718100719100720100721100722100723100724100725100726100727100728100729100730100731100732100733100734100735100736100737100738100739100740100741100742100743100744100745100746100747100748100749100750100751100752100753100754100755100756100757100758100759100760100761100762100763100764100765100766100767100768100769100770100771100772100773100774100775100776100777100778100779100780100781100782100783100784100785100786100787100788100789100790100791100792100793100794100795100796100797100798100799100800100801100802100803100804100805100806100807100808100809100810100811100812100813100814100815100816100817100818100819100820100821100822100823100824100825100826100827100828100829100830100831100832100833100834100835100836100837100838100839100840100841100842100843100844100845100846100847100848100849100850100851100852100853100854100855100856100857100858100859100860100861100862100863100864100865100866100867100868100869100870100871100872100873100874100875100876100877100878100879100880100881100882100883100884100885100886100887100888100889100890100891100892100893100894100895100896100897100898100899100900100901100902100903100904100905100906100907100908100909100910100911100912100913100914100915100916100917100918100919100920100921100922100923100924100925100926100927100928100929100930100931100932100933100934100935100936100937100938100939100940100941100942100943100944100945100946100947100948100949100950100951100952100953100954100955100956100957100958100959100960100961100962100963100964100965100966100967100968100969100970100971100972100973100974100975100976100977100978100979100980100981100982100983100984100985100986100987100988100989100990100991100992100993100994100995100996100997100998100999101000101001101002101003101004101005101006101007101008101009101010101011101012101013101014101015101016101017101018101019101020101021101022101023101024101025101026101027101028101029101030101031101032101033101034101035101036101037101038101039101040101041101042101043101044101045101046101047101048101049101050101051101052101053101054101055101056101057101058101059101060101061101062101063101064101065101066101067101068101069101070101071101072101073101074101075101076101077101078101079101080101081101082101083101084101085101086101087101088101089101090101091101092101093101094101095101096101097101098101099101100101101101102101103101104101105101106101107101108101109101110101111101112101113101114101115101116101117101118101119101120101121101122101123101124101125101126101127101128101129101130101131101132101133101134101135101136101137101138101139101140101141101142101143101144101145101146101147101148101149101150101151101152101153101154101155101156101157101158101159101160101161101162101163101164101165101166101167101168101169101170101171101172101173101174101175101176101177101178101179101180101181101182101183101184101185101186101187101188101189101190101191101192101193101194101195101196101197101198101199101200101201101202101203101204101205101206101207101208101209101210101211101212101213101214101215101216101217101218101219101220101221101222101223101224101225101226101227101228101229101230101231101232101233101234101235101236101237101238101239101240101241101242101243101244101245101246101247101248101249101250101251101252101253101254101255101256101257101258101259101260101261101262101263101264101265101266101267101268101269101270101271101272101273101274101275101276101277101278101279101280101281101282101283101284101285101286101287101288101289101290101291101292101293101294101295101296101297101298101299101300101301101302101303101304101305101306101307101308101309101310101311101312101313101314101315101316101317101318101319101320101321101322101323101324101325101326101327101328101329101330101331101332101333101334101335101336101337101338101339101340101341101342101343101344101345101346101347101348101349101350101351101352101353101354101355101356101357101358101359101360101361101362101363101364101365101366101367101368101369101370101371101372101373101374101375101376101377101378101379101380101381101382101383101384101385101386101387101388101389101390101391101392101393101394101395101396101397101398101399101400101401101402101403101404101405101406101407101408101409101410101411101412101413101414101415101416101417101418101419101420101421101422101423101424101425101426101427101428101429101430101431101432101433101434101435101436101437101438101439101440101441101442101443101444101445101446101447101448101449101450101451101452101453101454101455101456101457101458101459101460101461101462101463101464101465101466101467101468101469101470101471101472101473101474101475101476101477101478101479101480101481101482101483101484101485101486101487101488101489101490101491101492101493101494101495101496101497101498101499101500101501101502101503101504101505101506101507101508101509101510101511101512101513101514101515101516101517101518101519101520101521101522101523101524101525101526101527101528101529101530101531101532101533101534101535101536101537101538101539101540101541101542101543101544101545101546101547101548101549101550101551101552101553101554101555101556101557101558101559101560101561101562101563101564101565101566101567101568101569101570101571101572101573101574101575101576101577101578101579101580101581101582101583101584101585101586101587101588101589101590101591101592101593101594101595101596101597101598101599101600101601101602101603101604101605101606101607101608101609101610101611101612101613101614101615101616101617101618101619101620101621101622101623101624101625101626101627101628101629101630101631101632101633101634101635101636101637101638101639101640101641101642101643101644101645101646101647101648101649101650101651101652101653101654101655101656101657101658101659101660101661101662101663101664101665101666101667101668101669101670101671101672101673101674101675101676101677101678101679101680101681101682101683101684101685101686101687101688101689101690101691101692101693101694101695101696101697101698101699101700101701101702101703101704101705101706101707101708101709101710101711101712101713101714101715101716101717101718101719101720101721101722101723101724101725101726101727101728101729101730101731101732101733101734101735101736101737101738101739101740101741101742101743101744101745101746101747101748101749101750101751101752101753101754101755101756101757101758101759101760101761101762101763101764101765101766101767101768101769101770101771101772101773101774101775101776101777101778101779101780101781101782101783101784101785101786101787101788101789101790101791101792101793101794101795101796101797101798101799101800101801101802101803101804101805101806101807101808101809101810101811101812101813101814101815101816101817101818101819101820101821101822101823101824101825101826101827101828101829101830101831101832101833101834101835101836101837101838101839101840101841101842101843101844101845101846101847101848101849101850101851101852101853101854101855101856101857101858101859101860101861101862101863101864101865101866101867101868101869101870101871101872101873101874101875101876101877101878101879101880101881101882101883101884101885101886101887101888101889101890101891101892101893101894101895101896101897101898101899101900101901101902101903101904101905101906101907101908101909101910101911101912101913101914101915101916101917101918101919101920101921101922101923101924101925101926101927101928101929101930101931101932101933101934101935101936101937101938101939101940101941101942101943101944101945101946101947101948101949101950101951101952101953101954101955101956101957101958101959101960101961101962101963101964101965101966101967101968101969101970101971101972101973101974101975101976101977101978101979101980101981101982101983101984101985101986101987101988101989101990101991101992101993101994101995101996101997101998101999102000102001102002102003102004102005102006102007102008102009102010102011102012102013102014102015102016102017102018102019102020102021102022102023102024102025102026102027102028102029102030102031102032102033102034102035102036102037102038102039102040102041102042102043102044102045102046102047102048102049102050102051102052102053102054102055102056102057102058102059102060102061102062102063102064102065102066102067102068102069102070102071102072102073102074102075102076102077102078102079102080102081102082102083102084102085102086102087102088102089102090102091102092102093102094102095102096102097102098102099102100102101102102102103102104102105102106102107102108102109102110102111102112102113102114102115102116102117102118102119102120102121102122102123102124102125102126102127102128102129102130102131102132102133102134102135102136102137102138102139102140102141102142102143102144102145102146102147102148102149102150102151102152102153102154102155102156102157102158102159102160102161102162102163102164102165102166102167102168102169102170102171102172102173102174102175102176102177102178102179102180102181102182102183102184102185102186102187102188102189102190102191102192102193102194102195102196102197102198102199102200102201102202102203102204102205102206102207102208102209102210102211102212102213102214102215102216102217102218102219102220102221102222102223102224102225102226102227102228102229102230102231102232102233102234102235102236102237102238102239102240102241102242102243102244102245102246102247102248102249102250102251102252102253102254102255102256102257102258102259102260102261102262102263102264102265102266102267102268102269102270102271102272102273102274102275102276102277102278102279102280102281102282102283102284102285102286102287102288102289102290102291102292102293102294102295102296102297102298102299102300102301102302102303102304102305102306102307102308102309102310102311102312102313102314102315102316102317102318102319102320102321102322102323102324102325102326102327102328102329102330102331102332102333102334102335102336102337102338102339102340102341102342102343102344102345102346102347102348102349102350102351102352102353102354102355102356102357102358102359102360102361102362102363102364102365102366102367102368102369102370102371102372102373102374102375102376102377102378102379102380102381102382102383102384102385102386102387102388102389102390102391102392102393102394102395102396102397102398102399102400102401102402102403102404102405102406102407102408102409102410102411102412102413102414102415102416102417102418102419102420102421102422102423102424102425102426102427102428102429102430102431102432102433102434102435102436102437102438102439102440102441102442102443102444102445102446102447102448102449102450102451102452102453102454102455102456102457102458102459102460102461102462102463102464102465102466102467102468102469102470102471102472102473102474102475102476102477102478102479102480102481102482102483102484102485102486102487102488102489102490102491102492102493102494102495102496102497102498102499102500102501102502102503102504102505102506102507102508102509102510102511102512102513102514102515102516102517102518102519102520102521102522102523102524102525102526102527102528102529102530102531102532102533102534102535102536102537102538102539102540102541102542102543102544102545102546102547102548102549102550102551102552102553102554102555102556102557102558102559102560102561102562102563102564102565102566102567102568102569102570102571102572102573102574102575102576102577102578102579102580102581102582102583102584102585102586102587102588102589102590102591102592102593102594102595102596102597102598102599102600102601102602102603102604102605102606102607102608102609102610102611102612102613102614102615102616102617102618102619102620102621102622102623102624102625102626102627102628102629102630102631102632102633102634102635102636102637102638102639102640102641102642102643102644102645102646102647102648102649102650102651102652102653102654102655102656102657102658102659102660102661102662102663102664102665102666102667102668102669102670102671102672102673102674102675102676102677102678102679102680102681102682102683102684102685102686102687102688102689102690102691102692102693102694102695102696102697102698102699102700102701102702102703102704102705102706102707102708102709102710102711102712102713102714102715102716102717102718102719102720102721102722102723102724102725102726102727102728102729102730102731102732102733102734102735102736102737102738102739102740102741102742102743102744102745102746102747102748102749102750102751102752102753102754102755102756102757102758102759102760102761102762102763102764102765102766102767102768102769102770102771102772102773102774102775102776102777102778102779102780102781102782102783102784102785102786102787102788102789102790102791102792102793102794102795102796102797102798102799102800102801102802102803102804102805102806102807102808102809102810102811102812102813102814102815102816102817102818102819102820102821102822102823102824102825102826102827102828102829102830102831102832102833102834102835102836102837102838102839102840102841102842102843102844102845102846102847102848102849102850102851102852102853102854102855102856102857102858102859102860102861102862102863102864102865102866102867102868102869102870102871102872102873102874102875102876102877102878102879102880102881102882102883102884102885102886102887102888102889102890102891102892102893102894102895102896102897102898102899102900102901102902102903102904102905102906102907102908102909102910102911102912102913102914102915102916102917102918102919102920102921102922102923102924102925102926102927102928102929102930102931102932102933102934102935102936102937102938102939102940102941102942102943102944102945102946102947102948102949102950102951102952102953102954102955102956102957102958102959102960102961102962102963102964102965102966102967102968102969102970102971102972102973102974102975102976102977102978102979102980102981102982102983102984102985102986102987102988102989102990102991102992102993102994102995102996102997102998102999103000103001103002103003103004103005103006103007103008103009103010103011103012103013103014103015103016103017103018103019103020103021103022103023103024103025103026103027103028103029103030103031103032103033103034103035103036103037103038103039103040103041103042103043103044103045103046103047103048103049103050103051103052103053103054103055103056103057103058103059103060103061103062103063103064103065103066103067103068103069103070103071103072103073103074103075103076103077103078103079103080103081103082103083103084103085103086103087103088103089103090103091103092103093103094103095103096103097103098103099103100103101103102103103103104103105103106103107103108103109103110103111103112103113103114103115103116103117103118103119103120103121103122103123103124103125103126103127103128103129103130103131103132103133103134103135103136103137103138103139103140103141103142103143103144103145103146103147103148103149103150103151103152103153103154103155103156103157103158103159103160103161103162103163103164103165103166103167103168103169103170103171103172103173103174103175103176103177103178103179103180103181103182103183103184103185103186103187103188103189103190103191103192103193103194103195103196103197103198103199103200103201103202103203103204103205103206103207103208103209103210103211103212103213103214103215103216103217103218103219103220103221103222103223103224103225103226103227103228103229103230103231103232103233103234103235103236103237103238103239103240103241103242103243103244103245103246103247103248103249103250103251103252103253103254103255103256103257103258103259103260103261103262103263103264103265103266103267103268103269103270103271103272103273103274103275103276103277103278103279103280103281103282103283103284103285103286103287103288103289103290103291103292103293103294103295103296103297103298103299103300103301103302103303103304103305103306103307103308103309103310103311103312103313103314103315103316103317103318103319103320103321103322103323103324103325103326103327103328103329103330103331103332103333103334103335103336103337103338103339103340103341103342103343103344103345103346103347103348103349103350103351103352103353103354103355103356103357103358103359103360103361103362103363103364103365103366103367103368103369103370103371103372103373103374103375103376103377103378103379103380103381103382103383103384103385103386103387103388103389103390103391103392103393103394103395103396103397103398103399103400103401103402103403103404103405103406103407103408103409103410103411103412103413103414103415103416103417103418103419103420103421103422103423103424103425103426103427103428103429103430103431103432103433103434103435103436103437103438103439103440103441103442103443103444103445103446103447103448103449103450103451103452103453103454103455103456103457103458103459103460103461103462103463103464103465103466103467103468103469103470103471103472103473103474103475103476103477103478103479103480103481103482103483103484103485103486103487103488103489103490103491103492103493103494103495103496103497103498103499103500103501103502103503103504103505103506103507103508103509103510103511103512103513103514103515103516103517103518103519103520103521103522103523103524103525103526103527103528103529103530103531103532103533103534103535103536103537103538103539103540103541103542103543103544103545103546103547103548103549103550103551103552103553103554103555103556103557103558103559103560103561103562103563103564103565103566103567103568103569103570103571103572103573103574103575103576103577103578103579103580103581103582103583103584103585103586103587103588103589103590103591103592103593103594103595103596103597103598103599103600103601103602103603103604103605103606103607103608103609103610103611103612103613103614103615103616103617103618103619103620103621103622103623103624103625103626103627103628103629103630103631103632103633103634103635103636103637103638103639103640103641103642103643103644103645103646103647103648103649103650103651103652103653103654103655103656103657103658103659103660103661103662103663103664103665103666103667103668103669103670103671103672103673103674103675103676
  1. commit 6c8e900d11c0ed2d2b459a3c24fe84414ca9d35e
  2. Author: Ajay Bhargav Baaskaran <[email protected]>
  3. Date: Fri Nov 16 17:22:37 2018 -0800
  4. Razor parser rewrite (#2590)
  5. * Razor parser rewrite
  6. - Rewrite CSharp parser
  7. - Basic rewrite of HTML parser (More improvements to follow)
  8. - Define and generate syntax nodes and boilerplate
  9. - Rewrite ClassifiedSpan and TagHelperSpan generation logic
  10. - Rewrite TagHelper phase
  11. - Rewrite Intermediate phase
  12. - Rewrite other miscellaneous features and bug fixes
  13. - Rewrite partial parsing
  14. - Added some syntax manipulation APIs
  15. - Removed unused legacy types
  16. * Test changes
  17. - Update parser test infrastructure
  18. - Update tests
  19. - Regenerated baselines
  20. - Removed unused legacy types
  21. diff --git a/src/Microsoft.AspNetCore.Razor.Language/ClassifiedSpanVisitor.cs b/src/Microsoft.AspNetCore.Razor.Language/ClassifiedSpanVisitor.cs
  22. new file mode 100644
  23. index 00000000000..ec0e7977d01
  24. --- /dev/null
  25. +++ b/src/Microsoft.AspNetCore.Razor.Language/ClassifiedSpanVisitor.cs
  26. @@ -0,0 +1,312 @@
  27. +// Copyright (c) .NET Foundation. All rights reserved.
  28. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  29. +
  30. +using System;
  31. +using System.Collections.Generic;
  32. +using Microsoft.AspNetCore.Razor.Language.Legacy;
  33. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  34. +
  35. +namespace Microsoft.AspNetCore.Razor.Language
  36. +{
  37. + internal class ClassifiedSpanVisitor : SyntaxWalker
  38. + {
  39. + private RazorSourceDocument _source;
  40. + private List<ClassifiedSpanInternal> _spans;
  41. + private BlockKindInternal _currentBlockKind;
  42. + private SyntaxNode _currentBlock;
  43. +
  44. + public ClassifiedSpanVisitor(RazorSourceDocument source)
  45. + {
  46. + _source = source;
  47. + _spans = new List<ClassifiedSpanInternal>();
  48. + _currentBlockKind = BlockKindInternal.Markup;
  49. + }
  50. +
  51. + public IReadOnlyList<ClassifiedSpanInternal> ClassifiedSpans => _spans;
  52. +
  53. + public override void VisitRazorCommentBlock(RazorCommentBlockSyntax node)
  54. + {
  55. + WriteBlock(node, BlockKindInternal.Comment, razorCommentSyntax =>
  56. + {
  57. + WriteSpan(razorCommentSyntax.StartCommentTransition, SpanKindInternal.Transition, AcceptedCharactersInternal.None);
  58. + WriteSpan(razorCommentSyntax.StartCommentStar, SpanKindInternal.MetaCode, AcceptedCharactersInternal.None);
  59. +
  60. + var comment = razorCommentSyntax.Comment;
  61. + if (comment.IsMissing)
  62. + {
  63. + // We need to generate a classified span at this position. So insert a marker in its place.
  64. + comment = (SyntaxToken)SyntaxFactory.Token(SyntaxKind.Marker, string.Empty).Green.CreateRed(razorCommentSyntax, razorCommentSyntax.StartCommentStar.EndPosition);
  65. + }
  66. + WriteSpan(comment, SpanKindInternal.Comment, AcceptedCharactersInternal.Any);
  67. +
  68. + WriteSpan(razorCommentSyntax.EndCommentStar, SpanKindInternal.MetaCode, AcceptedCharactersInternal.None);
  69. + WriteSpan(razorCommentSyntax.EndCommentTransition, SpanKindInternal.Transition, AcceptedCharactersInternal.None);
  70. + });
  71. + }
  72. +
  73. + public override void VisitCSharpCodeBlock(CSharpCodeBlockSyntax node)
  74. + {
  75. + if (node.Parent is CSharpStatementBodySyntax ||
  76. + node.Parent is CSharpExplicitExpressionBodySyntax ||
  77. + node.Parent is CSharpImplicitExpressionBodySyntax ||
  78. + node.Parent is RazorDirectiveBodySyntax ||
  79. + (_currentBlockKind == BlockKindInternal.Directive &&
  80. + node.Children.Count == 1 &&
  81. + node.Children[0] is CSharpStatementLiteralSyntax))
  82. + {
  83. + base.VisitCSharpCodeBlock(node);
  84. + return;
  85. + }
  86. +
  87. + WriteBlock(node, BlockKindInternal.Statement, base.VisitCSharpCodeBlock);
  88. + }
  89. +
  90. + public override void VisitCSharpStatement(CSharpStatementSyntax node)
  91. + {
  92. + WriteBlock(node, BlockKindInternal.Statement, base.VisitCSharpStatement);
  93. + }
  94. +
  95. + public override void VisitCSharpExplicitExpression(CSharpExplicitExpressionSyntax node)
  96. + {
  97. + WriteBlock(node, BlockKindInternal.Expression, base.VisitCSharpExplicitExpression);
  98. + }
  99. +
  100. + public override void VisitCSharpImplicitExpression(CSharpImplicitExpressionSyntax node)
  101. + {
  102. + WriteBlock(node, BlockKindInternal.Expression, base.VisitCSharpImplicitExpression);
  103. + }
  104. +
  105. + public override void VisitRazorDirective(RazorDirectiveSyntax node)
  106. + {
  107. + WriteBlock(node, BlockKindInternal.Directive, base.VisitRazorDirective);
  108. + }
  109. +
  110. + public override void VisitCSharpTemplateBlock(CSharpTemplateBlockSyntax node)
  111. + {
  112. + WriteBlock(node, BlockKindInternal.Template, base.VisitCSharpTemplateBlock);
  113. + }
  114. +
  115. + public override void VisitMarkupBlock(MarkupBlockSyntax node)
  116. + {
  117. + WriteBlock(node, BlockKindInternal.Markup, base.VisitMarkupBlock);
  118. + }
  119. +
  120. + public override void VisitMarkupTagHelperAttributeValue(MarkupTagHelperAttributeValueSyntax node)
  121. + {
  122. + // We don't generate a classified span when the attribute value is a simple literal value.
  123. + // This is done so we maintain the classified spans generated in 2.x which
  124. + // used ConditionalAttributeCollapser (combines markup literal attribute values into one span with no block parent).
  125. + if (node.Children.Count > 1 ||
  126. + (node.Children.Count == 1 && node.Children[0] is MarkupDynamicAttributeValueSyntax))
  127. + {
  128. + WriteBlock(node, BlockKindInternal.Markup, base.VisitMarkupTagHelperAttributeValue);
  129. + return;
  130. + }
  131. +
  132. + base.VisitMarkupTagHelperAttributeValue(node);
  133. + }
  134. +
  135. + public override void VisitMarkupTagBlock(MarkupTagBlockSyntax node)
  136. + {
  137. + WriteBlock(node, BlockKindInternal.Tag, base.VisitMarkupTagBlock);
  138. + }
  139. +
  140. + public override void VisitMarkupTagHelperElement(MarkupTagHelperElementSyntax node)
  141. + {
  142. + WriteBlock(node, BlockKindInternal.Tag, base.VisitMarkupTagHelperElement);
  143. + }
  144. +
  145. + public override void VisitMarkupTagHelperStartTag(MarkupTagHelperStartTagSyntax node)
  146. + {
  147. + foreach (var child in node.Children)
  148. + {
  149. + if (child is MarkupTagHelperAttributeSyntax attribute)
  150. + {
  151. + Visit(attribute);
  152. + }
  153. + }
  154. + }
  155. +
  156. + public override void VisitMarkupTagHelperEndTag(MarkupTagHelperEndTagSyntax node)
  157. + {
  158. + // We don't want to generate a classified span for a tag helper end tag. Do nothing.
  159. + }
  160. +
  161. + public override void VisitMarkupAttributeBlock(MarkupAttributeBlockSyntax node)
  162. + {
  163. + WriteBlock(node, BlockKindInternal.Markup, n =>
  164. + {
  165. + var equalsSyntax = SyntaxFactory.MarkupTextLiteral(new SyntaxList<SyntaxToken>(node.EqualsToken));
  166. + var mergedAttributePrefix = MergeTextLiteralSpans(node.NamePrefix, node.Name, node.NameSuffix, equalsSyntax, node.ValuePrefix);
  167. + Visit(mergedAttributePrefix);
  168. + Visit(node.Value);
  169. + Visit(node.ValueSuffix);
  170. + });
  171. + }
  172. +
  173. + public override void VisitMarkupTagHelperAttribute(MarkupTagHelperAttributeSyntax node)
  174. + {
  175. + Visit(node.Value);
  176. + }
  177. +
  178. + public override void VisitMarkupMinimizedAttributeBlock(MarkupMinimizedAttributeBlockSyntax node)
  179. + {
  180. + WriteBlock(node, BlockKindInternal.Markup, n =>
  181. + {
  182. + var mergedAttributePrefix = MergeTextLiteralSpans(node.NamePrefix, node.Name);
  183. + Visit(mergedAttributePrefix);
  184. + });
  185. + }
  186. +
  187. + public override void VisitMarkupCommentBlock(MarkupCommentBlockSyntax node)
  188. + {
  189. + WriteBlock(node, BlockKindInternal.HtmlComment, base.VisitMarkupCommentBlock);
  190. + }
  191. +
  192. + public override void VisitMarkupDynamicAttributeValue(MarkupDynamicAttributeValueSyntax node)
  193. + {
  194. + WriteBlock(node, BlockKindInternal.Markup, base.VisitMarkupDynamicAttributeValue);
  195. + }
  196. +
  197. + public override void VisitRazorMetaCode(RazorMetaCodeSyntax node)
  198. + {
  199. + WriteSpan(node, SpanKindInternal.MetaCode);
  200. + base.VisitRazorMetaCode(node);
  201. + }
  202. +
  203. + public override void VisitCSharpTransition(CSharpTransitionSyntax node)
  204. + {
  205. + WriteSpan(node, SpanKindInternal.Transition);
  206. + base.VisitCSharpTransition(node);
  207. + }
  208. +
  209. + public override void VisitMarkupTransition(MarkupTransitionSyntax node)
  210. + {
  211. + WriteSpan(node, SpanKindInternal.Transition);
  212. + base.VisitMarkupTransition(node);
  213. + }
  214. +
  215. + public override void VisitCSharpStatementLiteral(CSharpStatementLiteralSyntax node)
  216. + {
  217. + WriteSpan(node, SpanKindInternal.Code);
  218. + base.VisitCSharpStatementLiteral(node);
  219. + }
  220. +
  221. + public override void VisitCSharpExpressionLiteral(CSharpExpressionLiteralSyntax node)
  222. + {
  223. + WriteSpan(node, SpanKindInternal.Code);
  224. + base.VisitCSharpExpressionLiteral(node);
  225. + }
  226. +
  227. + public override void VisitCSharpEphemeralTextLiteral(CSharpEphemeralTextLiteralSyntax node)
  228. + {
  229. + WriteSpan(node, SpanKindInternal.Code);
  230. + base.VisitCSharpEphemeralTextLiteral(node);
  231. + }
  232. +
  233. + public override void VisitUnclassifiedTextLiteral(UnclassifiedTextLiteralSyntax node)
  234. + {
  235. + WriteSpan(node, SpanKindInternal.None);
  236. + base.VisitUnclassifiedTextLiteral(node);
  237. + }
  238. +
  239. + public override void VisitMarkupLiteralAttributeValue(MarkupLiteralAttributeValueSyntax node)
  240. + {
  241. + WriteSpan(node, SpanKindInternal.Markup);
  242. + base.VisitMarkupLiteralAttributeValue(node);
  243. + }
  244. +
  245. + public override void VisitMarkupTextLiteral(MarkupTextLiteralSyntax node)
  246. + {
  247. + if (node.Parent is MarkupLiteralAttributeValueSyntax)
  248. + {
  249. + base.VisitMarkupTextLiteral(node);
  250. + return;
  251. + }
  252. +
  253. + WriteSpan(node, SpanKindInternal.Markup);
  254. + base.VisitMarkupTextLiteral(node);
  255. + }
  256. +
  257. + public override void VisitMarkupEphemeralTextLiteral(MarkupEphemeralTextLiteralSyntax node)
  258. + {
  259. + WriteSpan(node, SpanKindInternal.Markup);
  260. + base.VisitMarkupEphemeralTextLiteral(node);
  261. + }
  262. +
  263. + private void WriteBlock<TNode>(TNode node, BlockKindInternal kind, Action<TNode> handler) where TNode : SyntaxNode
  264. + {
  265. + var previousBlock = _currentBlock;
  266. + var previousKind = _currentBlockKind;
  267. +
  268. + _currentBlock = node;
  269. + _currentBlockKind = kind;
  270. +
  271. + handler(node);
  272. +
  273. + _currentBlock = previousBlock;
  274. + _currentBlockKind = previousKind;
  275. + }
  276. +
  277. + private void WriteSpan(SyntaxNode node, SpanKindInternal kind, AcceptedCharactersInternal? acceptedCharacters = null)
  278. + {
  279. + if (node.IsMissing)
  280. + {
  281. + return;
  282. + }
  283. +
  284. + var spanSource = node.GetSourceSpan(_source);
  285. + var blockSource = _currentBlock.GetSourceSpan(_source);
  286. + if (!acceptedCharacters.HasValue)
  287. + {
  288. + acceptedCharacters = AcceptedCharactersInternal.Any;
  289. + var context = node.GetSpanContext();
  290. + if (context != null)
  291. + {
  292. + acceptedCharacters = context.EditHandler.AcceptedCharacters;
  293. + }
  294. + }
  295. +
  296. + var span = new ClassifiedSpanInternal(spanSource, blockSource, kind, _currentBlockKind, acceptedCharacters.Value);
  297. + _spans.Add(span);
  298. + }
  299. +
  300. + private MarkupTextLiteralSyntax MergeTextLiteralSpans(params MarkupTextLiteralSyntax[] literalSyntaxes)
  301. + {
  302. + if (literalSyntaxes == null || literalSyntaxes.Length == 0)
  303. + {
  304. + return null;
  305. + }
  306. +
  307. + SyntaxNode parent = null;
  308. + var position = 0;
  309. + var seenFirstLiteral = false;
  310. + var builder = Syntax.InternalSyntax.SyntaxListBuilder.Create();
  311. +
  312. + foreach (var syntax in literalSyntaxes)
  313. + {
  314. + if (syntax == null)
  315. + {
  316. + continue;
  317. + }
  318. + else if (!seenFirstLiteral)
  319. + {
  320. + // Set the parent and position of the merged literal to the value of the first non-null literal.
  321. + parent = syntax.Parent;
  322. + position = syntax.Position;
  323. + seenFirstLiteral = true;
  324. + }
  325. +
  326. + foreach (var token in syntax.LiteralTokens)
  327. + {
  328. + builder.Add(token.Green);
  329. + }
  330. + }
  331. +
  332. + var mergedLiteralSyntax = Syntax.InternalSyntax.SyntaxFactory.MarkupTextLiteral(
  333. + builder.ToList<Syntax.InternalSyntax.SyntaxToken>());
  334. +
  335. + return (MarkupTextLiteralSyntax)mergedLiteralSyntax.CreateRed(parent, position);
  336. + }
  337. + }
  338. +}
  339. diff --git a/src/Microsoft.AspNetCore.Razor.Language/DefaultDirectiveSyntaxTreePass.cs b/src/Microsoft.AspNetCore.Razor.Language/DefaultDirectiveSyntaxTreePass.cs
  340. index 54c733e0f18..65e578b5ce4 100644
  341. --- a/src/Microsoft.AspNetCore.Razor.Language/DefaultDirectiveSyntaxTreePass.cs
  342. +++ b/src/Microsoft.AspNetCore.Razor.Language/DefaultDirectiveSyntaxTreePass.cs
  343. @@ -5,6 +5,7 @@ using System;
  344. using System.Linq;
  345. using Microsoft.AspNetCore.Razor.Language.Extensions;
  346. using Microsoft.AspNetCore.Razor.Language.Legacy;
  347. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  348. namespace Microsoft.AspNetCore.Razor.Language
  349. {
  350. @@ -23,37 +24,42 @@ namespace Microsoft.AspNetCore.Razor.Language
  351. {
  352. throw new ArgumentNullException(nameof(syntaxTree));
  353. }
  354. -
  355. - var sectionVerifier = new NestedSectionVerifier();
  356. - sectionVerifier.Verify(syntaxTree);
  357. -
  358. - return syntaxTree;
  359. +
  360. + var sectionVerifier = new NestedSectionVerifier(syntaxTree);
  361. + return sectionVerifier.Verify();
  362. }
  363. - private class NestedSectionVerifier : ParserVisitor
  364. + private class NestedSectionVerifier : SyntaxRewriter
  365. {
  366. private int _nestedLevel;
  367. + private RazorSyntaxTree _syntaxTree;
  368. +
  369. + public NestedSectionVerifier(RazorSyntaxTree syntaxTree)
  370. + {
  371. + _syntaxTree = syntaxTree;
  372. + }
  373. - public void Verify(RazorSyntaxTree tree)
  374. + public RazorSyntaxTree Verify()
  375. {
  376. - tree.Root.Accept(this);
  377. + var root = Visit(_syntaxTree.Root);
  378. + var rewrittenTree = new DefaultRazorSyntaxTree(root, _syntaxTree.Source, _syntaxTree.Diagnostics, _syntaxTree.Options);
  379. + return rewrittenTree;
  380. }
  381. - public override void VisitDirectiveBlock(DirectiveChunkGenerator chunkGenerator, Block block)
  382. + public override SyntaxNode VisitRazorDirective(RazorDirectiveSyntax node)
  383. {
  384. if (_nestedLevel > 0)
  385. {
  386. - var directiveStart = block.Children.First(child => !child.IsBlock && ((Span)child).Kind == SpanKindInternal.Transition).Start;
  387. + var directiveStart = node.Transition.GetSourceLocation(_syntaxTree.Source);
  388. var errorLength = /* @ */ 1 + SectionDirective.Directive.Directive.Length;
  389. var error = RazorDiagnosticFactory.CreateParsing_SectionsCannotBeNested(new SourceSpan(directiveStart, errorLength));
  390. - chunkGenerator.Diagnostics.Add(error);
  391. + node = node.AppendDiagnostic(error);
  392. }
  393. -
  394. _nestedLevel++;
  395. -
  396. - VisitDefault(block);
  397. -
  398. + var result = base.VisitRazorDirective(node);
  399. _nestedLevel--;
  400. +
  401. + return result;
  402. }
  403. }
  404. }
  405. diff --git a/src/Microsoft.AspNetCore.Razor.Language/DefaultRazorIntermediateNodeLoweringPhase.cs b/src/Microsoft.AspNetCore.Razor.Language/DefaultRazorIntermediateNodeLoweringPhase.cs
  406. index 762fd61d63b..07e1ad44c8d 100644
  407. --- a/src/Microsoft.AspNetCore.Razor.Language/DefaultRazorIntermediateNodeLoweringPhase.cs
  408. +++ b/src/Microsoft.AspNetCore.Razor.Language/DefaultRazorIntermediateNodeLoweringPhase.cs
  409. @@ -8,6 +8,7 @@ using System.Linq;
  410. using Microsoft.AspNetCore.Razor.Language.Extensions;
  411. using Microsoft.AspNetCore.Razor.Language.Intermediate;
  412. using Microsoft.AspNetCore.Razor.Language.Legacy;
  413. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  414. namespace Microsoft.AspNetCore.Razor.Language
  415. {
  416. @@ -46,8 +47,8 @@ namespace Microsoft.AspNetCore.Razor.Language
  417. {
  418. var import = imports[j];
  419. - importsVisitor.FilePath = import.Source.FilePath;
  420. - importsVisitor.VisitBlock(import.Root);
  421. + importsVisitor.SourceDocument = import.Source;
  422. + importsVisitor.Visit(import.Root);
  423. }
  424. importedUsings = importsVisitor.Usings;
  425. @@ -56,10 +57,10 @@ namespace Microsoft.AspNetCore.Razor.Language
  426. var tagHelperPrefix = tagHelperContext?.Prefix;
  427. var visitor = new MainSourceVisitor(document, builder, tagHelperPrefix, syntaxTree.Options.FeatureFlags)
  428. {
  429. - FilePath = syntaxTree.Source.FilePath,
  430. + SourceDocument = syntaxTree.Source,
  431. };
  432. - visitor.VisitBlock(syntaxTree.Root);
  433. + visitor.Visit(syntaxTree.Root);
  434. // 1. Prioritize non-imported usings over imported ones.
  435. // 2. Don't import usings that already exist in primary document.
  436. @@ -189,7 +190,7 @@ namespace Microsoft.AspNetCore.Razor.Language
  437. public override int GetHashCode() => Namespace.GetHashCode();
  438. }
  439. - private class LoweringVisitor : ParserVisitor
  440. + private class LoweringVisitor : SyntaxWalker
  441. {
  442. protected readonly IntermediateNodeBuilder _builder;
  443. protected readonly DocumentIntermediateNode _document;
  444. @@ -206,195 +207,208 @@ namespace Microsoft.AspNetCore.Razor.Language
  445. public IReadOnlyList<UsingReference> Usings => _usings;
  446. - public string FilePath { get; set; }
  447. + public RazorSourceDocument SourceDocument { get; set; }
  448. - public override void VisitDirectiveToken(DirectiveTokenChunkGenerator chunkGenerator, Span span)
  449. - {
  450. - _builder.Add(new DirectiveTokenIntermediateNode()
  451. - {
  452. - Content = span.Content,
  453. - DirectiveToken = chunkGenerator.Descriptor,
  454. - Source = BuildSourceSpanFromNode(span),
  455. - });
  456. - }
  457. -
  458. - public override void VisitDirectiveBlock(DirectiveChunkGenerator chunkGenerator, Block block)
  459. + public override void VisitRazorDirective(RazorDirectiveSyntax node)
  460. {
  461. IntermediateNode directiveNode;
  462. - if (IsMalformed(chunkGenerator.Diagnostics))
  463. + var descriptor = node.DirectiveDescriptor;
  464. +
  465. + if (descriptor != null)
  466. {
  467. - directiveNode = new MalformedDirectiveIntermediateNode()
  468. + var diagnostics = node.GetDiagnostics();
  469. +
  470. + // This is an extensible directive.
  471. + if (IsMalformed(diagnostics))
  472. {
  473. - DirectiveName = chunkGenerator.Descriptor.Directive,
  474. - Directive = chunkGenerator.Descriptor,
  475. - Source = BuildSourceSpanFromNode(block),
  476. - };
  477. - }
  478. - else
  479. - {
  480. - directiveNode = new DirectiveIntermediateNode()
  481. + directiveNode = new MalformedDirectiveIntermediateNode()
  482. + {
  483. + DirectiveName = descriptor.Directive,
  484. + Directive = descriptor,
  485. + Source = BuildSourceSpanFromNode(node),
  486. + };
  487. + }
  488. + else
  489. {
  490. - DirectiveName = chunkGenerator.Descriptor.Directive,
  491. - Directive = chunkGenerator.Descriptor,
  492. - Source = BuildSourceSpanFromNode(block),
  493. - };
  494. - }
  495. -
  496. - for (var i = 0; i < chunkGenerator.Diagnostics.Count; i++)
  497. - {
  498. - directiveNode.Diagnostics.Add(chunkGenerator.Diagnostics[i]);
  499. - }
  500. + directiveNode = new DirectiveIntermediateNode()
  501. + {
  502. + DirectiveName = descriptor.Directive,
  503. + Directive = descriptor,
  504. + Source = BuildSourceSpanFromNode(node),
  505. + };
  506. + }
  507. - _builder.Push(directiveNode);
  508. + for (var i = 0; i < diagnostics.Length; i++)
  509. + {
  510. + directiveNode.Diagnostics.Add(diagnostics[i]);
  511. + }
  512. - VisitDefault(block);
  513. + _builder.Push(directiveNode);
  514. + }
  515. - _builder.Pop();
  516. - }
  517. + Visit(node.Body);
  518. - public override void VisitImportSpan(AddImportChunkGenerator chunkGenerator, Span span)
  519. - {
  520. - var namespaceImport = chunkGenerator.Namespace.Trim();
  521. - var namespaceSpan = BuildSourceSpanFromNode(span);
  522. - _usings.Add(new UsingReference(namespaceImport, namespaceSpan));
  523. + if (descriptor != null)
  524. + {
  525. + _builder.Pop();
  526. + }
  527. }
  528. - public override void VisitAddTagHelperSpan(AddTagHelperChunkGenerator chunkGenerator, Span span)
  529. + public override void VisitCSharpStatementLiteral(CSharpStatementLiteralSyntax node)
  530. {
  531. - IntermediateNode directiveNode;
  532. - if (IsMalformed(chunkGenerator.Diagnostics))
  533. + var context = node.GetSpanContext();
  534. + if (context == null)
  535. {
  536. - directiveNode = new MalformedDirectiveIntermediateNode()
  537. - {
  538. - DirectiveName = CSharpCodeParser.AddTagHelperDirectiveDescriptor.Directive,
  539. - Directive = CSharpCodeParser.AddTagHelperDirectiveDescriptor,
  540. - Source = BuildSourceSpanFromNode(span),
  541. - };
  542. + base.VisitCSharpStatementLiteral(node);
  543. + return;
  544. }
  545. - else
  546. + else if (context.ChunkGenerator is DirectiveTokenChunkGenerator tokenChunkGenerator)
  547. {
  548. - directiveNode = new DirectiveIntermediateNode()
  549. + _builder.Add(new DirectiveTokenIntermediateNode()
  550. {
  551. - DirectiveName = CSharpCodeParser.AddTagHelperDirectiveDescriptor.Directive,
  552. - Directive = CSharpCodeParser.AddTagHelperDirectiveDescriptor,
  553. - Source = BuildSourceSpanFromNode(span),
  554. - };
  555. + Content = node.GetContent(),
  556. + DirectiveToken = tokenChunkGenerator.Descriptor,
  557. + Source = BuildSourceSpanFromNode(node),
  558. + });
  559. }
  560. -
  561. - for (var i = 0; i < chunkGenerator.Diagnostics.Count; i++)
  562. + else if (context.ChunkGenerator is AddImportChunkGenerator importChunkGenerator)
  563. {
  564. - directiveNode.Diagnostics.Add(chunkGenerator.Diagnostics[i]);
  565. + var namespaceImport = importChunkGenerator.Namespace.Trim();
  566. + var namespaceSpan = BuildSourceSpanFromNode(node);
  567. + _usings.Add(new UsingReference(namespaceImport, namespaceSpan));
  568. }
  569. -
  570. - _builder.Push(directiveNode);
  571. -
  572. - _builder.Add(new DirectiveTokenIntermediateNode()
  573. + else if (context.ChunkGenerator is AddTagHelperChunkGenerator addTagHelperChunkGenerator)
  574. {
  575. - Content = chunkGenerator.LookupText,
  576. - DirectiveToken = CSharpCodeParser.AddTagHelperDirectiveDescriptor.Tokens.First(),
  577. - Source = BuildSourceSpanFromNode(span),
  578. - });
  579. + IntermediateNode directiveNode;
  580. + if (IsMalformed(addTagHelperChunkGenerator.Diagnostics))
  581. + {
  582. + directiveNode = new MalformedDirectiveIntermediateNode()
  583. + {
  584. + DirectiveName = CSharpCodeParser.AddTagHelperDirectiveDescriptor.Directive,
  585. + Directive = CSharpCodeParser.AddTagHelperDirectiveDescriptor,
  586. + Source = BuildSourceSpanFromNode(node),
  587. + };
  588. + }
  589. + else
  590. + {
  591. + directiveNode = new DirectiveIntermediateNode()
  592. + {
  593. + DirectiveName = CSharpCodeParser.AddTagHelperDirectiveDescriptor.Directive,
  594. + Directive = CSharpCodeParser.AddTagHelperDirectiveDescriptor,
  595. + Source = BuildSourceSpanFromNode(node),
  596. + };
  597. + }
  598. - _builder.Pop();
  599. - }
  600. + for (var i = 0; i < addTagHelperChunkGenerator.Diagnostics.Count; i++)
  601. + {
  602. + directiveNode.Diagnostics.Add(addTagHelperChunkGenerator.Diagnostics[i]);
  603. + }
  604. - public override void VisitRemoveTagHelperSpan(RemoveTagHelperChunkGenerator chunkGenerator, Span span)
  605. - {
  606. - IntermediateNode directiveNode;
  607. - if (IsMalformed(chunkGenerator.Diagnostics))
  608. - {
  609. - directiveNode = new MalformedDirectiveIntermediateNode()
  610. + _builder.Push(directiveNode);
  611. +
  612. + _builder.Add(new DirectiveTokenIntermediateNode()
  613. {
  614. - DirectiveName = CSharpCodeParser.RemoveTagHelperDirectiveDescriptor.Directive,
  615. - Directive = CSharpCodeParser.RemoveTagHelperDirectiveDescriptor,
  616. - Source = BuildSourceSpanFromNode(span),
  617. - };
  618. + Content = addTagHelperChunkGenerator.LookupText,
  619. + DirectiveToken = CSharpCodeParser.AddTagHelperDirectiveDescriptor.Tokens.First(),
  620. + Source = BuildSourceSpanFromNode(node),
  621. + });
  622. +
  623. + _builder.Pop();
  624. }
  625. - else
  626. + else if (context.ChunkGenerator is RemoveTagHelperChunkGenerator removeTagHelperChunkGenerator)
  627. {
  628. - directiveNode = new DirectiveIntermediateNode()
  629. + IntermediateNode directiveNode;
  630. + if (IsMalformed(removeTagHelperChunkGenerator.Diagnostics))
  631. {
  632. - DirectiveName = CSharpCodeParser.RemoveTagHelperDirectiveDescriptor.Directive,
  633. - Directive = CSharpCodeParser.RemoveTagHelperDirectiveDescriptor,
  634. - Source = BuildSourceSpanFromNode(span),
  635. - };
  636. - }
  637. -
  638. - for (var i = 0; i < chunkGenerator.Diagnostics.Count; i++)
  639. - {
  640. - directiveNode.Diagnostics.Add(chunkGenerator.Diagnostics[i]);
  641. - }
  642. -
  643. - _builder.Push(directiveNode);
  644. + directiveNode = new MalformedDirectiveIntermediateNode()
  645. + {
  646. + DirectiveName = CSharpCodeParser.RemoveTagHelperDirectiveDescriptor.Directive,
  647. + Directive = CSharpCodeParser.RemoveTagHelperDirectiveDescriptor,
  648. + Source = BuildSourceSpanFromNode(node),
  649. + };
  650. + }
  651. + else
  652. + {
  653. + directiveNode = new DirectiveIntermediateNode()
  654. + {
  655. + DirectiveName = CSharpCodeParser.RemoveTagHelperDirectiveDescriptor.Directive,
  656. + Directive = CSharpCodeParser.RemoveTagHelperDirectiveDescriptor,
  657. + Source = BuildSourceSpanFromNode(node),
  658. + };
  659. + }
  660. - _builder.Add(new DirectiveTokenIntermediateNode()
  661. - {
  662. - Content = chunkGenerator.LookupText,
  663. - DirectiveToken = CSharpCodeParser.RemoveTagHelperDirectiveDescriptor.Tokens.First(),
  664. - Source = BuildSourceSpanFromNode(span),
  665. - });
  666. + for (var i = 0; i < removeTagHelperChunkGenerator.Diagnostics.Count; i++)
  667. + {
  668. + directiveNode.Diagnostics.Add(removeTagHelperChunkGenerator.Diagnostics[i]);
  669. + }
  670. - _builder.Pop();
  671. - }
  672. + _builder.Push(directiveNode);
  673. - public override void VisitTagHelperPrefixDirectiveSpan(TagHelperPrefixDirectiveChunkGenerator chunkGenerator, Span span)
  674. - {
  675. - IntermediateNode directiveNode;
  676. - if (IsMalformed(chunkGenerator.Diagnostics))
  677. - {
  678. - directiveNode = new MalformedDirectiveIntermediateNode()
  679. + _builder.Add(new DirectiveTokenIntermediateNode()
  680. {
  681. - DirectiveName = CSharpCodeParser.TagHelperPrefixDirectiveDescriptor.Directive,
  682. - Directive = CSharpCodeParser.TagHelperPrefixDirectiveDescriptor,
  683. - Source = BuildSourceSpanFromNode(span),
  684. - };
  685. + Content = removeTagHelperChunkGenerator.LookupText,
  686. + DirectiveToken = CSharpCodeParser.RemoveTagHelperDirectiveDescriptor.Tokens.First(),
  687. + Source = BuildSourceSpanFromNode(node),
  688. + });
  689. +
  690. + _builder.Pop();
  691. }
  692. - else
  693. + else if (context.ChunkGenerator is TagHelperPrefixDirectiveChunkGenerator tagHelperPrefixChunkGenerator)
  694. {
  695. - directiveNode = new DirectiveIntermediateNode()
  696. + IntermediateNode directiveNode;
  697. + if (IsMalformed(tagHelperPrefixChunkGenerator.Diagnostics))
  698. {
  699. - DirectiveName = CSharpCodeParser.TagHelperPrefixDirectiveDescriptor.Directive,
  700. - Directive = CSharpCodeParser.TagHelperPrefixDirectiveDescriptor,
  701. - Source = BuildSourceSpanFromNode(span),
  702. - };
  703. - }
  704. + directiveNode = new MalformedDirectiveIntermediateNode()
  705. + {
  706. + DirectiveName = CSharpCodeParser.TagHelperPrefixDirectiveDescriptor.Directive,
  707. + Directive = CSharpCodeParser.TagHelperPrefixDirectiveDescriptor,
  708. + Source = BuildSourceSpanFromNode(node),
  709. + };
  710. + }
  711. + else
  712. + {
  713. + directiveNode = new DirectiveIntermediateNode()
  714. + {
  715. + DirectiveName = CSharpCodeParser.TagHelperPrefixDirectiveDescriptor.Directive,
  716. + Directive = CSharpCodeParser.TagHelperPrefixDirectiveDescriptor,
  717. + Source = BuildSourceSpanFromNode(node),
  718. + };
  719. + }
  720. - for (var i = 0; i < chunkGenerator.Diagnostics.Count; i++)
  721. - {
  722. - directiveNode.Diagnostics.Add(chunkGenerator.Diagnostics[i]);
  723. - }
  724. + for (var i = 0; i < tagHelperPrefixChunkGenerator.Diagnostics.Count; i++)
  725. + {
  726. + directiveNode.Diagnostics.Add(tagHelperPrefixChunkGenerator.Diagnostics[i]);
  727. + }
  728. - _builder.Push(directiveNode);
  729. + _builder.Push(directiveNode);
  730. - _builder.Add(new DirectiveTokenIntermediateNode()
  731. - {
  732. - Content = chunkGenerator.Prefix,
  733. - DirectiveToken = CSharpCodeParser.TagHelperPrefixDirectiveDescriptor.Tokens.First(),
  734. - Source = BuildSourceSpanFromNode(span),
  735. - });
  736. + _builder.Add(new DirectiveTokenIntermediateNode()
  737. + {
  738. + Content = tagHelperPrefixChunkGenerator.Prefix,
  739. + DirectiveToken = CSharpCodeParser.TagHelperPrefixDirectiveDescriptor.Tokens.First(),
  740. + Source = BuildSourceSpanFromNode(node),
  741. + });
  742. - _builder.Pop();
  743. + _builder.Pop();
  744. + }
  745. +
  746. + base.VisitCSharpStatementLiteral(node);
  747. }
  748. - protected SourceSpan? BuildSourceSpanFromNode(SyntaxTreeNode node)
  749. + protected SourceSpan? BuildSourceSpanFromNode(SyntaxNode node)
  750. {
  751. - if (node == null || node.Start == SourceLocation.Undefined)
  752. + if (node == null)
  753. {
  754. return null;
  755. }
  756. - var span = new SourceSpan(
  757. - node.Start.FilePath ?? FilePath,
  758. - node.Start.AbsoluteIndex,
  759. - node.Start.LineIndex,
  760. - node.Start.CharacterIndex,
  761. - node.Length);
  762. - return span;
  763. + return node.GetSourceSpan(SourceDocument);
  764. }
  765. }
  766. private class MainSourceVisitor : LoweringVisitor
  767. {
  768. + private readonly HashSet<string> _renderedBoundAttributeNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
  769. private readonly string _tagHelperPrefix;
  770. public MainSourceVisitor(DocumentIntermediateNode document, IntermediateNodeBuilder builder, string tagHelperPrefix, RazorParserFeatureFlags featureFlags)
  771. @@ -408,86 +422,144 @@ namespace Microsoft.AspNetCore.Razor.Language
  772. // Name=checked
  773. // Prefix= checked="
  774. // Suffix="
  775. - public override void VisitAttributeBlock(AttributeBlockChunkGenerator chunkGenerator, Block block)
  776. + public override void VisitMarkupAttributeBlock(MarkupAttributeBlockSyntax node)
  777. {
  778. - _builder.Push(new HtmlAttributeIntermediateNode()
  779. + var prefixTokens = MergeLiterals(
  780. + node.NamePrefix?.LiteralTokens,
  781. + node.Name.LiteralTokens,
  782. + node.NameSuffix?.LiteralTokens,
  783. + node.EqualsToken == null ? new SyntaxList<SyntaxToken>() : new SyntaxList<SyntaxToken>(node.EqualsToken),
  784. + node.ValuePrefix?.LiteralTokens);
  785. + var prefix = (MarkupTextLiteralSyntax)SyntaxFactory.MarkupTextLiteral(prefixTokens).Green.CreateRed(node, node.NamePrefix?.Position ?? node.Name.Position);
  786. +
  787. + var name = node.Name.GetContent();
  788. + if (name.StartsWith("data-", StringComparison.OrdinalIgnoreCase) &&
  789. + !_featureFlags.EXPERIMENTAL_AllowConditionalDataDashAttributes)
  790. {
  791. - AttributeName = chunkGenerator.Name,
  792. - Prefix = chunkGenerator.Prefix,
  793. - Suffix = chunkGenerator.Suffix,
  794. - Source = BuildSourceSpanFromNode(block),
  795. - });
  796. + Visit(prefix);
  797. + Visit(node.Value);
  798. + Visit(node.ValueSuffix);
  799. + }
  800. + else
  801. + {
  802. + if (node.Value != null && node.Value.ChildNodes().All(c => c is MarkupLiteralAttributeValueSyntax))
  803. + {
  804. + // We need to do what ConditionalAttributeCollapser used to do.
  805. + var literalAttributeValueNodes = node.Value.ChildNodes().Cast<MarkupLiteralAttributeValueSyntax>().ToArray();
  806. + var valueTokens = SyntaxListBuilder<SyntaxToken>.Create();
  807. + for (var i = 0; i < literalAttributeValueNodes.Length; i++)
  808. + {
  809. + var mergedValue = MergeAttributeValue(literalAttributeValueNodes[i]);
  810. + valueTokens.AddRange(mergedValue.LiteralTokens);
  811. + }
  812. + var rewritten = SyntaxFactory.MarkupTextLiteral(valueTokens.ToList());
  813. +
  814. + var mergedLiterals = MergeLiterals(prefix?.LiteralTokens, rewritten.LiteralTokens, node.ValueSuffix?.LiteralTokens);
  815. + var mergedAttribute = SyntaxFactory.MarkupTextLiteral(mergedLiterals).Green.CreateRed(node.Parent, node.Position);
  816. + Visit(mergedAttribute);
  817. + }
  818. + else
  819. + {
  820. + _builder.Push(new HtmlAttributeIntermediateNode()
  821. + {
  822. + AttributeName = node.Name.GetContent(),
  823. + Prefix = prefix.GetContent(),
  824. + Suffix = node.ValueSuffix?.GetContent() ?? string.Empty,
  825. + Source = BuildSourceSpanFromNode(node),
  826. + });
  827. - VisitDefault(block);
  828. + VisitAttributeValue(node.Value);
  829. - _builder.Pop();
  830. + _builder.Pop();
  831. + }
  832. + }
  833. + }
  834. +
  835. + public override void VisitMarkupMinimizedAttributeBlock(MarkupMinimizedAttributeBlockSyntax node)
  836. + {
  837. + var name = node.Name.GetContent();
  838. + if (name.StartsWith("data-", StringComparison.OrdinalIgnoreCase) &&
  839. + !_featureFlags.EXPERIMENTAL_AllowConditionalDataDashAttributes)
  840. + {
  841. + base.VisitMarkupMinimizedAttributeBlock(node);
  842. + return;
  843. + }
  844. +
  845. + // Minimized attributes are just html content.
  846. + var literals = MergeLiterals(
  847. + node.NamePrefix?.LiteralTokens,
  848. + node.Name?.LiteralTokens);
  849. + var literal = SyntaxFactory.MarkupTextLiteral(literals).Green.CreateRed(node.Parent, node.Position);
  850. +
  851. + Visit(literal);
  852. }
  853. // Example
  854. // <input checked="hello-world `@false`"/>
  855. // Prefix= (space)
  856. // Children will contain a token for @false.
  857. - public override void VisitDynamicAttributeBlock(DynamicAttributeBlockChunkGenerator chunkGenerator, Block block)
  858. + public override void VisitMarkupDynamicAttributeValue(MarkupDynamicAttributeValueSyntax node)
  859. {
  860. - var firstChild = block.Children.FirstOrDefault(c => c.IsBlock) as Block;
  861. - if (firstChild == null || firstChild.Type == BlockKindInternal.Expression)
  862. + var containsExpression = false;
  863. + var descendantNodes = node.DescendantNodes(n =>
  864. + {
  865. + // Don't go into sub block. They may contain expressions but we only care about the top level.
  866. + return !(n.Parent is CSharpCodeBlockSyntax);
  867. + });
  868. + foreach (var child in descendantNodes)
  869. + {
  870. + if (child is CSharpImplicitExpressionSyntax || child is CSharpExplicitExpressionSyntax)
  871. + {
  872. + containsExpression = true;
  873. + }
  874. + }
  875. +
  876. + if (containsExpression)
  877. {
  878. _builder.Push(new CSharpExpressionAttributeValueIntermediateNode()
  879. {
  880. - Prefix = chunkGenerator.Prefix,
  881. - Source = BuildSourceSpanFromNode(block),
  882. + Prefix = node.Prefix?.GetContent() ?? string.Empty,
  883. + Source = BuildSourceSpanFromNode(node),
  884. });
  885. }
  886. else
  887. {
  888. _builder.Push(new CSharpCodeAttributeValueIntermediateNode()
  889. {
  890. - Prefix = chunkGenerator.Prefix,
  891. - Source = BuildSourceSpanFromNode(block),
  892. + Prefix = node.Prefix?.GetContent() ?? string.Empty,
  893. + Source = BuildSourceSpanFromNode(node),
  894. });
  895. }
  896. - VisitDefault(block);
  897. + Visit(node.Value);
  898. _builder.Pop();
  899. }
  900. - public override void VisitLiteralAttributeSpan(LiteralAttributeChunkGenerator chunkGenerator, Span span)
  901. + public override void VisitMarkupLiteralAttributeValue(MarkupLiteralAttributeValueSyntax node)
  902. {
  903. _builder.Push(new HtmlAttributeValueIntermediateNode()
  904. {
  905. - Prefix = chunkGenerator.Prefix,
  906. - Source = BuildSourceSpanFromNode(span),
  907. + Prefix = node.Prefix?.GetContent() ?? string.Empty,
  908. + Source = BuildSourceSpanFromNode(node),
  909. });
  910. - var location = chunkGenerator.Value.Location;
  911. - SourceSpan? valueSpan = null;
  912. - if (location != SourceLocation.Undefined)
  913. - {
  914. - valueSpan = new SourceSpan(
  915. - location.FilePath ?? FilePath,
  916. - location.AbsoluteIndex,
  917. - location.LineIndex,
  918. - location.CharacterIndex,
  919. - chunkGenerator.Value.Value.Length);
  920. - }
  921. -
  922. _builder.Add(new IntermediateToken()
  923. {
  924. - Content = chunkGenerator.Value,
  925. + Content = node.Value?.GetContent() ?? string.Empty,
  926. Kind = TokenKind.Html,
  927. - Source = valueSpan
  928. + Source = BuildSourceSpanFromNode(node.Value)
  929. });
  930. _builder.Pop();
  931. }
  932. - public override void VisitTemplateBlock(TemplateBlockChunkGenerator chunkGenerator, Block block)
  933. + public override void VisitCSharpTemplateBlock(CSharpTemplateBlockSyntax node)
  934. {
  935. var templateNode = new TemplateIntermediateNode();
  936. _builder.Push(templateNode);
  937. - VisitDefault(block);
  938. + base.VisitCSharpTemplateBlock(node);
  939. _builder.Pop();
  940. @@ -503,7 +575,7 @@ namespace Microsoft.AspNetCore.Razor.Language
  941. var contentLength = templateNode.Children.Sum(child => child.Source?.Length ?? 0);
  942. templateNode.Source = new SourceSpan(
  943. - sourceRangeStart.Value.FilePath ?? FilePath,
  944. + sourceRangeStart.Value.FilePath ?? SourceDocument.FilePath,
  945. sourceRangeStart.Value.AbsoluteIndex,
  946. sourceRangeStart.Value.LineIndex,
  947. sourceRangeStart.Value.CharacterIndex,
  948. @@ -518,11 +590,11 @@ namespace Microsoft.AspNetCore.Razor.Language
  949. // @DateTime.@*This is a comment*@Now
  950. //
  951. // We need to capture this in the IR so that we can give each piece the correct source mappings
  952. - public override void VisitExpressionBlock(ExpressionChunkGenerator chunkGenerator, Block block)
  953. + public override void VisitCSharpExplicitExpression(CSharpExplicitExpressionSyntax node)
  954. {
  955. if (_builder.Current is CSharpExpressionAttributeValueIntermediateNode)
  956. {
  957. - VisitDefault(block);
  958. + base.VisitCSharpExplicitExpression(node);
  959. return;
  960. }
  961. @@ -530,7 +602,7 @@ namespace Microsoft.AspNetCore.Razor.Language
  962. _builder.Push(expressionNode);
  963. - VisitDefault(block);
  964. + base.VisitCSharpExplicitExpression(node);
  965. _builder.Pop();
  966. @@ -546,7 +618,7 @@ namespace Microsoft.AspNetCore.Razor.Language
  967. var contentLength = expressionNode.Children.Sum(child => child.Source?.Length ?? 0);
  968. expressionNode.Source = new SourceSpan(
  969. - sourceRangeStart.Value.FilePath ?? FilePath,
  970. + sourceRangeStart.Value.FilePath ?? SourceDocument.FilePath,
  971. sourceRangeStart.Value.AbsoluteIndex,
  972. sourceRangeStart.Value.LineIndex,
  973. sourceRangeStart.Value.CharacterIndex,
  974. @@ -555,57 +627,120 @@ namespace Microsoft.AspNetCore.Razor.Language
  975. }
  976. }
  977. - public override void VisitExpressionSpan(ExpressionChunkGenerator chunkGenerator, Span span)
  978. + public override void VisitCSharpImplicitExpression(CSharpImplicitExpressionSyntax node)
  979. {
  980. - _builder.Add(new IntermediateToken()
  981. + if (_builder.Current is CSharpExpressionAttributeValueIntermediateNode)
  982. {
  983. - Content = span.Content,
  984. - Kind = TokenKind.CSharp,
  985. - Source = BuildSourceSpanFromNode(span),
  986. - });
  987. - }
  988. + base.VisitCSharpImplicitExpression(node);
  989. + return;
  990. + }
  991. - public override void VisitStatementSpan(StatementChunkGenerator chunkGenerator, Span span)
  992. - {
  993. - var isAttributeValue = _builder.Current is CSharpCodeAttributeValueIntermediateNode;
  994. + var expressionNode = new CSharpExpressionIntermediateNode();
  995. - if (!isAttributeValue)
  996. + _builder.Push(expressionNode);
  997. +
  998. + base.VisitCSharpImplicitExpression(node);
  999. +
  1000. + _builder.Pop();
  1001. +
  1002. + if (expressionNode.Children.Count > 0)
  1003. {
  1004. - var statementNode = new CSharpCodeIntermediateNode()
  1005. + var sourceRangeStart = expressionNode
  1006. + .Children
  1007. + .FirstOrDefault(child => child.Source != null)
  1008. + ?.Source;
  1009. +
  1010. + if (sourceRangeStart != null)
  1011. {
  1012. - Source = BuildSourceSpanFromNode(span)
  1013. - };
  1014. - _builder.Push(statementNode);
  1015. + var contentLength = expressionNode.Children.Sum(child => child.Source?.Length ?? 0);
  1016. +
  1017. + expressionNode.Source = new SourceSpan(
  1018. + sourceRangeStart.Value.FilePath ?? SourceDocument.FilePath,
  1019. + sourceRangeStart.Value.AbsoluteIndex,
  1020. + sourceRangeStart.Value.LineIndex,
  1021. + sourceRangeStart.Value.CharacterIndex,
  1022. + contentLength);
  1023. + }
  1024. + }
  1025. + }
  1026. +
  1027. + public override void VisitCSharpExpressionLiteral(CSharpExpressionLiteralSyntax node)
  1028. + {
  1029. + if (_builder.Current is TagHelperHtmlAttributeIntermediateNode)
  1030. + {
  1031. + // If we are top level in a tag helper HTML attribute, we want to be rendered as markup.
  1032. + // This case happens for duplicate non-string bound attributes. They would be initially be categorized as
  1033. + // CSharp but since they are duplicate, they should just be markup.
  1034. + var markupLiteral = SyntaxFactory.MarkupTextLiteral(node.LiteralTokens).Green.CreateRed(node.Parent, node.Position);
  1035. + Visit(markupLiteral);
  1036. + return;
  1037. }
  1038. _builder.Add(new IntermediateToken()
  1039. {
  1040. - Content = span.Content,
  1041. + Content = node.GetContent(),
  1042. Kind = TokenKind.CSharp,
  1043. - Source = BuildSourceSpanFromNode(span),
  1044. + Source = BuildSourceSpanFromNode(node),
  1045. });
  1046. - if (!isAttributeValue)
  1047. + base.VisitCSharpExpressionLiteral(node);
  1048. + }
  1049. +
  1050. + public override void VisitCSharpStatementLiteral(CSharpStatementLiteralSyntax node)
  1051. + {
  1052. + var context = node.GetSpanContext();
  1053. + if (context == null || context.ChunkGenerator is StatementChunkGenerator)
  1054. {
  1055. - _builder.Pop();
  1056. + var isAttributeValue = _builder.Current is CSharpCodeAttributeValueIntermediateNode;
  1057. +
  1058. + if (!isAttributeValue)
  1059. + {
  1060. + var statementNode = new CSharpCodeIntermediateNode()
  1061. + {
  1062. + Source = BuildSourceSpanFromNode(node)
  1063. + };
  1064. + _builder.Push(statementNode);
  1065. + }
  1066. +
  1067. + _builder.Add(new IntermediateToken()
  1068. + {
  1069. + Content = node.GetContent(),
  1070. + Kind = TokenKind.CSharp,
  1071. + Source = BuildSourceSpanFromNode(node),
  1072. + });
  1073. +
  1074. + if (!isAttributeValue)
  1075. + {
  1076. + _builder.Pop();
  1077. + }
  1078. }
  1079. +
  1080. + base.VisitCSharpStatementLiteral(node);
  1081. }
  1082. - public override void VisitMarkupSpan(MarkupChunkGenerator chunkGenerator, Span span)
  1083. + public override void VisitMarkupTextLiteral(MarkupTextLiteralSyntax node)
  1084. {
  1085. - if (span.Tokens.Count == 1)
  1086. + var context = node.GetSpanContext();
  1087. + if (context != null && context.ChunkGenerator == SpanChunkGenerator.Null)
  1088. + {
  1089. + base.VisitMarkupTextLiteral(node);
  1090. + return;
  1091. + }
  1092. +
  1093. + if (node.LiteralTokens.Count == 1)
  1094. {
  1095. - var token = span.Tokens[0];
  1096. + var token = node.LiteralTokens[0];
  1097. if (token != null &&
  1098. - token.Kind == SyntaxKind.Unknown &&
  1099. + token.Kind == SyntaxKind.Marker &&
  1100. token.Content.Length == 0)
  1101. {
  1102. // We don't want to create IR nodes for marker tokens.
  1103. + base.VisitMarkupTextLiteral(node);
  1104. return;
  1105. }
  1106. }
  1107. - var source = BuildSourceSpanFromNode(span);
  1108. + var source = BuildSourceSpanFromNode(node);
  1109. var currentChildren = _builder.Current.Children;
  1110. if (currentChildren.Count > 0 && currentChildren[currentChildren.Count - 1] is HtmlContentIntermediateNode)
  1111. {
  1112. @@ -613,7 +748,8 @@ namespace Microsoft.AspNetCore.Razor.Language
  1113. if (existingHtmlContent.Source == null && source == null)
  1114. {
  1115. - Combine(existingHtmlContent, span);
  1116. + Combine(existingHtmlContent, node);
  1117. + base.VisitMarkupTextLiteral(node);
  1118. return;
  1119. }
  1120. @@ -622,7 +758,8 @@ namespace Microsoft.AspNetCore.Razor.Language
  1121. existingHtmlContent.Source.Value.FilePath == source.Value.FilePath &&
  1122. existingHtmlContent.Source.Value.AbsoluteIndex + existingHtmlContent.Source.Value.Length == source.Value.AbsoluteIndex)
  1123. {
  1124. - Combine(existingHtmlContent, span);
  1125. + Combine(existingHtmlContent, node);
  1126. + base.VisitMarkupTextLiteral(node);
  1127. return;
  1128. }
  1129. }
  1130. @@ -635,23 +772,20 @@ namespace Microsoft.AspNetCore.Razor.Language
  1131. _builder.Add(new IntermediateToken()
  1132. {
  1133. - Content = span.Content,
  1134. + Content = node.GetContent(),
  1135. Kind = TokenKind.Html,
  1136. Source = source,
  1137. });
  1138. _builder.Pop();
  1139. +
  1140. + base.VisitMarkupTextLiteral(node);
  1141. }
  1142. - public override void VisitTagHelperBlock(TagHelperChunkGenerator chunkGenerator, Block block)
  1143. + public override void VisitMarkupTagHelperElement(MarkupTagHelperElementSyntax node)
  1144. {
  1145. - var tagHelperBlock = block as TagHelperBlock;
  1146. - if (tagHelperBlock == null)
  1147. - {
  1148. - return;
  1149. - }
  1150. -
  1151. - var tagName = tagHelperBlock.TagName;
  1152. + var info = node.TagHelperInfo;
  1153. + var tagName = info.TagName;
  1154. if (_tagHelperPrefix != null)
  1155. {
  1156. tagName = tagName.Substring(_tagHelperPrefix.Length);
  1157. @@ -660,11 +794,11 @@ namespace Microsoft.AspNetCore.Razor.Language
  1158. var tagHelperNode = new TagHelperIntermediateNode()
  1159. {
  1160. TagName = tagName,
  1161. - TagMode = tagHelperBlock.TagMode,
  1162. - Source = BuildSourceSpanFromNode(block)
  1163. + TagMode = info.TagMode,
  1164. + Source = BuildSourceSpanFromNode(node)
  1165. };
  1166. - foreach (var tagHelper in tagHelperBlock.Binding.Descriptors)
  1167. + foreach (var tagHelper in info.BindingResult.Descriptors)
  1168. {
  1169. tagHelperNode.TagHelpers.Add(tagHelper);
  1170. }
  1171. @@ -673,22 +807,223 @@ namespace Microsoft.AspNetCore.Razor.Language
  1172. _builder.Push(new TagHelperBodyIntermediateNode());
  1173. - VisitDefault(block);
  1174. + foreach (var item in node.Body)
  1175. + {
  1176. + Visit(item);
  1177. + }
  1178. _builder.Pop(); // Pop InitializeTagHelperStructureIntermediateNode
  1179. - AddTagHelperAttributes(tagHelperBlock.Attributes, tagHelperBlock.Binding);
  1180. + Visit(node.StartTag);
  1181. _builder.Pop(); // Pop TagHelperIntermediateNode
  1182. +
  1183. + // No need to visit the end tag because we don't write any IR for it.
  1184. +
  1185. + // We don't want to track attributes from a previous tag helper element.
  1186. + _renderedBoundAttributeNames.Clear();
  1187. + }
  1188. +
  1189. + public override void VisitMarkupTagHelperStartTag(MarkupTagHelperStartTagSyntax node)
  1190. + {
  1191. + foreach (var child in node.Children)
  1192. + {
  1193. + if (child is MarkupTagHelperAttributeSyntax || child is MarkupMinimizedTagHelperAttributeSyntax)
  1194. + {
  1195. + Visit(child);
  1196. + }
  1197. + }
  1198. + }
  1199. +
  1200. + public override void VisitMarkupMinimizedTagHelperAttribute(MarkupMinimizedTagHelperAttributeSyntax node)
  1201. + {
  1202. + if (!_featureFlags.AllowMinimizedBooleanTagHelperAttributes)
  1203. + {
  1204. + // Minimized attributes are not valid for non-boolean bound attributes. TagHelperBlockRewriter
  1205. + // has already logged an error if it was a non-boolean bound attribute; so we can skip.
  1206. + return;
  1207. + }
  1208. +
  1209. + var element = node.FirstAncestorOrSelf<MarkupTagHelperElementSyntax>();
  1210. + var descriptors = element.TagHelperInfo.BindingResult.Descriptors;
  1211. + var attributeName = node.Name.GetContent();
  1212. + var associatedDescriptors = descriptors.Where(descriptor =>
  1213. + descriptor.BoundAttributes.Any(attributeDescriptor => TagHelperMatchingConventions.CanSatisfyBoundAttribute(attributeName, attributeDescriptor)));
  1214. +
  1215. + if (associatedDescriptors.Any() && _renderedBoundAttributeNames.Add(attributeName))
  1216. + {
  1217. + foreach (var associatedDescriptor in associatedDescriptors)
  1218. + {
  1219. + var associatedAttributeDescriptor = associatedDescriptor.BoundAttributes.First(a =>
  1220. + {
  1221. + return TagHelperMatchingConventions.CanSatisfyBoundAttribute(attributeName, a);
  1222. + });
  1223. +
  1224. + var expectsBooleanValue = associatedAttributeDescriptor.ExpectsBooleanValue(attributeName);
  1225. +
  1226. + if (!expectsBooleanValue)
  1227. + {
  1228. + // We do not allow minimized non-boolean bound attributes.
  1229. + return;
  1230. + }
  1231. +
  1232. + var setTagHelperProperty = new TagHelperPropertyIntermediateNode()
  1233. + {
  1234. + AttributeName = attributeName,
  1235. + BoundAttribute = associatedAttributeDescriptor,
  1236. + TagHelper = associatedDescriptor,
  1237. + AttributeStructure = node.TagHelperAttributeInfo.AttributeStructure,
  1238. + Source = null,
  1239. + IsIndexerNameMatch = TagHelperMatchingConventions.SatisfiesBoundAttributeIndexer(attributeName, associatedAttributeDescriptor),
  1240. + };
  1241. +
  1242. + _builder.Add(setTagHelperProperty);
  1243. + }
  1244. + }
  1245. + else
  1246. + {
  1247. + var addHtmlAttribute = new TagHelperHtmlAttributeIntermediateNode()
  1248. + {
  1249. + AttributeName = attributeName,
  1250. + AttributeStructure = node.TagHelperAttributeInfo.AttributeStructure
  1251. + };
  1252. +
  1253. + _builder.Add(addHtmlAttribute);
  1254. + }
  1255. + }
  1256. +
  1257. + public override void VisitMarkupTagHelperAttribute(MarkupTagHelperAttributeSyntax node)
  1258. + {
  1259. + var element = node.FirstAncestorOrSelf<MarkupTagHelperElementSyntax>();
  1260. + var descriptors = element.TagHelperInfo.BindingResult.Descriptors;
  1261. + var attributeName = node.Name.GetContent();
  1262. + var attributeValueNode = node.Value;
  1263. + var associatedDescriptors = descriptors.Where(descriptor =>
  1264. + descriptor.BoundAttributes.Any(attributeDescriptor => TagHelperMatchingConventions.CanSatisfyBoundAttribute(attributeName, attributeDescriptor)));
  1265. +
  1266. + if (associatedDescriptors.Any() && _renderedBoundAttributeNames.Add(attributeName))
  1267. + {
  1268. + foreach (var associatedDescriptor in associatedDescriptors)
  1269. + {
  1270. + var associatedAttributeDescriptor = associatedDescriptor.BoundAttributes.First(a =>
  1271. + {
  1272. + return TagHelperMatchingConventions.CanSatisfyBoundAttribute(attributeName, a);
  1273. + });
  1274. +
  1275. + var setTagHelperProperty = new TagHelperPropertyIntermediateNode()
  1276. + {
  1277. + AttributeName = attributeName,
  1278. + BoundAttribute = associatedAttributeDescriptor,
  1279. + TagHelper = associatedDescriptor,
  1280. + AttributeStructure = node.TagHelperAttributeInfo.AttributeStructure,
  1281. + Source = BuildSourceSpanFromNode(attributeValueNode),
  1282. + IsIndexerNameMatch = TagHelperMatchingConventions.SatisfiesBoundAttributeIndexer(attributeName, associatedAttributeDescriptor),
  1283. + };
  1284. +
  1285. + _builder.Push(setTagHelperProperty);
  1286. + VisitAttributeValue(attributeValueNode);
  1287. + _builder.Pop();
  1288. + }
  1289. + }
  1290. + else
  1291. + {
  1292. + var addHtmlAttribute = new TagHelperHtmlAttributeIntermediateNode()
  1293. + {
  1294. + AttributeName = attributeName,
  1295. + AttributeStructure = node.TagHelperAttributeInfo.AttributeStructure
  1296. + };
  1297. +
  1298. + _builder.Push(addHtmlAttribute);
  1299. + VisitAttributeValue(attributeValueNode);
  1300. + _builder.Pop();
  1301. + }
  1302. }
  1303. - private void Combine(HtmlContentIntermediateNode node, Span span)
  1304. + private void VisitAttributeValue(SyntaxNode node)
  1305. + {
  1306. + if (node == null)
  1307. + {
  1308. + return;
  1309. + }
  1310. +
  1311. + IReadOnlyList<SyntaxNode> children = node.ChildNodes();
  1312. + var position = node.Position;
  1313. + if (children.First() is MarkupBlockSyntax markupBlock &&
  1314. + markupBlock.Children.Count == 2 &&
  1315. + markupBlock.Children[0] is MarkupTextLiteralSyntax &&
  1316. + markupBlock.Children[1] is MarkupEphemeralTextLiteralSyntax)
  1317. + {
  1318. + // This is a special case when we have an attribute like attr="@@foo".
  1319. + // In this case, we want the foo to be written out as HtmlContent and not HtmlAttributeValue.
  1320. + Visit(markupBlock);
  1321. + children = children.Skip(1).ToList();
  1322. + position = children.Count > 0 ? children[0].Position : position;
  1323. + }
  1324. +
  1325. + if (children.All(c => c is MarkupLiteralAttributeValueSyntax))
  1326. + {
  1327. + var literalAttributeValueNodes = children.Cast<MarkupLiteralAttributeValueSyntax>().ToArray();
  1328. + var valueTokens = SyntaxListBuilder<SyntaxToken>.Create();
  1329. + for (var i = 0; i < literalAttributeValueNodes.Length; i++)
  1330. + {
  1331. + var mergedValue = MergeAttributeValue(literalAttributeValueNodes[i]);
  1332. + valueTokens.AddRange(mergedValue.LiteralTokens);
  1333. + }
  1334. + var rewritten = SyntaxFactory.MarkupTextLiteral(valueTokens.ToList()).Green.CreateRed(node.Parent, position);
  1335. + Visit(rewritten);
  1336. + }
  1337. + else if (children.All(c => c is MarkupTextLiteralSyntax))
  1338. + {
  1339. + var builder = SyntaxListBuilder<SyntaxToken>.Create();
  1340. + var markupLiteralArray = children.Cast<MarkupTextLiteralSyntax>();
  1341. + foreach (var literal in markupLiteralArray)
  1342. + {
  1343. + builder.AddRange(literal.LiteralTokens);
  1344. + }
  1345. + var rewritten = SyntaxFactory.MarkupTextLiteral(builder.ToList()).Green.CreateRed(node.Parent, position);
  1346. + Visit(rewritten);
  1347. + }
  1348. + else if (children.All(c => c is CSharpExpressionLiteralSyntax))
  1349. + {
  1350. + var builder = SyntaxListBuilder<SyntaxToken>.Create();
  1351. + var expressionLiteralArray = children.Cast<CSharpExpressionLiteralSyntax>();
  1352. + SpanContext context = null;
  1353. + foreach (var literal in expressionLiteralArray)
  1354. + {
  1355. + context = literal.GetSpanContext();
  1356. + builder.AddRange(literal.LiteralTokens);
  1357. + }
  1358. + var rewritten = SyntaxFactory.CSharpExpressionLiteral(builder.ToList()).Green.CreateRed(node.Parent, position);
  1359. + rewritten = context != null ? rewritten.WithSpanContext(context) : rewritten;
  1360. + Visit(rewritten);
  1361. + }
  1362. + else
  1363. + {
  1364. + Visit(node);
  1365. + }
  1366. + }
  1367. +
  1368. + private MarkupTextLiteralSyntax MergeAttributeValue(MarkupLiteralAttributeValueSyntax node)
  1369. + {
  1370. + var valueTokens = MergeLiterals(node.Prefix?.LiteralTokens, node.Value?.LiteralTokens);
  1371. + var rewritten = node.Prefix?.Update(valueTokens) ?? node.Value?.Update(valueTokens);
  1372. + rewritten = (MarkupTextLiteralSyntax)rewritten?.Green.CreateRed(node, node.Position);
  1373. + var originalContext = rewritten.GetSpanContext();
  1374. + if (originalContext != null)
  1375. + {
  1376. + rewritten = rewritten.WithSpanContext(new SpanContext(new MarkupChunkGenerator(), originalContext.EditHandler));
  1377. + }
  1378. +
  1379. + return rewritten;
  1380. + }
  1381. +
  1382. + private void Combine(HtmlContentIntermediateNode node, SyntaxNode item)
  1383. {
  1384. node.Children.Add(new IntermediateToken()
  1385. {
  1386. - Content = span.Content,
  1387. + Content = item.GetContent(),
  1388. Kind = TokenKind.Html,
  1389. - Source = BuildSourceSpanFromNode(span),
  1390. + Source = BuildSourceSpanFromNode(item),
  1391. });
  1392. if (node.Source != null)
  1393. @@ -700,76 +1035,25 @@ namespace Microsoft.AspNetCore.Razor.Language
  1394. node.Source.Value.AbsoluteIndex,
  1395. node.Source.Value.LineIndex,
  1396. node.Source.Value.CharacterIndex,
  1397. - node.Source.Value.Length + span.Content.Length);
  1398. + node.Source.Value.Length + item.FullWidth);
  1399. }
  1400. }
  1401. - private void AddTagHelperAttributes(IList<TagHelperAttributeNode> attributes, TagHelperBinding tagHelperBinding)
  1402. + private SyntaxList<SyntaxToken> MergeLiterals(params SyntaxList<SyntaxToken>?[] literals)
  1403. {
  1404. - var descriptors = tagHelperBinding.Descriptors;
  1405. - var renderedBoundAttributeNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
  1406. - foreach (var attribute in attributes)
  1407. + var builder = SyntaxListBuilder<SyntaxToken>.Create();
  1408. + for (var i = 0; i < literals.Length; i++)
  1409. {
  1410. - var attributeValueNode = attribute.Value;
  1411. - var associatedDescriptors = descriptors.Where(descriptor =>
  1412. - descriptor.BoundAttributes.Any(attributeDescriptor => TagHelperMatchingConventions.CanSatisfyBoundAttribute(attribute.Name, attributeDescriptor)));
  1413. -
  1414. - if (associatedDescriptors.Any() && renderedBoundAttributeNames.Add(attribute.Name))
  1415. + var literal = literals[i];
  1416. + if (!literal.HasValue)
  1417. {
  1418. - var isMinimizedAttribute = attributeValueNode == null;
  1419. - if (isMinimizedAttribute && !_featureFlags.AllowMinimizedBooleanTagHelperAttributes)
  1420. - {
  1421. - // Minimized attributes are not valid for non-boolean bound attributes. TagHelperBlockRewriter
  1422. - // has already logged an error if it was a non-boolean bound attribute; so we can skip.
  1423. - continue;
  1424. - }
  1425. -
  1426. - foreach (var associatedDescriptor in associatedDescriptors)
  1427. - {
  1428. - var associatedAttributeDescriptor = associatedDescriptor.BoundAttributes.First(a =>
  1429. - {
  1430. - return TagHelperMatchingConventions.CanSatisfyBoundAttribute(attribute.Name, a);
  1431. - });
  1432. -
  1433. - var expectsBooleanValue = associatedAttributeDescriptor.ExpectsBooleanValue(attribute.Name);
  1434. -
  1435. - if (isMinimizedAttribute && !expectsBooleanValue)
  1436. - {
  1437. - // We do not allow minimized non-boolean bound attributes.
  1438. - continue;
  1439. - }
  1440. -
  1441. - var setTagHelperProperty = new TagHelperPropertyIntermediateNode()
  1442. - {
  1443. - AttributeName = attribute.Name,
  1444. - BoundAttribute = associatedAttributeDescriptor,
  1445. - TagHelper = associatedDescriptor,
  1446. - AttributeStructure = attribute.AttributeStructure,
  1447. - Source = BuildSourceSpanFromNode(attributeValueNode),
  1448. - IsIndexerNameMatch = TagHelperMatchingConventions.SatisfiesBoundAttributeIndexer(attribute.Name, associatedAttributeDescriptor),
  1449. - };
  1450. -
  1451. - _builder.Push(setTagHelperProperty);
  1452. - attributeValueNode?.Accept(this);
  1453. - _builder.Pop();
  1454. - }
  1455. + continue;
  1456. }
  1457. - else
  1458. - {
  1459. - var addHtmlAttribute = new TagHelperHtmlAttributeIntermediateNode()
  1460. - {
  1461. - AttributeName = attribute.Name,
  1462. - AttributeStructure = attribute.AttributeStructure
  1463. - };
  1464. - _builder.Push(addHtmlAttribute);
  1465. - if (attributeValueNode != null)
  1466. - {
  1467. - attributeValueNode.Accept(this);
  1468. - }
  1469. - _builder.Pop();
  1470. - }
  1471. + builder.AddRange(literal.Value);
  1472. }
  1473. +
  1474. + return builder.ToList();
  1475. }
  1476. }
  1477. @@ -827,8 +1111,8 @@ namespace Microsoft.AspNetCore.Razor.Language
  1478. }
  1479. }
  1480. - private static bool IsMalformed(List<RazorDiagnostic> diagnostics)
  1481. - => diagnostics.Count > 0 && diagnostics.Any(diagnostic => diagnostic.Severity == RazorDiagnosticSeverity.Error);
  1482. + private static bool IsMalformed(IEnumerable<RazorDiagnostic> diagnostics)
  1483. + => diagnostics.Any(diagnostic => diagnostic.Severity == RazorDiagnosticSeverity.Error);
  1484. }
  1485. #pragma warning restore CS0618 // Type or member is obsolete
  1486. }
  1487. diff --git a/src/Microsoft.AspNetCore.Razor.Language/DefaultRazorSyntaxTree.cs b/src/Microsoft.AspNetCore.Razor.Language/DefaultRazorSyntaxTree.cs
  1488. index 4b6d43fe06e..018dbfe5fb4 100644
  1489. --- a/src/Microsoft.AspNetCore.Razor.Language/DefaultRazorSyntaxTree.cs
  1490. +++ b/src/Microsoft.AspNetCore.Razor.Language/DefaultRazorSyntaxTree.cs
  1491. @@ -1,15 +1,17 @@
  1492. // Copyright (c) .NET Foundation. All rights reserved.
  1493. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  1494. +using System;
  1495. using System.Collections.Generic;
  1496. using Microsoft.AspNetCore.Razor.Language.Legacy;
  1497. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  1498. namespace Microsoft.AspNetCore.Razor.Language
  1499. {
  1500. internal class DefaultRazorSyntaxTree : RazorSyntaxTree
  1501. {
  1502. public DefaultRazorSyntaxTree(
  1503. - Block root,
  1504. + SyntaxNode root,
  1505. RazorSourceDocument source,
  1506. IReadOnlyList<RazorDiagnostic> diagnostics,
  1507. RazorParserOptions options)
  1508. @@ -24,7 +26,7 @@ namespace Microsoft.AspNetCore.Razor.Language
  1509. public override RazorParserOptions Options { get; }
  1510. - internal override Block Root { get; }
  1511. + internal override SyntaxNode Root { get; }
  1512. public override RazorSourceDocument Source { get; }
  1513. }
  1514. diff --git a/src/Microsoft.AspNetCore.Razor.Language/DefaultRazorTagHelperBinderPhase.cs b/src/Microsoft.AspNetCore.Razor.Language/DefaultRazorTagHelperBinderPhase.cs
  1515. index aa0668a539a..c15aaff04e0 100644
  1516. --- a/src/Microsoft.AspNetCore.Razor.Language/DefaultRazorTagHelperBinderPhase.cs
  1517. +++ b/src/Microsoft.AspNetCore.Razor.Language/DefaultRazorTagHelperBinderPhase.cs
  1518. @@ -5,6 +5,7 @@ using System;
  1519. using System.Collections.Generic;
  1520. using System.Linq;
  1521. using Microsoft.AspNetCore.Razor.Language.Legacy;
  1522. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  1523. namespace Microsoft.AspNetCore.Razor.Language
  1524. {
  1525. @@ -39,11 +40,11 @@ namespace Microsoft.AspNetCore.Razor.Language
  1526. for (var i = 0; i < imports.Count; i++)
  1527. {
  1528. var import = imports[i];
  1529. - visitor.VisitBlock(import.Root);
  1530. + visitor.Visit(import.Root);
  1531. }
  1532. }
  1533. - visitor.VisitBlock(syntaxTree.Root);
  1534. + visitor.Visit(syntaxTree.Root);
  1535. var tagHelperPrefix = visitor.TagHelperPrefix;
  1536. descriptors = visitor.Matches.ToArray();
  1537. @@ -57,21 +58,9 @@ namespace Microsoft.AspNetCore.Razor.Language
  1538. return;
  1539. }
  1540. - var errorSink = new ErrorSink();
  1541. - var rewriter = new TagHelperParseTreeRewriter(tagHelperPrefix, descriptors, syntaxTree.Options.FeatureFlags);
  1542. -
  1543. - var root = syntaxTree.Root;
  1544. - root = rewriter.Rewrite(root, errorSink);
  1545. -
  1546. - var errorList = new List<RazorDiagnostic>();
  1547. - errorList.AddRange(errorSink.Errors);
  1548. -
  1549. - errorList.AddRange(descriptors.SelectMany(d => d.GetAllDiagnostics()));
  1550. -
  1551. - var diagnostics = CombineErrors(syntaxTree.Diagnostics, errorList);
  1552. -
  1553. - var newSyntaxTree = RazorSyntaxTree.Create(root, syntaxTree.Source, diagnostics, syntaxTree.Options);
  1554. - codeDocument.SetSyntaxTree(newSyntaxTree);
  1555. + var rewrittenSyntaxTree = TagHelperParseTreeRewriter.Rewrite(syntaxTree, tagHelperPrefix, descriptors);
  1556. +
  1557. + codeDocument.SetSyntaxTree(rewrittenSyntaxTree);
  1558. }
  1559. private static bool MatchesDirective(TagHelperDescriptor descriptor, string typePattern, string assemblyName)
  1560. @@ -97,25 +86,7 @@ namespace Microsoft.AspNetCore.Razor.Language
  1561. return string.Equals(descriptor.Name, typePattern, StringComparison.Ordinal);
  1562. }
  1563. - private static int GetErrorLength(string directiveText)
  1564. - {
  1565. - var nonNullLength = directiveText == null ? 1 : directiveText.Length;
  1566. - var normalizeEmptyStringLength = Math.Max(nonNullLength, 1);
  1567. -
  1568. - return normalizeEmptyStringLength;
  1569. - }
  1570. -
  1571. - private IReadOnlyList<RazorDiagnostic> CombineErrors(IReadOnlyList<RazorDiagnostic> errors1, IReadOnlyList<RazorDiagnostic> errors2)
  1572. - {
  1573. - var combinedErrors = new List<RazorDiagnostic>(errors1.Count + errors2.Count);
  1574. - combinedErrors.AddRange(errors1);
  1575. - combinedErrors.AddRange(errors2);
  1576. -
  1577. - return combinedErrors;
  1578. - }
  1579. -
  1580. - // Internal for testing.
  1581. - internal class DirectiveVisitor : ParserVisitor
  1582. + internal class DirectiveVisitor : SyntaxRewriter
  1583. {
  1584. private IReadOnlyList<TagHelperDescriptor> _tagHelpers;
  1585. @@ -128,62 +99,80 @@ namespace Microsoft.AspNetCore.Razor.Language
  1586. public HashSet<TagHelperDescriptor> Matches { get; } = new HashSet<TagHelperDescriptor>();
  1587. - public override void VisitAddTagHelperSpan(AddTagHelperChunkGenerator chunkGenerator, Span span)
  1588. + public override SyntaxNode VisitRazorDirective(RazorDirectiveSyntax node)
  1589. {
  1590. - if (chunkGenerator.AssemblyName == null)
  1591. - {
  1592. - // Skip this one, it's an error
  1593. - return;
  1594. - }
  1595. -
  1596. - if (!AssemblyContainsTagHelpers(chunkGenerator.AssemblyName, _tagHelpers))
  1597. + var descendantLiterals = node.DescendantNodes();
  1598. + foreach (var child in descendantLiterals)
  1599. {
  1600. - // No tag helpers in the assembly.
  1601. - return;
  1602. - }
  1603. -
  1604. - for (var i = 0; i < _tagHelpers.Count; i++)
  1605. - {
  1606. - var tagHelper = _tagHelpers[i];
  1607. - if (MatchesDirective(tagHelper, chunkGenerator.TypePattern, chunkGenerator.AssemblyName))
  1608. + if (!(child is CSharpStatementLiteralSyntax literal))
  1609. {
  1610. - Matches.Add(tagHelper);
  1611. + continue;
  1612. }
  1613. - }
  1614. - }
  1615. -
  1616. - public override void VisitRemoveTagHelperSpan(RemoveTagHelperChunkGenerator chunkGenerator, Span span)
  1617. - {
  1618. - if (chunkGenerator.AssemblyName == null)
  1619. - {
  1620. - // Skip this one, it's an error
  1621. - return;
  1622. - }
  1623. -
  1624. -
  1625. - if (!AssemblyContainsTagHelpers(chunkGenerator.AssemblyName, _tagHelpers))
  1626. - {
  1627. - // No tag helpers in the assembly.
  1628. - return;
  1629. - }
  1630. - for (var i = 0; i < _tagHelpers.Count; i++)
  1631. - {
  1632. - var tagHelper = _tagHelpers[i];
  1633. - if (MatchesDirective(tagHelper, chunkGenerator.TypePattern, chunkGenerator.AssemblyName))
  1634. + var context = literal.GetSpanContext();
  1635. + if (context == null)
  1636. + {
  1637. + // We can't find a chunk generator.
  1638. + continue;
  1639. + }
  1640. + else if (context.ChunkGenerator is AddTagHelperChunkGenerator addTagHelper)
  1641. {
  1642. - Matches.Remove(tagHelper);
  1643. + if (addTagHelper.AssemblyName == null)
  1644. + {
  1645. + // Skip this one, it's an error
  1646. + continue;
  1647. + }
  1648. +
  1649. + if (!AssemblyContainsTagHelpers(addTagHelper.AssemblyName, _tagHelpers))
  1650. + {
  1651. + // No tag helpers in the assembly.
  1652. + continue;
  1653. + }
  1654. +
  1655. + for (var i = 0; i < _tagHelpers.Count; i++)
  1656. + {
  1657. + var tagHelper = _tagHelpers[i];
  1658. + if (MatchesDirective(tagHelper, addTagHelper.TypePattern, addTagHelper.AssemblyName))
  1659. + {
  1660. + Matches.Add(tagHelper);
  1661. + }
  1662. + }
  1663. + }
  1664. + else if (context.ChunkGenerator is RemoveTagHelperChunkGenerator removeTagHelper)
  1665. + {
  1666. + if (removeTagHelper.AssemblyName == null)
  1667. + {
  1668. + // Skip this one, it's an error
  1669. + continue;
  1670. + }
  1671. +
  1672. +
  1673. + if (!AssemblyContainsTagHelpers(removeTagHelper.AssemblyName, _tagHelpers))
  1674. + {
  1675. + // No tag helpers in the assembly.
  1676. + continue;
  1677. + }
  1678. +
  1679. + for (var i = 0; i < _tagHelpers.Count; i++)
  1680. + {
  1681. + var tagHelper = _tagHelpers[i];
  1682. + if (MatchesDirective(tagHelper, removeTagHelper.TypePattern, removeTagHelper.AssemblyName))
  1683. + {
  1684. + Matches.Remove(tagHelper);
  1685. + }
  1686. + }
  1687. + }
  1688. + else if (context.ChunkGenerator is TagHelperPrefixDirectiveChunkGenerator tagHelperPrefix)
  1689. + {
  1690. + if (!string.IsNullOrEmpty(tagHelperPrefix.DirectiveText))
  1691. + {
  1692. + // We only expect to see a single one of these per file, but that's enforced at another level.
  1693. + TagHelperPrefix = tagHelperPrefix.DirectiveText;
  1694. + }
  1695. }
  1696. }
  1697. - }
  1698. - public override void VisitTagHelperPrefixDirectiveSpan(TagHelperPrefixDirectiveChunkGenerator chunkGenerator, Span span)
  1699. - {
  1700. - if (!string.IsNullOrEmpty(chunkGenerator.DirectiveText))
  1701. - {
  1702. - // We only expect to see a single one of these per file, but that's enforced at another level.
  1703. - TagHelperPrefix = chunkGenerator.DirectiveText;
  1704. - }
  1705. + return base.VisitRazorDirective(node);
  1706. }
  1707. private bool AssemblyContainsTagHelpers(string assemblyName, IReadOnlyList<TagHelperDescriptor> tagHelpers)
  1708. diff --git a/src/Microsoft.AspNetCore.Razor.Language/DirectiveTokenEditHandler.cs b/src/Microsoft.AspNetCore.Razor.Language/DirectiveTokenEditHandler.cs
  1709. index b4edccf6387..c84d8b0c67e 100644
  1710. --- a/src/Microsoft.AspNetCore.Razor.Language/DirectiveTokenEditHandler.cs
  1711. +++ b/src/Microsoft.AspNetCore.Razor.Language/DirectiveTokenEditHandler.cs
  1712. @@ -4,17 +4,17 @@
  1713. using System;
  1714. using System.Collections.Generic;
  1715. using Microsoft.AspNetCore.Razor.Language.Legacy;
  1716. -using Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax;
  1717. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  1718. namespace Microsoft.AspNetCore.Razor.Language
  1719. {
  1720. internal class DirectiveTokenEditHandler : SpanEditHandler
  1721. {
  1722. - public DirectiveTokenEditHandler(Func<string, IEnumerable<SyntaxToken>> tokenizer) : base(tokenizer)
  1723. + public DirectiveTokenEditHandler(Func<string, IEnumerable<Syntax.InternalSyntax.SyntaxToken>> tokenizer) : base(tokenizer)
  1724. {
  1725. }
  1726. - protected override PartialParseResultInternal CanAcceptChange(Span target, SourceChange change)
  1727. + protected override PartialParseResultInternal CanAcceptChange(SyntaxNode target, SourceChange change)
  1728. {
  1729. if (AcceptedCharacters == AcceptedCharactersInternal.NonWhitespace)
  1730. {
  1731. @@ -31,7 +31,6 @@ namespace Microsoft.AspNetCore.Razor.Language
  1732. }
  1733. return PartialParseResultInternal.Rejected;
  1734. -
  1735. }
  1736. private static bool ContainsWhitespace(string content)
  1737. diff --git a/src/Microsoft.AspNetCore.Razor.Language/HtmlNodeOptimizationPass.cs b/src/Microsoft.AspNetCore.Razor.Language/HtmlNodeOptimizationPass.cs
  1738. index ea3d754554f..1b327aa032a 100644
  1739. --- a/src/Microsoft.AspNetCore.Razor.Language/HtmlNodeOptimizationPass.cs
  1740. +++ b/src/Microsoft.AspNetCore.Razor.Language/HtmlNodeOptimizationPass.cs
  1741. @@ -22,14 +22,11 @@ namespace Microsoft.AspNetCore.Razor.Language
  1742. throw new ArgumentNullException(nameof(syntaxTree));
  1743. }
  1744. - var conditionalAttributeCollapser = new ConditionalAttributeCollapser();
  1745. - var rewritten = conditionalAttributeCollapser.Rewrite(syntaxTree.Root);
  1746. -
  1747. - var whitespaceRewriter = new WhiteSpaceRewriter();
  1748. - rewritten = whitespaceRewriter.Rewrite(rewritten);
  1749. + var whitespaceRewriter = new WhitespaceRewriter();
  1750. + var rewritten = whitespaceRewriter.Visit(syntaxTree.Root);
  1751. var rewrittenSyntaxTree = RazorSyntaxTree.Create(rewritten, syntaxTree.Source, syntaxTree.Diagnostics, syntaxTree.Options);
  1752. return rewrittenSyntaxTree;
  1753. }
  1754. }
  1755. -}
  1756. +}
  1757. \ No newline at end of file
  1758. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/AddImportChunkGenerator.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/AddImportChunkGenerator.cs
  1759. index 0d7b9de155c..4cee1abe3e8 100644
  1760. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/AddImportChunkGenerator.cs
  1761. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/AddImportChunkGenerator.cs
  1762. @@ -14,23 +14,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  1763. public string Namespace { get; }
  1764. - public override void Accept(ParserVisitor visitor, Span span)
  1765. - {
  1766. - visitor.VisitImportSpan(this, span);
  1767. - }
  1768. -
  1769. - public override void GenerateChunk(Span target, ChunkGeneratorContext context)
  1770. - {
  1771. - var ns = Namespace;
  1772. -
  1773. - if (!string.IsNullOrEmpty(ns) && char.IsWhiteSpace(ns[0]))
  1774. - {
  1775. - ns = ns.Substring(1);
  1776. - }
  1777. -
  1778. - //context.ChunkTreeBuilder.AddUsingChunk(ns, target);
  1779. - }
  1780. -
  1781. public override string ToString()
  1782. {
  1783. return "Import:" + Namespace + ";";
  1784. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/AddTagHelperChunkGenerator.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/AddTagHelperChunkGenerator.cs
  1785. index f446be12c03..2df86b32de3 100644
  1786. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/AddTagHelperChunkGenerator.cs
  1787. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/AddTagHelperChunkGenerator.cs
  1788. @@ -35,11 +35,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  1789. public List<RazorDiagnostic> Diagnostics { get; }
  1790. - public override void Accept(ParserVisitor visitor, Span span)
  1791. - {
  1792. - visitor.VisitAddTagHelperSpan(this, span);
  1793. - }
  1794. -
  1795. /// <inheritdoc />
  1796. public override bool Equals(object obj)
  1797. {
  1798. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/AttributeBlockChunkGenerator.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/AttributeBlockChunkGenerator.cs
  1799. deleted file mode 100644
  1800. index de77a1746dd..00000000000
  1801. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/AttributeBlockChunkGenerator.cs
  1802. +++ /dev/null
  1803. @@ -1,68 +0,0 @@
  1804. -// Copyright (c) .NET Foundation. All rights reserved.
  1805. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  1806. -
  1807. -using System;
  1808. -using System.Globalization;
  1809. -using Microsoft.Extensions.Internal;
  1810. -
  1811. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  1812. -{
  1813. - internal class AttributeBlockChunkGenerator : ParentChunkGenerator
  1814. - {
  1815. - public AttributeBlockChunkGenerator(string name, LocationTagged<string> prefix, LocationTagged<string> suffix)
  1816. - {
  1817. - Name = name;
  1818. - Prefix = prefix;
  1819. - Suffix = suffix;
  1820. - }
  1821. -
  1822. - public string Name { get; }
  1823. -
  1824. - public LocationTagged<string> Prefix { get; }
  1825. -
  1826. - public LocationTagged<string> Suffix { get; }
  1827. -
  1828. - public override void GenerateStartParentChunk(Block target, ChunkGeneratorContext context)
  1829. - {
  1830. - //var chunk = context.ChunkTreeBuilder.StartParentChunk<CodeAttributeChunk>(target);
  1831. -
  1832. - //chunk.Attribute = Name;
  1833. - //chunk.Prefix = Prefix;
  1834. - //chunk.Suffix = Suffix;
  1835. - }
  1836. -
  1837. - public override void GenerateEndParentChunk(Block target, ChunkGeneratorContext context)
  1838. - {
  1839. - //context.ChunkTreeBuilder.EndParentChunk();
  1840. - }
  1841. -
  1842. - public override void Accept(ParserVisitor visitor, Block block)
  1843. - {
  1844. - visitor.VisitAttributeBlock(this, block);
  1845. - }
  1846. -
  1847. - public override string ToString()
  1848. - {
  1849. - return string.Format(CultureInfo.CurrentCulture, "Attr:{0},{1:F},{2:F}", Name, Prefix, Suffix);
  1850. - }
  1851. -
  1852. - public override bool Equals(object obj)
  1853. - {
  1854. - var other = obj as AttributeBlockChunkGenerator;
  1855. - return other != null &&
  1856. - string.Equals(other.Name, Name, StringComparison.Ordinal) &&
  1857. - Equals(other.Prefix, Prefix) &&
  1858. - Equals(other.Suffix, Suffix);
  1859. - }
  1860. -
  1861. - public override int GetHashCode()
  1862. - {
  1863. - var hashCodeCombiner = HashCodeCombiner.Start();
  1864. - hashCodeCombiner.Add(Name, StringComparer.Ordinal);
  1865. - hashCodeCombiner.Add(Prefix);
  1866. - hashCodeCombiner.Add(Suffix);
  1867. -
  1868. - return hashCodeCombiner;
  1869. - }
  1870. - }
  1871. -}
  1872. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/AutoCompleteEditHandler.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/AutoCompleteEditHandler.cs
  1873. index a20dbddfb96..25143777802 100644
  1874. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/AutoCompleteEditHandler.cs
  1875. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/AutoCompleteEditHandler.cs
  1876. @@ -3,7 +3,7 @@
  1877. using System;
  1878. using System.Collections.Generic;
  1879. -using Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax;
  1880. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  1881. using Microsoft.Extensions.Internal;
  1882. namespace Microsoft.AspNetCore.Razor.Language.Legacy
  1883. @@ -12,18 +12,18 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  1884. {
  1885. private static readonly int TypeHashCode = typeof(AutoCompleteEditHandler).GetHashCode();
  1886. - public AutoCompleteEditHandler(Func<string, IEnumerable<SyntaxToken>> tokenizer)
  1887. + public AutoCompleteEditHandler(Func<string, IEnumerable<Syntax.InternalSyntax.SyntaxToken>> tokenizer)
  1888. : base(tokenizer)
  1889. {
  1890. }
  1891. - public AutoCompleteEditHandler(Func<string, IEnumerable<SyntaxToken>> tokenizer, bool autoCompleteAtEndOfSpan)
  1892. + public AutoCompleteEditHandler(Func<string, IEnumerable<Syntax.InternalSyntax.SyntaxToken>> tokenizer, bool autoCompleteAtEndOfSpan)
  1893. : this(tokenizer)
  1894. {
  1895. AutoCompleteAtEndOfSpan = autoCompleteAtEndOfSpan;
  1896. }
  1897. - public AutoCompleteEditHandler(Func<string, IEnumerable<SyntaxToken>> tokenizer, AcceptedCharactersInternal accepted)
  1898. + public AutoCompleteEditHandler(Func<string, IEnumerable<Syntax.InternalSyntax.SyntaxToken>> tokenizer, AcceptedCharactersInternal accepted)
  1899. : base(tokenizer, accepted)
  1900. {
  1901. }
  1902. @@ -32,7 +32,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  1903. public string AutoCompleteString { get; set; }
  1904. - protected override PartialParseResultInternal CanAcceptChange(Span target, SourceChange change)
  1905. + protected override PartialParseResultInternal CanAcceptChange(SyntaxNode target, SourceChange change)
  1906. {
  1907. if (((AutoCompleteAtEndOfSpan && IsAtEndOfSpan(target, change)) || IsAtEndOfFirstLine(target, change)) &&
  1908. change.IsInsert &&
  1909. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/Block.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/Block.cs
  1910. deleted file mode 100644
  1911. index ee7cc135f10..00000000000
  1912. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/Block.cs
  1913. +++ /dev/null
  1914. @@ -1,288 +0,0 @@
  1915. -// Copyright (c) .NET Foundation. All rights reserved.
  1916. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  1917. -
  1918. -using System;
  1919. -using System.Collections.Generic;
  1920. -using System.Globalization;
  1921. -using System.Linq;
  1922. -using Microsoft.Extensions.Internal;
  1923. -
  1924. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  1925. -{
  1926. - internal class Block : SyntaxTreeNode
  1927. - {
  1928. - private int? _length;
  1929. -
  1930. - public Block(BlockBuilder source)
  1931. - : this(source.Type, source.Children, source.ChunkGenerator)
  1932. - {
  1933. - source.Reset();
  1934. - }
  1935. -
  1936. - protected Block(BlockKindInternal? type, IReadOnlyList<SyntaxTreeNode> children, IParentChunkGenerator generator)
  1937. - {
  1938. - if (type == null)
  1939. - {
  1940. - throw new InvalidOperationException(Resources.Block_Type_Not_Specified);
  1941. - }
  1942. -
  1943. - Type = type.Value;
  1944. - Children = children;
  1945. - ChunkGenerator = generator;
  1946. -
  1947. - // Perf: Avoid allocating an enumerator.
  1948. - for (var i = 0; i < Children.Count; i++)
  1949. - {
  1950. - Children[i].Parent = this;
  1951. - }
  1952. - }
  1953. - public IParentChunkGenerator ChunkGenerator { get; }
  1954. -
  1955. - public BlockKindInternal Type { get; }
  1956. -
  1957. - public IReadOnlyList<SyntaxTreeNode> Children { get; }
  1958. -
  1959. - public override bool IsBlock => true;
  1960. -
  1961. - public override SourceLocation Start
  1962. - {
  1963. - get
  1964. - {
  1965. - var child = Children.FirstOrDefault();
  1966. - if (child == null)
  1967. - {
  1968. - return SourceLocation.Zero;
  1969. - }
  1970. - else
  1971. - {
  1972. - return child.Start;
  1973. - }
  1974. - }
  1975. - }
  1976. -
  1977. - public override int Length
  1978. - {
  1979. - get
  1980. - {
  1981. - if (_length == null)
  1982. - {
  1983. - var length = 0;
  1984. - for (var i = 0; i < Children.Count; i++)
  1985. - {
  1986. - length += Children[i].Length;
  1987. - }
  1988. -
  1989. - _length = length;
  1990. - }
  1991. -
  1992. - return _length.Value;
  1993. - }
  1994. - }
  1995. -
  1996. -
  1997. - public virtual IEnumerable<Span> Flatten()
  1998. - {
  1999. - // Perf: Avoid allocating an enumerator.
  2000. - for (var i = 0; i < Children.Count; i++)
  2001. - {
  2002. - var element = Children[i];
  2003. - var span = element as Span;
  2004. - if (span != null)
  2005. - {
  2006. - yield return span;
  2007. - }
  2008. - else
  2009. - {
  2010. - var block = element as Block;
  2011. - foreach (Span childSpan in block.Flatten())
  2012. - {
  2013. - yield return childSpan;
  2014. - }
  2015. - }
  2016. - }
  2017. - }
  2018. -
  2019. - public Span FindFirstDescendentSpan()
  2020. - {
  2021. - SyntaxTreeNode current = this;
  2022. - while (current != null && current.IsBlock)
  2023. - {
  2024. - current = ((Block)current).Children.FirstOrDefault();
  2025. - }
  2026. - return current as Span;
  2027. - }
  2028. -
  2029. - public Span FindLastDescendentSpan()
  2030. - {
  2031. - SyntaxTreeNode current = this;
  2032. - while (current != null && current.IsBlock)
  2033. - {
  2034. - current = ((Block)current).Children.LastOrDefault();
  2035. - }
  2036. - return current as Span;
  2037. - }
  2038. -
  2039. - public virtual Span LocateOwner(SourceChange change) => LocateOwner(change, Children);
  2040. -
  2041. - protected static Span LocateOwner(SourceChange change, IEnumerable<SyntaxTreeNode> elements)
  2042. - {
  2043. - // Ask each child recursively
  2044. - Span owner = null;
  2045. - foreach (var element in elements)
  2046. - {
  2047. - var span = element as Span;
  2048. - if (span == null)
  2049. - {
  2050. - owner = ((Block)element).LocateOwner(change);
  2051. - }
  2052. - else
  2053. - {
  2054. - if (change.Span.AbsoluteIndex < span.Start.AbsoluteIndex)
  2055. - {
  2056. - // Early escape for cases where changes overlap multiple spans
  2057. - // In those cases, the span will return false, and we don't want to search the whole tree
  2058. - // So if the current span starts after the change, we know we've searched as far as we need to
  2059. - break;
  2060. - }
  2061. - owner = span.EditHandler.OwnsChange(span, change) ? span : owner;
  2062. - }
  2063. -
  2064. - if (owner != null)
  2065. - {
  2066. - break;
  2067. - }
  2068. - }
  2069. - return owner;
  2070. - }
  2071. -
  2072. - public override string ToString()
  2073. - {
  2074. - return string.Format(
  2075. - CultureInfo.CurrentCulture,
  2076. - "{0} Block at {1}::{2} (Gen:{3})",
  2077. - Type,
  2078. - Start,
  2079. - Length,
  2080. - ChunkGenerator);
  2081. - }
  2082. -
  2083. - public override bool Equals(object obj)
  2084. - {
  2085. - var other = obj as Block;
  2086. - return other != null &&
  2087. - Type == other.Type &&
  2088. - Equals(ChunkGenerator, other.ChunkGenerator) &&
  2089. - ChildrenEqual(Children, other.Children);
  2090. - }
  2091. -
  2092. - public override int GetHashCode()
  2093. - {
  2094. - var hashCodeCombiner = HashCodeCombiner.Start();
  2095. - hashCodeCombiner.Add(Type);
  2096. - hashCodeCombiner.Add(ChunkGenerator);
  2097. - hashCodeCombiner.Add(Children);
  2098. -
  2099. - return hashCodeCombiner;
  2100. - }
  2101. -
  2102. - private static bool ChildrenEqual(IEnumerable<SyntaxTreeNode> left, IEnumerable<SyntaxTreeNode> right)
  2103. - {
  2104. - IEnumerator<SyntaxTreeNode> leftEnum = left.GetEnumerator();
  2105. - IEnumerator<SyntaxTreeNode> rightEnum = right.GetEnumerator();
  2106. - while (leftEnum.MoveNext())
  2107. - {
  2108. - if (!rightEnum.MoveNext() || // More items in left than in right
  2109. - !Equals(leftEnum.Current, rightEnum.Current))
  2110. - {
  2111. - // Nodes are not equal
  2112. - return false;
  2113. - }
  2114. - }
  2115. - if (rightEnum.MoveNext())
  2116. - {
  2117. - // More items in right than left
  2118. - return false;
  2119. - }
  2120. - return true;
  2121. - }
  2122. -
  2123. - public override bool EquivalentTo(SyntaxTreeNode node)
  2124. - {
  2125. - var other = node as Block;
  2126. - if (other == null || other.Type != Type)
  2127. - {
  2128. - return false;
  2129. - }
  2130. -
  2131. - return Enumerable.SequenceEqual(Children, other.Children, EquivalenceComparer.Default);
  2132. - }
  2133. -
  2134. - public override int GetEquivalenceHash()
  2135. - {
  2136. - var hashCodeCombiner = HashCodeCombiner.Start();
  2137. - hashCodeCombiner.Add(Type);
  2138. - foreach (var child in Children)
  2139. - {
  2140. - hashCodeCombiner.Add(child.GetEquivalenceHash());
  2141. - }
  2142. -
  2143. - return hashCodeCombiner.CombinedHash;
  2144. - }
  2145. -
  2146. - public override void Accept(ParserVisitor visitor)
  2147. - {
  2148. - visitor.VisitBlock(this);
  2149. - }
  2150. -
  2151. - public override SyntaxTreeNode Clone()
  2152. - {
  2153. - var blockBuilder = new BlockBuilder(this);
  2154. -
  2155. - blockBuilder.Children.Clear();
  2156. - for (var i = 0; i < Children.Count; i++)
  2157. - {
  2158. - var clonedChild = Children[i].Clone();
  2159. - blockBuilder.Children.Add(clonedChild);
  2160. - }
  2161. -
  2162. - return blockBuilder.Build();
  2163. - }
  2164. -
  2165. - internal void ChildChanged()
  2166. - {
  2167. - // A node in our graph has changed. We'll need to recompute our length the next time we're asked for it.
  2168. - _length = null;
  2169. -
  2170. - Parent?.ChildChanged();
  2171. - }
  2172. -
  2173. - private class EquivalenceComparer : IEqualityComparer<SyntaxTreeNode>
  2174. - {
  2175. - public static readonly EquivalenceComparer Default = new EquivalenceComparer();
  2176. -
  2177. - private EquivalenceComparer()
  2178. - {
  2179. - }
  2180. -
  2181. - public bool Equals(SyntaxTreeNode nodeX, SyntaxTreeNode nodeY)
  2182. - {
  2183. - if (nodeX == nodeY)
  2184. - {
  2185. - return true;
  2186. - }
  2187. -
  2188. - return nodeX != null && nodeX.EquivalentTo(nodeY);
  2189. - }
  2190. -
  2191. - public int GetHashCode(SyntaxTreeNode node)
  2192. - {
  2193. - if (node == null)
  2194. - {
  2195. - throw new ArgumentNullException(nameof(node));
  2196. - }
  2197. -
  2198. - return node.GetEquivalenceHash();
  2199. - }
  2200. - }
  2201. - }
  2202. -}
  2203. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/BlockBuilder.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/BlockBuilder.cs
  2204. deleted file mode 100644
  2205. index 3e3905c4a7a..00000000000
  2206. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/BlockBuilder.cs
  2207. +++ /dev/null
  2208. @@ -1,40 +0,0 @@
  2209. -// Copyright (c) .NET Foundation. All rights reserved.
  2210. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  2211. -
  2212. -using System.Collections.Generic;
  2213. -
  2214. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  2215. -{
  2216. - internal class BlockBuilder
  2217. - {
  2218. - public BlockBuilder()
  2219. - {
  2220. - Reset();
  2221. - }
  2222. -
  2223. - public BlockBuilder(Block original)
  2224. - {
  2225. - Type = original.Type;
  2226. - Children = new List<SyntaxTreeNode>(original.Children);
  2227. - ChunkGenerator = original.ChunkGenerator;
  2228. - }
  2229. -
  2230. - public IParentChunkGenerator ChunkGenerator { get; set; }
  2231. -
  2232. - public BlockKindInternal? Type { get; set; }
  2233. -
  2234. - public List<SyntaxTreeNode> Children { get; private set; }
  2235. -
  2236. - public virtual Block Build()
  2237. - {
  2238. - return new Block(this);
  2239. - }
  2240. -
  2241. - public virtual void Reset()
  2242. - {
  2243. - Type = null;
  2244. - Children = new List<SyntaxTreeNode>();
  2245. - ChunkGenerator = ParentChunkGenerator.Null;
  2246. - }
  2247. - }
  2248. -}
  2249. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/BlockExtensions.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/BlockExtensions.cs
  2250. deleted file mode 100644
  2251. index 232baf7ee90..00000000000
  2252. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/BlockExtensions.cs
  2253. +++ /dev/null
  2254. @@ -1,28 +0,0 @@
  2255. -// Copyright (c) .NET Foundation. All rights reserved.
  2256. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  2257. -
  2258. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  2259. -{
  2260. - internal static class BlockExtensions
  2261. - {
  2262. - public static void LinkNodes(this Block self)
  2263. - {
  2264. - Span first = null;
  2265. - Span previous = null;
  2266. - foreach (Span span in self.Flatten())
  2267. - {
  2268. - if (first == null)
  2269. - {
  2270. - first = span;
  2271. - }
  2272. - span.Previous = previous;
  2273. -
  2274. - if (previous != null)
  2275. - {
  2276. - previous.Next = span;
  2277. - }
  2278. - previous = span;
  2279. - }
  2280. - }
  2281. - }
  2282. -}
  2283. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/CSharpCodeParser.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/CSharpCodeParser.cs
  2284. index 12697094594..44612ee18c5 100644
  2285. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/CSharpCodeParser.cs
  2286. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/CSharpCodeParser.cs
  2287. @@ -70,8 +70,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  2288. private readonly ISet<string> CurrentKeywords = new HashSet<string>(DefaultKeywords);
  2289. - private Dictionary<string, Action> _directiveParsers = new Dictionary<string, Action>(StringComparer.Ordinal);
  2290. - private Dictionary<CSharpKeyword, Action<bool>> _keywordParsers = new Dictionary<CSharpKeyword, Action<bool>>();
  2291. + private Dictionary<CSharpKeyword, Action<SyntaxListBuilder<RazorSyntaxNode>, CSharpTransitionSyntax>> _keywordParserMap = new Dictionary<CSharpKeyword, Action<SyntaxListBuilder<RazorSyntaxNode>, CSharpTransitionSyntax>>();
  2292. + private Dictionary<string, Action<SyntaxListBuilder<RazorSyntaxNode>, CSharpTransitionSyntax>> _directiveParserMap = new Dictionary<string, Action<SyntaxListBuilder<RazorSyntaxNode>, CSharpTransitionSyntax>>(StringComparer.Ordinal);
  2293. public CSharpCodeParser(ParserContext context)
  2294. : this(directives: Enumerable.Empty<DirectiveDescriptor>(), context: context)
  2295. @@ -92,9 +92,9 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  2296. }
  2297. Keywords = new HashSet<string>();
  2298. - SetUpKeywords();
  2299. - SetupDirectives(directives);
  2300. - SetUpExpressions();
  2301. + SetupKeywordParsers();
  2302. + SetupExpressionParsers();
  2303. + SetupDirectiveParsers(directives);
  2304. }
  2305. public HtmlMarkupParser HtmlParser { get; set; }
  2306. @@ -103,121 +103,39 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  2307. public bool IsNested { get; set; }
  2308. - protected override bool TokenKindEquals(SyntaxKind x, SyntaxKind y) => x == y;
  2309. -
  2310. - protected void MapDirectives(Action handler, params string[] directives)
  2311. - {
  2312. - foreach (var directive in directives)
  2313. - {
  2314. - _directiveParsers.Add(directive, () =>
  2315. - {
  2316. - handler();
  2317. - Context.SeenDirectives.Add(directive);
  2318. - });
  2319. -
  2320. - Keywords.Add(directive);
  2321. -
  2322. - // These C# keywords are reserved for use in directives. It's an error to use them outside of
  2323. - // a directive. This code removes the error generation if the directive *is* registered.
  2324. - if (string.Equals(directive, "class", StringComparison.OrdinalIgnoreCase))
  2325. - {
  2326. - _keywordParsers.Remove(CSharpKeyword.Class);
  2327. - }
  2328. - else if (string.Equals(directive, "namespace", StringComparison.OrdinalIgnoreCase))
  2329. - {
  2330. - _keywordParsers.Remove(CSharpKeyword.Namespace);
  2331. - }
  2332. - }
  2333. - }
  2334. -
  2335. - protected bool TryGetDirectiveHandler(string directive, out Action handler)
  2336. - {
  2337. - return _directiveParsers.TryGetValue(directive, out handler);
  2338. - }
  2339. -
  2340. - private void MapExpressionKeyword(Action<bool> handler, CSharpKeyword keyword)
  2341. - {
  2342. - _keywordParsers.Add(keyword, handler);
  2343. -
  2344. - // Expression keywords don't belong in the regular keyword list
  2345. - }
  2346. -
  2347. - private void MapKeywords(Action<bool> handler, params CSharpKeyword[] keywords)
  2348. - {
  2349. - MapKeywords(handler, topLevel: true, keywords: keywords);
  2350. - }
  2351. -
  2352. - private void MapKeywords(Action<bool> handler, bool topLevel, params CSharpKeyword[] keywords)
  2353. + public CSharpCodeBlockSyntax ParseBlock()
  2354. {
  2355. - foreach (var keyword in keywords)
  2356. + if (Context == null)
  2357. {
  2358. - _keywordParsers.Add(keyword, handler);
  2359. - if (topLevel)
  2360. - {
  2361. - Keywords.Add(CSharpLanguageCharacteristics.GetKeyword(keyword));
  2362. - }
  2363. + throw new InvalidOperationException(Resources.Parser_Context_Not_Set);
  2364. }
  2365. - }
  2366. -
  2367. - [Conditional("DEBUG")]
  2368. - internal void Assert(CSharpKeyword expectedKeyword)
  2369. - {
  2370. - var result = CSharpTokenizer.GetTokenKeyword(CurrentToken);
  2371. - Debug.Assert(CurrentToken.Kind == SyntaxKind.Keyword &&
  2372. - result.HasValue &&
  2373. - result.Value == expectedKeyword);
  2374. - }
  2375. - protected internal bool At(CSharpKeyword keyword)
  2376. - {
  2377. - var result = CSharpTokenizer.GetTokenKeyword(CurrentToken);
  2378. - return At(SyntaxKind.Keyword) &&
  2379. - result.HasValue &&
  2380. - result.Value == keyword;
  2381. - }
  2382. -
  2383. - protected internal bool AcceptIf(CSharpKeyword keyword)
  2384. - {
  2385. - if (At(keyword))
  2386. + if (EndOfFile)
  2387. {
  2388. - AcceptAndMoveNext();
  2389. - return true;
  2390. + // Nothing to parse.
  2391. + return null;
  2392. }
  2393. - return false;
  2394. - }
  2395. -
  2396. - protected static Func<SyntaxToken, bool> IsSpacingToken(bool includeNewLines, bool includeComments)
  2397. - {
  2398. - return token => token.Kind == SyntaxKind.Whitespace ||
  2399. - (includeNewLines && token.Kind == SyntaxKind.NewLine) ||
  2400. - (includeComments && token.Kind == SyntaxKind.CSharpComment);
  2401. - }
  2402. - public override void ParseBlock()
  2403. - {
  2404. - using (PushSpanConfig(DefaultSpanConfig))
  2405. + using (var pooledResult = Pool.Allocate<RazorSyntaxNode>())
  2406. + using (PushSpanContextConfig(DefaultSpanContextConfig))
  2407. {
  2408. - if (Context == null)
  2409. - {
  2410. - throw new InvalidOperationException(Resources.Parser_Context_Not_Set);
  2411. - }
  2412. -
  2413. - Span.Start = CurrentLocation;
  2414. -
  2415. - // Unless changed, the block is a statement block
  2416. - using (Context.Builder.StartBlock(BlockKindInternal.Statement))
  2417. + var builder = pooledResult.Builder;
  2418. + try
  2419. {
  2420. NextToken();
  2421. + // Unless changed, the block is a statement block
  2422. AcceptWhile(IsSpacingToken(includeNewLines: true, includeComments: true));
  2423. + builder.Add(OutputTokensAsStatementLiteral());
  2424. - var current = CurrentToken;
  2425. + // We are usually called when the other parser sees a transition '@'. Look for it.
  2426. + SyntaxToken transitionToken = null;
  2427. if (At(SyntaxKind.StringLiteral) &&
  2428. CurrentToken.Content.Length > 0 &&
  2429. CurrentToken.Content[0] == SyntaxConstants.TransitionCharacter)
  2430. {
  2431. var split = Language.SplitToken(CurrentToken, 1, SyntaxKind.Transition);
  2432. - current = split.Item1;
  2433. + transitionToken = split.Item1;
  2434. // Back up to the end of the transition
  2435. Context.Source.Position -= split.Item2.Content.Length;
  2436. @@ -225,142 +143,106 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  2437. }
  2438. else if (At(SyntaxKind.Transition))
  2439. {
  2440. - NextToken();
  2441. + transitionToken = EatCurrentToken();
  2442. }
  2443. - // Accept "@" if we see it, but if we don't, that's OK. We assume we were started for a good reason
  2444. - if (current.Kind == SyntaxKind.Transition)
  2445. - {
  2446. - if (Span.Tokens.Count > 0)
  2447. - {
  2448. - Output(SpanKindInternal.Code);
  2449. - }
  2450. - AtTransition(current);
  2451. - }
  2452. - else
  2453. + if (transitionToken == null)
  2454. {
  2455. - // No "@" => Jump straight to AfterTransition
  2456. - AfterTransition();
  2457. + transitionToken = SyntaxFactory.MissingToken(SyntaxKind.Transition);
  2458. }
  2459. - Output(SpanKindInternal.Code);
  2460. - }
  2461. - }
  2462. - }
  2463. -
  2464. - private void DefaultSpanConfig(SpanBuilder span)
  2465. - {
  2466. - span.EditHandler = SpanEditHandler.CreateDefault(Language.TokenizeString);
  2467. - span.ChunkGenerator = new StatementChunkGenerator();
  2468. - }
  2469. -
  2470. - private void AtTransition(SyntaxToken current)
  2471. - {
  2472. - Debug.Assert(current.Kind == SyntaxKind.Transition);
  2473. - Accept(current);
  2474. - Span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  2475. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  2476. -
  2477. - // Output the "@" span and continue here
  2478. - Output(SpanKindInternal.Transition);
  2479. - AfterTransition();
  2480. - }
  2481. + SpanContext.ChunkGenerator = SpanChunkGenerator.Null;
  2482. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  2483. + var transition = GetNodeWithSpanContext(SyntaxFactory.CSharpTransition(transitionToken));
  2484. - private void AfterTransition()
  2485. - {
  2486. - using (PushSpanConfig(DefaultSpanConfig))
  2487. - {
  2488. - EnsureCurrent();
  2489. - try
  2490. - {
  2491. - // What type of block is this?
  2492. - if (!EndOfFile)
  2493. + if (At(SyntaxKind.LeftBrace))
  2494. {
  2495. - if (CurrentToken.Kind == SyntaxKind.LeftParenthesis)
  2496. - {
  2497. - Context.Builder.CurrentBlock.Type = BlockKindInternal.Expression;
  2498. - Context.Builder.CurrentBlock.ChunkGenerator = new ExpressionChunkGenerator();
  2499. - ExplicitExpression();
  2500. - return;
  2501. - }
  2502. - else if (CurrentToken.Kind == SyntaxKind.Identifier)
  2503. + var statementBody = ParseStatementBody();
  2504. + var statement = SyntaxFactory.CSharpStatement(transition, statementBody);
  2505. + builder.Add(statement);
  2506. + }
  2507. + else if (At(SyntaxKind.LeftParenthesis))
  2508. + {
  2509. + var expressionBody = ParseExplicitExpressionBody();
  2510. + var expression = SyntaxFactory.CSharpExplicitExpression(transition, expressionBody);
  2511. + builder.Add(expression);
  2512. + }
  2513. + else if (At(SyntaxKind.Identifier))
  2514. + {
  2515. + if (!TryParseDirective(builder, transition, CurrentToken.Content))
  2516. {
  2517. - if (TryGetDirectiveHandler(CurrentToken.Content, out var handler))
  2518. + if (string.Equals(
  2519. + CurrentToken.Content,
  2520. + SyntaxConstants.CSharp.HelperKeyword,
  2521. + StringComparison.Ordinal))
  2522. {
  2523. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  2524. - handler();
  2525. - return;
  2526. + var diagnostic = RazorDiagnosticFactory.CreateParsing_HelperDirectiveNotAvailable(
  2527. + new SourceSpan(CurrentStart, CurrentToken.Content.Length));
  2528. + CurrentToken.SetDiagnostics(new[] { diagnostic });
  2529. + Context.ErrorSink.OnError(diagnostic);
  2530. }
  2531. - else
  2532. - {
  2533. - if (string.Equals(
  2534. - CurrentToken.Content,
  2535. - SyntaxConstants.CSharp.HelperKeyword,
  2536. - StringComparison.Ordinal))
  2537. - {
  2538. - Context.ErrorSink.OnError(
  2539. - RazorDiagnosticFactory.CreateParsing_HelperDirectiveNotAvailable(
  2540. - new SourceSpan(CurrentStart, CurrentToken.Content.Length)));
  2541. - }
  2542. - Context.Builder.CurrentBlock.Type = BlockKindInternal.Expression;
  2543. - Context.Builder.CurrentBlock.ChunkGenerator = new ExpressionChunkGenerator();
  2544. - ImplicitExpression();
  2545. - return;
  2546. - }
  2547. - }
  2548. - else if (CurrentToken.Kind == SyntaxKind.Keyword)
  2549. - {
  2550. - if (TryGetDirectiveHandler(CurrentToken.Content, out var handler))
  2551. - {
  2552. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  2553. - handler();
  2554. - return;
  2555. - }
  2556. - else
  2557. - {
  2558. - KeywordBlock(topLevel: true);
  2559. - return;
  2560. - }
  2561. + var implicitExpressionBody = ParseImplicitExpressionBody();
  2562. + var implicitExpression = SyntaxFactory.CSharpImplicitExpression(transition, implicitExpressionBody);
  2563. + builder.Add(implicitExpression);
  2564. }
  2565. - else if (CurrentToken.Kind == SyntaxKind.LeftBrace)
  2566. + }
  2567. + else if (At(SyntaxKind.Keyword))
  2568. + {
  2569. + if (!TryParseDirective(builder, transition, CurrentToken.Content) &&
  2570. + !TryParseKeyword(builder, transition))
  2571. {
  2572. - VerbatimBlock();
  2573. - return;
  2574. + // Not a directive or a special keyword. Just parse as an implicit expression.
  2575. + var implicitExpressionBody = ParseImplicitExpressionBody();
  2576. + var implicitExpression = SyntaxFactory.CSharpImplicitExpression(transition, implicitExpressionBody);
  2577. + builder.Add(implicitExpression);
  2578. }
  2579. - }
  2580. - // Invalid character
  2581. - Context.Builder.CurrentBlock.Type = BlockKindInternal.Expression;
  2582. - Context.Builder.CurrentBlock.ChunkGenerator = new ExpressionChunkGenerator();
  2583. - AddMarkerTokenIfNecessary();
  2584. - Span.ChunkGenerator = new ExpressionChunkGenerator();
  2585. - Span.EditHandler = new ImplicitExpressionEditHandler(
  2586. - Language.TokenizeString,
  2587. - CurrentKeywords,
  2588. - acceptTrailingDot: IsNested)
  2589. - {
  2590. - AcceptedCharacters = AcceptedCharactersInternal.NonWhitespace
  2591. - };
  2592. - if (At(SyntaxKind.Whitespace) || At(SyntaxKind.NewLine))
  2593. - {
  2594. - Context.ErrorSink.OnError(
  2595. - RazorDiagnosticFactory.CreateParsing_UnexpectedWhiteSpaceAtStartOfCodeBlock(
  2596. - new SourceSpan(CurrentStart, CurrentToken.Content.Length)));
  2597. - }
  2598. - else if (EndOfFile)
  2599. - {
  2600. - Context.ErrorSink.OnError(
  2601. - RazorDiagnosticFactory.CreateParsing_UnexpectedEndOfFileAtStartOfCodeBlock(
  2602. - new SourceSpan(CurrentStart, contentLength: 1 /* end of file */)));
  2603. + builder.Add(OutputTokensAsStatementLiteral());
  2604. }
  2605. else
  2606. {
  2607. - Context.ErrorSink.OnError(
  2608. - RazorDiagnosticFactory.CreateParsing_UnexpectedCharacterAtStartOfCodeBlock(
  2609. - new SourceSpan(CurrentStart, CurrentToken.Content.Length),
  2610. - CurrentToken.Content));
  2611. + // Invalid character
  2612. + SpanContext.ChunkGenerator = new ExpressionChunkGenerator();
  2613. + SpanContext.EditHandler = new ImplicitExpressionEditHandler(
  2614. + Language.TokenizeString,
  2615. + CurrentKeywords,
  2616. + acceptTrailingDot: IsNested)
  2617. + {
  2618. + AcceptedCharacters = AcceptedCharactersInternal.NonWhitespace
  2619. + };
  2620. +
  2621. + AcceptMarkerTokenIfNecessary();
  2622. + var expressionLiteral = SyntaxFactory.CSharpCodeBlock(OutputTokensAsExpressionLiteral());
  2623. + var expressionBody = SyntaxFactory.CSharpImplicitExpressionBody(expressionLiteral);
  2624. + var expressionBlock = SyntaxFactory.CSharpImplicitExpression(transition, expressionBody);
  2625. + builder.Add(expressionBlock);
  2626. +
  2627. + if (At(SyntaxKind.Whitespace) || At(SyntaxKind.NewLine))
  2628. + {
  2629. + Context.ErrorSink.OnError(
  2630. + RazorDiagnosticFactory.CreateParsing_UnexpectedWhiteSpaceAtStartOfCodeBlock(
  2631. + new SourceSpan(CurrentStart, CurrentToken.Content.Length)));
  2632. + }
  2633. + else if (EndOfFile)
  2634. + {
  2635. + Context.ErrorSink.OnError(
  2636. + RazorDiagnosticFactory.CreateParsing_UnexpectedEndOfFileAtStartOfCodeBlock(
  2637. + new SourceSpan(CurrentStart, contentLength: 1 /* end of file */)));
  2638. + }
  2639. + else
  2640. + {
  2641. + Context.ErrorSink.OnError(
  2642. + RazorDiagnosticFactory.CreateParsing_UnexpectedCharacterAtStartOfCodeBlock(
  2643. + new SourceSpan(CurrentStart, CurrentToken.Content.Length),
  2644. + CurrentToken.Content));
  2645. + }
  2646. }
  2647. +
  2648. + Debug.Assert(TokenBuilder.Count == 0, "We should not have any tokens left.");
  2649. +
  2650. + var codeBlock = SyntaxFactory.CSharpCodeBlock(builder.ToList());
  2651. + return codeBlock;
  2652. }
  2653. finally
  2654. {
  2655. @@ -370,75 +252,90 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  2656. }
  2657. }
  2658. - private void VerbatimBlock()
  2659. + private CSharpExplicitExpressionBodySyntax ParseExplicitExpressionBody()
  2660. {
  2661. - Assert(SyntaxKind.LeftBrace);
  2662. - var block = new Block(Resources.BlockName_Code, CurrentStart);
  2663. - AcceptAndMoveNext();
  2664. + var block = new Block(Resources.BlockName_ExplicitExpression, CurrentStart);
  2665. + Assert(SyntaxKind.LeftParenthesis);
  2666. + var leftParenToken = EatCurrentToken();
  2667. + var leftParen = OutputAsMetaCode(leftParenToken);
  2668. - // Set up the "{" span and output
  2669. - Span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  2670. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  2671. - Output(SpanKindInternal.MetaCode);
  2672. + using (var pooledResult = Pool.Allocate<RazorSyntaxNode>())
  2673. + {
  2674. + var expressionBuilder = pooledResult.Builder;
  2675. + using (PushSpanContextConfig(ExplicitExpressionSpanContextConfig))
  2676. + {
  2677. + var success = Balance(
  2678. + expressionBuilder,
  2679. + BalancingModes.BacktrackOnFailure |
  2680. + BalancingModes.NoErrorOnFailure |
  2681. + BalancingModes.AllowCommentsAndTemplates,
  2682. + SyntaxKind.LeftParenthesis,
  2683. + SyntaxKind.RightParenthesis,
  2684. + block.Start);
  2685. - // Set up auto-complete and parse the code block
  2686. - var editHandler = new AutoCompleteEditHandler(Language.TokenizeString);
  2687. - Span.EditHandler = editHandler;
  2688. - CodeBlock(false, block);
  2689. + if (!success)
  2690. + {
  2691. + AcceptUntil(SyntaxKind.LessThan);
  2692. + Context.ErrorSink.OnError(
  2693. + RazorDiagnosticFactory.CreateParsing_ExpectedEndOfBlockBeforeEOF(
  2694. + new SourceSpan(block.Start, contentLength: 1 /* ( */), block.Name, ")", "("));
  2695. + }
  2696. - Span.ChunkGenerator = new StatementChunkGenerator();
  2697. - AddMarkerTokenIfNecessary();
  2698. - if (!At(SyntaxKind.RightBrace))
  2699. - {
  2700. - editHandler.AutoCompleteString = "}";
  2701. - }
  2702. - Output(SpanKindInternal.Code);
  2703. + // If necessary, put an empty-content marker token here
  2704. + AcceptMarkerTokenIfNecessary();
  2705. + expressionBuilder.Add(OutputTokensAsExpressionLiteral());
  2706. + }
  2707. - if (Optional(SyntaxKind.RightBrace))
  2708. - {
  2709. - // Set up the "}" span
  2710. - Span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  2711. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  2712. - }
  2713. + var expressionBlock = SyntaxFactory.CSharpCodeBlock(expressionBuilder.ToList());
  2714. - if (!IsNested)
  2715. - {
  2716. - EnsureCurrent();
  2717. - if (At(SyntaxKind.NewLine) ||
  2718. - (At(SyntaxKind.Whitespace) && NextIs(SyntaxKind.NewLine)))
  2719. + RazorMetaCodeSyntax rightParen = null;
  2720. + if (At(SyntaxKind.RightParenthesis))
  2721. {
  2722. - Context.NullGenerateWhitespaceAndNewLine = true;
  2723. + rightParen = OutputAsMetaCode(EatCurrentToken());
  2724. + }
  2725. + else
  2726. + {
  2727. + var missingToken = SyntaxFactory.MissingToken(SyntaxKind.RightParenthesis);
  2728. + rightParen = OutputAsMetaCode(missingToken, SpanContext.EditHandler.AcceptedCharacters);
  2729. + }
  2730. + if (!EndOfFile)
  2731. + {
  2732. + PutCurrentBack();
  2733. }
  2734. - }
  2735. - Output(SpanKindInternal.MetaCode);
  2736. + return SyntaxFactory.CSharpExplicitExpressionBody(leftParen, expressionBlock, rightParen);
  2737. + }
  2738. }
  2739. - private void ImplicitExpression()
  2740. + private CSharpImplicitExpressionBodySyntax ParseImplicitExpressionBody(bool async = false)
  2741. {
  2742. - ImplicitExpression(AcceptedCharactersInternal.NonWhitespace);
  2743. - }
  2744. + var accepted = AcceptedCharactersInternal.NonWhitespace;
  2745. + if (async)
  2746. + {
  2747. + // Async implicit expressions include the "await" keyword and therefore need to allow spaces to
  2748. + // separate the "await" and the following code.
  2749. + accepted = AcceptedCharactersInternal.AnyExceptNewline;
  2750. + }
  2751. - // Async implicit expressions include the "await" keyword and therefore need to allow spaces to
  2752. - // separate the "await" and the following code.
  2753. - private void AsyncImplicitExpression()
  2754. - {
  2755. - ImplicitExpression(AcceptedCharactersInternal.AnyExceptNewline);
  2756. + using (var pooledResult = Pool.Allocate<RazorSyntaxNode>())
  2757. + {
  2758. + var expressionBuilder = pooledResult.Builder;
  2759. + ParseImplicitExpression(expressionBuilder, accepted);
  2760. + var codeBlock = SyntaxFactory.CSharpCodeBlock(expressionBuilder.ToList());
  2761. + return SyntaxFactory.CSharpImplicitExpressionBody(codeBlock);
  2762. + }
  2763. }
  2764. - private void ImplicitExpression(AcceptedCharactersInternal acceptedCharacters)
  2765. + private void ParseImplicitExpression(in SyntaxListBuilder<RazorSyntaxNode> builder, AcceptedCharactersInternal acceptedCharacters)
  2766. {
  2767. - Context.Builder.CurrentBlock.Type = BlockKindInternal.Expression;
  2768. - Context.Builder.CurrentBlock.ChunkGenerator = new ExpressionChunkGenerator();
  2769. -
  2770. - using (PushSpanConfig(span =>
  2771. + using (PushSpanContextConfig(spanContext =>
  2772. {
  2773. - span.EditHandler = new ImplicitExpressionEditHandler(
  2774. + spanContext.EditHandler = new ImplicitExpressionEditHandler(
  2775. Language.TokenizeString,
  2776. Keywords,
  2777. acceptTrailingDot: IsNested);
  2778. - span.EditHandler.AcceptedCharacters = acceptedCharacters;
  2779. - span.ChunkGenerator = new ExpressionChunkGenerator();
  2780. + spanContext.EditHandler.AcceptedCharacters = acceptedCharacters;
  2781. + spanContext.ChunkGenerator = new ExpressionChunkGenerator();
  2782. }))
  2783. {
  2784. do
  2785. @@ -448,14 +345,14 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  2786. AcceptAndMoveNext();
  2787. }
  2788. }
  2789. - while (MethodCallOrArrayIndex(acceptedCharacters));
  2790. + while (ParseMethodCallOrArrayIndex(builder, acceptedCharacters));
  2791. PutCurrentBack();
  2792. - Output(SpanKindInternal.Code);
  2793. + builder.Add(OutputTokensAsExpressionLiteral());
  2794. }
  2795. }
  2796. - private bool MethodCallOrArrayIndex(AcceptedCharactersInternal acceptedCharacters)
  2797. + private bool ParseMethodCallOrArrayIndex(in SyntaxListBuilder<RazorSyntaxNode> builder, AcceptedCharactersInternal acceptedCharacters)
  2798. {
  2799. if (!EndOfFile)
  2800. {
  2801. @@ -463,19 +360,19 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  2802. CurrentToken.Kind == SyntaxKind.LeftBracket)
  2803. {
  2804. // If we end within "(", whitespace is fine
  2805. - Span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.Any;
  2806. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.Any;
  2807. SyntaxKind right;
  2808. bool success;
  2809. - using (PushSpanConfig((span, prev) =>
  2810. + using (PushSpanContextConfig((spanContext, prev) =>
  2811. {
  2812. - prev(span);
  2813. - span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.Any;
  2814. + prev(spanContext);
  2815. + spanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.Any;
  2816. }))
  2817. {
  2818. right = Language.FlipBracket(CurrentToken.Kind);
  2819. - success = Balance(BalancingModes.BacktrackOnFailure | BalancingModes.AllowCommentsAndTemplates);
  2820. + success = Balance(builder, BalancingModes.BacktrackOnFailure | BalancingModes.AllowCommentsAndTemplates);
  2821. }
  2822. if (!success)
  2823. @@ -487,9 +384,9 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  2824. AcceptAndMoveNext();
  2825. // At the ending brace, restore the initial accepted characters.
  2826. - Span.EditHandler.AcceptedCharacters = acceptedCharacters;
  2827. + SpanContext.EditHandler.AcceptedCharacters = acceptedCharacters;
  2828. }
  2829. - return MethodCallOrArrayIndex(acceptedCharacters);
  2830. + return ParseMethodCallOrArrayIndex(builder, acceptedCharacters);
  2831. }
  2832. if (At(SyntaxKind.QuestionMark))
  2833. {
  2834. @@ -512,7 +409,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  2835. AcceptAndMoveNext();
  2836. // Accept the [ and any content inside (it will attempt to balance).
  2837. - return MethodCallOrArrayIndex(acceptedCharacters);
  2838. + return ParseMethodCallOrArrayIndex(builder, acceptedCharacters);
  2839. }
  2840. }
  2841. }
  2842. @@ -553,362 +450,990 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  2843. return false;
  2844. }
  2845. - protected void CompleteBlock()
  2846. + private CSharpStatementBodySyntax ParseStatementBody(Block block = null)
  2847. {
  2848. - CompleteBlock(insertMarkerIfNecessary: true);
  2849. - }
  2850. + Assert(SyntaxKind.LeftBrace);
  2851. + block = block ?? new Block(Resources.BlockName_Code, CurrentStart);
  2852. + var leftBrace = OutputAsMetaCode(EatExpectedToken(SyntaxKind.LeftBrace));
  2853. + CSharpCodeBlockSyntax codeBlock = null;
  2854. + using (var pooledResult = Pool.Allocate<RazorSyntaxNode>())
  2855. + {
  2856. + var builder = pooledResult.Builder;
  2857. + // Set up auto-complete and parse the code block
  2858. + var editHandler = new AutoCompleteEditHandler(Language.TokenizeString);
  2859. + SpanContext.EditHandler = editHandler;
  2860. + ParseCodeBlock(builder, block, acceptTerminatingBrace: false);
  2861. - protected void CompleteBlock(bool insertMarkerIfNecessary)
  2862. - {
  2863. - CompleteBlock(insertMarkerIfNecessary, captureWhitespaceToEndOfLine: insertMarkerIfNecessary);
  2864. - }
  2865. + EnsureCurrent();
  2866. + SpanContext.ChunkGenerator = new StatementChunkGenerator();
  2867. + AcceptMarkerTokenIfNecessary();
  2868. + if (!At(SyntaxKind.RightBrace))
  2869. + {
  2870. + editHandler.AutoCompleteString = "}";
  2871. + }
  2872. + builder.Add(OutputTokensAsStatementLiteral());
  2873. - protected void CompleteBlock(bool insertMarkerIfNecessary, bool captureWhitespaceToEndOfLine)
  2874. - {
  2875. - if (insertMarkerIfNecessary && Context.Builder.LastAcceptedCharacters != AcceptedCharactersInternal.Any)
  2876. - {
  2877. - AddMarkerTokenIfNecessary();
  2878. + codeBlock = SyntaxFactory.CSharpCodeBlock(builder.ToList());
  2879. }
  2880. - EnsureCurrent();
  2881. -
  2882. - // Read whitespace, but not newlines
  2883. - // If we're not inserting a marker span, we don't need to capture whitespace
  2884. - if (!Context.WhiteSpaceIsSignificantToAncestorBlock &&
  2885. - Context.Builder.CurrentBlock.Type != BlockKindInternal.Expression &&
  2886. - captureWhitespaceToEndOfLine &&
  2887. - !Context.DesignTimeMode &&
  2888. - !IsNested)
  2889. + RazorMetaCodeSyntax rightBrace = null;
  2890. + if (At(SyntaxKind.RightBrace))
  2891. {
  2892. - CaptureWhitespaceAtEndOfCodeOnlyLine();
  2893. + rightBrace = OutputAsMetaCode(EatCurrentToken());
  2894. }
  2895. else
  2896. {
  2897. - PutCurrentBack();
  2898. + rightBrace = OutputAsMetaCode(
  2899. + SyntaxFactory.MissingToken(SyntaxKind.RightBrace),
  2900. + SpanContext.EditHandler.AcceptedCharacters);
  2901. }
  2902. - }
  2903. - private void CaptureWhitespaceAtEndOfCodeOnlyLine()
  2904. - {
  2905. - var whitespace = ReadWhile(token => token.Kind == SyntaxKind.Whitespace);
  2906. - if (At(SyntaxKind.NewLine))
  2907. - {
  2908. - Accept(whitespace);
  2909. - AcceptAndMoveNext();
  2910. - PutCurrentBack();
  2911. - }
  2912. - else
  2913. + if (!IsNested)
  2914. {
  2915. - PutCurrentBack();
  2916. - PutBack(whitespace);
  2917. + EnsureCurrent();
  2918. + if (At(SyntaxKind.NewLine) ||
  2919. + (At(SyntaxKind.Whitespace) && NextIs(SyntaxKind.NewLine)))
  2920. + {
  2921. + Context.NullGenerateWhitespaceAndNewLine = true;
  2922. + }
  2923. }
  2924. - }
  2925. - private void ConfigureExplicitExpressionSpan(SpanBuilder sb)
  2926. - {
  2927. - sb.EditHandler = SpanEditHandler.CreateDefault(Language.TokenizeString);
  2928. - sb.ChunkGenerator = new ExpressionChunkGenerator();
  2929. + return SyntaxFactory.CSharpStatementBody(leftBrace, codeBlock, rightBrace);
  2930. }
  2931. - private void ExplicitExpression()
  2932. + private void ParseCodeBlock(in SyntaxListBuilder<RazorSyntaxNode> builder, Block block, bool acceptTerminatingBrace = true)
  2933. {
  2934. - var block = new Block(Resources.BlockName_ExplicitExpression, CurrentStart);
  2935. - Assert(SyntaxKind.LeftParenthesis);
  2936. - AcceptAndMoveNext();
  2937. - Span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  2938. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  2939. - Output(SpanKindInternal.MetaCode);
  2940. - using (PushSpanConfig(ConfigureExplicitExpressionSpan))
  2941. - {
  2942. - var success = Balance(
  2943. - BalancingModes.BacktrackOnFailure |
  2944. - BalancingModes.NoErrorOnFailure |
  2945. - BalancingModes.AllowCommentsAndTemplates,
  2946. - SyntaxKind.LeftParenthesis,
  2947. - SyntaxKind.RightParenthesis,
  2948. - block.Start);
  2949. -
  2950. - if (!success)
  2951. - {
  2952. - AcceptUntil(SyntaxKind.LessThan);
  2953. - Context.ErrorSink.OnError(
  2954. - RazorDiagnosticFactory.CreateParsing_ExpectedEndOfBlockBeforeEOF(
  2955. - new SourceSpan(block.Start, contentLength: 1 /* ( */), block.Name, ")", "("));
  2956. - }
  2957. -
  2958. - // If necessary, put an empty-content marker token here
  2959. - if (Span.Tokens.Count == 0)
  2960. - {
  2961. - Accept(SyntaxFactory.Token(SyntaxKind.Unknown, string.Empty));
  2962. - }
  2963. -
  2964. - // Output the content span and then capture the ")"
  2965. - Output(SpanKindInternal.Code);
  2966. - }
  2967. - Optional(SyntaxKind.RightParenthesis);
  2968. - if (!EndOfFile)
  2969. + EnsureCurrent();
  2970. + while (!EndOfFile && !At(SyntaxKind.RightBrace))
  2971. {
  2972. - PutCurrentBack();
  2973. + // Parse a statement, then return here
  2974. + ParseStatement(builder, block: block);
  2975. + EnsureCurrent();
  2976. }
  2977. - Span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  2978. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  2979. - CompleteBlock(insertMarkerIfNecessary: false);
  2980. - Output(SpanKindInternal.MetaCode);
  2981. - }
  2982. - private void Template()
  2983. - {
  2984. - if (Context.Builder.ActiveBlocks.Any(block => block.Type == BlockKindInternal.Template))
  2985. + if (EndOfFile)
  2986. {
  2987. Context.ErrorSink.OnError(
  2988. - RazorDiagnosticFactory.CreateParsing_InlineMarkupBlocksCannotBeNested(
  2989. - new SourceSpan(CurrentStart, contentLength: 1 /* @ */)));
  2990. + RazorDiagnosticFactory.CreateParsing_ExpectedEndOfBlockBeforeEOF(
  2991. + new SourceSpan(block.Start, contentLength: 1 /* { OR } */), block.Name, "}", "{"));
  2992. }
  2993. - Output(SpanKindInternal.Code);
  2994. - using (Context.Builder.StartBlock(BlockKindInternal.Template))
  2995. + else if (acceptTerminatingBrace)
  2996. {
  2997. - Context.Builder.CurrentBlock.ChunkGenerator = new TemplateBlockChunkGenerator();
  2998. - PutCurrentBack();
  2999. - OtherParserBlock();
  3000. + Assert(SyntaxKind.RightBrace);
  3001. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  3002. + AcceptAndMoveNext();
  3003. }
  3004. }
  3005. - private void OtherParserBlock()
  3006. - {
  3007. - ParseWithOtherParser(p => p.ParseBlock());
  3008. - }
  3009. -
  3010. - private void SectionBlock(string left, string right, bool caseSensitive)
  3011. - {
  3012. - ParseWithOtherParser(p => p.ParseRazorBlock(Tuple.Create(left, right), caseSensitive));
  3013. - }
  3014. -
  3015. - private void NestedBlock()
  3016. + private void ParseStatement(in SyntaxListBuilder<RazorSyntaxNode> builder, Block block)
  3017. {
  3018. - Output(SpanKindInternal.Code);
  3019. -
  3020. - var wasNested = IsNested;
  3021. - IsNested = true;
  3022. - using (PushSpanConfig())
  3023. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.Any;
  3024. + // Accept whitespace but always keep the last whitespace node so we can put it back if necessary
  3025. + var lastWhitespace = AcceptWhitespaceInLines();
  3026. + if (EndOfFile)
  3027. {
  3028. - ParseBlock();
  3029. + if (lastWhitespace != null)
  3030. + {
  3031. + Accept(lastWhitespace);
  3032. + }
  3033. +
  3034. + builder.Add(OutputTokensAsStatementLiteral());
  3035. + return;
  3036. }
  3037. - Span.Start = CurrentLocation;
  3038. - Initialize(Span);
  3039. - IsNested = wasNested;
  3040. - NextToken();
  3041. - }
  3042. + var kind = CurrentToken.Kind;
  3043. + var location = CurrentStart;
  3044. - protected override bool IsAtEmbeddedTransition(bool allowTemplatesAndComments, bool allowTransitions)
  3045. - {
  3046. - // No embedded transitions in C#, so ignore that param
  3047. - return allowTemplatesAndComments
  3048. - && ((Language.IsTransition(CurrentToken)
  3049. - && NextIs(SyntaxKind.LessThan, SyntaxKind.Colon, SyntaxKind.DoubleColon))
  3050. - || Language.IsCommentStart(CurrentToken));
  3051. - }
  3052. + // Both cases @: and @:: are triggered as markup, second colon in second case will be triggered as a plain text
  3053. + var isSingleLineMarkup = kind == SyntaxKind.Transition &&
  3054. + (NextIs(SyntaxKind.Colon, SyntaxKind.DoubleColon));
  3055. - protected override void HandleEmbeddedTransition()
  3056. - {
  3057. - if (Language.IsTransition(CurrentToken))
  3058. + var isMarkup = isSingleLineMarkup ||
  3059. + kind == SyntaxKind.LessThan ||
  3060. + (kind == SyntaxKind.Transition && NextIs(SyntaxKind.LessThan));
  3061. +
  3062. + if (Context.DesignTimeMode || !isMarkup)
  3063. + {
  3064. + // CODE owns whitespace, MARKUP owns it ONLY in DesignTimeMode.
  3065. + if (lastWhitespace != null)
  3066. + {
  3067. + Accept(lastWhitespace);
  3068. + }
  3069. + }
  3070. + else
  3071. {
  3072. + var nextToken = Lookahead(1);
  3073. +
  3074. + // MARKUP owns whitespace EXCEPT in DesignTimeMode.
  3075. PutCurrentBack();
  3076. - Template();
  3077. +
  3078. + // Put back the whitespace unless it precedes a '<text>' tag.
  3079. + if (nextToken != null &&
  3080. + !string.Equals(nextToken.Content, SyntaxConstants.TextTagName, StringComparison.Ordinal))
  3081. + {
  3082. + PutBack(lastWhitespace);
  3083. + }
  3084. + else
  3085. + {
  3086. + // If it precedes a '<text>' tag, it should be accepted as code.
  3087. + Accept(lastWhitespace);
  3088. + }
  3089. }
  3090. - else if (Language.IsCommentStart(CurrentToken))
  3091. +
  3092. + if (isMarkup)
  3093. + {
  3094. + if (kind == SyntaxKind.Transition && !isSingleLineMarkup)
  3095. + {
  3096. + Context.ErrorSink.OnError(
  3097. + RazorDiagnosticFactory.CreateParsing_AtInCodeMustBeFollowedByColonParenOrIdentifierStart(
  3098. + new SourceSpan(location, contentLength: 1 /* @ */)));
  3099. + }
  3100. +
  3101. + // Markup block
  3102. + builder.Add(OutputTokensAsStatementLiteral());
  3103. + if (Context.DesignTimeMode && CurrentToken != null &&
  3104. + (CurrentToken.Kind == SyntaxKind.LessThan || CurrentToken.Kind == SyntaxKind.Transition))
  3105. + {
  3106. + PutCurrentBack();
  3107. + }
  3108. + OtherParserBlock(builder);
  3109. + }
  3110. + else
  3111. {
  3112. - RazorComment();
  3113. + // What kind of statement is this?
  3114. + switch (kind)
  3115. + {
  3116. + case SyntaxKind.RazorCommentTransition:
  3117. + AcceptMarkerTokenIfNecessary();
  3118. + builder.Add(OutputTokensAsStatementLiteral());
  3119. + var comment = ParseRazorComment();
  3120. + builder.Add(comment);
  3121. + ParseStatement(builder, block);
  3122. + break;
  3123. + case SyntaxKind.LeftBrace:
  3124. + // Verbatim Block
  3125. + AcceptAndMoveNext();
  3126. + ParseCodeBlock(builder, block);
  3127. + break;
  3128. + case SyntaxKind.Keyword:
  3129. + if (!TryParseKeyword(builder, transition: null))
  3130. + {
  3131. + ParseStandardStatement(builder);
  3132. + }
  3133. + break;
  3134. + case SyntaxKind.Transition:
  3135. + // Embedded Expression block
  3136. + ParseEmbeddedExpression(builder);
  3137. + break;
  3138. + case SyntaxKind.RightBrace:
  3139. + // Possible end of Code Block, just run the continuation
  3140. + break;
  3141. + case SyntaxKind.CSharpComment:
  3142. + Accept(CurrentToken);
  3143. + NextToken();
  3144. + break;
  3145. + default:
  3146. + // Other statement
  3147. + ParseStandardStatement(builder);
  3148. + break;
  3149. + }
  3150. }
  3151. }
  3152. - private void ParseWithOtherParser(Action<HtmlMarkupParser> parseAction)
  3153. + private void ParseEmbeddedExpression(in SyntaxListBuilder<RazorSyntaxNode> builder)
  3154. {
  3155. - // When transitioning to the HTML parser we no longer want to act as if we're in a nested C# state.
  3156. - // For instance, if <div>@hello.</div> is in a nested C# block we don't want the trailing '.' to be handled
  3157. - // as C#; it should be handled as a period because it's wrapped in markup.
  3158. - var wasNested = IsNested;
  3159. - IsNested = false;
  3160. + // First, verify the type of the block
  3161. + Assert(SyntaxKind.Transition);
  3162. + var transition = CurrentToken;
  3163. + NextToken();
  3164. - using (PushSpanConfig())
  3165. + if (At(SyntaxKind.Transition))
  3166. {
  3167. - parseAction(HtmlParser);
  3168. - }
  3169. + // Escaped "@"
  3170. + builder.Add(OutputTokensAsStatementLiteral());
  3171. - Span.Start = CurrentLocation;
  3172. - Initialize(Span);
  3173. + // Output "@" as hidden span
  3174. + Accept(transition);
  3175. + SpanContext.ChunkGenerator = SpanChunkGenerator.Null;
  3176. + builder.Add(OutputTokensAsEphemeralLiteral());
  3177. - IsNested = wasNested;
  3178. + Assert(SyntaxKind.Transition);
  3179. + AcceptAndMoveNext();
  3180. + ParseStandardStatement(builder);
  3181. + }
  3182. + else
  3183. + {
  3184. + // Throw errors as necessary, but continue parsing
  3185. + if (At(SyntaxKind.LeftBrace))
  3186. + {
  3187. + Context.ErrorSink.OnError(
  3188. + RazorDiagnosticFactory.CreateParsing_UnexpectedNestedCodeBlock(
  3189. + new SourceSpan(CurrentStart, contentLength: 1 /* { */)));
  3190. + }
  3191. - NextToken();
  3192. - }
  3193. + // @( or @foo - Nested expression, parse a child block
  3194. + PutCurrentBack();
  3195. + PutBack(transition);
  3196. - private void SetUpKeywords()
  3197. - {
  3198. - MapKeywords(
  3199. - ConditionalBlock,
  3200. - CSharpKeyword.For,
  3201. - CSharpKeyword.Foreach,
  3202. - CSharpKeyword.While,
  3203. - CSharpKeyword.Switch,
  3204. - CSharpKeyword.Lock);
  3205. - MapKeywords(CaseStatement, false, CSharpKeyword.Case, CSharpKeyword.Default);
  3206. - MapKeywords(IfStatement, CSharpKeyword.If);
  3207. - MapKeywords(TryStatement, CSharpKeyword.Try);
  3208. - MapKeywords(UsingKeyword, CSharpKeyword.Using);
  3209. - MapKeywords(DoStatement, CSharpKeyword.Do);
  3210. - MapKeywords(ReservedDirective, CSharpKeyword.Class, CSharpKeyword.Namespace);
  3211. - }
  3212. + // Before exiting, add a marker span if necessary
  3213. + AcceptMarkerTokenIfNecessary();
  3214. + builder.Add(OutputTokensAsStatementLiteral());
  3215. - protected virtual void ReservedDirective(bool topLevel)
  3216. - {
  3217. - Context.ErrorSink.OnError(
  3218. - RazorDiagnosticFactory.CreateParsing_ReservedWord(
  3219. - new SourceSpan(CurrentStart, CurrentToken.Content.Length), CurrentToken.Content));
  3220. -
  3221. - AcceptAndMoveNext();
  3222. - Span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  3223. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  3224. - Context.Builder.CurrentBlock.Type = BlockKindInternal.Directive;
  3225. - CompleteBlock();
  3226. - Output(SpanKindInternal.MetaCode);
  3227. + var nestedBlock = ParseNestedBlock();
  3228. + builder.Add(nestedBlock);
  3229. + }
  3230. }
  3231. - private void KeywordBlock(bool topLevel)
  3232. + private RazorSyntaxNode ParseNestedBlock()
  3233. {
  3234. - HandleKeyword(topLevel, () =>
  3235. + var wasNested = IsNested;
  3236. + IsNested = true;
  3237. +
  3238. + RazorSyntaxNode nestedBlock;
  3239. + using (PushSpanContextConfig())
  3240. {
  3241. - Context.Builder.CurrentBlock.Type = BlockKindInternal.Expression;
  3242. - Context.Builder.CurrentBlock.ChunkGenerator = new ExpressionChunkGenerator();
  3243. - ImplicitExpression();
  3244. - });
  3245. - }
  3246. + nestedBlock = ParseBlock();
  3247. + }
  3248. - private void CaseStatement(bool topLevel)
  3249. - {
  3250. - Assert(SyntaxKind.Keyword);
  3251. - var result = CSharpTokenizer.GetTokenKeyword(CurrentToken);
  3252. - Debug.Assert(result.HasValue &&
  3253. - (result.Value == CSharpKeyword.Case ||
  3254. - result.Value == CSharpKeyword.Default));
  3255. - AcceptUntil(SyntaxKind.Colon);
  3256. - Optional(SyntaxKind.Colon);
  3257. + InitializeContext(SpanContext);
  3258. + IsNested = wasNested;
  3259. + NextToken();
  3260. +
  3261. + return nestedBlock;
  3262. }
  3263. - private void DoStatement(bool topLevel)
  3264. + private void ParseStandardStatement(in SyntaxListBuilder<RazorSyntaxNode> builder)
  3265. {
  3266. - Assert(CSharpKeyword.Do);
  3267. - UnconditionalBlock();
  3268. - WhileClause();
  3269. - if (topLevel)
  3270. + while (!EndOfFile)
  3271. {
  3272. - CompleteBlock();
  3273. + var bookmark = CurrentStart.AbsoluteIndex;
  3274. + var read = ReadWhile(token =>
  3275. + token.Kind != SyntaxKind.Semicolon &&
  3276. + token.Kind != SyntaxKind.RazorCommentTransition &&
  3277. + token.Kind != SyntaxKind.Transition &&
  3278. + token.Kind != SyntaxKind.LeftBrace &&
  3279. + token.Kind != SyntaxKind.LeftParenthesis &&
  3280. + token.Kind != SyntaxKind.LeftBracket &&
  3281. + token.Kind != SyntaxKind.RightBrace);
  3282. +
  3283. + if (At(SyntaxKind.LeftBrace) ||
  3284. + At(SyntaxKind.LeftParenthesis) ||
  3285. + At(SyntaxKind.LeftBracket))
  3286. + {
  3287. + Accept(read);
  3288. + if (Balance(builder, BalancingModes.AllowCommentsAndTemplates | BalancingModes.BacktrackOnFailure))
  3289. + {
  3290. + TryAccept(SyntaxKind.RightBrace);
  3291. + }
  3292. + else
  3293. + {
  3294. + // Recovery
  3295. + AcceptUntil(SyntaxKind.LessThan, SyntaxKind.RightBrace);
  3296. + return;
  3297. + }
  3298. + }
  3299. + else if (At(SyntaxKind.Transition) && (NextIs(SyntaxKind.LessThan, SyntaxKind.Colon)))
  3300. + {
  3301. + Accept(read);
  3302. + builder.Add(OutputTokensAsStatementLiteral());
  3303. + ParseTemplate(builder);
  3304. + }
  3305. + else if (At(SyntaxKind.RazorCommentTransition))
  3306. + {
  3307. + Accept(read);
  3308. + AcceptMarkerTokenIfNecessary();
  3309. + builder.Add(OutputTokensAsStatementLiteral());
  3310. + builder.Add(ParseRazorComment());
  3311. + }
  3312. + else if (At(SyntaxKind.Semicolon))
  3313. + {
  3314. + Accept(read);
  3315. + AcceptAndMoveNext();
  3316. + return;
  3317. + }
  3318. + else if (At(SyntaxKind.RightBrace))
  3319. + {
  3320. + Accept(read);
  3321. + return;
  3322. + }
  3323. + else
  3324. + {
  3325. + Context.Source.Position = bookmark;
  3326. + NextToken();
  3327. + AcceptUntil(SyntaxKind.LessThan, SyntaxKind.LeftBrace, SyntaxKind.RightBrace);
  3328. + return;
  3329. + }
  3330. }
  3331. }
  3332. - private void WhileClause()
  3333. + private void ParseTemplate(in SyntaxListBuilder<RazorSyntaxNode> builder)
  3334. {
  3335. - Span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.Any;
  3336. - var whitespace = SkipToNextImportantToken();
  3337. -
  3338. - if (At(CSharpKeyword.While))
  3339. + if (Context.InTemplateContext)
  3340. {
  3341. - Accept(whitespace);
  3342. - Assert(CSharpKeyword.While);
  3343. - AcceptAndMoveNext();
  3344. - AcceptWhile(IsSpacingToken(includeNewLines: true, includeComments: true));
  3345. - if (AcceptCondition() && Optional(SyntaxKind.Semicolon))
  3346. - {
  3347. - Span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  3348. - }
  3349. + Context.ErrorSink.OnError(
  3350. + RazorDiagnosticFactory.CreateParsing_InlineMarkupBlocksCannotBeNested(
  3351. + new SourceSpan(CurrentStart, contentLength: 1 /* @ */)));
  3352. + }
  3353. + if (SpanContext.ChunkGenerator is ExpressionChunkGenerator)
  3354. + {
  3355. + builder.Add(OutputTokensAsExpressionLiteral());
  3356. }
  3357. else
  3358. {
  3359. + builder.Add(OutputTokensAsStatementLiteral());
  3360. + }
  3361. +
  3362. + using (var pooledResult = Pool.Allocate<RazorSyntaxNode>())
  3363. + {
  3364. + var templateBuilder = pooledResult.Builder;
  3365. + Context.InTemplateContext = true;
  3366. PutCurrentBack();
  3367. - PutBack(whitespace);
  3368. + OtherParserBlock(templateBuilder);
  3369. +
  3370. + var template = SyntaxFactory.CSharpTemplateBlock(templateBuilder.ToList());
  3371. + builder.Add(template);
  3372. +
  3373. + Context.InTemplateContext = false;
  3374. }
  3375. }
  3376. - private void UsingKeyword(bool topLevel)
  3377. + protected bool TryParseDirective(in SyntaxListBuilder<RazorSyntaxNode> builder, CSharpTransitionSyntax transition, string directive)
  3378. {
  3379. - Assert(CSharpKeyword.Using);
  3380. - var block = new Block(CurrentToken, CurrentStart);
  3381. - AcceptAndMoveNext();
  3382. - AcceptWhile(IsSpacingToken(includeNewLines: false, includeComments: true));
  3383. -
  3384. - if (At(SyntaxKind.LeftParenthesis))
  3385. + if (_directiveParserMap.TryGetValue(directive, out var handler))
  3386. {
  3387. - // using ( ==> Using Statement
  3388. - UsingStatement(block);
  3389. - }
  3390. - else if (At(SyntaxKind.Identifier) || At(CSharpKeyword.Static))
  3391. - {
  3392. - // using Identifier ==> Using Declaration
  3393. - if (!topLevel)
  3394. - {
  3395. - Context.ErrorSink.OnError(
  3396. - RazorDiagnosticFactory.CreateParsing_NamespaceImportAndTypeAliasCannotExistWithinCodeBlock(
  3397. - new SourceSpan(block.Start, block.Name.Length)));
  3398. - StandardStatement();
  3399. - }
  3400. - else
  3401. - {
  3402. - UsingDeclaration();
  3403. - }
  3404. + SpanContext.ChunkGenerator = SpanChunkGenerator.Null;
  3405. + handler(builder, transition);
  3406. + return true;
  3407. }
  3408. - if (topLevel)
  3409. - {
  3410. - CompleteBlock();
  3411. - }
  3412. + return false;
  3413. }
  3414. - private void UsingDeclaration()
  3415. + private void SetupDirectiveParsers(IEnumerable<DirectiveDescriptor> directiveDescriptors)
  3416. {
  3417. - // Set block type to directive
  3418. - Context.Builder.CurrentBlock.Type = BlockKindInternal.Directive;
  3419. + var allDirectives = directiveDescriptors.Concat(DefaultDirectiveDescriptors).ToList();
  3420. - var start = CurrentStart;
  3421. - if (At(SyntaxKind.Identifier))
  3422. + for (var i = 0; i < allDirectives.Count; i++)
  3423. {
  3424. - // non-static using
  3425. - NamespaceOrTypeName();
  3426. - var whitespace = ReadWhile(IsSpacingToken(includeNewLines: true, includeComments: true));
  3427. - if (At(SyntaxKind.Assign))
  3428. - {
  3429. - // Alias
  3430. - Accept(whitespace);
  3431. - Assert(SyntaxKind.Assign);
  3432. - AcceptAndMoveNext();
  3433. + var directiveDescriptor = allDirectives[i];
  3434. + CurrentKeywords.Add(directiveDescriptor.Directive);
  3435. + MapDirectives((builder, transition) => ParseExtensibleDirective(builder, transition, directiveDescriptor), directiveDescriptor.Directive);
  3436. + }
  3437. - AcceptWhile(IsSpacingToken(includeNewLines: true, includeComments: true));
  3438. + MapDirectives(ParseTagHelperPrefixDirective, SyntaxConstants.CSharp.TagHelperPrefixKeyword);
  3439. + MapDirectives(ParseAddTagHelperDirective, SyntaxConstants.CSharp.AddTagHelperKeyword);
  3440. + MapDirectives(ParseRemoveTagHelperDirective, SyntaxConstants.CSharp.RemoveTagHelperKeyword);
  3441. + }
  3442. - // One more namespace or type name
  3443. - NamespaceOrTypeName();
  3444. - }
  3445. - else
  3446. + private void EnsureDirectiveIsAtStartOfLine()
  3447. + {
  3448. + // 1 is the offset of the @ transition for the directive.
  3449. + if (CurrentStart.CharacterIndex > 1)
  3450. + {
  3451. + var index = CurrentStart.AbsoluteIndex - 1;
  3452. + var lineStart = CurrentStart.AbsoluteIndex - CurrentStart.CharacterIndex;
  3453. + while (--index >= lineStart)
  3454. {
  3455. - PutCurrentBack();
  3456. - PutBack(whitespace);
  3457. + var @char = Context.SourceDocument[index];
  3458. +
  3459. + if (!char.IsWhiteSpace(@char))
  3460. + {
  3461. + var currentDirective = CurrentToken.Content;
  3462. + Context.ErrorSink.OnError(
  3463. + RazorDiagnosticFactory.CreateParsing_DirectiveMustAppearAtStartOfLine(
  3464. + new SourceSpan(CurrentStart, currentDirective.Length), currentDirective));
  3465. + break;
  3466. + }
  3467. }
  3468. }
  3469. - else if (At(CSharpKeyword.Static))
  3470. + }
  3471. +
  3472. + protected void MapDirectives(Action<SyntaxListBuilder<RazorSyntaxNode>, CSharpTransitionSyntax> handler, params string[] directives)
  3473. + {
  3474. + foreach (var directive in directives)
  3475. {
  3476. - // static using
  3477. - AcceptAndMoveNext();
  3478. - AcceptWhile(IsSpacingToken(includeNewLines: false, includeComments: true));
  3479. - NamespaceOrTypeName();
  3480. + _directiveParserMap.Add(directive, (builder, transition) =>
  3481. + {
  3482. + handler(builder, transition);
  3483. + Context.SeenDirectives.Add(directive);
  3484. + });
  3485. +
  3486. + Keywords.Add(directive);
  3487. +
  3488. + // These C# keywords are reserved for use in directives. It's an error to use them outside of
  3489. + // a directive. This code removes the error generation if the directive *is* registered.
  3490. + if (string.Equals(directive, "class", StringComparison.OrdinalIgnoreCase))
  3491. + {
  3492. + _keywordParserMap.Remove(CSharpKeyword.Class);
  3493. + }
  3494. + else if (string.Equals(directive, "namespace", StringComparison.OrdinalIgnoreCase))
  3495. + {
  3496. + _keywordParserMap.Remove(CSharpKeyword.Namespace);
  3497. + }
  3498. + }
  3499. + }
  3500. +
  3501. + private void ParseTagHelperPrefixDirective(SyntaxListBuilder<RazorSyntaxNode> builder, CSharpTransitionSyntax transition)
  3502. + {
  3503. + RazorDiagnostic duplicateDiagnostic = null;
  3504. + if (Context.SeenDirectives.Contains(SyntaxConstants.CSharp.TagHelperPrefixKeyword))
  3505. + {
  3506. + var directiveStart = CurrentStart;
  3507. + if (transition != null)
  3508. + {
  3509. + // Start the error from the Transition '@'.
  3510. + directiveStart = new SourceLocation(
  3511. + directiveStart.FilePath,
  3512. + directiveStart.AbsoluteIndex - 1,
  3513. + directiveStart.LineIndex,
  3514. + directiveStart.CharacterIndex - 1);
  3515. + }
  3516. + var errorLength = /* @ */ 1 + SyntaxConstants.CSharp.TagHelperPrefixKeyword.Length;
  3517. + duplicateDiagnostic = RazorDiagnosticFactory.CreateParsing_DuplicateDirective(
  3518. + new SourceSpan(directiveStart, errorLength),
  3519. + SyntaxConstants.CSharp.TagHelperPrefixKeyword);
  3520. }
  3521. - Span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.AnyExceptNewline;
  3522. - Span.ChunkGenerator = new AddImportChunkGenerator(new LocationTagged<string>(
  3523. - string.Concat(Span.Tokens.Skip(1).Select(s => s.Content)),
  3524. - start));
  3525. + var directiveBody = ParseTagHelperDirective(
  3526. + SyntaxConstants.CSharp.TagHelperPrefixKeyword,
  3527. + (prefix, errors, startLocation) =>
  3528. + {
  3529. + if (duplicateDiagnostic != null)
  3530. + {
  3531. + errors.Add(duplicateDiagnostic);
  3532. + }
  3533. +
  3534. + var parsedDirective = ParseDirective(prefix, startLocation, TagHelperDirectiveType.TagHelperPrefix, errors);
  3535. +
  3536. + return new TagHelperPrefixDirectiveChunkGenerator(
  3537. + prefix,
  3538. + parsedDirective.DirectiveText,
  3539. + errors);
  3540. + });
  3541. +
  3542. + var directive = SyntaxFactory.RazorDirective(transition, directiveBody);
  3543. + builder.Add(directive);
  3544. + }
  3545. - // Optional ";"
  3546. - if (EnsureCurrent())
  3547. + private void ParseAddTagHelperDirective(SyntaxListBuilder<RazorSyntaxNode> builder, CSharpTransitionSyntax transition)
  3548. + {
  3549. + var directiveBody = ParseTagHelperDirective(
  3550. + SyntaxConstants.CSharp.AddTagHelperKeyword,
  3551. + (lookupText, errors, startLocation) =>
  3552. + {
  3553. + var parsedDirective = ParseDirective(lookupText, startLocation, TagHelperDirectiveType.AddTagHelper, errors);
  3554. +
  3555. + return new AddTagHelperChunkGenerator(
  3556. + lookupText,
  3557. + parsedDirective.DirectiveText,
  3558. + parsedDirective.TypePattern,
  3559. + parsedDirective.AssemblyName,
  3560. + errors);
  3561. + });
  3562. +
  3563. + var directive = SyntaxFactory.RazorDirective(transition, directiveBody);
  3564. + builder.Add(directive);
  3565. + }
  3566. +
  3567. + private void ParseRemoveTagHelperDirective(SyntaxListBuilder<RazorSyntaxNode> builder, CSharpTransitionSyntax transition)
  3568. + {
  3569. + var directiveBody = ParseTagHelperDirective(
  3570. + SyntaxConstants.CSharp.RemoveTagHelperKeyword,
  3571. + (lookupText, errors, startLocation) =>
  3572. + {
  3573. + var parsedDirective = ParseDirective(lookupText, startLocation, TagHelperDirectiveType.RemoveTagHelper, errors);
  3574. +
  3575. + return new RemoveTagHelperChunkGenerator(
  3576. + lookupText,
  3577. + parsedDirective.DirectiveText,
  3578. + parsedDirective.TypePattern,
  3579. + parsedDirective.AssemblyName,
  3580. + errors);
  3581. + });
  3582. +
  3583. + var directive = SyntaxFactory.RazorDirective(transition, directiveBody);
  3584. + builder.Add(directive);
  3585. + }
  3586. +
  3587. + [Conditional("DEBUG")]
  3588. + protected void AssertDirective(string directive)
  3589. + {
  3590. + Debug.Assert(CurrentToken.Kind == SyntaxKind.Identifier || CurrentToken.Kind == SyntaxKind.Keyword);
  3591. + Debug.Assert(string.Equals(CurrentToken.Content, directive, StringComparison.Ordinal));
  3592. + }
  3593. +
  3594. + private RazorDirectiveBodySyntax ParseTagHelperDirective(
  3595. + string keyword,
  3596. + Func<string, List<RazorDiagnostic>, SourceLocation, ISpanChunkGenerator> chunkGeneratorFactory)
  3597. + {
  3598. + AssertDirective(keyword);
  3599. +
  3600. + var savedErrorSink = Context.ErrorSink;
  3601. + var directiveErrorSink = new ErrorSink();
  3602. + RazorMetaCodeSyntax keywordBlock = null;
  3603. + using (var pooledResult = Pool.Allocate<RazorSyntaxNode>())
  3604. + {
  3605. + var directiveBuilder = pooledResult.Builder;
  3606. + Context.ErrorSink = directiveErrorSink;
  3607. +
  3608. + string directiveValue = null;
  3609. + SourceLocation? valueStartLocation = null;
  3610. + try
  3611. + {
  3612. + EnsureDirectiveIsAtStartOfLine();
  3613. +
  3614. + var keywordStartLocation = CurrentStart;
  3615. +
  3616. + // Accept the directive name
  3617. + var keywordToken = EatCurrentToken();
  3618. + var keywordLength = keywordToken.FullWidth + 1 /* @ */;
  3619. +
  3620. + var foundWhitespace = At(SyntaxKind.Whitespace);
  3621. +
  3622. + // If we found whitespace then any content placed within the whitespace MAY cause a destructive change
  3623. + // to the document. We can't accept it.
  3624. + var acceptedCharacters = foundWhitespace ? AcceptedCharactersInternal.None : AcceptedCharactersInternal.AnyExceptNewline;
  3625. + Accept(keywordToken);
  3626. + keywordBlock = OutputAsMetaCode(Output(), acceptedCharacters);
  3627. +
  3628. + AcceptWhile(SyntaxKind.Whitespace);
  3629. + SpanContext.ChunkGenerator = SpanChunkGenerator.Null;
  3630. + SpanContext.EditHandler.AcceptedCharacters = acceptedCharacters;
  3631. + directiveBuilder.Add(OutputAsMarkupLiteral());
  3632. +
  3633. + if (EndOfFile || At(SyntaxKind.NewLine))
  3634. + {
  3635. + Context.ErrorSink.OnError(
  3636. + RazorDiagnosticFactory.CreateParsing_DirectiveMustHaveValue(
  3637. + new SourceSpan(keywordStartLocation, keywordLength), keyword));
  3638. +
  3639. + directiveValue = string.Empty;
  3640. + }
  3641. + else
  3642. + {
  3643. + // Need to grab the current location before we accept until the end of the line.
  3644. + valueStartLocation = CurrentStart;
  3645. +
  3646. + // Parse to the end of the line. Essentially accepts anything until end of line, comments, invalid code
  3647. + // etc.
  3648. + AcceptUntil(SyntaxKind.NewLine);
  3649. +
  3650. + // Pull out the value and remove whitespaces and optional quotes
  3651. + var rawValue = string.Concat(TokenBuilder.ToList().Nodes.Select(s => s.Content)).Trim();
  3652. +
  3653. + var startsWithQuote = rawValue.StartsWith("\"", StringComparison.Ordinal);
  3654. + var endsWithQuote = rawValue.EndsWith("\"", StringComparison.Ordinal);
  3655. + if (startsWithQuote != endsWithQuote)
  3656. + {
  3657. + Context.ErrorSink.OnError(
  3658. + RazorDiagnosticFactory.CreateParsing_IncompleteQuotesAroundDirective(
  3659. + new SourceSpan(valueStartLocation.Value, rawValue.Length), keyword));
  3660. + }
  3661. +
  3662. + directiveValue = rawValue;
  3663. + }
  3664. + }
  3665. + finally
  3666. + {
  3667. + SpanContext.ChunkGenerator = chunkGeneratorFactory(
  3668. + directiveValue,
  3669. + directiveErrorSink.Errors.ToList(),
  3670. + valueStartLocation ?? CurrentStart);
  3671. + Context.ErrorSink = savedErrorSink;
  3672. + }
  3673. +
  3674. + // Finish the block and output the tokens
  3675. + CompleteBlock();
  3676. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.AnyExceptNewline;
  3677. +
  3678. + directiveBuilder.Add(OutputTokensAsStatementLiteral());
  3679. + var directiveCodeBlock = SyntaxFactory.CSharpCodeBlock(directiveBuilder.ToList());
  3680. +
  3681. + return SyntaxFactory.RazorDirectiveBody(keywordBlock, directiveCodeBlock);
  3682. + }
  3683. + }
  3684. +
  3685. + private ParsedDirective ParseDirective(
  3686. + string directiveText,
  3687. + SourceLocation directiveLocation,
  3688. + TagHelperDirectiveType directiveType,
  3689. + List<RazorDiagnostic> errors)
  3690. + {
  3691. + var offset = 0;
  3692. + directiveText = directiveText.Trim();
  3693. + if (directiveText.Length >= 2 &&
  3694. + directiveText.StartsWith("\"", StringComparison.Ordinal) &&
  3695. + directiveText.EndsWith("\"", StringComparison.Ordinal))
  3696. + {
  3697. + directiveText = directiveText.Substring(1, directiveText.Length - 2);
  3698. + if (string.IsNullOrEmpty(directiveText))
  3699. + {
  3700. + offset = 1;
  3701. + }
  3702. + }
  3703. +
  3704. + // If this is the "string literal" form of a directive, we'll need to postprocess the location
  3705. + // and content.
  3706. + //
  3707. + // Ex: @addTagHelper "*, Microsoft.AspNetCore.CoolLibrary"
  3708. + // ^ ^
  3709. + // Start End
  3710. + if (TokenBuilder.Count == 1 &&
  3711. + TokenBuilder[0] is SyntaxToken token &&
  3712. + token.Kind == SyntaxKind.StringLiteral)
  3713. + {
  3714. + offset += token.Content.IndexOf(directiveText, StringComparison.Ordinal);
  3715. +
  3716. + // This is safe because inside one of these directives all of the text needs to be on the
  3717. + // same line.
  3718. + var original = directiveLocation;
  3719. + directiveLocation = new SourceLocation(
  3720. + original.FilePath,
  3721. + original.AbsoluteIndex + offset,
  3722. + original.LineIndex,
  3723. + original.CharacterIndex + offset);
  3724. + }
  3725. +
  3726. + var parsedDirective = new ParsedDirective()
  3727. + {
  3728. + DirectiveText = directiveText
  3729. + };
  3730. +
  3731. + if (directiveType == TagHelperDirectiveType.TagHelperPrefix)
  3732. {
  3733. - Optional(SyntaxKind.Semicolon);
  3734. + ValidateTagHelperPrefix(parsedDirective.DirectiveText, directiveLocation, errors);
  3735. +
  3736. + return parsedDirective;
  3737. + }
  3738. +
  3739. + return ParseAddOrRemoveDirective(parsedDirective, directiveLocation, errors);
  3740. + }
  3741. +
  3742. + // Internal for testing.
  3743. + internal ParsedDirective ParseAddOrRemoveDirective(ParsedDirective directive, SourceLocation directiveLocation, List<RazorDiagnostic> errors)
  3744. + {
  3745. + var text = directive.DirectiveText;
  3746. + var lookupStrings = text?.Split(new[] { ',' });
  3747. +
  3748. + // Ensure that we have valid lookupStrings to work with. The valid format is "typeName, assemblyName"
  3749. + if (lookupStrings == null ||
  3750. + lookupStrings.Any(string.IsNullOrWhiteSpace) ||
  3751. + lookupStrings.Length != 2 ||
  3752. + text.StartsWith("'") ||
  3753. + text.EndsWith("'"))
  3754. + {
  3755. + errors.Add(
  3756. + RazorDiagnosticFactory.CreateParsing_InvalidTagHelperLookupText(
  3757. + new SourceSpan(directiveLocation, Math.Max(text.Length, 1)), text));
  3758. +
  3759. + return directive;
  3760. + }
  3761. +
  3762. + var trimmedAssemblyName = lookupStrings[1].Trim();
  3763. +
  3764. + // + 1 is for the comma separator in the lookup text.
  3765. + var assemblyNameIndex =
  3766. + lookupStrings[0].Length + 1 + lookupStrings[1].IndexOf(trimmedAssemblyName, StringComparison.Ordinal);
  3767. + var assemblyNamePrefix = directive.DirectiveText.Substring(0, assemblyNameIndex);
  3768. +
  3769. + directive.TypePattern = lookupStrings[0].Trim();
  3770. + directive.AssemblyName = trimmedAssemblyName;
  3771. +
  3772. + return directive;
  3773. + }
  3774. +
  3775. + // Internal for testing.
  3776. + internal void ValidateTagHelperPrefix(
  3777. + string prefix,
  3778. + SourceLocation directiveLocation,
  3779. + List<RazorDiagnostic> diagnostics)
  3780. + {
  3781. + foreach (var character in prefix)
  3782. + {
  3783. + // Prefixes are correlated with tag names, tag names cannot have whitespace.
  3784. + if (char.IsWhiteSpace(character) || InvalidNonWhitespaceNameCharacters.Contains(character))
  3785. + {
  3786. + diagnostics.Add(
  3787. + RazorDiagnosticFactory.CreateParsing_InvalidTagHelperPrefixValue(
  3788. + new SourceSpan(directiveLocation, prefix.Length),
  3789. + SyntaxConstants.CSharp.TagHelperPrefixKeyword,
  3790. + character,
  3791. + prefix));
  3792. +
  3793. + return;
  3794. + }
  3795. + }
  3796. + }
  3797. +
  3798. + private void ParseExtensibleDirective(in SyntaxListBuilder<RazorSyntaxNode> builder, CSharpTransitionSyntax transition, DirectiveDescriptor descriptor)
  3799. + {
  3800. + AssertDirective(descriptor.Directive);
  3801. +
  3802. + var directiveErrorSink = new ErrorSink();
  3803. + var savedErrorSink = Context.ErrorSink;
  3804. + Context.ErrorSink = directiveErrorSink;
  3805. +
  3806. + using (var pooledResult = Pool.Allocate<RazorSyntaxNode>())
  3807. + {
  3808. + var directiveBuilder = pooledResult.Builder;
  3809. + RazorMetaCodeSyntax keywordBlock = null;
  3810. +
  3811. + try
  3812. + {
  3813. + EnsureDirectiveIsAtStartOfLine();
  3814. + var directiveStart = CurrentStart;
  3815. + if (transition != null)
  3816. + {
  3817. + // Start the error from the Transition '@'.
  3818. + directiveStart = new SourceLocation(
  3819. + directiveStart.FilePath,
  3820. + directiveStart.AbsoluteIndex - 1,
  3821. + directiveStart.LineIndex,
  3822. + directiveStart.CharacterIndex - 1);
  3823. + }
  3824. +
  3825. + AcceptAndMoveNext();
  3826. + keywordBlock = OutputAsMetaCode(Output());
  3827. +
  3828. + // Even if an error was logged do not bail out early. If a directive was used incorrectly it doesn't mean it can't be parsed.
  3829. + ValidateDirectiveUsage(descriptor, directiveStart);
  3830. +
  3831. + for (var i = 0; i < descriptor.Tokens.Count; i++)
  3832. + {
  3833. + if (!At(SyntaxKind.Whitespace) &&
  3834. + !At(SyntaxKind.NewLine) &&
  3835. + !EndOfFile)
  3836. + {
  3837. + // This case should never happen in a real scenario. We're just being defensive.
  3838. + Context.ErrorSink.OnError(
  3839. + RazorDiagnosticFactory.CreateParsing_DirectiveTokensMustBeSeparatedByWhitespace(
  3840. + new SourceSpan(CurrentStart, CurrentToken.Content.Length), descriptor.Directive));
  3841. +
  3842. + builder.Add(BuildDirective());
  3843. + return;
  3844. + }
  3845. +
  3846. + var tokenDescriptor = descriptor.Tokens[i];
  3847. + AcceptWhile(IsSpacingToken(includeNewLines: false, includeComments: true));
  3848. +
  3849. + if (tokenDescriptor.Kind == DirectiveTokenKind.Member ||
  3850. + tokenDescriptor.Kind == DirectiveTokenKind.Namespace ||
  3851. + tokenDescriptor.Kind == DirectiveTokenKind.Type)
  3852. + {
  3853. + SpanContext.ChunkGenerator = SpanChunkGenerator.Null;
  3854. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.Whitespace;
  3855. + directiveBuilder.Add(OutputTokensAsStatementLiteral());
  3856. +
  3857. + if (EndOfFile || At(SyntaxKind.NewLine))
  3858. + {
  3859. + // Add a marker token to provide CSharp intellisense when we start typing the directive token.
  3860. + AcceptMarkerTokenIfNecessary();
  3861. + SpanContext.ChunkGenerator = new DirectiveTokenChunkGenerator(tokenDescriptor);
  3862. + SpanContext.EditHandler = new DirectiveTokenEditHandler(Language.TokenizeString);
  3863. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.NonWhitespace;
  3864. + directiveBuilder.Add(OutputTokensAsStatementLiteral());
  3865. + }
  3866. + }
  3867. + else
  3868. + {
  3869. + SpanContext.ChunkGenerator = SpanChunkGenerator.Null;
  3870. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.Whitespace;
  3871. + directiveBuilder.Add(OutputAsMarkupEphemeralLiteral());
  3872. + }
  3873. +
  3874. + if (tokenDescriptor.Optional && (EndOfFile || At(SyntaxKind.NewLine)))
  3875. + {
  3876. + break;
  3877. + }
  3878. + else if (EndOfFile)
  3879. + {
  3880. + Context.ErrorSink.OnError(
  3881. + RazorDiagnosticFactory.CreateParsing_UnexpectedEOFAfterDirective(
  3882. + new SourceSpan(CurrentStart, contentLength: 1),
  3883. + descriptor.Directive,
  3884. + tokenDescriptor.Kind.ToString().ToLowerInvariant()));
  3885. + builder.Add(BuildDirective());
  3886. + return;
  3887. + }
  3888. +
  3889. + switch (tokenDescriptor.Kind)
  3890. + {
  3891. + case DirectiveTokenKind.Type:
  3892. + if (!TryParseNamespaceOrTypeName(directiveBuilder))
  3893. + {
  3894. + Context.ErrorSink.OnError(
  3895. + RazorDiagnosticFactory.CreateParsing_DirectiveExpectsTypeName(
  3896. + new SourceSpan(CurrentStart, CurrentToken.Content.Length), descriptor.Directive));
  3897. +
  3898. + builder.Add(BuildDirective());
  3899. + return;
  3900. + }
  3901. + break;
  3902. +
  3903. + case DirectiveTokenKind.Namespace:
  3904. + if (!TryParseQualifiedIdentifier(out var identifierLength))
  3905. + {
  3906. + Context.ErrorSink.OnError(
  3907. + RazorDiagnosticFactory.CreateParsing_DirectiveExpectsNamespace(
  3908. + new SourceSpan(CurrentStart, identifierLength), descriptor.Directive));
  3909. +
  3910. + builder.Add(BuildDirective());
  3911. + return;
  3912. + }
  3913. + break;
  3914. +
  3915. + case DirectiveTokenKind.Member:
  3916. + if (At(SyntaxKind.Identifier))
  3917. + {
  3918. + AcceptAndMoveNext();
  3919. + }
  3920. + else
  3921. + {
  3922. + Context.ErrorSink.OnError(
  3923. + RazorDiagnosticFactory.CreateParsing_DirectiveExpectsIdentifier(
  3924. + new SourceSpan(CurrentStart, CurrentToken.Content.Length), descriptor.Directive));
  3925. + builder.Add(BuildDirective());
  3926. + return;
  3927. + }
  3928. + break;
  3929. +
  3930. + case DirectiveTokenKind.String:
  3931. + if (At(SyntaxKind.StringLiteral) && !CurrentToken.ContainsDiagnostics)
  3932. + {
  3933. + AcceptAndMoveNext();
  3934. + }
  3935. + else
  3936. + {
  3937. + Context.ErrorSink.OnError(
  3938. + RazorDiagnosticFactory.CreateParsing_DirectiveExpectsQuotedStringLiteral(
  3939. + new SourceSpan(CurrentStart, CurrentToken.Content.Length), descriptor.Directive));
  3940. + builder.Add(BuildDirective());
  3941. + return;
  3942. + }
  3943. + break;
  3944. + }
  3945. +
  3946. + SpanContext.ChunkGenerator = new DirectiveTokenChunkGenerator(tokenDescriptor);
  3947. + SpanContext.EditHandler = new DirectiveTokenEditHandler(Language.TokenizeString);
  3948. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.NonWhitespace;
  3949. + directiveBuilder.Add(OutputTokensAsStatementLiteral());
  3950. + }
  3951. +
  3952. + AcceptWhile(IsSpacingToken(includeNewLines: false, includeComments: true));
  3953. + SpanContext.ChunkGenerator = SpanChunkGenerator.Null;
  3954. +
  3955. + switch (descriptor.Kind)
  3956. + {
  3957. + case DirectiveKind.SingleLine:
  3958. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.Whitespace;
  3959. + directiveBuilder.Add(OutputTokensAsUnclassifiedLiteral());
  3960. +
  3961. + TryAccept(SyntaxKind.Semicolon);
  3962. + directiveBuilder.Add(OutputAsMetaCode(Output(), AcceptedCharactersInternal.Whitespace));
  3963. +
  3964. + AcceptWhile(IsSpacingToken(includeNewLines: false, includeComments: true));
  3965. +
  3966. + if (At(SyntaxKind.NewLine))
  3967. + {
  3968. + AcceptAndMoveNext();
  3969. + }
  3970. + else if (!EndOfFile)
  3971. + {
  3972. + Context.ErrorSink.OnError(
  3973. + RazorDiagnosticFactory.CreateParsing_UnexpectedDirectiveLiteral(
  3974. + new SourceSpan(CurrentStart, CurrentToken.Content.Length),
  3975. + descriptor.Directive,
  3976. + Resources.ErrorComponent_Newline));
  3977. + }
  3978. +
  3979. +
  3980. + // This should contain the optional whitespace after the optional semicolon and the new line.
  3981. + // Output as Markup as we want intellisense here.
  3982. + SpanContext.ChunkGenerator = SpanChunkGenerator.Null;
  3983. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.Whitespace;
  3984. + directiveBuilder.Add(OutputAsMarkupEphemeralLiteral());
  3985. + break;
  3986. + case DirectiveKind.RazorBlock:
  3987. + AcceptWhile(IsSpacingToken(includeNewLines: true, includeComments: true));
  3988. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.AllWhitespace;
  3989. + directiveBuilder.Add(OutputAsMarkupLiteral());
  3990. +
  3991. + ParseDirectiveBlock(directiveBuilder, descriptor, parseChildren: (childBuilder, startingBraceLocation) =>
  3992. + {
  3993. + // When transitioning to the HTML parser we no longer want to act as if we're in a nested C# state.
  3994. + // For instance, if <div>@hello.</div> is in a nested C# block we don't want the trailing '.' to be handled
  3995. + // as C#; it should be handled as a period because it's wrapped in markup.
  3996. + var wasNested = IsNested;
  3997. + IsNested = false;
  3998. +
  3999. + using (PushSpanContextConfig())
  4000. + {
  4001. + var razorBlock = HtmlParser.ParseRazorBlock(Tuple.Create("{", "}"), caseSensitive: true);
  4002. + directiveBuilder.Add(razorBlock);
  4003. + }
  4004. +
  4005. + InitializeContext(SpanContext);
  4006. + IsNested = wasNested;
  4007. + NextToken();
  4008. + });
  4009. + break;
  4010. + case DirectiveKind.CodeBlock:
  4011. + AcceptWhile(IsSpacingToken(includeNewLines: true, includeComments: true));
  4012. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.AllWhitespace;
  4013. + directiveBuilder.Add(OutputAsMarkupLiteral());
  4014. +
  4015. + ParseDirectiveBlock(directiveBuilder, descriptor, parseChildren: (childBuilder, startingBraceLocation) =>
  4016. + {
  4017. + NextToken();
  4018. + Balance(childBuilder, BalancingModes.NoErrorOnFailure, SyntaxKind.LeftBrace, SyntaxKind.RightBrace, startingBraceLocation);
  4019. + SpanContext.ChunkGenerator = new StatementChunkGenerator();
  4020. + var existingEditHandler = SpanContext.EditHandler;
  4021. + SpanContext.EditHandler = new CodeBlockEditHandler(Language.TokenizeString);
  4022. +
  4023. + AcceptMarkerTokenIfNecessary();
  4024. +
  4025. + childBuilder.Add(OutputTokensAsStatementLiteral());
  4026. +
  4027. + SpanContext.EditHandler = existingEditHandler;
  4028. + });
  4029. + break;
  4030. + }
  4031. + }
  4032. + finally
  4033. + {
  4034. + Context.ErrorSink = savedErrorSink;
  4035. + }
  4036. +
  4037. + builder.Add(BuildDirective());
  4038. +
  4039. + RazorDirectiveSyntax BuildDirective()
  4040. + {
  4041. + directiveBuilder.Add(OutputTokensAsStatementLiteral());
  4042. + var directiveCodeBlock = SyntaxFactory.CSharpCodeBlock(directiveBuilder.ToList());
  4043. +
  4044. + var directiveBody = SyntaxFactory.RazorDirectiveBody(keywordBlock, directiveCodeBlock);
  4045. + var directive = SyntaxFactory.RazorDirective(transition, directiveBody);
  4046. + directive = (RazorDirectiveSyntax)directive.SetDiagnostics(directiveErrorSink.Errors.ToArray());
  4047. + directive = directive.WithDirectiveDescriptor(descriptor);
  4048. + return directive;
  4049. + }
  4050. + }
  4051. + }
  4052. +
  4053. + private void ValidateDirectiveUsage(DirectiveDescriptor descriptor, SourceLocation directiveStart)
  4054. + {
  4055. + if (descriptor.Usage == DirectiveUsage.FileScopedSinglyOccurring)
  4056. + {
  4057. + if (Context.SeenDirectives.Contains(descriptor.Directive))
  4058. + {
  4059. + // There will always be at least 1 child because of the `@` transition.
  4060. + var errorLength = /* @ */ 1 + descriptor.Directive.Length;
  4061. + Context.ErrorSink.OnError(
  4062. + RazorDiagnosticFactory.CreateParsing_DuplicateDirective(
  4063. + new SourceSpan(directiveStart, errorLength), descriptor.Directive));
  4064. +
  4065. + return;
  4066. + }
  4067. }
  4068. }
  4069. @@ -917,7 +1442,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  4070. // qualified-identifier:
  4071. // identifier
  4072. // qualified-identifier . identifier
  4073. - protected bool QualifiedIdentifier(out int identifierLength)
  4074. + protected bool TryParseQualifiedIdentifier(out int identifierLength)
  4075. {
  4076. var currentIdentifierLength = 0;
  4077. var expectingDot = false;
  4078. @@ -968,1203 +1493,943 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  4079. }
  4080. }
  4081. - protected bool NamespaceOrTypeName()
  4082. + private void ParseDirectiveBlock(in SyntaxListBuilder<RazorSyntaxNode> builder, DirectiveDescriptor descriptor, Action<SyntaxListBuilder<RazorSyntaxNode>, SourceLocation> parseChildren)
  4083. {
  4084. - if (Optional(SyntaxKind.LeftParenthesis))
  4085. + if (EndOfFile)
  4086. {
  4087. - while (!Optional(SyntaxKind.RightParenthesis) && !EndOfFile)
  4088. - {
  4089. - Optional(SyntaxKind.Whitespace);
  4090. -
  4091. - if (!NamespaceOrTypeName())
  4092. - {
  4093. - return false;
  4094. - }
  4095. -
  4096. - Optional(SyntaxKind.Whitespace);
  4097. - Optional(SyntaxKind.Identifier);
  4098. - Optional(SyntaxKind.Whitespace);
  4099. - Optional(SyntaxKind.Comma);
  4100. - }
  4101. -
  4102. - if (At(SyntaxKind.Whitespace) && NextIs(SyntaxKind.QuestionMark))
  4103. - {
  4104. - // Only accept the whitespace if we are going to consume the next token.
  4105. - AcceptAndMoveNext();
  4106. - }
  4107. -
  4108. - Optional(SyntaxKind.QuestionMark); // Nullable
  4109. -
  4110. - return true;
  4111. + Context.ErrorSink.OnError(
  4112. + RazorDiagnosticFactory.CreateParsing_UnexpectedEOFAfterDirective(
  4113. + new SourceSpan(CurrentStart, contentLength: 1 /* { */), descriptor.Directive, "{"));
  4114. + }
  4115. + else if (!At(SyntaxKind.LeftBrace))
  4116. + {
  4117. + Context.ErrorSink.OnError(
  4118. + RazorDiagnosticFactory.CreateParsing_UnexpectedDirectiveLiteral(
  4119. + new SourceSpan(CurrentStart, CurrentToken.Content.Length), descriptor.Directive, "{"));
  4120. }
  4121. - else if (Optional(SyntaxKind.Identifier) || Optional(SyntaxKind.Keyword))
  4122. + else
  4123. {
  4124. - if (Optional(SyntaxKind.DoubleColon))
  4125. + var editHandler = new AutoCompleteEditHandler(Language.TokenizeString, autoCompleteAtEndOfSpan: true);
  4126. + SpanContext.EditHandler = editHandler;
  4127. + var startingBraceLocation = CurrentStart;
  4128. + Accept(CurrentToken);
  4129. + builder.Add(OutputAsMetaCode(Output()));
  4130. +
  4131. + using (var pooledResult = Pool.Allocate<RazorSyntaxNode>())
  4132. {
  4133. - if (!Optional(SyntaxKind.Identifier))
  4134. + var childBuilder = pooledResult.Builder;
  4135. + parseChildren(childBuilder, startingBraceLocation);
  4136. + if (childBuilder.Count > 0)
  4137. {
  4138. - Optional(SyntaxKind.Keyword);
  4139. + builder.Add(SyntaxFactory.CSharpCodeBlock(childBuilder.ToList()));
  4140. }
  4141. }
  4142. - if (At(SyntaxKind.LessThan))
  4143. - {
  4144. - TypeArgumentList();
  4145. - }
  4146. - if (Optional(SyntaxKind.Dot))
  4147. - {
  4148. - NamespaceOrTypeName();
  4149. - }
  4150. - if (At(SyntaxKind.Whitespace) && NextIs(SyntaxKind.QuestionMark))
  4151. + SpanContext.ChunkGenerator = SpanChunkGenerator.Null;
  4152. + if (!TryAccept(SyntaxKind.RightBrace))
  4153. {
  4154. - // Only accept the whitespace if we are going to consume the next token.
  4155. - AcceptAndMoveNext();
  4156. - }
  4157. -
  4158. - Optional(SyntaxKind.QuestionMark); // Nullable
  4159. + editHandler.AutoCompleteString = "}";
  4160. + Context.ErrorSink.OnError(
  4161. + RazorDiagnosticFactory.CreateParsing_ExpectedEndOfBlockBeforeEOF(
  4162. + new SourceSpan(startingBraceLocation, contentLength: 1 /* } */), descriptor.Directive, "}", "{"));
  4163. - if (At(SyntaxKind.Whitespace) && NextIs(SyntaxKind.LeftBracket))
  4164. - {
  4165. - // Only accept the whitespace if we are going to consume the next token.
  4166. - AcceptAndMoveNext();
  4167. + Accept(SyntaxFactory.MissingToken(SyntaxKind.RightBrace));
  4168. }
  4169. -
  4170. - while (At(SyntaxKind.LeftBracket))
  4171. + else
  4172. {
  4173. - Balance(BalancingModes.None);
  4174. - Optional(SyntaxKind.RightBracket);
  4175. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  4176. }
  4177. - return true;
  4178. - }
  4179. - else
  4180. - {
  4181. - return false;
  4182. + CompleteBlock(insertMarkerIfNecessary: false, captureWhitespaceToEndOfLine: true);
  4183. + builder.Add(OutputAsMetaCode(Output(), SpanContext.EditHandler.AcceptedCharacters));
  4184. }
  4185. }
  4186. - private void TypeArgumentList()
  4187. - {
  4188. - Assert(SyntaxKind.LessThan);
  4189. - Balance(BalancingModes.None);
  4190. - Optional(SyntaxKind.GreaterThan);
  4191. - }
  4192. -
  4193. - private void UsingStatement(Block block)
  4194. + private bool TryParseKeyword(in SyntaxListBuilder<RazorSyntaxNode> builder, CSharpTransitionSyntax transition)
  4195. {
  4196. - Assert(SyntaxKind.LeftParenthesis);
  4197. -
  4198. - // Parse condition
  4199. - if (AcceptCondition())
  4200. + var result = CSharpTokenizer.GetTokenKeyword(CurrentToken);
  4201. + Debug.Assert(CurrentToken.Kind == SyntaxKind.Keyword && result.HasValue);
  4202. + if (_keywordParserMap.TryGetValue(result.Value, out var handler))
  4203. {
  4204. - AcceptWhile(IsSpacingToken(includeNewLines: true, includeComments: true));
  4205. -
  4206. - // Parse code block
  4207. - ExpectCodeBlock(block);
  4208. + handler(builder, transition);
  4209. + return true;
  4210. }
  4211. - }
  4212. - private void TryStatement(bool topLevel)
  4213. - {
  4214. - Assert(CSharpKeyword.Try);
  4215. - UnconditionalBlock();
  4216. - AfterTryClause();
  4217. - if (topLevel)
  4218. - {
  4219. - CompleteBlock();
  4220. - }
  4221. + return false;
  4222. }
  4223. - private void IfStatement(bool topLevel)
  4224. + private void SetupExpressionParsers()
  4225. {
  4226. - Assert(CSharpKeyword.If);
  4227. - ConditionalBlock(topLevel: false);
  4228. - AfterIfClause();
  4229. - if (topLevel)
  4230. - {
  4231. - CompleteBlock();
  4232. - }
  4233. + MapExpressionKeyword(ParseAwaitExpression, CSharpKeyword.Await);
  4234. }
  4235. - private void AfterTryClause()
  4236. + private void SetupKeywordParsers()
  4237. {
  4238. - // Grab whitespace
  4239. - var whitespace = SkipToNextImportantToken();
  4240. -
  4241. - // Check for a catch or finally part
  4242. - if (At(CSharpKeyword.Catch))
  4243. - {
  4244. - Accept(whitespace);
  4245. - Assert(CSharpKeyword.Catch);
  4246. - FilterableCatchBlock();
  4247. - AfterTryClause();
  4248. - }
  4249. - else if (At(CSharpKeyword.Finally))
  4250. - {
  4251. - Accept(whitespace);
  4252. - Assert(CSharpKeyword.Finally);
  4253. - UnconditionalBlock();
  4254. - }
  4255. - else
  4256. - {
  4257. - // Return whitespace and end the block
  4258. - PutCurrentBack();
  4259. - PutBack(whitespace);
  4260. - Span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.Any;
  4261. - }
  4262. + MapKeywords(
  4263. + ParseConditionalBlock,
  4264. + CSharpKeyword.For,
  4265. + CSharpKeyword.Foreach,
  4266. + CSharpKeyword.While,
  4267. + CSharpKeyword.Switch,
  4268. + CSharpKeyword.Lock);
  4269. + MapKeywords(ParseCaseStatement, false, CSharpKeyword.Case, CSharpKeyword.Default);
  4270. + MapKeywords(ParseIfStatement, CSharpKeyword.If);
  4271. + MapKeywords(ParseTryStatement, CSharpKeyword.Try);
  4272. + MapKeywords(ParseDoStatement, CSharpKeyword.Do);
  4273. + MapKeywords(ParseUsingKeyword, CSharpKeyword.Using);
  4274. + MapKeywords(ParseReservedDirective, CSharpKeyword.Class, CSharpKeyword.Namespace);
  4275. }
  4276. - private void AfterIfClause()
  4277. + private void MapExpressionKeyword(Action<SyntaxListBuilder<RazorSyntaxNode>, CSharpTransitionSyntax> handler, CSharpKeyword keyword)
  4278. {
  4279. - // Grab whitespace and razor comments
  4280. - var whitespace = SkipToNextImportantToken();
  4281. + _keywordParserMap.Add(keyword, handler);
  4282. - // Check for an else part
  4283. - if (At(CSharpKeyword.Else))
  4284. - {
  4285. - Accept(whitespace);
  4286. - Assert(CSharpKeyword.Else);
  4287. - ElseClause();
  4288. - }
  4289. - else
  4290. - {
  4291. - // No else, return whitespace
  4292. - PutCurrentBack();
  4293. - PutBack(whitespace);
  4294. - Span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.Any;
  4295. - }
  4296. + // Expression keywords don't belong in the regular keyword list
  4297. }
  4298. - private void ElseClause()
  4299. + private void MapKeywords(Action<SyntaxListBuilder<RazorSyntaxNode>, CSharpTransitionSyntax> handler, params CSharpKeyword[] keywords)
  4300. {
  4301. - if (!At(CSharpKeyword.Else))
  4302. - {
  4303. - return;
  4304. - }
  4305. - var block = new Block(CurrentToken, CurrentStart);
  4306. -
  4307. - AcceptAndMoveNext();
  4308. - AcceptWhile(IsSpacingToken(includeNewLines: true, includeComments: true));
  4309. - if (At(CSharpKeyword.If))
  4310. - {
  4311. - // ElseIf
  4312. - block.Name = SyntaxConstants.CSharp.ElseIfKeyword;
  4313. - ConditionalBlock(block);
  4314. - AfterIfClause();
  4315. - }
  4316. - else if (!EndOfFile)
  4317. - {
  4318. - // Else
  4319. - ExpectCodeBlock(block);
  4320. - }
  4321. + MapKeywords(handler, topLevel: true, keywords: keywords);
  4322. }
  4323. - private void ExpectCodeBlock(Block block)
  4324. + private void MapKeywords(Action<SyntaxListBuilder<RazorSyntaxNode>, CSharpTransitionSyntax> handler, bool topLevel, params CSharpKeyword[] keywords)
  4325. {
  4326. - if (!EndOfFile)
  4327. + foreach (var keyword in keywords)
  4328. {
  4329. - // Check for "{" to make sure we're at a block
  4330. - if (!At(SyntaxKind.LeftBrace))
  4331. + _keywordParserMap.Add(keyword, handler);
  4332. + if (topLevel)
  4333. {
  4334. - Context.ErrorSink.OnError(
  4335. - RazorDiagnosticFactory.CreateParsing_SingleLineControlFlowStatementsNotAllowed(
  4336. - new SourceSpan(CurrentStart, CurrentToken.Content.Length),
  4337. - Language.GetSample(SyntaxKind.LeftBrace),
  4338. - CurrentToken.Content));
  4339. + Keywords.Add(CSharpLanguageCharacteristics.GetKeyword(keyword));
  4340. }
  4341. -
  4342. - // Parse the statement and then we're done
  4343. - Statement(block);
  4344. }
  4345. }
  4346. - private void UnconditionalBlock()
  4347. - {
  4348. - Assert(SyntaxKind.Keyword);
  4349. - var block = new Block(CurrentToken, CurrentStart);
  4350. - AcceptAndMoveNext();
  4351. - AcceptWhile(IsSpacingToken(includeNewLines: true, includeComments: true));
  4352. - ExpectCodeBlock(block);
  4353. - }
  4354. -
  4355. - private void FilterableCatchBlock()
  4356. + private void ParseAwaitExpression(SyntaxListBuilder<RazorSyntaxNode> builder, CSharpTransitionSyntax transition)
  4357. {
  4358. - Assert(CSharpKeyword.Catch);
  4359. -
  4360. - var block = new Block(CurrentToken, CurrentStart);
  4361. + // Ensure that we're on the await statement (only runs in debug)
  4362. + Assert(CSharpKeyword.Await);
  4363. - // Accept "catch"
  4364. + // Accept the "await" and move on
  4365. AcceptAndMoveNext();
  4366. - AcceptWhile(IsValidStatementSpacingToken);
  4367. -
  4368. - // Parse the catch condition if present. If not present, let the C# compiler complain.
  4369. - if (AcceptCondition())
  4370. - {
  4371. - AcceptWhile(IsValidStatementSpacingToken);
  4372. -
  4373. - if (At(CSharpKeyword.When))
  4374. - {
  4375. - // Accept "when".
  4376. - AcceptAndMoveNext();
  4377. - AcceptWhile(IsValidStatementSpacingToken);
  4378. -
  4379. - // Parse the filter condition if present. If not present, let the C# compiler complain.
  4380. - if (!AcceptCondition())
  4381. - {
  4382. - // Incomplete condition.
  4383. - return;
  4384. - }
  4385. -
  4386. - AcceptWhile(IsValidStatementSpacingToken);
  4387. - }
  4388. - ExpectCodeBlock(block);
  4389. - }
  4390. - }
  4391. + // Accept 1 or more spaces between the await and the following code.
  4392. + AcceptWhile(IsSpacingToken(includeNewLines: false, includeComments: true));
  4393. - private void ConditionalBlock(bool topLevel)
  4394. - {
  4395. - Assert(SyntaxKind.Keyword);
  4396. - var block = new Block(CurrentToken, CurrentStart);
  4397. - ConditionalBlock(block);
  4398. + // Top level basically indicates if we're within an expression or statement.
  4399. + // Ex: topLevel true = @await Foo() | topLevel false = @{ await Foo(); }
  4400. + // Note that in this case @{ <b>@await Foo()</b> } top level is true for await.
  4401. + // Therefore, if we're top level then we want to act like an implicit expression,
  4402. + // otherwise just act as whatever we're contained in.
  4403. + var topLevel = transition != null;
  4404. if (topLevel)
  4405. {
  4406. - CompleteBlock();
  4407. - }
  4408. - }
  4409. -
  4410. - private void ConditionalBlock(Block block)
  4411. - {
  4412. - AcceptAndMoveNext();
  4413. - AcceptWhile(IsSpacingToken(includeNewLines: true, includeComments: true));
  4414. -
  4415. - // Parse the condition, if present (if not present, we'll let the C# compiler complain)
  4416. - if (AcceptCondition())
  4417. - {
  4418. - AcceptWhile(IsSpacingToken(includeNewLines: true, includeComments: true));
  4419. - ExpectCodeBlock(block);
  4420. - }
  4421. - }
  4422. -
  4423. - private bool AcceptCondition()
  4424. - {
  4425. - if (At(SyntaxKind.LeftParenthesis))
  4426. - {
  4427. - var complete = Balance(BalancingModes.BacktrackOnFailure | BalancingModes.AllowCommentsAndTemplates);
  4428. - if (!complete)
  4429. - {
  4430. - AcceptUntil(SyntaxKind.NewLine);
  4431. - }
  4432. - else
  4433. - {
  4434. - Optional(SyntaxKind.RightParenthesis);
  4435. - }
  4436. - return complete;
  4437. + // Setup the Span to be an async implicit expression (an implicit expresison that allows spaces).
  4438. + // Spaces are allowed because of "@await Foo()".
  4439. + var implicitExpressionBody = ParseImplicitExpressionBody(async: true);
  4440. + builder.Add(SyntaxFactory.CSharpImplicitExpression(transition, implicitExpressionBody));
  4441. }
  4442. - return true;
  4443. }
  4444. - private void Statement()
  4445. + private void ParseConditionalBlock(SyntaxListBuilder<RazorSyntaxNode> builder, CSharpTransitionSyntax transition)
  4446. {
  4447. - Statement(null);
  4448. + var topLevel = transition != null;
  4449. + ParseConditionalBlock(builder, transition, topLevel);
  4450. }
  4451. - private void Statement(Block block)
  4452. + private void ParseConditionalBlock(in SyntaxListBuilder<RazorSyntaxNode> builder, CSharpTransitionSyntax transition, bool topLevel)
  4453. {
  4454. - Span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.Any;
  4455. -
  4456. - // Accept whitespace but always keep the last whitespace node so we can put it back if necessary
  4457. - var lastWhitespace = AcceptWhiteSpaceInLines();
  4458. -
  4459. - if (EndOfFile)
  4460. + Assert(SyntaxKind.Keyword);
  4461. + if (transition != null)
  4462. {
  4463. - if (lastWhitespace != null)
  4464. - {
  4465. - Accept(lastWhitespace);
  4466. - }
  4467. - return;
  4468. + builder.Add(transition);
  4469. }
  4470. - var type = CurrentToken.Kind;
  4471. - var loc = CurrentStart;
  4472. -
  4473. - // Both cases @: and @:: are triggered as markup, second colon in second case will be triggered as a plain text
  4474. - var isSingleLineMarkup = type == SyntaxKind.Transition &&
  4475. - (NextIs(SyntaxKind.Colon, SyntaxKind.DoubleColon));
  4476. -
  4477. - var isMarkup = isSingleLineMarkup ||
  4478. - type == SyntaxKind.LessThan ||
  4479. - (type == SyntaxKind.Transition && NextIs(SyntaxKind.LessThan));
  4480. -
  4481. - if (Context.DesignTimeMode || !isMarkup)
  4482. + var block = new Block(CurrentToken, CurrentStart);
  4483. + ParseConditionalBlock(builder, block);
  4484. + if (topLevel)
  4485. {
  4486. - // CODE owns whitespace, MARKUP owns it ONLY in DesignTimeMode.
  4487. - if (lastWhitespace != null)
  4488. - {
  4489. - Accept(lastWhitespace);
  4490. - }
  4491. + CompleteBlock();
  4492. }
  4493. - else
  4494. + }
  4495. +
  4496. + private void ParseConditionalBlock(in SyntaxListBuilder<RazorSyntaxNode> builder, Block block)
  4497. + {
  4498. + AcceptAndMoveNext();
  4499. + AcceptWhile(IsSpacingToken(includeNewLines: true, includeComments: true));
  4500. +
  4501. + // Parse the condition, if present (if not present, we'll let the C# compiler complain)
  4502. + if (TryParseCondition(builder))
  4503. {
  4504. - var nextToken = Lookahead(1);
  4505. + AcceptWhile(IsSpacingToken(includeNewLines: true, includeComments: true));
  4506. - // MARKUP owns whitespace EXCEPT in DesignTimeMode.
  4507. - PutCurrentBack();
  4508. + ParseExpectedCodeBlock(builder, block);
  4509. + }
  4510. + }
  4511. - // Put back the whitespace unless it precedes a '<text>' tag.
  4512. - if (nextToken != null &&
  4513. - !string.Equals(nextToken.Content, SyntaxConstants.TextTagName, StringComparison.Ordinal))
  4514. + private bool TryParseCondition(in SyntaxListBuilder<RazorSyntaxNode> builder)
  4515. + {
  4516. + if (At(SyntaxKind.LeftParenthesis))
  4517. + {
  4518. + var complete = Balance(builder, BalancingModes.BacktrackOnFailure | BalancingModes.AllowCommentsAndTemplates);
  4519. + if (!complete)
  4520. {
  4521. - PutBack(lastWhitespace);
  4522. + AcceptUntil(SyntaxKind.NewLine);
  4523. }
  4524. else
  4525. {
  4526. - // If it precedes a '<text>' tag, it should be accepted as code.
  4527. - Accept(lastWhitespace);
  4528. + TryAccept(SyntaxKind.RightParenthesis);
  4529. }
  4530. + return complete;
  4531. }
  4532. + return true;
  4533. + }
  4534. - if (isMarkup)
  4535. + private void ParseExpectedCodeBlock(in SyntaxListBuilder<RazorSyntaxNode> builder, Block block)
  4536. + {
  4537. + if (!EndOfFile)
  4538. {
  4539. - if (type == SyntaxKind.Transition && !isSingleLineMarkup)
  4540. + // Check for "{" to make sure we're at a block
  4541. + if (!At(SyntaxKind.LeftBrace))
  4542. {
  4543. Context.ErrorSink.OnError(
  4544. - RazorDiagnosticFactory.CreateParsing_AtInCodeMustBeFollowedByColonParenOrIdentifierStart(
  4545. - new SourceSpan(loc, contentLength: 1 /* @ */)));
  4546. + RazorDiagnosticFactory.CreateParsing_SingleLineControlFlowStatementsNotAllowed(
  4547. + new SourceSpan(CurrentStart, CurrentToken.Content.Length),
  4548. + Language.GetSample(SyntaxKind.LeftBrace),
  4549. + CurrentToken.Content));
  4550. }
  4551. - // Markup block
  4552. - Output(SpanKindInternal.Code);
  4553. - if (Context.DesignTimeMode && CurrentToken != null &&
  4554. - (CurrentToken.Kind == SyntaxKind.LessThan || CurrentToken.Kind == SyntaxKind.Transition))
  4555. - {
  4556. - PutCurrentBack();
  4557. - }
  4558. - OtherParserBlock();
  4559. + // Parse the statement and then we're done
  4560. + ParseStatement(builder, block);
  4561. }
  4562. - else
  4563. + }
  4564. +
  4565. + private void ParseUnconditionalBlock(in SyntaxListBuilder<RazorSyntaxNode> builder)
  4566. + {
  4567. + Assert(SyntaxKind.Keyword);
  4568. + var block = new Block(CurrentToken, CurrentStart);
  4569. + AcceptAndMoveNext();
  4570. + AcceptWhile(IsSpacingToken(includeNewLines: true, includeComments: true));
  4571. + ParseExpectedCodeBlock(builder, block);
  4572. + }
  4573. +
  4574. + private void ParseCaseStatement(SyntaxListBuilder<RazorSyntaxNode> builder, CSharpTransitionSyntax transition)
  4575. + {
  4576. + Assert(SyntaxKind.Keyword);
  4577. + if (transition != null)
  4578. {
  4579. - // What kind of statement is this?
  4580. - HandleStatement(block, type);
  4581. + // Normally, case statement won't start with a transition in a valid scenario.
  4582. + // If it does, just accept it and let the compiler complain.
  4583. + builder.Add(transition);
  4584. }
  4585. + var result = CSharpTokenizer.GetTokenKeyword(CurrentToken);
  4586. + Debug.Assert(result.HasValue &&
  4587. + (result.Value == CSharpKeyword.Case ||
  4588. + result.Value == CSharpKeyword.Default));
  4589. + AcceptUntil(SyntaxKind.Colon);
  4590. + TryAccept(SyntaxKind.Colon);
  4591. }
  4592. - private void HandleStatement(Block block, SyntaxKind type)
  4593. + private void ParseIfStatement(SyntaxListBuilder<RazorSyntaxNode> builder, CSharpTransitionSyntax transition)
  4594. {
  4595. - switch (type)
  4596. + Assert(CSharpKeyword.If);
  4597. + ParseConditionalBlock(builder, transition, topLevel: false);
  4598. + ParseAfterIfClause(builder);
  4599. + var topLevel = transition != null;
  4600. + if (topLevel)
  4601. {
  4602. - case SyntaxKind.RazorCommentTransition:
  4603. - Output(SpanKindInternal.Code);
  4604. - RazorComment();
  4605. - Statement(block);
  4606. - break;
  4607. - case SyntaxKind.LeftBrace:
  4608. - // Verbatim Block
  4609. - block = block ?? new Block(Resources.BlockName_Code, CurrentStart);
  4610. - AcceptAndMoveNext();
  4611. - CodeBlock(block);
  4612. - break;
  4613. - case SyntaxKind.Keyword:
  4614. - // Keyword block
  4615. - HandleKeyword(false, StandardStatement);
  4616. - break;
  4617. - case SyntaxKind.Transition:
  4618. - // Embedded Expression block
  4619. - EmbeddedExpression();
  4620. - break;
  4621. - case SyntaxKind.RightBrace:
  4622. - // Possible end of Code Block, just run the continuation
  4623. - break;
  4624. - case SyntaxKind.CSharpComment:
  4625. - AcceptAndMoveNext();
  4626. - break;
  4627. - default:
  4628. - // Other statement
  4629. - StandardStatement();
  4630. - break;
  4631. + CompleteBlock();
  4632. }
  4633. }
  4634. - private void EmbeddedExpression()
  4635. + private void ParseAfterIfClause(SyntaxListBuilder<RazorSyntaxNode> builder)
  4636. {
  4637. - // First, verify the type of the block
  4638. - Assert(SyntaxKind.Transition);
  4639. - var transition = CurrentToken;
  4640. - NextToken();
  4641. + // Grab whitespace and razor comments
  4642. + var whitespace = SkipToNextImportantToken(builder);
  4643. - if (At(SyntaxKind.Transition))
  4644. + // Check for an else part
  4645. + if (At(CSharpKeyword.Else))
  4646. {
  4647. - // Escaped "@"
  4648. - Output(SpanKindInternal.Code);
  4649. -
  4650. - // Output "@" as hidden span
  4651. - Accept(transition);
  4652. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  4653. - Output(SpanKindInternal.Code);
  4654. -
  4655. - Assert(SyntaxKind.Transition);
  4656. - AcceptAndMoveNext();
  4657. - StandardStatement();
  4658. + Accept(whitespace);
  4659. + Assert(CSharpKeyword.Else);
  4660. + ParseElseClause(builder);
  4661. }
  4662. else
  4663. {
  4664. - // Throw errors as necessary, but continue parsing
  4665. - if (At(SyntaxKind.LeftBrace))
  4666. - {
  4667. - Context.ErrorSink.OnError(
  4668. - RazorDiagnosticFactory.CreateParsing_UnexpectedNestedCodeBlock(
  4669. - new SourceSpan(CurrentStart, contentLength: 1 /* { */)));
  4670. - }
  4671. -
  4672. - // @( or @foo - Nested expression, parse a child block
  4673. + // No else, return whitespace
  4674. PutCurrentBack();
  4675. - PutBack(transition);
  4676. -
  4677. - // Before exiting, add a marker span if necessary
  4678. - AddMarkerTokenIfNecessary();
  4679. -
  4680. - NestedBlock();
  4681. + PutBack(whitespace);
  4682. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.Any;
  4683. }
  4684. }
  4685. - private void StandardStatement()
  4686. + private void ParseElseClause(in SyntaxListBuilder<RazorSyntaxNode> builder)
  4687. {
  4688. - while (!EndOfFile)
  4689. + if (!At(CSharpKeyword.Else))
  4690. {
  4691. - var bookmark = CurrentStart.AbsoluteIndex;
  4692. - var read = ReadWhile(token =>
  4693. - token.Kind != SyntaxKind.Semicolon &&
  4694. - token.Kind != SyntaxKind.RazorCommentTransition &&
  4695. - token.Kind != SyntaxKind.Transition &&
  4696. - token.Kind != SyntaxKind.LeftBrace &&
  4697. - token.Kind != SyntaxKind.LeftParenthesis &&
  4698. - token.Kind != SyntaxKind.LeftBracket &&
  4699. - token.Kind != SyntaxKind.RightBrace);
  4700. -
  4701. - if (At(SyntaxKind.LeftBrace) ||
  4702. - At(SyntaxKind.LeftParenthesis) ||
  4703. - At(SyntaxKind.LeftBracket))
  4704. - {
  4705. - Accept(read);
  4706. - if (Balance(BalancingModes.AllowCommentsAndTemplates | BalancingModes.BacktrackOnFailure))
  4707. - {
  4708. - Optional(SyntaxKind.RightBrace);
  4709. - }
  4710. - else
  4711. - {
  4712. - // Recovery
  4713. - AcceptUntil(SyntaxKind.LessThan, SyntaxKind.RightBrace);
  4714. - return;
  4715. - }
  4716. - }
  4717. - else if (At(SyntaxKind.Transition) && (NextIs(SyntaxKind.LessThan, SyntaxKind.Colon)))
  4718. - {
  4719. - Accept(read);
  4720. - Output(SpanKindInternal.Code);
  4721. - Template();
  4722. - }
  4723. - else if (At(SyntaxKind.RazorCommentTransition))
  4724. - {
  4725. - Accept(read);
  4726. - RazorComment();
  4727. - }
  4728. - else if (At(SyntaxKind.Semicolon))
  4729. - {
  4730. - Accept(read);
  4731. - AcceptAndMoveNext();
  4732. - return;
  4733. - }
  4734. - else if (At(SyntaxKind.RightBrace))
  4735. - {
  4736. - Accept(read);
  4737. - return;
  4738. - }
  4739. - else
  4740. - {
  4741. - Context.Source.Position = bookmark;
  4742. - NextToken();
  4743. - AcceptUntil(SyntaxKind.LessThan, SyntaxKind.LeftBrace, SyntaxKind.RightBrace);
  4744. - return;
  4745. - }
  4746. + return;
  4747. }
  4748. - }
  4749. + var block = new Block(CurrentToken, CurrentStart);
  4750. - private void CodeBlock(Block block)
  4751. - {
  4752. - CodeBlock(true, block);
  4753. + AcceptAndMoveNext();
  4754. + AcceptWhile(IsSpacingToken(includeNewLines: true, includeComments: true));
  4755. + if (At(CSharpKeyword.If))
  4756. + {
  4757. + // ElseIf
  4758. + block.Name = SyntaxConstants.CSharp.ElseIfKeyword;
  4759. + ParseConditionalBlock(builder, block);
  4760. + ParseAfterIfClause(builder);
  4761. + }
  4762. + else if (!EndOfFile)
  4763. + {
  4764. + // Else
  4765. + ParseExpectedCodeBlock(builder, block);
  4766. + }
  4767. }
  4768. - private void CodeBlock(bool acceptTerminatingBrace, Block block)
  4769. + private void ParseTryStatement(SyntaxListBuilder<RazorSyntaxNode> builder, CSharpTransitionSyntax transition)
  4770. {
  4771. - EnsureCurrent();
  4772. - while (!EndOfFile && !At(SyntaxKind.RightBrace))
  4773. + Assert(CSharpKeyword.Try);
  4774. + var topLevel = transition != null;
  4775. + if (topLevel)
  4776. {
  4777. - // Parse a statement, then return here
  4778. - Statement();
  4779. - EnsureCurrent();
  4780. + builder.Add(transition);
  4781. }
  4782. - if (EndOfFile)
  4783. - {
  4784. - Context.ErrorSink.OnError(
  4785. - RazorDiagnosticFactory.CreateParsing_ExpectedEndOfBlockBeforeEOF(
  4786. - new SourceSpan(block.Start, contentLength: 1 /* { OR } */), block.Name, "}", "{"));
  4787. - }
  4788. - else if (acceptTerminatingBrace)
  4789. + ParseUnconditionalBlock(builder);
  4790. + ParseAfterTryClause(builder);
  4791. + if (topLevel)
  4792. {
  4793. - Assert(SyntaxKind.RightBrace);
  4794. - Span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  4795. - AcceptAndMoveNext();
  4796. + CompleteBlock();
  4797. }
  4798. }
  4799. - private void HandleKeyword(bool topLevel, Action fallback)
  4800. + private void ParseAfterTryClause(in SyntaxListBuilder<RazorSyntaxNode> builder)
  4801. {
  4802. - var result = CSharpTokenizer.GetTokenKeyword(CurrentToken);
  4803. - Debug.Assert(CurrentToken.Kind == SyntaxKind.Keyword && result.HasValue);
  4804. - if (_keywordParsers.TryGetValue(result.Value, out var handler))
  4805. + // Grab whitespace
  4806. + var whitespace = SkipToNextImportantToken(builder);
  4807. +
  4808. + // Check for a catch or finally part
  4809. + if (At(CSharpKeyword.Catch))
  4810. + {
  4811. + Accept(whitespace);
  4812. + Assert(CSharpKeyword.Catch);
  4813. + ParseFilterableCatchBlock(builder);
  4814. + ParseAfterTryClause(builder);
  4815. + }
  4816. + else if (At(CSharpKeyword.Finally))
  4817. {
  4818. - handler(topLevel);
  4819. + Accept(whitespace);
  4820. + Assert(CSharpKeyword.Finally);
  4821. + ParseUnconditionalBlock(builder);
  4822. }
  4823. else
  4824. {
  4825. - fallback();
  4826. + // Return whitespace and end the block
  4827. + PutCurrentBack();
  4828. + PutBack(whitespace);
  4829. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.Any;
  4830. }
  4831. }
  4832. - private IEnumerable<SyntaxToken> SkipToNextImportantToken()
  4833. + private void ParseFilterableCatchBlock(in SyntaxListBuilder<RazorSyntaxNode> builder)
  4834. {
  4835. - while (!EndOfFile)
  4836. + Assert(CSharpKeyword.Catch);
  4837. +
  4838. + var block = new Block(CurrentToken, CurrentStart);
  4839. +
  4840. + // Accept "catch"
  4841. + AcceptAndMoveNext();
  4842. + AcceptWhile(IsValidStatementSpacingToken);
  4843. +
  4844. + // Parse the catch condition if present. If not present, let the C# compiler complain.
  4845. + if (TryParseCondition(builder))
  4846. {
  4847. - var whitespace = ReadWhile(IsSpacingToken(includeNewLines: true, includeComments: true));
  4848. - if (At(SyntaxKind.RazorCommentTransition))
  4849. - {
  4850. - Accept(whitespace);
  4851. - Span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.Any;
  4852. - RazorComment();
  4853. - }
  4854. - else
  4855. + AcceptWhile(IsValidStatementSpacingToken);
  4856. +
  4857. + if (At(CSharpKeyword.When))
  4858. {
  4859. - return whitespace;
  4860. - }
  4861. - }
  4862. - return Enumerable.Empty<SyntaxToken>();
  4863. - }
  4864. + // Accept "when".
  4865. + AcceptAndMoveNext();
  4866. + AcceptWhile(IsValidStatementSpacingToken);
  4867. - // Common code for Parsers, but FxCop REALLY doesn't like it in the base class.. moving it here for now.
  4868. - protected override void OutputSpanBeforeRazorComment()
  4869. - {
  4870. - AddMarkerTokenIfNecessary();
  4871. - Output(SpanKindInternal.Code);
  4872. - }
  4873. + // Parse the filter condition if present. If not present, let the C# compiler complain.
  4874. + if (!TryParseCondition(builder))
  4875. + {
  4876. + // Incomplete condition.
  4877. + return;
  4878. + }
  4879. - private void SetUpExpressions()
  4880. - {
  4881. - MapExpressionKeyword(AwaitExpression, CSharpKeyword.Await);
  4882. + AcceptWhile(IsValidStatementSpacingToken);
  4883. + }
  4884. +
  4885. + ParseExpectedCodeBlock(builder, block);
  4886. + }
  4887. }
  4888. - private void AwaitExpression(bool topLevel)
  4889. + private void ParseDoStatement(SyntaxListBuilder<RazorSyntaxNode> builder, CSharpTransitionSyntax transition)
  4890. {
  4891. - // Ensure that we're on the await statement (only runs in debug)
  4892. - Assert(CSharpKeyword.Await);
  4893. -
  4894. - // Accept the "await" and move on
  4895. - AcceptAndMoveNext();
  4896. -
  4897. - // Accept 1 or more spaces between the await and the following code.
  4898. - AcceptWhile(IsSpacingToken(includeNewLines: false, includeComments: true));
  4899. + Assert(CSharpKeyword.Do);
  4900. + if (transition != null)
  4901. + {
  4902. + builder.Add(transition);
  4903. + }
  4904. - // Top level basically indicates if we're within an expression or statement.
  4905. - // Ex: topLevel true = @await Foo() | topLevel false = @{ await Foo(); }
  4906. - // Note that in this case @{ <b>@await Foo()</b> } top level is true for await.
  4907. - // Therefore, if we're top level then we want to act like an implicit expression,
  4908. - // otherwise just act as whatever we're contained in.
  4909. + ParseUnconditionalBlock(builder);
  4910. + ParseWhileClause(builder);
  4911. + var topLevel = transition != null;
  4912. if (topLevel)
  4913. {
  4914. - // Setup the Span to be an async implicit expression (an implicit expresison that allows spaces).
  4915. - // Spaces are allowed because of "@await Foo()".
  4916. - AsyncImplicitExpression();
  4917. + CompleteBlock();
  4918. }
  4919. }
  4920. - private void SetupDirectives(IEnumerable<DirectiveDescriptor> directiveDescriptors)
  4921. + private void ParseWhileClause(in SyntaxListBuilder<RazorSyntaxNode> builder)
  4922. {
  4923. - var allDirectives = directiveDescriptors.Concat(DefaultDirectiveDescriptors).ToList();
  4924. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.Any;
  4925. + var whitespace = SkipToNextImportantToken(builder);
  4926. - for (var i = 0; i < allDirectives.Count; i++)
  4927. + if (At(CSharpKeyword.While))
  4928. {
  4929. - var directiveDescriptor = allDirectives[i];
  4930. - CurrentKeywords.Add(directiveDescriptor.Directive);
  4931. - MapDirectives(() => HandleDirective(directiveDescriptor), directiveDescriptor.Directive);
  4932. + Accept(whitespace);
  4933. + Assert(CSharpKeyword.While);
  4934. + AcceptAndMoveNext();
  4935. + AcceptWhile(IsSpacingToken(includeNewLines: true, includeComments: true));
  4936. + if (TryParseCondition(builder) && TryAccept(SyntaxKind.Semicolon))
  4937. + {
  4938. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  4939. + }
  4940. + }
  4941. + else
  4942. + {
  4943. + PutCurrentBack();
  4944. + PutBack(whitespace);
  4945. }
  4946. -
  4947. - MapDirectives(TagHelperPrefixDirective, SyntaxConstants.CSharp.TagHelperPrefixKeyword);
  4948. - MapDirectives(AddTagHelperDirective, SyntaxConstants.CSharp.AddTagHelperKeyword);
  4949. - MapDirectives(RemoveTagHelperDirective, SyntaxConstants.CSharp.RemoveTagHelperKeyword);
  4950. }
  4951. - private void EnsureDirectiveIsAtStartOfLine()
  4952. + private void ParseUsingKeyword(SyntaxListBuilder<RazorSyntaxNode> builder, CSharpTransitionSyntax transition)
  4953. {
  4954. - // 1 is the offset of the @ transition for the directive.
  4955. - if (CurrentStart.CharacterIndex > 1)
  4956. + Assert(CSharpKeyword.Using);
  4957. + var topLevel = transition != null;
  4958. + var block = new Block(CurrentToken, CurrentStart);
  4959. + var usingToken = EatCurrentToken();
  4960. + var whitespaceOrComments = ReadWhile(IsSpacingToken(includeNewLines: false, includeComments: true));
  4961. + var atLeftParen = At(SyntaxKind.LeftParenthesis);
  4962. + var atIdentifier = At(SyntaxKind.Identifier);
  4963. + var atStatic = At(CSharpKeyword.Static);
  4964. +
  4965. + // Put the read tokens back and let them be handled later.
  4966. + PutCurrentBack();
  4967. + PutBack(whitespaceOrComments);
  4968. + PutBack(usingToken);
  4969. + EnsureCurrent();
  4970. +
  4971. + if (atLeftParen)
  4972. {
  4973. - var index = CurrentStart.AbsoluteIndex - 1;
  4974. - var lineStart = CurrentStart.AbsoluteIndex - CurrentStart.CharacterIndex;
  4975. - while (--index >= lineStart)
  4976. + // using ( ==> Using Statement
  4977. + ParseUsingStatement(builder, transition, block);
  4978. + }
  4979. + else if (atIdentifier || atStatic)
  4980. + {
  4981. + // using Identifier ==> Using Declaration
  4982. + if (!topLevel)
  4983. {
  4984. - var @char = Context.SourceDocument[index];
  4985. -
  4986. - if (!char.IsWhiteSpace(@char))
  4987. + Context.ErrorSink.OnError(
  4988. + RazorDiagnosticFactory.CreateParsing_NamespaceImportAndTypeAliasCannotExistWithinCodeBlock(
  4989. + new SourceSpan(block.Start, block.Name.Length)));
  4990. + if (transition != null)
  4991. {
  4992. - var currentDirective = CurrentToken.Content;
  4993. - Context.ErrorSink.OnError(
  4994. - RazorDiagnosticFactory.CreateParsing_DirectiveMustAppearAtStartOfLine(
  4995. - new SourceSpan(CurrentStart, currentDirective.Length), currentDirective));
  4996. - break;
  4997. + builder.Add(transition);
  4998. }
  4999. + AcceptAndMoveNext();
  5000. + AcceptWhile(IsSpacingToken(includeNewLines: false, includeComments: true));
  5001. + ParseStandardStatement(builder);
  5002. + }
  5003. + else
  5004. + {
  5005. + ParseUsingDeclaration(builder, transition);
  5006. + return;
  5007. }
  5008. }
  5009. + else
  5010. + {
  5011. + AcceptAndMoveNext();
  5012. + AcceptWhile(IsSpacingToken(includeNewLines: false, includeComments: true));
  5013. + }
  5014. +
  5015. + if (topLevel)
  5016. + {
  5017. + CompleteBlock();
  5018. + }
  5019. }
  5020. - private void HandleDirective(DirectiveDescriptor descriptor)
  5021. + private void ParseUsingStatement(in SyntaxListBuilder<RazorSyntaxNode> builder, CSharpTransitionSyntax transition, Block block)
  5022. {
  5023. - AssertDirective(descriptor.Directive);
  5024. + Assert(CSharpKeyword.Using);
  5025. + AcceptAndMoveNext();
  5026. + AcceptWhile(IsSpacingToken(includeNewLines: false, includeComments: true));
  5027. - var directiveErrorSink = new ErrorSink();
  5028. - var savedErrorSink = Context.ErrorSink;
  5029. - Context.ErrorSink = directiveErrorSink;
  5030. + Assert(SyntaxKind.LeftParenthesis);
  5031. + if (transition != null)
  5032. + {
  5033. + builder.Add(transition);
  5034. + }
  5035. - var directiveChunkGenerator = new DirectiveChunkGenerator(descriptor);
  5036. - try
  5037. + // Parse condition
  5038. + if (TryParseCondition(builder))
  5039. {
  5040. - EnsureDirectiveIsAtStartOfLine();
  5041. + AcceptWhile(IsSpacingToken(includeNewLines: true, includeComments: true));
  5042. - Context.Builder.CurrentBlock.Type = BlockKindInternal.Directive;
  5043. - Context.Builder.CurrentBlock.ChunkGenerator = directiveChunkGenerator;
  5044. + // Parse code block
  5045. + ParseExpectedCodeBlock(builder, block);
  5046. + }
  5047. + }
  5048. + private void ParseUsingDeclaration(in SyntaxListBuilder<RazorSyntaxNode> builder, CSharpTransitionSyntax transition)
  5049. + {
  5050. + // Using declarations should always be top level. The error case is handled in a different code path.
  5051. + Debug.Assert(transition != null);
  5052. + using (var pooledResult = Pool.Allocate<RazorSyntaxNode>())
  5053. + {
  5054. + var directiveBuilder = pooledResult.Builder;
  5055. + Assert(CSharpKeyword.Using);
  5056. AcceptAndMoveNext();
  5057. - Output(SpanKindInternal.MetaCode, AcceptedCharactersInternal.None);
  5058. -
  5059. - // Even if an error was logged do not bail out early. If a directive was used incorrectly it doesn't mean it can't be parsed.
  5060. - ValidateDirectiveUsage(descriptor);
  5061. -
  5062. - for (var i = 0; i < descriptor.Tokens.Count; i++)
  5063. + AcceptWhile(IsSpacingToken(includeNewLines: false, includeComments: true));
  5064. + var start = CurrentStart;
  5065. + if (At(SyntaxKind.Identifier))
  5066. {
  5067. - if (!At(SyntaxKind.Whitespace) &&
  5068. - !At(SyntaxKind.NewLine) &&
  5069. - !EndOfFile)
  5070. + // non-static using
  5071. + TryParseNamespaceOrTypeName(directiveBuilder);
  5072. + var whitespace = ReadWhile(IsSpacingToken(includeNewLines: true, includeComments: true));
  5073. + if (At(SyntaxKind.Assign))
  5074. {
  5075. - Context.ErrorSink.OnError(
  5076. - RazorDiagnosticFactory.CreateParsing_DirectiveTokensMustBeSeparatedByWhitespace(
  5077. - new SourceSpan(CurrentStart, CurrentToken.Content.Length), descriptor.Directive));
  5078. - return;
  5079. - }
  5080. -
  5081. - var tokenDescriptor = descriptor.Tokens[i];
  5082. - AcceptWhile(IsSpacingToken(includeNewLines: false, includeComments: true));
  5083. + // Alias
  5084. + Accept(whitespace);
  5085. + Assert(SyntaxKind.Assign);
  5086. + AcceptAndMoveNext();
  5087. - if (tokenDescriptor.Kind == DirectiveTokenKind.Member ||
  5088. - tokenDescriptor.Kind == DirectiveTokenKind.Namespace ||
  5089. - tokenDescriptor.Kind == DirectiveTokenKind.Type)
  5090. - {
  5091. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  5092. - Output(SpanKindInternal.Code, AcceptedCharactersInternal.Whitespace);
  5093. + AcceptWhile(IsSpacingToken(includeNewLines: true, includeComments: true));
  5094. - if (EndOfFile || At(SyntaxKind.NewLine))
  5095. - {
  5096. - // Add a marker token to provide CSharp intellisense when we start typing the directive token.
  5097. - AddMarkerTokenIfNecessary();
  5098. - Span.ChunkGenerator = new DirectiveTokenChunkGenerator(tokenDescriptor);
  5099. - Span.EditHandler = new DirectiveTokenEditHandler(Language.TokenizeString);
  5100. - Output(SpanKindInternal.Code, AcceptedCharactersInternal.NonWhitespace);
  5101. - }
  5102. + // One more namespace or type name
  5103. + TryParseNamespaceOrTypeName(directiveBuilder);
  5104. }
  5105. else
  5106. {
  5107. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  5108. - Output(SpanKindInternal.Markup, AcceptedCharactersInternal.Whitespace);
  5109. - }
  5110. -
  5111. - if (tokenDescriptor.Optional && (EndOfFile || At(SyntaxKind.NewLine)))
  5112. - {
  5113. - break;
  5114. - }
  5115. - else if (EndOfFile)
  5116. - {
  5117. - Context.ErrorSink.OnError(
  5118. - RazorDiagnosticFactory.CreateParsing_UnexpectedEOFAfterDirective(
  5119. - new SourceSpan(CurrentStart, contentLength: 1),
  5120. - descriptor.Directive,
  5121. - tokenDescriptor.Kind.ToString().ToLowerInvariant()));
  5122. - return;
  5123. + PutCurrentBack();
  5124. + PutBack(whitespace);
  5125. }
  5126. + }
  5127. + else if (At(CSharpKeyword.Static))
  5128. + {
  5129. + // static using
  5130. + AcceptAndMoveNext();
  5131. + AcceptWhile(IsSpacingToken(includeNewLines: false, includeComments: true));
  5132. + TryParseNamespaceOrTypeName(directiveBuilder);
  5133. + }
  5134. - switch (tokenDescriptor.Kind)
  5135. - {
  5136. - case DirectiveTokenKind.Type:
  5137. - if (!NamespaceOrTypeName())
  5138. - {
  5139. - Context.ErrorSink.OnError(
  5140. - RazorDiagnosticFactory.CreateParsing_DirectiveExpectsTypeName(
  5141. - new SourceSpan(CurrentStart, CurrentToken.Content.Length), descriptor.Directive));
  5142. -
  5143. - return;
  5144. - }
  5145. - break;
  5146. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.AnyExceptNewline;
  5147. + SpanContext.ChunkGenerator = new AddImportChunkGenerator(new LocationTagged<string>(
  5148. + string.Concat(TokenBuilder.ToList().Nodes.Skip(1).Select(s => s.Content)),
  5149. + start));
  5150. - case DirectiveTokenKind.Namespace:
  5151. - if (!QualifiedIdentifier(out var identifierLength))
  5152. - {
  5153. - Context.ErrorSink.OnError(
  5154. - RazorDiagnosticFactory.CreateParsing_DirectiveExpectsNamespace(
  5155. - new SourceSpan(CurrentStart, identifierLength), descriptor.Directive));
  5156. + // Optional ";"
  5157. + if (EnsureCurrent())
  5158. + {
  5159. + TryAccept(SyntaxKind.Semicolon);
  5160. + }
  5161. - return;
  5162. - }
  5163. - break;
  5164. + CompleteBlock();
  5165. + Debug.Assert(directiveBuilder.Count == 0, "We should not have built any blocks so far.");
  5166. + var keywordTokens = OutputTokensAsStatementLiteral();
  5167. + var directiveBody = SyntaxFactory.RazorDirectiveBody(keywordTokens, null);
  5168. + builder.Add(SyntaxFactory.RazorDirective(transition, directiveBody));
  5169. + }
  5170. + }
  5171. - case DirectiveTokenKind.Member:
  5172. - if (At(SyntaxKind.Identifier))
  5173. - {
  5174. - AcceptAndMoveNext();
  5175. - }
  5176. - else
  5177. - {
  5178. - Context.ErrorSink.OnError(
  5179. - RazorDiagnosticFactory.CreateParsing_DirectiveExpectsIdentifier(
  5180. - new SourceSpan(CurrentStart, CurrentToken.Content.Length), descriptor.Directive));
  5181. - return;
  5182. - }
  5183. - break;
  5184. + private bool TryParseNamespaceOrTypeName(in SyntaxListBuilder<RazorSyntaxNode> builder)
  5185. + {
  5186. + if (TryAccept(SyntaxKind.LeftParenthesis))
  5187. + {
  5188. + while (!TryAccept(SyntaxKind.RightParenthesis) && !EndOfFile)
  5189. + {
  5190. + TryAccept(SyntaxKind.Whitespace);
  5191. - case DirectiveTokenKind.String:
  5192. - if (At(SyntaxKind.StringLiteral) && !CurrentToken.ContainsDiagnostics)
  5193. - {
  5194. - AcceptAndMoveNext();
  5195. - }
  5196. - else
  5197. - {
  5198. - Context.ErrorSink.OnError(
  5199. - RazorDiagnosticFactory.CreateParsing_DirectiveExpectsQuotedStringLiteral(
  5200. - new SourceSpan(CurrentStart, CurrentToken.Content.Length), descriptor.Directive));
  5201. - return;
  5202. - }
  5203. - break;
  5204. + if (!TryParseNamespaceOrTypeName(builder))
  5205. + {
  5206. + return false;
  5207. }
  5208. - Span.ChunkGenerator = new DirectiveTokenChunkGenerator(tokenDescriptor);
  5209. - Span.EditHandler = new DirectiveTokenEditHandler(Language.TokenizeString);
  5210. - Output(SpanKindInternal.Code, AcceptedCharactersInternal.NonWhitespace);
  5211. + TryAccept(SyntaxKind.Whitespace);
  5212. + TryAccept(SyntaxKind.Identifier);
  5213. + TryAccept(SyntaxKind.Whitespace);
  5214. + TryAccept(SyntaxKind.Comma);
  5215. }
  5216. - AcceptWhile(IsSpacingToken(includeNewLines: false, includeComments: true));
  5217. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  5218. -
  5219. - switch (descriptor.Kind)
  5220. + if (At(SyntaxKind.Whitespace) && NextIs(SyntaxKind.QuestionMark))
  5221. {
  5222. - case DirectiveKind.SingleLine:
  5223. - Output(SpanKindInternal.None, AcceptedCharactersInternal.Whitespace);
  5224. -
  5225. - Optional(SyntaxKind.Semicolon);
  5226. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  5227. - Output(SpanKindInternal.MetaCode, AcceptedCharactersInternal.Whitespace);
  5228. -
  5229. - AcceptWhile(IsSpacingToken(includeNewLines: false, includeComments: true));
  5230. -
  5231. - if (At(SyntaxKind.NewLine))
  5232. - {
  5233. - AcceptAndMoveNext();
  5234. - }
  5235. - else if (!EndOfFile)
  5236. - {
  5237. - Context.ErrorSink.OnError(
  5238. - RazorDiagnosticFactory.CreateParsing_UnexpectedDirectiveLiteral(
  5239. - new SourceSpan(CurrentStart, CurrentToken.Content.Length),
  5240. - descriptor.Directive,
  5241. - Resources.ErrorComponent_Newline));
  5242. - }
  5243. -
  5244. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  5245. -
  5246. - // This should contain the optional whitespace after the optional semicolon and the new line.
  5247. - // Output as Markup as we want intellisense here.
  5248. - Output(SpanKindInternal.Markup, AcceptedCharactersInternal.Whitespace);
  5249. - break;
  5250. - case DirectiveKind.RazorBlock:
  5251. - AcceptWhile(IsSpacingToken(includeNewLines: true, includeComments: true));
  5252. - Output(SpanKindInternal.Markup, AcceptedCharactersInternal.AllWhitespace);
  5253. -
  5254. - ParseDirectiveBlock(descriptor, parseChildren: (startingBraceLocation) =>
  5255. - {
  5256. - // When transitioning to the HTML parser we no longer want to act as if we're in a nested C# state.
  5257. - // For instance, if <div>@hello.</div> is in a nested C# block we don't want the trailing '.' to be handled
  5258. - // as C#; it should be handled as a period because it's wrapped in markup.
  5259. - var wasNested = IsNested;
  5260. - IsNested = false;
  5261. -
  5262. - using (PushSpanConfig())
  5263. - {
  5264. - HtmlParser.ParseRazorBlock(Tuple.Create("{", "}"), caseSensitive: true);
  5265. - }
  5266. -
  5267. - Span.Start = CurrentLocation;
  5268. - Initialize(Span);
  5269. + // Only accept the whitespace if we are going to consume the next token.
  5270. + AcceptAndMoveNext();
  5271. + }
  5272. - IsNested = wasNested;
  5273. + TryAccept(SyntaxKind.QuestionMark); // Nullable
  5274. - NextToken();
  5275. - });
  5276. - break;
  5277. - case DirectiveKind.CodeBlock:
  5278. - AcceptWhile(IsSpacingToken(includeNewLines: true, includeComments: true));
  5279. - Output(SpanKindInternal.Markup, AcceptedCharactersInternal.AllWhitespace);
  5280. + return true;
  5281. + }
  5282. + else if (TryAccept(SyntaxKind.Identifier) || TryAccept(SyntaxKind.Keyword))
  5283. + {
  5284. + if (TryAccept(SyntaxKind.DoubleColon))
  5285. + {
  5286. + if (!TryAccept(SyntaxKind.Identifier))
  5287. + {
  5288. + TryAccept(SyntaxKind.Keyword);
  5289. + }
  5290. + }
  5291. + if (At(SyntaxKind.LessThan))
  5292. + {
  5293. + ParseTypeArgumentList(builder);
  5294. + }
  5295. + if (TryAccept(SyntaxKind.Dot))
  5296. + {
  5297. + TryParseNamespaceOrTypeName(builder);
  5298. + }
  5299. - ParseDirectiveBlock(descriptor, parseChildren: (startingBraceLocation) =>
  5300. - {
  5301. - NextToken();
  5302. - Balance(BalancingModes.NoErrorOnFailure, SyntaxKind.LeftBrace, SyntaxKind.RightBrace, startingBraceLocation);
  5303. - Span.ChunkGenerator = new StatementChunkGenerator();
  5304. - var existingEditHandler = Span.EditHandler;
  5305. - Span.EditHandler = new CodeBlockEditHandler(Language.TokenizeString);
  5306. + if (At(SyntaxKind.Whitespace) && NextIs(SyntaxKind.QuestionMark))
  5307. + {
  5308. + // Only accept the whitespace if we are going to consume the next token.
  5309. + AcceptAndMoveNext();
  5310. + }
  5311. - AddMarkerTokenIfNecessary();
  5312. + TryAccept(SyntaxKind.QuestionMark); // Nullable
  5313. - Output(SpanKindInternal.Code);
  5314. + if (At(SyntaxKind.Whitespace) && NextIs(SyntaxKind.LeftBracket))
  5315. + {
  5316. + // Only accept the whitespace if we are going to consume the next token.
  5317. + AcceptAndMoveNext();
  5318. + }
  5319. - Span.EditHandler = existingEditHandler;
  5320. - });
  5321. - break;
  5322. + while (At(SyntaxKind.LeftBracket))
  5323. + {
  5324. + Balance(builder, BalancingModes.None);
  5325. + if (!TryAccept(SyntaxKind.RightBracket))
  5326. + {
  5327. + Accept(SyntaxFactory.MissingToken(SyntaxKind.RightBracket));
  5328. + }
  5329. }
  5330. + return true;
  5331. }
  5332. - finally
  5333. + else
  5334. {
  5335. - if (directiveErrorSink.Errors.Count > 0)
  5336. - {
  5337. - directiveChunkGenerator.Diagnostics.AddRange(directiveErrorSink.Errors);
  5338. - }
  5339. + return false;
  5340. + }
  5341. + }
  5342. - Context.ErrorSink = savedErrorSink;
  5343. + private void ParseTypeArgumentList(in SyntaxListBuilder<RazorSyntaxNode> builder)
  5344. + {
  5345. + Assert(SyntaxKind.LessThan);
  5346. + Balance(builder, BalancingModes.None);
  5347. + if (!TryAccept(SyntaxKind.GreaterThan))
  5348. + {
  5349. + Accept(SyntaxFactory.MissingToken(SyntaxKind.GreaterThan));
  5350. }
  5351. }
  5352. + private void ParseReservedDirective(SyntaxListBuilder<RazorSyntaxNode> builder, CSharpTransitionSyntax transition)
  5353. + {
  5354. + Context.ErrorSink.OnError(
  5355. + RazorDiagnosticFactory.CreateParsing_ReservedWord(
  5356. + new SourceSpan(CurrentStart, CurrentToken.Content.Length), CurrentToken.Content));
  5357. +
  5358. + AcceptAndMoveNext();
  5359. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  5360. + SpanContext.ChunkGenerator = SpanChunkGenerator.Null;
  5361. + CompleteBlock();
  5362. + var keyword = OutputAsMetaCode(Output());
  5363. + var directiveBody = SyntaxFactory.RazorDirectiveBody(keyword, cSharpCode: null);
  5364. + var directive = SyntaxFactory.RazorDirective(transition, directiveBody);
  5365. + builder.Add(directive);
  5366. + }
  5367. - private void ValidateDirectiveUsage(DirectiveDescriptor descriptor)
  5368. + protected void CompleteBlock()
  5369. {
  5370. - if (descriptor.Usage == DirectiveUsage.FileScopedSinglyOccurring)
  5371. - {
  5372. - if (Context.SeenDirectives.Contains(descriptor.Directive))
  5373. - {
  5374. - // There will always be at least 1 child because of the `@` transition.
  5375. - var directiveStart = Context.Builder.CurrentBlock.Children.First().Start;
  5376. - var errorLength = /* @ */ 1 + descriptor.Directive.Length;
  5377. - Context.ErrorSink.OnError(
  5378. - RazorDiagnosticFactory.CreateParsing_DuplicateDirective(
  5379. - new SourceSpan(directiveStart, errorLength), descriptor.Directive));
  5380. + CompleteBlock(insertMarkerIfNecessary: true);
  5381. + }
  5382. - return;
  5383. - }
  5384. - }
  5385. + protected void CompleteBlock(bool insertMarkerIfNecessary)
  5386. + {
  5387. + CompleteBlock(insertMarkerIfNecessary, captureWhitespaceToEndOfLine: insertMarkerIfNecessary);
  5388. }
  5389. - private void ParseDirectiveBlock(DirectiveDescriptor descriptor, Action<SourceLocation> parseChildren)
  5390. + protected void CompleteBlock(bool insertMarkerIfNecessary, bool captureWhitespaceToEndOfLine)
  5391. {
  5392. - if (EndOfFile)
  5393. + if (insertMarkerIfNecessary && Context.LastAcceptedCharacters != AcceptedCharactersInternal.Any)
  5394. {
  5395. - Context.ErrorSink.OnError(
  5396. - RazorDiagnosticFactory.CreateParsing_UnexpectedEOFAfterDirective(
  5397. - new SourceSpan(CurrentStart, contentLength: 1 /* { */), descriptor.Directive, "{"));
  5398. + AcceptMarkerTokenIfNecessary();
  5399. }
  5400. - else if (!At(SyntaxKind.LeftBrace))
  5401. +
  5402. + EnsureCurrent();
  5403. +
  5404. + // Read whitespace, but not newlines
  5405. + // If we're not inserting a marker span, we don't need to capture whitespace
  5406. + if (!Context.WhiteSpaceIsSignificantToAncestorBlock &&
  5407. + captureWhitespaceToEndOfLine &&
  5408. + !Context.DesignTimeMode &&
  5409. + !IsNested)
  5410. {
  5411. - Context.ErrorSink.OnError(
  5412. - RazorDiagnosticFactory.CreateParsing_UnexpectedDirectiveLiteral(
  5413. - new SourceSpan(CurrentStart, CurrentToken.Content.Length), descriptor.Directive, "{"));
  5414. + var whitespace = ReadWhile(token => token.Kind == SyntaxKind.Whitespace);
  5415. + if (At(SyntaxKind.NewLine))
  5416. + {
  5417. + Accept(whitespace);
  5418. + AcceptAndMoveNext();
  5419. + PutCurrentBack();
  5420. + }
  5421. + else
  5422. + {
  5423. + PutCurrentBack();
  5424. + PutBack(whitespace);
  5425. + }
  5426. }
  5427. else
  5428. {
  5429. - var editHandler = new AutoCompleteEditHandler(Language.TokenizeString, autoCompleteAtEndOfSpan: true);
  5430. - Span.EditHandler = editHandler;
  5431. - var startingBraceLocation = CurrentStart;
  5432. - Accept(CurrentToken);
  5433. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  5434. - Output(SpanKindInternal.MetaCode, AcceptedCharactersInternal.None);
  5435. -
  5436. - parseChildren(startingBraceLocation);
  5437. + PutCurrentBack();
  5438. + }
  5439. + }
  5440. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  5441. - if (!Optional(SyntaxKind.RightBrace))
  5442. + private IEnumerable<SyntaxToken> SkipToNextImportantToken(in SyntaxListBuilder<RazorSyntaxNode> builder)
  5443. + {
  5444. + while (!EndOfFile)
  5445. + {
  5446. + var whitespace = ReadWhile(IsSpacingToken(includeNewLines: true, includeComments: true));
  5447. + if (At(SyntaxKind.RazorCommentTransition))
  5448. {
  5449. - editHandler.AutoCompleteString = "}";
  5450. - Context.ErrorSink.OnError(
  5451. - RazorDiagnosticFactory.CreateParsing_ExpectedEndOfBlockBeforeEOF(
  5452. - new SourceSpan(startingBraceLocation, contentLength: 1 /* } */), descriptor.Directive, "}", "{"));
  5453. + Accept(whitespace);
  5454. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.Any;
  5455. + AcceptMarkerTokenIfNecessary();
  5456. + builder.Add(OutputTokensAsStatementLiteral());
  5457. + var comment = ParseRazorComment();
  5458. + builder.Add(comment);
  5459. }
  5460. else
  5461. {
  5462. - Span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  5463. + return whitespace;
  5464. }
  5465. - CompleteBlock(insertMarkerIfNecessary: false, captureWhitespaceToEndOfLine: true);
  5466. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  5467. - Output(SpanKindInternal.MetaCode, AcceptedCharactersInternal.None);
  5468. }
  5469. + return Enumerable.Empty<SyntaxToken>();
  5470. }
  5471. - protected virtual void TagHelperPrefixDirective()
  5472. + private void DefaultSpanContextConfig(SpanContextBuilder spanContext)
  5473. {
  5474. - RazorDiagnostic duplicateDiagnostic = null;
  5475. - if (Context.SeenDirectives.Contains(SyntaxConstants.CSharp.TagHelperPrefixKeyword))
  5476. - {
  5477. - // There wil always be at least 1 child because of the `@` transition.
  5478. - var directiveStart = Context.Builder.CurrentBlock.Children.First().Start;
  5479. - var errorLength = /* @ */ 1 + SyntaxConstants.CSharp.TagHelperPrefixKeyword.Length;
  5480. - duplicateDiagnostic = RazorDiagnosticFactory.CreateParsing_DuplicateDirective(
  5481. - new SourceSpan(directiveStart, errorLength),
  5482. - SyntaxConstants.CSharp.TagHelperPrefixKeyword);
  5483. - }
  5484. -
  5485. - TagHelperDirective(
  5486. - SyntaxConstants.CSharp.TagHelperPrefixKeyword,
  5487. - (prefix, errors) =>
  5488. - {
  5489. - if (duplicateDiagnostic != null)
  5490. - {
  5491. - errors.Add(duplicateDiagnostic);
  5492. - }
  5493. -
  5494. - var parsedDirective = ParseDirective(prefix, Span.Start, TagHelperDirectiveType.TagHelperPrefix, errors);
  5495. + spanContext.EditHandler = SpanEditHandler.CreateDefault(Language.TokenizeString);
  5496. + spanContext.ChunkGenerator = new StatementChunkGenerator();
  5497. + }
  5498. - return new TagHelperPrefixDirectiveChunkGenerator(
  5499. - prefix,
  5500. - parsedDirective.DirectiveText,
  5501. - errors);
  5502. - });
  5503. + private void ExplicitExpressionSpanContextConfig(SpanContextBuilder spanContext)
  5504. + {
  5505. + spanContext.EditHandler = SpanEditHandler.CreateDefault(Language.TokenizeString);
  5506. + spanContext.ChunkGenerator = new ExpressionChunkGenerator();
  5507. }
  5508. - // Internal for testing.
  5509. - internal void ValidateTagHelperPrefix(
  5510. - string prefix,
  5511. - SourceLocation directiveLocation,
  5512. - List<RazorDiagnostic> diagnostics)
  5513. + private CSharpStatementLiteralSyntax OutputTokensAsStatementLiteral()
  5514. {
  5515. - foreach (var character in prefix)
  5516. + var tokens = Output();
  5517. + if (tokens.Count == 0)
  5518. {
  5519. - // Prefixes are correlated with tag names, tag names cannot have whitespace.
  5520. - if (char.IsWhiteSpace(character) || InvalidNonWhitespaceNameCharacters.Contains(character))
  5521. - {
  5522. - diagnostics.Add(
  5523. - RazorDiagnosticFactory.CreateParsing_InvalidTagHelperPrefixValue(
  5524. - new SourceSpan(directiveLocation, prefix.Length),
  5525. - SyntaxConstants.CSharp.TagHelperPrefixKeyword,
  5526. - character,
  5527. - prefix));
  5528. -
  5529. - return;
  5530. - }
  5531. + return null;
  5532. }
  5533. +
  5534. + return GetNodeWithSpanContext(SyntaxFactory.CSharpStatementLiteral(tokens));
  5535. }
  5536. - private ParsedDirective ParseDirective(
  5537. - string directiveText,
  5538. - SourceLocation directiveLocation,
  5539. - TagHelperDirectiveType directiveType,
  5540. - List<RazorDiagnostic> errors)
  5541. + private CSharpExpressionLiteralSyntax OutputTokensAsExpressionLiteral()
  5542. {
  5543. - var offset = 0;
  5544. - directiveText = directiveText.Trim();
  5545. - if (directiveText.Length >= 2 &&
  5546. - directiveText.StartsWith("\"", StringComparison.Ordinal) &&
  5547. - directiveText.EndsWith("\"", StringComparison.Ordinal))
  5548. + var tokens = Output();
  5549. + if (tokens.Count == 0)
  5550. {
  5551. - directiveText = directiveText.Substring(1, directiveText.Length - 2);
  5552. - if (string.IsNullOrEmpty(directiveText))
  5553. - {
  5554. - offset = 1;
  5555. - }
  5556. + return null;
  5557. }
  5558. - // If this is the "string literal" form of a directive, we'll need to postprocess the location
  5559. - // and content.
  5560. - //
  5561. - // Ex: @addTagHelper "*, Microsoft.AspNetCore.CoolLibrary"
  5562. - // ^ ^
  5563. - // Start End
  5564. - if (Span.Tokens.Count == 1 && (Span.Tokens[0] as SyntaxToken)?.Kind == SyntaxKind.StringLiteral)
  5565. - {
  5566. - offset += Span.Tokens[0].Content.IndexOf(directiveText, StringComparison.Ordinal);
  5567. + return GetNodeWithSpanContext(SyntaxFactory.CSharpExpressionLiteral(tokens));
  5568. + }
  5569. - // This is safe because inside one of these directives all of the text needs to be on the
  5570. - // same line.
  5571. - var original = directiveLocation;
  5572. - directiveLocation = new SourceLocation(
  5573. - original.FilePath,
  5574. - original.AbsoluteIndex + offset,
  5575. - original.LineIndex,
  5576. - original.CharacterIndex + offset);
  5577. + private CSharpEphemeralTextLiteralSyntax OutputTokensAsEphemeralLiteral()
  5578. + {
  5579. + var tokens = Output();
  5580. + if (tokens.Count == 0)
  5581. + {
  5582. + return null;
  5583. }
  5584. - var parsedDirective = new ParsedDirective()
  5585. - {
  5586. - DirectiveText = directiveText
  5587. - };
  5588. + return GetNodeWithSpanContext(SyntaxFactory.CSharpEphemeralTextLiteral(tokens));
  5589. + }
  5590. - if (directiveType == TagHelperDirectiveType.TagHelperPrefix)
  5591. + private UnclassifiedTextLiteralSyntax OutputTokensAsUnclassifiedLiteral()
  5592. + {
  5593. + var tokens = Output();
  5594. + if (tokens.Count == 0)
  5595. {
  5596. - ValidateTagHelperPrefix(parsedDirective.DirectiveText, directiveLocation, errors);
  5597. -
  5598. - return parsedDirective;
  5599. + return null;
  5600. }
  5601. - return ParseAddOrRemoveDirective(parsedDirective, directiveLocation, errors);
  5602. +
  5603. + return GetNodeWithSpanContext(SyntaxFactory.UnclassifiedTextLiteral(tokens));
  5604. }
  5605. - // Internal for testing.
  5606. - internal ParsedDirective ParseAddOrRemoveDirective(ParsedDirective directive, SourceLocation directiveLocation, List<RazorDiagnostic> errors)
  5607. + private void OtherParserBlock(in SyntaxListBuilder<RazorSyntaxNode> builder)
  5608. {
  5609. - var text = directive.DirectiveText;
  5610. - var lookupStrings = text?.Split(new[] { ',' });
  5611. + // When transitioning to the HTML parser we no longer want to act as if we're in a nested C# state.
  5612. + // For instance, if <div>@hello.</div> is in a nested C# block we don't want the trailing '.' to be handled
  5613. + // as C#; it should be handled as a period because it's wrapped in markup.
  5614. + var wasNested = IsNested;
  5615. + IsNested = false;
  5616. - // Ensure that we have valid lookupStrings to work with. The valid format is "typeName, assemblyName"
  5617. - if (lookupStrings == null ||
  5618. - lookupStrings.Any(string.IsNullOrWhiteSpace) ||
  5619. - lookupStrings.Length != 2 ||
  5620. - text.StartsWith("'") ||
  5621. - text.EndsWith("'"))
  5622. + RazorSyntaxNode htmlBlock = null;
  5623. + using (PushSpanContextConfig())
  5624. {
  5625. - errors.Add(
  5626. - RazorDiagnosticFactory.CreateParsing_InvalidTagHelperLookupText(
  5627. - new SourceSpan(directiveLocation, Math.Max(text.Length, 1)), text));
  5628. -
  5629. - return directive;
  5630. + htmlBlock = HtmlParser.ParseBlock();
  5631. }
  5632. - var trimmedAssemblyName = lookupStrings[1].Trim();
  5633. -
  5634. - // + 1 is for the comma separator in the lookup text.
  5635. - var assemblyNameIndex =
  5636. - lookupStrings[0].Length + 1 + lookupStrings[1].IndexOf(trimmedAssemblyName, StringComparison.Ordinal);
  5637. - var assemblyNamePrefix = directive.DirectiveText.Substring(0, assemblyNameIndex);
  5638. -
  5639. - directive.TypePattern = lookupStrings[0].Trim();
  5640. - directive.AssemblyName = trimmedAssemblyName;
  5641. + builder.Add(htmlBlock);
  5642. + InitializeContext(SpanContext);
  5643. - return directive;
  5644. + IsNested = wasNested;
  5645. + NextToken();
  5646. }
  5647. - protected virtual void AddTagHelperDirective()
  5648. + private bool Balance(SyntaxListBuilder<RazorSyntaxNode> builder, BalancingModes mode)
  5649. {
  5650. - TagHelperDirective(
  5651. - SyntaxConstants.CSharp.AddTagHelperKeyword,
  5652. - (lookupText, errors) =>
  5653. - {
  5654. - var parsedDirective = ParseDirective(lookupText, Span.Start, TagHelperDirectiveType.AddTagHelper, errors);
  5655. + var left = CurrentToken.Kind;
  5656. + var right = Language.FlipBracket(left);
  5657. + var start = CurrentStart;
  5658. + AcceptAndMoveNext();
  5659. + if (EndOfFile && ((mode & BalancingModes.NoErrorOnFailure) != BalancingModes.NoErrorOnFailure))
  5660. + {
  5661. + Context.ErrorSink.OnError(
  5662. + RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF(
  5663. + new SourceSpan(start, contentLength: 1 /* { OR } */),
  5664. + Language.GetSample(left),
  5665. + Language.GetSample(right)));
  5666. + }
  5667. - return new AddTagHelperChunkGenerator(
  5668. - lookupText,
  5669. - parsedDirective.DirectiveText,
  5670. - parsedDirective.TypePattern,
  5671. - parsedDirective.AssemblyName,
  5672. - errors);
  5673. - });
  5674. + return Balance(builder, mode, left, right, start);
  5675. }
  5676. - protected virtual void RemoveTagHelperDirective()
  5677. + private bool Balance(SyntaxListBuilder<RazorSyntaxNode> builder, BalancingModes mode, SyntaxKind left, SyntaxKind right, SourceLocation start)
  5678. {
  5679. - TagHelperDirective(
  5680. - SyntaxConstants.CSharp.RemoveTagHelperKeyword,
  5681. - (lookupText, errors) =>
  5682. + var startPosition = CurrentStart.AbsoluteIndex;
  5683. + var nesting = 1;
  5684. + if (!EndOfFile)
  5685. + {
  5686. + var tokens = new List<SyntaxToken>();
  5687. + do
  5688. {
  5689. - var parsedDirective = ParseDirective(lookupText, Span.Start, TagHelperDirectiveType.RemoveTagHelper, errors);
  5690. + if (IsAtEmbeddedTransition(
  5691. + (mode & BalancingModes.AllowCommentsAndTemplates) == BalancingModes.AllowCommentsAndTemplates,
  5692. + (mode & BalancingModes.AllowEmbeddedTransitions) == BalancingModes.AllowEmbeddedTransitions))
  5693. + {
  5694. + Accept(tokens);
  5695. + tokens.Clear();
  5696. + ParseEmbeddedTransition(builder);
  5697. - return new RemoveTagHelperChunkGenerator(
  5698. - lookupText,
  5699. - parsedDirective.DirectiveText,
  5700. - parsedDirective.TypePattern,
  5701. - parsedDirective.AssemblyName,
  5702. - errors);
  5703. - });
  5704. + // Reset backtracking since we've already outputted some spans.
  5705. + startPosition = CurrentStart.AbsoluteIndex;
  5706. + }
  5707. + if (At(left))
  5708. + {
  5709. + nesting++;
  5710. + }
  5711. + else if (At(right))
  5712. + {
  5713. + nesting--;
  5714. + }
  5715. + if (nesting > 0)
  5716. + {
  5717. + tokens.Add(CurrentToken);
  5718. + }
  5719. + }
  5720. + while (nesting > 0 && NextToken());
  5721. +
  5722. + if (nesting > 0)
  5723. + {
  5724. + if ((mode & BalancingModes.NoErrorOnFailure) != BalancingModes.NoErrorOnFailure)
  5725. + {
  5726. + Context.ErrorSink.OnError(
  5727. + RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF(
  5728. + new SourceSpan(start, contentLength: 1 /* { OR } */),
  5729. + Language.GetSample(left),
  5730. + Language.GetSample(right)));
  5731. + }
  5732. + if ((mode & BalancingModes.BacktrackOnFailure) == BalancingModes.BacktrackOnFailure)
  5733. + {
  5734. + Context.Source.Position = startPosition;
  5735. + NextToken();
  5736. + }
  5737. + else
  5738. + {
  5739. + Accept(tokens);
  5740. + }
  5741. + }
  5742. + else
  5743. + {
  5744. + // Accept all the tokens we saw
  5745. + Accept(tokens);
  5746. + }
  5747. + }
  5748. + return nesting == 0;
  5749. }
  5750. - [Conditional("DEBUG")]
  5751. - protected void AssertDirective(string directive)
  5752. + private bool IsAtEmbeddedTransition(bool allowTemplatesAndComments, bool allowTransitions)
  5753. {
  5754. - Debug.Assert(CurrentToken.Kind == SyntaxKind.Identifier || CurrentToken.Kind == SyntaxKind.Keyword);
  5755. - Debug.Assert(string.Equals(CurrentToken.Content, directive, StringComparison.Ordinal));
  5756. + // No embedded transitions in C#, so ignore that param
  5757. + return allowTemplatesAndComments
  5758. + && ((Language.IsTransition(CurrentToken)
  5759. + && NextIs(SyntaxKind.LessThan, SyntaxKind.Colon, SyntaxKind.DoubleColon))
  5760. + || Language.IsCommentStart(CurrentToken));
  5761. }
  5762. - private void TagHelperDirective(string keyword, Func<string, List<RazorDiagnostic>, ISpanChunkGenerator> chunkGeneratorFactory)
  5763. + private void ParseEmbeddedTransition(in SyntaxListBuilder<RazorSyntaxNode> builder)
  5764. {
  5765. - AssertDirective(keyword);
  5766. -
  5767. - var savedErrorSink = Context.ErrorSink;
  5768. - var directiveErrorSink = new ErrorSink();
  5769. - Context.ErrorSink = directiveErrorSink;
  5770. -
  5771. - string directiveValue = null;
  5772. - try
  5773. + if (Language.IsTransition(CurrentToken))
  5774. {
  5775. - EnsureDirectiveIsAtStartOfLine();
  5776. -
  5777. - var keywordStartLocation = CurrentStart;
  5778. -
  5779. - // Accept the directive name
  5780. - AcceptAndMoveNext();
  5781. -
  5782. - // Set the block type
  5783. - Context.Builder.CurrentBlock.Type = BlockKindInternal.Directive;
  5784. -
  5785. - var keywordLength = Span.End.AbsoluteIndex - Span.Start.AbsoluteIndex;
  5786. -
  5787. - var foundWhitespace = At(SyntaxKind.Whitespace);
  5788. -
  5789. - // If we found whitespace then any content placed within the whitespace MAY cause a destructive change
  5790. - // to the document. We can't accept it.
  5791. - var acceptedCharacters = foundWhitespace ? AcceptedCharactersInternal.None : AcceptedCharactersInternal.AnyExceptNewline;
  5792. - Output(SpanKindInternal.MetaCode, acceptedCharacters);
  5793. -
  5794. - AcceptWhile(SyntaxKind.Whitespace);
  5795. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  5796. - Output(SpanKindInternal.Markup, acceptedCharacters);
  5797. -
  5798. - if (EndOfFile || At(SyntaxKind.NewLine))
  5799. + PutCurrentBack();
  5800. + ParseTemplate(builder);
  5801. + }
  5802. + else if (Language.IsCommentStart(CurrentToken))
  5803. + {
  5804. + // Output tokens before parsing the comment.
  5805. + AcceptMarkerTokenIfNecessary();
  5806. + if (SpanContext.ChunkGenerator is ExpressionChunkGenerator)
  5807. {
  5808. - Context.ErrorSink.OnError(
  5809. - RazorDiagnosticFactory.CreateParsing_DirectiveMustHaveValue(
  5810. - new SourceSpan(keywordStartLocation, keywordLength), keyword));
  5811. -
  5812. - directiveValue = string.Empty;
  5813. + builder.Add(OutputTokensAsExpressionLiteral());
  5814. }
  5815. else
  5816. {
  5817. - // Need to grab the current location before we accept until the end of the line.
  5818. - var startLocation = CurrentStart;
  5819. -
  5820. - // Parse to the end of the line. Essentially accepts anything until end of line, comments, invalid code
  5821. - // etc.
  5822. - AcceptUntil(SyntaxKind.NewLine);
  5823. + builder.Add(OutputTokensAsStatementLiteral());
  5824. + }
  5825. - // Pull out the value and remove whitespaces and optional quotes
  5826. - var rawValue = string.Concat(Span.Tokens.Select(s => s.Content)).Trim();
  5827. + var comment = ParseRazorComment();
  5828. + builder.Add(comment);
  5829. + }
  5830. + }
  5831. - var startsWithQuote = rawValue.StartsWith("\"", StringComparison.Ordinal);
  5832. - var endsWithQuote = rawValue.EndsWith("\"", StringComparison.Ordinal);
  5833. - if (startsWithQuote != endsWithQuote)
  5834. - {
  5835. - Context.ErrorSink.OnError(
  5836. - RazorDiagnosticFactory.CreateParsing_IncompleteQuotesAroundDirective(
  5837. - new SourceSpan(startLocation, rawValue.Length), keyword));
  5838. - }
  5839. + [Conditional("DEBUG")]
  5840. + internal void Assert(CSharpKeyword expectedKeyword)
  5841. + {
  5842. + var result = CSharpTokenizer.GetTokenKeyword(CurrentToken);
  5843. + Debug.Assert(CurrentToken.Kind == SyntaxKind.Keyword &&
  5844. + result.HasValue &&
  5845. + result.Value == expectedKeyword);
  5846. + }
  5847. - directiveValue = rawValue;
  5848. - }
  5849. - }
  5850. - finally
  5851. - {
  5852. - Span.ChunkGenerator = chunkGeneratorFactory(directiveValue, directiveErrorSink.Errors.ToList());
  5853. - Context.ErrorSink = savedErrorSink;
  5854. - }
  5855. + protected internal bool At(CSharpKeyword keyword)
  5856. + {
  5857. + var result = CSharpTokenizer.GetTokenKeyword(CurrentToken);
  5858. + return At(SyntaxKind.Keyword) &&
  5859. + result.HasValue &&
  5860. + result.Value == keyword;
  5861. + }
  5862. - // Output the span and finish the block
  5863. - CompleteBlock();
  5864. - Output(SpanKindInternal.Code, AcceptedCharactersInternal.AnyExceptNewline);
  5865. + protected static Func<SyntaxToken, bool> IsSpacingToken(bool includeNewLines, bool includeComments)
  5866. + {
  5867. + return token => token.Kind == SyntaxKind.Whitespace ||
  5868. + (includeNewLines && token.Kind == SyntaxKind.NewLine) ||
  5869. + (includeComments && token.Kind == SyntaxKind.CSharpComment);
  5870. }
  5871. protected class Block
  5872. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/CSharpLanguageCharacteristics.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/CSharpLanguageCharacteristics.cs
  5873. index e8144cbc0e3..3a017b54de5 100644
  5874. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/CSharpLanguageCharacteristics.cs
  5875. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/CSharpLanguageCharacteristics.cs
  5876. @@ -114,7 +114,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  5877. public override SyntaxToken CreateMarkerToken()
  5878. {
  5879. - return SyntaxFactory.Token(SyntaxKind.Unknown, string.Empty);
  5880. + return SyntaxFactory.Token(SyntaxKind.Marker, string.Empty);
  5881. }
  5882. public override SyntaxKind GetKnownTokenType(KnownTokenType type)
  5883. @@ -127,7 +127,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  5884. return SyntaxKind.Keyword;
  5885. case KnownTokenType.NewLine:
  5886. return SyntaxKind.NewLine;
  5887. - case KnownTokenType.WhiteSpace:
  5888. + case KnownTokenType.Whitespace:
  5889. return SyntaxKind.Whitespace;
  5890. case KnownTokenType.Transition:
  5891. return SyntaxKind.Transition;
  5892. @@ -138,7 +138,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  5893. case KnownTokenType.CommentBody:
  5894. return SyntaxKind.RazorCommentLiteral;
  5895. default:
  5896. - return SyntaxKind.Unknown;
  5897. + return SyntaxKind.Marker;
  5898. }
  5899. }
  5900. @@ -164,7 +164,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  5901. return SyntaxKind.LessThan;
  5902. default:
  5903. Debug.Fail("FlipBracket must be called with a bracket character");
  5904. - return SyntaxKind.Unknown;
  5905. + return SyntaxKind.Marker;
  5906. }
  5907. }
  5908. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/CSharpTokenizer.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/CSharpTokenizer.cs
  5909. index 8d29ab0fea0..21cd0dc00bc 100644
  5910. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/CSharpTokenizer.cs
  5911. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/CSharpTokenizer.cs
  5912. @@ -458,7 +458,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  5913. {
  5914. return handler();
  5915. }
  5916. - return SyntaxKind.Unknown;
  5917. + return SyntaxKind.Marker;
  5918. }
  5919. private SyntaxKind LessThanOperator()
  5920. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/ChunkGeneratorContext.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/ChunkGeneratorContext.cs
  5921. deleted file mode 100644
  5922. index b4a4a4782e6..00000000000
  5923. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/ChunkGeneratorContext.cs
  5924. +++ /dev/null
  5925. @@ -1,25 +0,0 @@
  5926. -// Copyright (c) .NET Foundation. All rights reserved.
  5927. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  5928. -
  5929. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  5930. -{
  5931. - internal class ChunkGeneratorContext
  5932. - {
  5933. - public ChunkGeneratorContext(
  5934. - string className,
  5935. - string rootNamespace,
  5936. - string sourceFile,
  5937. - bool shouldGenerateLinePragmas)
  5938. - {
  5939. - SourceFile = shouldGenerateLinePragmas ? sourceFile : null;
  5940. - RootNamespace = rootNamespace;
  5941. - ClassName = className;
  5942. - }
  5943. -
  5944. - public string SourceFile { get; internal set; }
  5945. -
  5946. - public string RootNamespace { get; }
  5947. -
  5948. - public string ClassName { get; }
  5949. - }
  5950. -}
  5951. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/CodeBlockEditHandler.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/CodeBlockEditHandler.cs
  5952. index 89d1f3d6c6e..8ecbd859068 100644
  5953. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/CodeBlockEditHandler.cs
  5954. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/CodeBlockEditHandler.cs
  5955. @@ -4,17 +4,17 @@
  5956. using System;
  5957. using System.Collections.Generic;
  5958. using System.Globalization;
  5959. -using Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax;
  5960. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  5961. namespace Microsoft.AspNetCore.Razor.Language.Legacy
  5962. {
  5963. internal class CodeBlockEditHandler : SpanEditHandler
  5964. {
  5965. - public CodeBlockEditHandler(Func<string, IEnumerable<SyntaxToken>> tokenizer) : base(tokenizer)
  5966. + public CodeBlockEditHandler(Func<string, IEnumerable<Syntax.InternalSyntax.SyntaxToken>> tokenizer) : base(tokenizer)
  5967. {
  5968. }
  5969. - protected override PartialParseResultInternal CanAcceptChange(Span target, SourceChange change)
  5970. + protected override PartialParseResultInternal CanAcceptChange(SyntaxNode target, SourceChange change)
  5971. {
  5972. if (IsAcceptableDeletion(target, change))
  5973. {
  5974. @@ -35,7 +35,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  5975. }
  5976. // Internal for testing
  5977. - internal static bool IsAcceptableReplacement(Span target, SourceChange change)
  5978. + internal static bool IsAcceptableReplacement(SyntaxNode target, SourceChange change)
  5979. {
  5980. if (!change.IsReplace)
  5981. {
  5982. @@ -56,7 +56,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  5983. }
  5984. // Internal for testing
  5985. - internal static bool IsAcceptableDeletion(Span target, SourceChange change)
  5986. + internal static bool IsAcceptableDeletion(SyntaxNode target, SourceChange change)
  5987. {
  5988. if (!change.IsDelete)
  5989. {
  5990. @@ -72,11 +72,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  5991. }
  5992. // Internal for testing
  5993. - internal static bool ModifiesInvalidContent(Span target, SourceChange change)
  5994. + internal static bool ModifiesInvalidContent(SyntaxNode target, SourceChange change)
  5995. {
  5996. - var relativePosition = change.Span.AbsoluteIndex - target.Start.AbsoluteIndex;
  5997. + var relativePosition = change.Span.AbsoluteIndex - target.Position;
  5998. - if (target.Content.IndexOfAny(new[] { '{', '}' }, relativePosition, change.Span.Length) >= 0)
  5999. + if (target.GetContent().IndexOfAny(new[] { '{', '}' }, relativePosition, change.Span.Length) >= 0)
  6000. {
  6001. return true;
  6002. }
  6003. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/ConditionalAttributeCollapser.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/ConditionalAttributeCollapser.cs
  6004. deleted file mode 100644
  6005. index 4fa89603dce..00000000000
  6006. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/ConditionalAttributeCollapser.cs
  6007. +++ /dev/null
  6008. @@ -1,67 +0,0 @@
  6009. -// Copyright (c) .NET Foundation. All rights reserved.
  6010. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  6011. -
  6012. -using System.Diagnostics;
  6013. -using System.Text;
  6014. -
  6015. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  6016. -{
  6017. - internal class ConditionalAttributeCollapser : MarkupRewriter
  6018. - {
  6019. - protected override bool CanRewrite(Block block)
  6020. - {
  6021. - var generator = block.ChunkGenerator as AttributeBlockChunkGenerator;
  6022. - if (generator != null && block.Children.Count > 0)
  6023. - {
  6024. - // Perf: Avoid allocating an enumerator.
  6025. - for (var i = 0; i < block.Children.Count; i++)
  6026. - {
  6027. - if (!IsLiteralAttributeValue(block.Children[i]))
  6028. - {
  6029. - return false;
  6030. - }
  6031. - }
  6032. -
  6033. - return true;
  6034. - }
  6035. -
  6036. - return false;
  6037. - }
  6038. -
  6039. - protected override SyntaxTreeNode RewriteBlock(BlockBuilder parent, Block block)
  6040. - {
  6041. - // Collect the content of this node
  6042. - var builder = new StringBuilder();
  6043. - for (var i = 0; i < block.Children.Count; i++)
  6044. - {
  6045. - var childSpan = (Span)block.Children[i];
  6046. - builder.Append(childSpan.Content);
  6047. - }
  6048. -
  6049. - // Create a new span containing this content
  6050. - var span = new SpanBuilder(block.Children[0].Start);
  6051. -
  6052. - span.EditHandler = SpanEditHandler.CreateDefault(HtmlLanguageCharacteristics.Instance.TokenizeString);
  6053. - Debug.Assert(block.Children.Count > 0);
  6054. - var start = ((Span)block.Children[0]).Start;
  6055. - FillSpan(span, start, builder.ToString());
  6056. - return span.Build();
  6057. - }
  6058. -
  6059. - private bool IsLiteralAttributeValue(SyntaxTreeNode node)
  6060. - {
  6061. - if (node.IsBlock)
  6062. - {
  6063. - return false;
  6064. - }
  6065. -
  6066. - var span = node as Span;
  6067. - Debug.Assert(span != null);
  6068. -
  6069. - return span != null &&
  6070. - (span.ChunkGenerator is LiteralAttributeChunkGenerator ||
  6071. - span.ChunkGenerator is MarkupChunkGenerator ||
  6072. - span.ChunkGenerator == SpanChunkGenerator.Null);
  6073. - }
  6074. - }
  6075. -}
  6076. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/DirectiveChunkGenerator.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/DirectiveChunkGenerator.cs
  6077. deleted file mode 100644
  6078. index 19a6bad4637..00000000000
  6079. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/DirectiveChunkGenerator.cs
  6080. +++ /dev/null
  6081. @@ -1,82 +0,0 @@
  6082. -// Copyright(c) .NET Foundation.All rights reserved.
  6083. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  6084. -
  6085. -using System;
  6086. -using System.Collections.Generic;
  6087. -using System.Linq;
  6088. -using System.Text;
  6089. -using Microsoft.Extensions.Internal;
  6090. -
  6091. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  6092. -{
  6093. - internal class DirectiveChunkGenerator : ParentChunkGenerator
  6094. - {
  6095. - private static readonly Type Type = typeof(DirectiveChunkGenerator);
  6096. - private List<RazorDiagnostic> _diagnostics;
  6097. -
  6098. - public DirectiveChunkGenerator(DirectiveDescriptor descriptor)
  6099. - {
  6100. - Descriptor = descriptor;
  6101. - }
  6102. -
  6103. - public DirectiveDescriptor Descriptor { get; }
  6104. -
  6105. - public List<RazorDiagnostic> Diagnostics
  6106. - {
  6107. - get
  6108. - {
  6109. - if (_diagnostics == null)
  6110. - {
  6111. - _diagnostics = new List<RazorDiagnostic>();
  6112. - }
  6113. -
  6114. - return _diagnostics;
  6115. - }
  6116. - }
  6117. -
  6118. - public override void Accept(ParserVisitor visitor, Block block)
  6119. - {
  6120. - visitor.VisitDirectiveBlock(this, block);
  6121. - }
  6122. -
  6123. - public override bool Equals(object obj)
  6124. - {
  6125. - var other = obj as DirectiveChunkGenerator;
  6126. - return base.Equals(other) &&
  6127. - Enumerable.SequenceEqual(Diagnostics, other.Diagnostics) &&
  6128. - DirectiveDescriptorComparer.Default.Equals(Descriptor, other.Descriptor);
  6129. - }
  6130. -
  6131. - public override int GetHashCode()
  6132. - {
  6133. - var combiner = HashCodeCombiner.Start();
  6134. - combiner.Add(base.GetHashCode());
  6135. - combiner.Add(Type);
  6136. -
  6137. - return combiner.CombinedHash;
  6138. - }
  6139. -
  6140. - public override string ToString()
  6141. - {
  6142. - // This is used primarily at test time to show an identifiable representation of the chunk generator.
  6143. -
  6144. - var builder = new StringBuilder("Directive:{");
  6145. - builder.Append(Descriptor.Directive);
  6146. - builder.Append(";");
  6147. - builder.Append(Descriptor.Kind);
  6148. - builder.Append(";");
  6149. - builder.Append(Descriptor.Usage);
  6150. - builder.Append("}");
  6151. -
  6152. - if (Diagnostics.Count > 0)
  6153. - {
  6154. - builder.Append(" [");
  6155. - var ids = string.Join(", ", Diagnostics.Select(diagnostic => $"{diagnostic.Id}{diagnostic.Span}"));
  6156. - builder.Append(ids);
  6157. - builder.Append("]");
  6158. - }
  6159. -
  6160. - return builder.ToString();
  6161. - }
  6162. - }
  6163. -}
  6164. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/DirectiveTokenChunkGenerator.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/DirectiveTokenChunkGenerator.cs
  6165. index 69327ba6e21..ea1095bd5bc 100644
  6166. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/DirectiveTokenChunkGenerator.cs
  6167. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/DirectiveTokenChunkGenerator.cs
  6168. @@ -18,11 +18,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  6169. public DirectiveTokenDescriptor Descriptor { get; }
  6170. - public override void Accept(ParserVisitor visitor, Span span)
  6171. - {
  6172. - visitor.VisitDirectiveToken(this, span);
  6173. - }
  6174. -
  6175. public override bool Equals(object obj)
  6176. {
  6177. var other = obj as DirectiveTokenChunkGenerator;
  6178. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/DynamicAttributeBlockChunkGenerator.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/DynamicAttributeBlockChunkGenerator.cs
  6179. deleted file mode 100644
  6180. index 5b8c31efae2..00000000000
  6181. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/DynamicAttributeBlockChunkGenerator.cs
  6182. +++ /dev/null
  6183. @@ -1,60 +0,0 @@
  6184. -// Copyright (c) .NET Foundation. All rights reserved.
  6185. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  6186. -
  6187. -using System;
  6188. -using System.Globalization;
  6189. -
  6190. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  6191. -{
  6192. - internal class DynamicAttributeBlockChunkGenerator : ParentChunkGenerator
  6193. - {
  6194. - public DynamicAttributeBlockChunkGenerator(LocationTagged<string> prefix, int offset, int line, int col)
  6195. - : this(prefix, new SourceLocation(offset, line, col))
  6196. - {
  6197. - }
  6198. -
  6199. - public DynamicAttributeBlockChunkGenerator(LocationTagged<string> prefix, SourceLocation valueStart)
  6200. - {
  6201. - Prefix = prefix;
  6202. - ValueStart = valueStart;
  6203. - }
  6204. -
  6205. - public LocationTagged<string> Prefix { get; }
  6206. -
  6207. - public SourceLocation ValueStart { get; }
  6208. -
  6209. - public override void Accept(ParserVisitor visitor, Block block)
  6210. - {
  6211. - visitor.VisitDynamicAttributeBlock(this, block);
  6212. - }
  6213. -
  6214. - public override void GenerateStartParentChunk(Block target, ChunkGeneratorContext context)
  6215. - {
  6216. - //var chunk = context.ChunkTreeBuilder.StartParentChunk<DynamicCodeAttributeChunk>(target);
  6217. - //chunk.Start = ValueStart;
  6218. - //chunk.Prefix = Prefix;
  6219. - }
  6220. -
  6221. - public override void GenerateEndParentChunk(Block target, ChunkGeneratorContext context)
  6222. - {
  6223. - //context.ChunkTreeBuilder.EndParentChunk();
  6224. - }
  6225. -
  6226. - public override string ToString()
  6227. - {
  6228. - return string.Format(CultureInfo.CurrentCulture, "DynAttr:{0:F}", Prefix);
  6229. - }
  6230. -
  6231. - public override bool Equals(object obj)
  6232. - {
  6233. - var other = obj as DynamicAttributeBlockChunkGenerator;
  6234. - return other != null &&
  6235. - Equals(other.Prefix, Prefix);
  6236. - }
  6237. -
  6238. - public override int GetHashCode()
  6239. - {
  6240. - return Prefix == null ? 0 : Prefix.GetHashCode();
  6241. - }
  6242. - }
  6243. -}
  6244. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/EditResult.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/EditResult.cs
  6245. index 6aff8dea249..13dfb20a716 100644
  6246. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/EditResult.cs
  6247. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/EditResult.cs
  6248. @@ -1,17 +1,19 @@
  6249. // Copyright (c) .NET Foundation. All rights reserved.
  6250. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  6251. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  6252. +
  6253. namespace Microsoft.AspNetCore.Razor.Language.Legacy
  6254. {
  6255. internal class EditResult
  6256. {
  6257. - public EditResult(PartialParseResultInternal result, SpanBuilder editedSpan)
  6258. + public EditResult(PartialParseResultInternal result, SyntaxNode editedNode)
  6259. {
  6260. Result = result;
  6261. - EditedSpan = editedSpan;
  6262. + EditedNode = editedNode;
  6263. }
  6264. public PartialParseResultInternal Result { get; set; }
  6265. - public SpanBuilder EditedSpan { get; set; }
  6266. + public SyntaxNode EditedNode { get; set; }
  6267. }
  6268. }
  6269. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/ExpressionChunkGenerator.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/ExpressionChunkGenerator.cs
  6270. index fd2ef3ab91b..24eb488c1e4 100644
  6271. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/ExpressionChunkGenerator.cs
  6272. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/ExpressionChunkGenerator.cs
  6273. @@ -5,35 +5,10 @@ using System;
  6274. namespace Microsoft.AspNetCore.Razor.Language.Legacy
  6275. {
  6276. - internal class ExpressionChunkGenerator : ISpanChunkGenerator, IParentChunkGenerator
  6277. + internal class ExpressionChunkGenerator : ISpanChunkGenerator
  6278. {
  6279. private static readonly int TypeHashCode = typeof(ExpressionChunkGenerator).GetHashCode();
  6280. - public void GenerateStartParentChunk(Block target, ChunkGeneratorContext context)
  6281. - {
  6282. - //context.ChunkTreeBuilder.StartParentChunk<ExpressionBlockChunk>(target);
  6283. - }
  6284. -
  6285. - public void GenerateChunk(Span target, ChunkGeneratorContext context)
  6286. - {
  6287. - //context.ChunkTreeBuilder.AddExpressionChunk(target.Content, target);
  6288. - }
  6289. -
  6290. - public void GenerateEndParentChunk(Block target, ChunkGeneratorContext context)
  6291. - {
  6292. - //context.ChunkTreeBuilder.EndParentChunk();
  6293. - }
  6294. -
  6295. - public void Accept(ParserVisitor visitor, Span span)
  6296. - {
  6297. - visitor.VisitExpressionSpan(this, span);
  6298. - }
  6299. -
  6300. - public void Accept(ParserVisitor visitor, Block block)
  6301. - {
  6302. - visitor.VisitExpressionBlock(this, block);
  6303. - }
  6304. -
  6305. public override string ToString()
  6306. {
  6307. return "Expr";
  6308. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/HtmlLanguageCharacteristics.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/HtmlLanguageCharacteristics.cs
  6309. index c404183ed06..5efd2b80a5f 100644
  6310. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/HtmlLanguageCharacteristics.cs
  6311. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/HtmlLanguageCharacteristics.cs
  6312. @@ -86,13 +86,13 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  6313. return SyntaxKind.OpenAngle;
  6314. default:
  6315. Debug.Fail("FlipBracket must be called with a bracket character");
  6316. - return SyntaxKind.Unknown;
  6317. + return SyntaxKind.Marker;
  6318. }
  6319. }
  6320. public override SyntaxToken CreateMarkerToken()
  6321. {
  6322. - return SyntaxFactory.Token(SyntaxKind.Unknown, string.Empty);
  6323. + return SyntaxFactory.Token(SyntaxKind.Marker, string.Empty);
  6324. }
  6325. public override SyntaxKind GetKnownTokenType(KnownTokenType type)
  6326. @@ -113,10 +113,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  6327. return SyntaxKind.NewLine;
  6328. case KnownTokenType.Transition:
  6329. return SyntaxKind.Transition;
  6330. - case KnownTokenType.WhiteSpace:
  6331. + case KnownTokenType.Whitespace:
  6332. return SyntaxKind.Whitespace;
  6333. default:
  6334. - return SyntaxKind.Unknown;
  6335. + return SyntaxKind.Marker;
  6336. }
  6337. }
  6338. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/HtmlMarkupParser.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/HtmlMarkupParser.cs
  6339. index efc0d275981..f06c8db1bcc 100644
  6340. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/HtmlMarkupParser.cs
  6341. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/HtmlMarkupParser.cs
  6342. @@ -19,10 +19,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  6343. SyntaxFactory.Token(SyntaxKind.Bang, "!"),
  6344. SyntaxFactory.Token(SyntaxKind.OpenAngle, "<"),
  6345. };
  6346. - private static readonly SyntaxToken[] singleHyphenArray = new[]
  6347. - {
  6348. - SyntaxFactory.Token(SyntaxKind.Text, "-")
  6349. - };
  6350. private static readonly char[] ValidAfterTypeAttributeNameCharacters = { ' ', '\t', '\r', '\n', '\f', '=' };
  6351. private SourceLocation _lastTagStart = SourceLocation.Zero;
  6352. @@ -54,7 +50,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  6353. {
  6354. }
  6355. - public ParserBase CodeParser { get; set; }
  6356. + public CSharpCodeParser CodeParser { get; set; }
  6357. public ISet<string> VoidElements
  6358. {
  6359. @@ -68,26 +64,57 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  6360. get { return CaseSensitive ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase; }
  6361. }
  6362. - protected override bool TokenKindEquals(SyntaxKind x, SyntaxKind y) => x == y;
  6363. -
  6364. - public override void BuildSpan(SpanBuilder span, SourceLocation start, string content)
  6365. + // Special tags include <!--, <!DOCTYPE, <![CDATA and <? tags
  6366. + private bool AtSpecialTag
  6367. {
  6368. - span.Kind = SpanKindInternal.Markup;
  6369. - span.ChunkGenerator = new MarkupChunkGenerator();
  6370. - base.BuildSpan(span, start, content);
  6371. + get
  6372. + {
  6373. + if (At(SyntaxKind.OpenAngle))
  6374. + {
  6375. + if (NextIs(SyntaxKind.Bang))
  6376. + {
  6377. + return !IsBangEscape(lookahead: 1);
  6378. + }
  6379. +
  6380. + return NextIs(SyntaxKind.QuestionMark);
  6381. + }
  6382. +
  6383. + return false;
  6384. + }
  6385. }
  6386. - protected override void OutputSpanBeforeRazorComment()
  6387. + public RazorDocumentSyntax ParseDocument()
  6388. {
  6389. - Output(SpanKindInternal.Markup);
  6390. + if (Context == null)
  6391. + {
  6392. + throw new InvalidOperationException(Resources.Parser_Context_Not_Set);
  6393. + }
  6394. +
  6395. + using (var pooledResult = Pool.Allocate<RazorSyntaxNode>())
  6396. + using (PushSpanContextConfig(DefaultMarkupSpanContext))
  6397. + {
  6398. + var builder = pooledResult.Builder;
  6399. + NextToken();
  6400. + while (!EndOfFile)
  6401. + {
  6402. + SkipToAndParseCode(builder, SyntaxKind.OpenAngle);
  6403. + ParseTagInDocumentContext(builder);
  6404. + }
  6405. + AcceptMarkerTokenIfNecessary();
  6406. + builder.Add(OutputAsMarkupLiteral());
  6407. +
  6408. + var markup = SyntaxFactory.MarkupBlock(builder.ToList());
  6409. +
  6410. + return SyntaxFactory.RazorDocument(markup);
  6411. + }
  6412. }
  6413. - protected void SkipToAndParseCode(SyntaxKind type)
  6414. + private void SkipToAndParseCode(in SyntaxListBuilder<RazorSyntaxNode> builder, SyntaxKind type)
  6415. {
  6416. - SkipToAndParseCode(token => token.Kind == type);
  6417. + SkipToAndParseCode(builder, token => token.Kind == type);
  6418. }
  6419. - protected void SkipToAndParseCode(Func<SyntaxToken, bool> condition)
  6420. + private void SkipToAndParseCode(in SyntaxListBuilder<RazorSyntaxNode> builder, Func<SyntaxToken, bool> condition)
  6421. {
  6422. SyntaxToken last = null;
  6423. var startOfLine = false;
  6424. @@ -96,14 +123,14 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  6425. if (Context.NullGenerateWhitespaceAndNewLine)
  6426. {
  6427. Context.NullGenerateWhitespaceAndNewLine = false;
  6428. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  6429. + SpanContext.ChunkGenerator = SpanChunkGenerator.Null;
  6430. AcceptWhile(token => token.Kind == SyntaxKind.Whitespace);
  6431. if (At(SyntaxKind.NewLine))
  6432. {
  6433. AcceptAndMoveNext();
  6434. }
  6435. - Output(SpanKindInternal.Markup);
  6436. + builder.Add(OutputAsMarkupEphemeralLiteral());
  6437. }
  6438. else if (At(SyntaxKind.NewLine))
  6439. {
  6440. @@ -128,10 +155,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  6441. Accept(last);
  6442. last = null;
  6443. }
  6444. - Output(SpanKindInternal.Markup);
  6445. + builder.Add(OutputAsMarkupLiteral());
  6446. Accept(transition);
  6447. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  6448. - Output(SpanKindInternal.Markup);
  6449. + SpanContext.ChunkGenerator = SpanChunkGenerator.Null;
  6450. + builder.Add(OutputAsMarkupEphemeralLiteral());
  6451. AcceptAndMoveNext();
  6452. continue; // while
  6453. }
  6454. @@ -162,30 +189,40 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  6455. }
  6456. }
  6457. - OtherParserBlock();
  6458. + OtherParserBlock(builder);
  6459. }
  6460. else if (At(SyntaxKind.RazorCommentTransition))
  6461. {
  6462. + var shouldRenderWhitespace = true;
  6463. if (last != null)
  6464. {
  6465. // Don't render the whitespace between the start of the line and the razor comment.
  6466. if (startOfLine && last.Kind == SyntaxKind.Whitespace)
  6467. {
  6468. - AddMarkerTokenIfNecessary();
  6469. + AcceptMarkerTokenIfNecessary();
  6470. // Output the tokens that may have been accepted prior to the whitespace.
  6471. - Output(SpanKindInternal.Markup);
  6472. + builder.Add(OutputAsMarkupLiteral());
  6473. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  6474. + SpanContext.ChunkGenerator = SpanChunkGenerator.Null;
  6475. + shouldRenderWhitespace = false;
  6476. }
  6477. Accept(last);
  6478. last = null;
  6479. }
  6480. - AddMarkerTokenIfNecessary();
  6481. - Output(SpanKindInternal.Markup);
  6482. + AcceptMarkerTokenIfNecessary();
  6483. + if (shouldRenderWhitespace)
  6484. + {
  6485. + builder.Add(OutputAsMarkupLiteral());
  6486. + }
  6487. + else
  6488. + {
  6489. + builder.Add(OutputAsMarkupEphemeralLiteral());
  6490. + }
  6491. - RazorComment();
  6492. + var comment = ParseRazorComment();
  6493. + builder.Add(comment);
  6494. // Handle the whitespace and newline at the end of a razor comment.
  6495. if (startOfLine &&
  6496. @@ -194,8 +231,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  6497. {
  6498. AcceptWhile(IsSpacingToken(includeNewLines: false));
  6499. AcceptAndMoveNext();
  6500. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  6501. - Output(SpanKindInternal.Markup);
  6502. + SpanContext.ChunkGenerator = SpanChunkGenerator.Null;
  6503. + builder.Add(OutputAsMarkupEphemeralLiteral());
  6504. }
  6505. }
  6506. else
  6507. @@ -222,282 +259,461 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  6508. }
  6509. }
  6510. - protected static Func<SyntaxToken, bool> IsSpacingToken(bool includeNewLines)
  6511. - {
  6512. - return token => token.Kind == SyntaxKind.Whitespace || (includeNewLines && token.Kind == SyntaxKind.NewLine);
  6513. - }
  6514. -
  6515. - private void OtherParserBlock()
  6516. - {
  6517. - AddMarkerTokenIfNecessary();
  6518. - Output(SpanKindInternal.Markup);
  6519. -
  6520. - using (PushSpanConfig())
  6521. - {
  6522. - CodeParser.ParseBlock();
  6523. - }
  6524. -
  6525. - Span.Start = CurrentLocation;
  6526. - Initialize(Span);
  6527. - NextToken();
  6528. - }
  6529. -
  6530. - private bool IsBangEscape(int lookahead)
  6531. - {
  6532. - var potentialBang = Lookahead(lookahead);
  6533. -
  6534. - if (potentialBang != null &&
  6535. - potentialBang.Kind == SyntaxKind.Bang)
  6536. - {
  6537. - var afterBang = Lookahead(lookahead + 1);
  6538. -
  6539. - return afterBang != null &&
  6540. - afterBang.Kind == SyntaxKind.Text &&
  6541. - !string.Equals(afterBang.Content, "DOCTYPE", StringComparison.OrdinalIgnoreCase);
  6542. - }
  6543. -
  6544. - return false;
  6545. - }
  6546. -
  6547. - private void OptionalBangEscape()
  6548. + /// <summary>
  6549. + /// Reads the content of a tag (if present) in the MarkupDocument (or MarkupSection) context,
  6550. + /// where we don't care about maintaining a stack of tags.
  6551. + /// </summary>
  6552. + private void ParseTagInDocumentContext(in SyntaxListBuilder<RazorSyntaxNode> builder)
  6553. {
  6554. - if (IsBangEscape(lookahead: 0))
  6555. + if (At(SyntaxKind.OpenAngle))
  6556. {
  6557. - Output(SpanKindInternal.Markup);
  6558. -
  6559. - // Accept the parser escape character '!'.
  6560. - Assert(SyntaxKind.Bang);
  6561. - AcceptAndMoveNext();
  6562. + if (NextIs(SyntaxKind.Bang))
  6563. + {
  6564. + // Checking to see if we meet the conditions of a special '!' tag: <!DOCTYPE, <![CDATA[, <!--.
  6565. + if (!IsBangEscape(lookahead: 1))
  6566. + {
  6567. + if (Lookahead(2)?.Kind == SyntaxKind.DoubleHyphen)
  6568. + {
  6569. + builder.Add(OutputAsMarkupLiteral());
  6570. + }
  6571. - // Setup the metacode span that we will be outputing.
  6572. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  6573. - Output(SpanKindInternal.MetaCode, AcceptedCharactersInternal.None);
  6574. - }
  6575. - }
  6576. + AcceptAndMoveNext(); // Accept '<'
  6577. + ParseBangTag(builder);
  6578. - public override void ParseBlock()
  6579. - {
  6580. - if (Context == null)
  6581. - {
  6582. - throw new InvalidOperationException(Resources.Parser_Context_Not_Set);
  6583. - }
  6584. + return;
  6585. + }
  6586. - using (PushSpanConfig(DefaultMarkupSpan))
  6587. - {
  6588. - using (Context.Builder.StartBlock(BlockKindInternal.Markup))
  6589. + // We should behave like a normal tag that has a parser escape, fall through to the normal
  6590. + // tag logic.
  6591. + }
  6592. + else if (NextIs(SyntaxKind.QuestionMark))
  6593. {
  6594. - Span.Start = CurrentLocation;
  6595. + AcceptAndMoveNext(); // Accept '<'
  6596. + TryParseXmlPI(builder);
  6597. + return;
  6598. + }
  6599. - if (!NextToken())
  6600. - {
  6601. - return;
  6602. - }
  6603. + builder.Add(OutputAsMarkupLiteral());
  6604. - AcceptWhile(IsSpacingToken(includeNewLines: true));
  6605. + // Start tag block
  6606. + using (var pooledResult = Pool.Allocate<RazorSyntaxNode>())
  6607. + {
  6608. + var tagBuilder = pooledResult.Builder;
  6609. + AcceptAndMoveNext(); // Accept '<'
  6610. - if (CurrentToken.Kind == SyntaxKind.OpenAngle)
  6611. - {
  6612. - // "<" => Implicit Tag Block
  6613. - TagBlock(new Stack<Tuple<SyntaxToken, SourceLocation>>());
  6614. - }
  6615. - else if (CurrentToken.Kind == SyntaxKind.Transition)
  6616. + if (!At(SyntaxKind.ForwardSlash))
  6617. {
  6618. - // "@" => Explicit Tag/Single Line Block OR Template
  6619. - Output(SpanKindInternal.Markup);
  6620. -
  6621. - // Definitely have a transition span
  6622. - Assert(SyntaxKind.Transition);
  6623. - AcceptAndMoveNext();
  6624. - Span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  6625. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  6626. - Output(SpanKindInternal.Transition);
  6627. - if (At(SyntaxKind.Transition))
  6628. + ParseOptionalBangEscape(tagBuilder);
  6629. +
  6630. + // Parsing a start tag
  6631. + var scriptTag = At(SyntaxKind.Text) &&
  6632. + string.Equals(CurrentToken.Content, "script", StringComparison.OrdinalIgnoreCase);
  6633. + TryAccept(SyntaxKind.Text);
  6634. + ParseTagContent(tagBuilder); // Parse the tag, don't care about the content
  6635. + TryAccept(SyntaxKind.ForwardSlash);
  6636. + TryAccept(SyntaxKind.CloseAngle);
  6637. +
  6638. + // If the script tag expects javascript content then we should do minimal parsing until we reach
  6639. + // the end script tag. Don't want to incorrectly parse a "var tag = '<input />';" as an HTML tag.
  6640. + if (scriptTag && !CurrentScriptTagExpectsHtml(tagBuilder))
  6641. {
  6642. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  6643. - AcceptAndMoveNext();
  6644. - Output(SpanKindInternal.MetaCode);
  6645. + tagBuilder.Add(OutputAsMarkupLiteral());
  6646. + var block = SyntaxFactory.MarkupTagBlock(tagBuilder.ToList());
  6647. + builder.Add(block);
  6648. +
  6649. + SkipToEndScriptAndParseCode(builder);
  6650. + return;
  6651. }
  6652. - AfterTransition();
  6653. }
  6654. else
  6655. {
  6656. - Context.ErrorSink.OnError(
  6657. - RazorDiagnosticFactory.CreateParsing_MarkupBlockMustStartWithTag(
  6658. - new SourceSpan(CurrentStart, CurrentToken.Content.Length)));
  6659. + // Parsing an end tag
  6660. + // This section can accept things like: '</p >' or '</p>' etc.
  6661. + TryAccept(SyntaxKind.ForwardSlash);
  6662. +
  6663. + // Whitespace here is invalid (according to the spec)
  6664. + ParseOptionalBangEscape(tagBuilder);
  6665. + TryAccept(SyntaxKind.Text);
  6666. + TryAccept(SyntaxKind.Whitespace);
  6667. + TryAccept(SyntaxKind.CloseAngle);
  6668. }
  6669. - Output(SpanKindInternal.Markup);
  6670. +
  6671. + tagBuilder.Add(OutputAsMarkupLiteral());
  6672. +
  6673. + // End tag block
  6674. + var tagBlock = SyntaxFactory.MarkupTagBlock(tagBuilder.ToList());
  6675. + builder.Add(tagBlock);
  6676. }
  6677. }
  6678. }
  6679. - private void DefaultMarkupSpan(SpanBuilder span)
  6680. + private void ParseTagContent(in SyntaxListBuilder<RazorSyntaxNode> builder)
  6681. {
  6682. - span.ChunkGenerator = new MarkupChunkGenerator();
  6683. - span.EditHandler = new SpanEditHandler(Language.TokenizeString, AcceptedCharactersInternal.Any);
  6684. + if (!At(SyntaxKind.Whitespace) && !At(SyntaxKind.NewLine))
  6685. + {
  6686. + // We should be right after the tag name, so if there's no whitespace or new line, something is wrong
  6687. + RecoverToEndOfTag(builder);
  6688. + }
  6689. + else
  6690. + {
  6691. + // We are here ($): <tag$ foo="bar" biz="~/Baz" />
  6692. + while (!EndOfFile && !IsEndOfTag())
  6693. + {
  6694. + BeforeAttribute(builder);
  6695. + }
  6696. + }
  6697. }
  6698. - private void AfterTransition()
  6699. + private bool IsEndOfTag()
  6700. {
  6701. - // "@:" => Explicit Single Line Block
  6702. - if (CurrentToken.Kind == SyntaxKind.Text && CurrentToken.Content.Length > 0 && CurrentToken.Content[0] == ':')
  6703. + if (At(SyntaxKind.ForwardSlash))
  6704. {
  6705. - // Split the token
  6706. - var split = Language.SplitToken(CurrentToken, 1, SyntaxKind.Colon);
  6707. -
  6708. - // The first part (left) is added to this span and we return a MetaCode span
  6709. - Accept(split.Item1);
  6710. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  6711. - Output(SpanKindInternal.MetaCode);
  6712. - if (split.Item2 != null)
  6713. + if (NextIs(SyntaxKind.CloseAngle))
  6714. {
  6715. - Accept(split.Item2);
  6716. + return true;
  6717. + }
  6718. + else
  6719. + {
  6720. + AcceptAndMoveNext();
  6721. }
  6722. - NextToken();
  6723. - SingleLineMarkup();
  6724. - }
  6725. - else if (CurrentToken.Kind == SyntaxKind.OpenAngle)
  6726. - {
  6727. - TagBlock(new Stack<Tuple<SyntaxToken, SourceLocation>>());
  6728. }
  6729. + return At(SyntaxKind.CloseAngle) || At(SyntaxKind.OpenAngle);
  6730. }
  6731. - private void SingleLineMarkup()
  6732. + private void BeforeAttribute(in SyntaxListBuilder<RazorSyntaxNode> builder)
  6733. {
  6734. - // Parse until a newline, it's that simple!
  6735. - // First, signal to code parser that whitespace is significant to us.
  6736. - var old = Context.WhiteSpaceIsSignificantToAncestorBlock;
  6737. - Context.WhiteSpaceIsSignificantToAncestorBlock = true;
  6738. - Span.EditHandler = new SpanEditHandler(Language.TokenizeString);
  6739. - SkipToAndParseCode(SyntaxKind.NewLine);
  6740. - if (!EndOfFile && CurrentToken.Kind == SyntaxKind.NewLine)
  6741. + // http://dev.w3.org/html5/spec/tokenization.html#before-attribute-name-state
  6742. + // Capture whitespace
  6743. + var whitespace = ReadWhile(token => token.Kind == SyntaxKind.Whitespace || token.Kind == SyntaxKind.NewLine);
  6744. +
  6745. + if (At(SyntaxKind.Transition) || At(SyntaxKind.RazorCommentTransition))
  6746. {
  6747. - AcceptAndMoveNext();
  6748. - Span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  6749. + // Transition outside of attribute value => Switch to recovery mode
  6750. + Accept(whitespace);
  6751. + RecoverToEndOfTag(builder);
  6752. + return;
  6753. }
  6754. - PutCurrentBack();
  6755. - Context.WhiteSpaceIsSignificantToAncestorBlock = old;
  6756. - Output(SpanKindInternal.Markup);
  6757. - }
  6758. - private void TagBlock(Stack<Tuple<SyntaxToken, SourceLocation>> tags)
  6759. - {
  6760. - // Skip Whitespace and Text
  6761. - var complete = false;
  6762. - do
  6763. + // http://dev.w3.org/html5/spec/tokenization.html#attribute-name-state
  6764. + // Read the 'name' (i.e. read until the '=' or whitespace/newline)
  6765. + var nameTokens = Enumerable.Empty<SyntaxToken>();
  6766. + var whitespaceAfterAttributeName = Enumerable.Empty<SyntaxToken>();
  6767. + if (IsValidAttributeNameToken(CurrentToken))
  6768. {
  6769. - SkipToAndParseCode(SyntaxKind.OpenAngle);
  6770. + nameTokens = ReadWhile(token =>
  6771. + token.Kind != SyntaxKind.Whitespace &&
  6772. + token.Kind != SyntaxKind.NewLine &&
  6773. + token.Kind != SyntaxKind.Equals &&
  6774. + token.Kind != SyntaxKind.CloseAngle &&
  6775. + token.Kind != SyntaxKind.OpenAngle &&
  6776. + (token.Kind != SyntaxKind.ForwardSlash || !NextIs(SyntaxKind.CloseAngle)));
  6777. - // Output everything prior to the OpenAngle into a markup span
  6778. - Output(SpanKindInternal.Markup);
  6779. + // capture whitespace after attribute name (if any)
  6780. + whitespaceAfterAttributeName = ReadWhile(
  6781. + token => token.Kind == SyntaxKind.Whitespace || token.Kind == SyntaxKind.NewLine);
  6782. + }
  6783. + else
  6784. + {
  6785. + // Unexpected character in tag, enter recovery
  6786. + Accept(whitespace);
  6787. + RecoverToEndOfTag(builder);
  6788. + return;
  6789. + }
  6790. - // Do not want to start a new tag block if we're at the end of the file.
  6791. - IDisposable tagBlockWrapper = null;
  6792. - try
  6793. - {
  6794. - var atSpecialTag = AtSpecialTag;
  6795. + if (!At(SyntaxKind.Equals))
  6796. + {
  6797. + // Minimized attribute
  6798. - if (!EndOfFile && !atSpecialTag)
  6799. - {
  6800. - // Start a Block tag. This is used to wrap things like <p> or <a class="btn"> etc.
  6801. - tagBlockWrapper = Context.Builder.StartBlock(BlockKindInternal.Tag);
  6802. - }
  6803. + // We are at the prefix of the next attribute or the end of tag. Put it back so it is parsed later.
  6804. + PutCurrentBack();
  6805. + PutBack(whitespaceAfterAttributeName);
  6806. - if (EndOfFile)
  6807. - {
  6808. - EndTagBlock(tags, complete: true);
  6809. - }
  6810. - else
  6811. - {
  6812. - _bufferedOpenAngle = null;
  6813. - _lastTagStart = CurrentStart;
  6814. - Assert(SyntaxKind.OpenAngle);
  6815. - _bufferedOpenAngle = CurrentToken;
  6816. - var tagStart = CurrentStart;
  6817. - if (!NextToken())
  6818. - {
  6819. - Accept(_bufferedOpenAngle);
  6820. - EndTagBlock(tags, complete: false);
  6821. - }
  6822. - else
  6823. - {
  6824. - complete = AfterTagStart(tagStart, tags, atSpecialTag, tagBlockWrapper);
  6825. - }
  6826. - }
  6827. + // Output anything prior to the attribute, in most cases this will be the tag name:
  6828. + // |<input| checked />. If in-between other attributes this will noop or output malformed attribute
  6829. + // content (if the previous attribute was malformed).
  6830. + builder.Add(OutputAsMarkupLiteral());
  6831. - if (complete)
  6832. - {
  6833. - // Completed tags have no accepted characters inside of blocks.
  6834. - Span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  6835. - }
  6836. + Accept(whitespace);
  6837. + var namePrefix = OutputAsMarkupLiteral();
  6838. + Accept(nameTokens);
  6839. + var name = OutputAsMarkupLiteral();
  6840. - // Output the contents of the tag into its own markup span.
  6841. - Output(SpanKindInternal.Markup);
  6842. - }
  6843. - finally
  6844. - {
  6845. - // Will be null if we were at end of file or special tag when initially created.
  6846. - if (tagBlockWrapper != null)
  6847. - {
  6848. - // End tag block
  6849. - tagBlockWrapper.Dispose();
  6850. - }
  6851. - }
  6852. + var minimizedAttributeBlock = SyntaxFactory.MarkupMinimizedAttributeBlock(namePrefix, name);
  6853. + builder.Add(minimizedAttributeBlock);
  6854. +
  6855. + return;
  6856. }
  6857. - while (tags.Count > 0);
  6858. - EndTagBlock(tags, complete);
  6859. + // Not a minimized attribute, parse as if it were well-formed (if attribute turns out to be malformed we
  6860. + // will go into recovery).
  6861. + builder.Add(OutputAsMarkupLiteral());
  6862. +
  6863. + var attributeBlock = ParseAttributePrefix(whitespace, nameTokens, whitespaceAfterAttributeName);
  6864. +
  6865. + builder.Add(attributeBlock);
  6866. }
  6867. - private bool AfterTagStart(SourceLocation tagStart,
  6868. - Stack<Tuple<SyntaxToken, SourceLocation>> tags,
  6869. - bool atSpecialTag,
  6870. - IDisposable tagBlockWrapper)
  6871. + private MarkupAttributeBlockSyntax ParseAttributePrefix(
  6872. + IEnumerable<SyntaxToken> whitespace,
  6873. + IEnumerable<SyntaxToken> nameTokens,
  6874. + IEnumerable<SyntaxToken> whitespaceAfterAttributeName)
  6875. {
  6876. - if (!EndOfFile)
  6877. - {
  6878. - switch (CurrentToken.Kind)
  6879. - {
  6880. - case SyntaxKind.ForwardSlash:
  6881. - // End Tag
  6882. - return EndTag(tagStart, tags, tagBlockWrapper);
  6883. - case SyntaxKind.Bang:
  6884. - // Comment, CDATA, DOCTYPE, or a parser-escaped HTML tag.
  6885. - if (atSpecialTag)
  6886. - {
  6887. - Accept(_bufferedOpenAngle);
  6888. - return BangTag();
  6889. - }
  6890. - else
  6891. - {
  6892. - goto default;
  6893. + // First, determine if this is a 'data-' attribute (since those can't use conditional attributes)
  6894. + var nameContent = string.Concat(nameTokens.Select(s => s.Content));
  6895. + var attributeCanBeConditional =
  6896. + Context.FeatureFlags.EXPERIMENTAL_AllowConditionalDataDashAttributes ||
  6897. + !nameContent.StartsWith("data-", StringComparison.OrdinalIgnoreCase);
  6898. +
  6899. + // Accept the whitespace and name
  6900. + Accept(whitespace);
  6901. + var namePrefix = OutputAsMarkupLiteral();
  6902. + Accept(nameTokens);
  6903. + var name = OutputAsMarkupLiteral();
  6904. +
  6905. + // Since this is not a minimized attribute, the whitespace after attribute name belongs to this attribute.
  6906. + Accept(whitespaceAfterAttributeName);
  6907. + var nameSuffix = OutputAsMarkupLiteral();
  6908. + Assert(SyntaxKind.Equals); // We should be at "="
  6909. + var equalsToken = EatCurrentToken();
  6910. +
  6911. + var whitespaceAfterEquals = ReadWhile(token => token.Kind == SyntaxKind.Whitespace || token.Kind == SyntaxKind.NewLine);
  6912. + var quote = SyntaxKind.Marker;
  6913. + if (At(SyntaxKind.SingleQuote) || At(SyntaxKind.DoubleQuote))
  6914. + {
  6915. + // Found a quote, the whitespace belongs to this attribute.
  6916. + Accept(whitespaceAfterEquals);
  6917. + quote = CurrentToken.Kind;
  6918. + AcceptAndMoveNext();
  6919. + }
  6920. + else if (whitespaceAfterEquals.Any())
  6921. + {
  6922. + // No quotes found after the whitespace. Put it back so that it can be parsed later.
  6923. + PutCurrentBack();
  6924. + PutBack(whitespaceAfterEquals);
  6925. + }
  6926. +
  6927. + MarkupTextLiteralSyntax valuePrefix = null;
  6928. + RazorBlockSyntax attributeValue = null;
  6929. + MarkupTextLiteralSyntax valueSuffix = null;
  6930. +
  6931. + if (attributeCanBeConditional)
  6932. + {
  6933. + SpanContext.ChunkGenerator = SpanChunkGenerator.Null; // The block chunk generator will render the prefix
  6934. +
  6935. + // We now have the value prefix which is usually whitespace and/or a quote
  6936. + valuePrefix = OutputAsMarkupLiteral();
  6937. +
  6938. + // Read the attribute value only if the value is quoted
  6939. + // or if there is no whitespace between '=' and the unquoted value.
  6940. + if (quote != SyntaxKind.Marker || !whitespaceAfterEquals.Any())
  6941. + {
  6942. + using (var pooledResult = Pool.Allocate<RazorSyntaxNode>())
  6943. + {
  6944. + var attributeValueBuilder = pooledResult.Builder;
  6945. + // Read the attribute value.
  6946. + while (!EndOfFile && !IsEndOfAttributeValue(quote, CurrentToken))
  6947. + {
  6948. + ParseAttributeValue(attributeValueBuilder, quote);
  6949. }
  6950. - case SyntaxKind.QuestionMark:
  6951. - // XML PI
  6952. - Accept(_bufferedOpenAngle);
  6953. - return XmlPI();
  6954. - default:
  6955. - // Start Tag
  6956. - return StartTag(tags, tagBlockWrapper);
  6957. +
  6958. + if (attributeValueBuilder.Count > 0)
  6959. + {
  6960. + attributeValue = SyntaxFactory.GenericBlock(attributeValueBuilder.ToList());
  6961. + }
  6962. + }
  6963. + }
  6964. +
  6965. + // Capture the suffix
  6966. + if (quote != SyntaxKind.Marker && At(quote))
  6967. + {
  6968. + AcceptAndMoveNext();
  6969. + // Again, block chunk generator will render the suffix
  6970. + SpanContext.ChunkGenerator = SpanChunkGenerator.Null;
  6971. + valueSuffix = OutputAsMarkupLiteral();
  6972. }
  6973. }
  6974. - if (tags.Count == 0)
  6975. + else if (quote != SyntaxKind.Marker || !whitespaceAfterEquals.Any())
  6976. {
  6977. - Context.ErrorSink.OnError(
  6978. - RazorDiagnosticFactory.CreateParsing_OuterTagMissingName(
  6979. - new SourceSpan(CurrentStart, contentLength: 1 /* end of file */)));
  6980. + valuePrefix = OutputAsMarkupLiteral();
  6981. +
  6982. + using (var pooledResult = Pool.Allocate<RazorSyntaxNode>())
  6983. + {
  6984. + var attributeValueBuilder = pooledResult.Builder;
  6985. + // Not a "conditional" attribute, so just read the value
  6986. + SkipToAndParseCode(attributeValueBuilder, token => IsEndOfAttributeValue(quote, token));
  6987. +
  6988. + // Output already accepted tokens if any as markup literal
  6989. + var literalValue = OutputAsMarkupLiteral();
  6990. + attributeValueBuilder.Add(literalValue);
  6991. +
  6992. + // Capture the attribute value (will include everything in-between the attribute's quotes).
  6993. + attributeValue = SyntaxFactory.GenericBlock(attributeValueBuilder.ToList());
  6994. + }
  6995. +
  6996. + if (quote != SyntaxKind.Marker)
  6997. + {
  6998. + TryAccept(quote);
  6999. + valueSuffix = OutputAsMarkupLiteral();
  7000. + }
  7001. }
  7002. - return false;
  7003. + else
  7004. + {
  7005. + // There is no quote and there is whitespace after equals. There is no attribute value.
  7006. + }
  7007. +
  7008. + return SyntaxFactory.MarkupAttributeBlock(namePrefix, name, nameSuffix, equalsToken, valuePrefix, attributeValue, valueSuffix);
  7009. }
  7010. - private bool XmlPI()
  7011. + private void ParseAttributeValue(in SyntaxListBuilder<RazorSyntaxNode> builder, SyntaxKind quote)
  7012. {
  7013. - // Accept "?"
  7014. - Assert(SyntaxKind.QuestionMark);
  7015. + var prefixStart = CurrentStart;
  7016. + var prefixTokens = ReadWhile(token => token.Kind == SyntaxKind.Whitespace || token.Kind == SyntaxKind.NewLine);
  7017. +
  7018. + if (At(SyntaxKind.Transition))
  7019. + {
  7020. + if (NextIs(SyntaxKind.Transition))
  7021. + {
  7022. + // Wrapping this in a block so that the ConditionalAttributeCollapser doesn't rewrite it.
  7023. + using (var pooledResult = Pool.Allocate<RazorSyntaxNode>())
  7024. + {
  7025. + var markupBuilder = pooledResult.Builder;
  7026. + Accept(prefixTokens);
  7027. +
  7028. + // Render a single "@" in place of "@@".
  7029. + SpanContext.ChunkGenerator = new LiteralAttributeChunkGenerator(
  7030. + new LocationTagged<string>(string.Concat(prefixTokens.Select(s => s.Content)), prefixStart),
  7031. + new LocationTagged<string>(CurrentToken.Content, CurrentStart));
  7032. + AcceptAndMoveNext();
  7033. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  7034. + markupBuilder.Add(OutputAsMarkupLiteral());
  7035. +
  7036. + SpanContext.ChunkGenerator = SpanChunkGenerator.Null;
  7037. + AcceptAndMoveNext();
  7038. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  7039. + markupBuilder.Add(OutputAsMarkupEphemeralLiteral());
  7040. +
  7041. + var markupBlock = SyntaxFactory.MarkupBlock(markupBuilder.ToList());
  7042. + builder.Add(markupBlock);
  7043. + }
  7044. + }
  7045. + else
  7046. + {
  7047. + Accept(prefixTokens);
  7048. + var valueStart = CurrentStart;
  7049. + PutCurrentBack();
  7050. +
  7051. + var prefix = OutputAsMarkupLiteral();
  7052. +
  7053. + // Dynamic value, start a new block and set the chunk generator
  7054. + using (var pooledResult = Pool.Allocate<RazorSyntaxNode>())
  7055. + {
  7056. + var dynamicAttributeValueBuilder = pooledResult.Builder;
  7057. +
  7058. + OtherParserBlock(dynamicAttributeValueBuilder);
  7059. + var value = SyntaxFactory.MarkupDynamicAttributeValue(prefix, SyntaxFactory.GenericBlock(dynamicAttributeValueBuilder.ToList()));
  7060. + builder.Add(value);
  7061. + }
  7062. + }
  7063. + }
  7064. + else
  7065. + {
  7066. + Accept(prefixTokens);
  7067. + var prefix = OutputAsMarkupLiteral();
  7068. +
  7069. + // Literal value
  7070. + // 'quote' should be "Unknown" if not quoted and tokens coming from the tokenizer should never have
  7071. + // "Unknown" type.
  7072. + var valueTokens = ReadWhile(token =>
  7073. + // These three conditions find separators which break the attribute value into portions
  7074. + token.Kind != SyntaxKind.Whitespace &&
  7075. + token.Kind != SyntaxKind.NewLine &&
  7076. + token.Kind != SyntaxKind.Transition &&
  7077. + // This condition checks for the end of the attribute value (it repeats some of the checks above
  7078. + // but for now that's ok)
  7079. + !IsEndOfAttributeValue(quote, token));
  7080. + Accept(valueTokens);
  7081. + var value = OutputAsMarkupLiteral();
  7082. +
  7083. + var literalAttributeValue = SyntaxFactory.MarkupLiteralAttributeValue(prefix, value);
  7084. + builder.Add(literalAttributeValue);
  7085. + }
  7086. + }
  7087. +
  7088. + private void RecoverToEndOfTag(in SyntaxListBuilder<RazorSyntaxNode> builder)
  7089. + {
  7090. + // Accept until ">", "/" or "<", but parse code
  7091. + while (!EndOfFile)
  7092. + {
  7093. + SkipToAndParseCode(builder, IsTagRecoveryStopPoint);
  7094. + if (!EndOfFile)
  7095. + {
  7096. + EnsureCurrent();
  7097. + switch (CurrentToken.Kind)
  7098. + {
  7099. + case SyntaxKind.SingleQuote:
  7100. + case SyntaxKind.DoubleQuote:
  7101. + ParseQuoted(builder);
  7102. + break;
  7103. + case SyntaxKind.OpenAngle:
  7104. + // Another "<" means this tag is invalid.
  7105. + case SyntaxKind.ForwardSlash:
  7106. + // Empty tag
  7107. + case SyntaxKind.CloseAngle:
  7108. + // End of tag
  7109. + return;
  7110. + default:
  7111. + AcceptAndMoveNext();
  7112. + break;
  7113. + }
  7114. + }
  7115. + }
  7116. + }
  7117. +
  7118. + private bool IsTagRecoveryStopPoint(SyntaxToken token)
  7119. + {
  7120. + return token.Kind == SyntaxKind.CloseAngle ||
  7121. + token.Kind == SyntaxKind.ForwardSlash ||
  7122. + token.Kind == SyntaxKind.OpenAngle ||
  7123. + token.Kind == SyntaxKind.SingleQuote ||
  7124. + token.Kind == SyntaxKind.DoubleQuote;
  7125. + }
  7126. +
  7127. + private bool IsEndOfAttributeValue(SyntaxKind quote, SyntaxToken token)
  7128. + {
  7129. + return EndOfFile || token == null ||
  7130. + (quote != SyntaxKind.Marker
  7131. + ? token.Kind == quote // If quoted, just wait for the quote
  7132. + : IsUnquotedEndOfAttributeValue(token));
  7133. + }
  7134. +
  7135. + private bool IsUnquotedEndOfAttributeValue(SyntaxToken token)
  7136. + {
  7137. + // If unquoted, we have a larger set of terminating characters:
  7138. + // http://dev.w3.org/html5/spec/tokenization.html#attribute-value-unquoted-state
  7139. + // Also we need to detect "/" and ">"
  7140. + return token.Kind == SyntaxKind.DoubleQuote ||
  7141. + token.Kind == SyntaxKind.SingleQuote ||
  7142. + token.Kind == SyntaxKind.OpenAngle ||
  7143. + token.Kind == SyntaxKind.Equals ||
  7144. + (token.Kind == SyntaxKind.ForwardSlash && NextIs(SyntaxKind.CloseAngle)) ||
  7145. + token.Kind == SyntaxKind.CloseAngle ||
  7146. + token.Kind == SyntaxKind.Whitespace ||
  7147. + token.Kind == SyntaxKind.NewLine;
  7148. + }
  7149. +
  7150. + private void ParseQuoted(in SyntaxListBuilder<RazorSyntaxNode> builder)
  7151. + {
  7152. + var type = CurrentToken.Kind;
  7153. AcceptAndMoveNext();
  7154. - return AcceptUntilAll(SyntaxKind.QuestionMark, SyntaxKind.CloseAngle);
  7155. + SkipToAndParseCode(builder, type);
  7156. + if (!EndOfFile)
  7157. + {
  7158. + Assert(type);
  7159. + AcceptAndMoveNext();
  7160. + }
  7161. }
  7162. - private bool BangTag()
  7163. + private bool ParseBangTag(in SyntaxListBuilder<RazorSyntaxNode> builder)
  7164. {
  7165. // Accept "!"
  7166. Assert(SyntaxKind.Bang);
  7167. @@ -506,27 +722,34 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  7168. {
  7169. if (IsHtmlCommentAhead())
  7170. {
  7171. - using (Context.Builder.StartBlock(BlockKindInternal.HtmlComment))
  7172. + using (var pooledResult = Pool.Allocate<RazorSyntaxNode>())
  7173. {
  7174. + var htmlCommentBuilder = pooledResult.Builder;
  7175. +
  7176. // Accept the double-hyphen token at the beginning of the comment block.
  7177. AcceptAndMoveNext();
  7178. - Output(SpanKindInternal.Markup, AcceptedCharactersInternal.None);
  7179. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  7180. + htmlCommentBuilder.Add(OutputAsMarkupLiteral());
  7181. - Span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.Whitespace;
  7182. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.Whitespace;
  7183. while (!EndOfFile)
  7184. {
  7185. - SkipToAndParseCode(SyntaxKind.DoubleHyphen);
  7186. + SkipToAndParseCode(htmlCommentBuilder, SyntaxKind.DoubleHyphen);
  7187. var lastDoubleHyphen = AcceptAllButLastDoubleHyphens();
  7188. if (At(SyntaxKind.CloseAngle))
  7189. {
  7190. // Output the content in the comment block as a separate markup
  7191. - Output(SpanKindInternal.Markup, AcceptedCharactersInternal.Whitespace);
  7192. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.Whitespace;
  7193. + htmlCommentBuilder.Add(OutputAsMarkupLiteral());
  7194. // This is the end of a comment block
  7195. Accept(lastDoubleHyphen);
  7196. AcceptAndMoveNext();
  7197. - Output(SpanKindInternal.Markup, AcceptedCharactersInternal.None);
  7198. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  7199. + htmlCommentBuilder.Add(OutputAsMarkupLiteral());
  7200. + var commentBlock = SyntaxFactory.MarkupCommentBlock(htmlCommentBuilder.ToList());
  7201. + builder.Add(commentBlock);
  7202. return true;
  7203. }
  7204. else if (lastDoubleHyphen != null)
  7205. @@ -540,50 +763,19 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  7206. {
  7207. if (AcceptAndMoveNext())
  7208. {
  7209. - return CData();
  7210. + return TryParseCData(builder);
  7211. }
  7212. }
  7213. else
  7214. {
  7215. AcceptAndMoveNext();
  7216. - return AcceptUntilAll(SyntaxKind.CloseAngle);
  7217. + return AcceptTokenUntilAll(builder, SyntaxKind.CloseAngle);
  7218. }
  7219. }
  7220. return false;
  7221. }
  7222. - protected SyntaxToken AcceptAllButLastDoubleHyphens()
  7223. - {
  7224. - var lastDoubleHyphen = CurrentToken;
  7225. - AcceptWhile(s =>
  7226. - {
  7227. - if (NextIs(SyntaxKind.DoubleHyphen))
  7228. - {
  7229. - lastDoubleHyphen = s;
  7230. - return true;
  7231. - }
  7232. -
  7233. - return false;
  7234. - });
  7235. -
  7236. - NextToken();
  7237. -
  7238. - if (At(SyntaxKind.Text) && IsHyphen(CurrentToken))
  7239. - {
  7240. - // Doing this here to maintain the order of tokens
  7241. - if (!NextIs(SyntaxKind.CloseAngle))
  7242. - {
  7243. - Accept(lastDoubleHyphen);
  7244. - lastDoubleHyphen = null;
  7245. - }
  7246. -
  7247. - AcceptAndMoveNext();
  7248. - }
  7249. -
  7250. - return lastDoubleHyphen;
  7251. - }
  7252. -
  7253. internal static bool IsHyphen(SyntaxToken token)
  7254. {
  7255. return token.Kind == SyntaxKind.Text && token.Content == "-";
  7256. @@ -592,7 +784,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  7257. protected bool IsHtmlCommentAhead()
  7258. {
  7259. // From HTML5 Specification, available at http://www.w3.org/TR/html52/syntax.html#comments
  7260. -
  7261. +
  7262. // Comments must have the following format:
  7263. // 1. The string "<!--"
  7264. // 2. Optionally, text, with the additional restriction that the text
  7265. @@ -682,7 +874,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  7266. return false;
  7267. }
  7268. - private bool CData()
  7269. + private bool TryParseCData(in SyntaxListBuilder<RazorSyntaxNode> builder)
  7270. {
  7271. if (CurrentToken.Kind == SyntaxKind.Text && string.Equals(CurrentToken.Content, "cdata", StringComparison.OrdinalIgnoreCase))
  7272. {
  7273. @@ -690,7 +882,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  7274. {
  7275. if (CurrentToken.Kind == SyntaxKind.LeftBracket)
  7276. {
  7277. - return AcceptUntilAll(SyntaxKind.RightBracket, SyntaxKind.RightBracket, SyntaxKind.CloseAngle);
  7278. + return AcceptTokenUntilAll(builder, SyntaxKind.RightBracket, SyntaxKind.RightBracket, SyntaxKind.CloseAngle);
  7279. }
  7280. }
  7281. }
  7282. @@ -698,478 +890,445 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  7283. return false;
  7284. }
  7285. - private bool EndTag(SourceLocation tagStart,
  7286. - Stack<Tuple<SyntaxToken, SourceLocation>> tags,
  7287. - IDisposable tagBlockWrapper)
  7288. + private bool TryParseXmlPI(in SyntaxListBuilder<RazorSyntaxNode> builder)
  7289. {
  7290. - // Accept "/" and move next
  7291. - Assert(SyntaxKind.ForwardSlash);
  7292. - var forwardSlash = CurrentToken;
  7293. - if (!NextToken())
  7294. - {
  7295. - Accept(_bufferedOpenAngle);
  7296. - Accept(forwardSlash);
  7297. - return false;
  7298. - }
  7299. - else
  7300. - {
  7301. - var tagName = string.Empty;
  7302. - SyntaxToken bangToken = null;
  7303. -
  7304. - if (At(SyntaxKind.Bang))
  7305. - {
  7306. - bangToken = CurrentToken;
  7307. -
  7308. - var nextToken = Lookahead(count: 1);
  7309. -
  7310. - if (nextToken != null && nextToken.Kind == SyntaxKind.Text)
  7311. - {
  7312. - tagName = "!" + nextToken.Content;
  7313. - }
  7314. - }
  7315. - else if (At(SyntaxKind.Text))
  7316. - {
  7317. - tagName = CurrentToken.Content;
  7318. - }
  7319. -
  7320. - var matched = RemoveTag(tags, tagName, tagStart);
  7321. -
  7322. - if (tags.Count == 0 &&
  7323. - // Note tagName may contain a '!' escape character. This ensures </!text> doesn't match here.
  7324. - // </!text> tags are treated like any other escaped HTML end tag.
  7325. - string.Equals(tagName, SyntaxConstants.TextTagName, StringComparison.OrdinalIgnoreCase) &&
  7326. - matched)
  7327. - {
  7328. - return EndTextTag(forwardSlash, tagBlockWrapper);
  7329. - }
  7330. - Accept(_bufferedOpenAngle);
  7331. - Accept(forwardSlash);
  7332. -
  7333. - OptionalBangEscape();
  7334. -
  7335. - AcceptUntil(SyntaxKind.CloseAngle);
  7336. -
  7337. - // Accept the ">"
  7338. - return Optional(SyntaxKind.CloseAngle);
  7339. - }
  7340. + // Accept "?"
  7341. + Assert(SyntaxKind.QuestionMark);
  7342. + AcceptAndMoveNext();
  7343. + return AcceptTokenUntilAll(builder, SyntaxKind.QuestionMark, SyntaxKind.CloseAngle);
  7344. }
  7345. - private void RecoverTextTag()
  7346. + private void ParseOptionalBangEscape(in SyntaxListBuilder<RazorSyntaxNode> builder)
  7347. {
  7348. - // We don't want to skip-to and parse because there shouldn't be anything in the body of text tags.
  7349. - AcceptUntil(SyntaxKind.CloseAngle, SyntaxKind.NewLine);
  7350. + if (IsBangEscape(lookahead: 0))
  7351. + {
  7352. + builder.Add(OutputAsMarkupLiteral());
  7353. - // Include the close angle in the text tag block if it's there, otherwise just move on
  7354. - Optional(SyntaxKind.CloseAngle);
  7355. + // Accept the parser escape character '!'.
  7356. + Assert(SyntaxKind.Bang);
  7357. + AcceptAndMoveNext();
  7358. +
  7359. + // Setup the metacode span that we will be outputing.
  7360. + SpanContext.ChunkGenerator = SpanChunkGenerator.Null;
  7361. + builder.Add(OutputAsMetaCode(Output()));
  7362. + }
  7363. }
  7364. - private bool EndTextTag(SyntaxToken solidus, IDisposable tagBlockWrapper)
  7365. + private bool IsBangEscape(int lookahead)
  7366. {
  7367. - Accept(_bufferedOpenAngle);
  7368. - Accept(solidus);
  7369. -
  7370. - var textLocation = CurrentStart;
  7371. - Assert(SyntaxKind.Text);
  7372. - AcceptAndMoveNext();
  7373. -
  7374. - var seenCloseAngle = Optional(SyntaxKind.CloseAngle);
  7375. + var potentialBang = Lookahead(lookahead);
  7376. - if (!seenCloseAngle)
  7377. + if (potentialBang != null &&
  7378. + potentialBang.Kind == SyntaxKind.Bang)
  7379. {
  7380. - Context.ErrorSink.OnError(
  7381. - RazorDiagnosticFactory.CreateParsing_TextTagCannotContainAttributes(
  7382. - new SourceSpan(textLocation, contentLength: 4 /* text */)));
  7383. + var afterBang = Lookahead(lookahead + 1);
  7384. - Span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.Any;
  7385. - RecoverTextTag();
  7386. - }
  7387. - else
  7388. - {
  7389. - Span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  7390. + return afterBang != null &&
  7391. + afterBang.Kind == SyntaxKind.Text &&
  7392. + !string.Equals(afterBang.Content, "DOCTYPE", StringComparison.OrdinalIgnoreCase);
  7393. }
  7394. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  7395. -
  7396. - CompleteTagBlockWithSpan(tagBlockWrapper, Span.EditHandler.AcceptedCharacters, SpanKindInternal.Transition);
  7397. -
  7398. - return seenCloseAngle;
  7399. + return false;
  7400. }
  7401. - // Special tags include <!--, <!DOCTYPE, <![CDATA and <? tags
  7402. - private bool AtSpecialTag
  7403. + private void SkipToEndScriptAndParseCode(in SyntaxListBuilder<RazorSyntaxNode> builder, AcceptedCharactersInternal endTagAcceptedCharacters = AcceptedCharactersInternal.Any)
  7404. {
  7405. - get
  7406. + // Special case for <script>: Skip to end of script tag and parse code
  7407. + var seenEndScript = false;
  7408. +
  7409. + while (!seenEndScript && !EndOfFile)
  7410. {
  7411. - if (At(SyntaxKind.OpenAngle))
  7412. + SkipToAndParseCode(builder, SyntaxKind.OpenAngle);
  7413. + var tagStart = CurrentStart;
  7414. +
  7415. + if (NextIs(SyntaxKind.ForwardSlash))
  7416. {
  7417. - if (NextIs(SyntaxKind.Bang))
  7418. + var openAngle = CurrentToken;
  7419. + NextToken(); // Skip over '<', current is '/'
  7420. + var solidus = CurrentToken;
  7421. + NextToken(); // Skip over '/', current should be text
  7422. +
  7423. + if (At(SyntaxKind.Text) &&
  7424. + string.Equals(CurrentToken.Content, ScriptTagName, StringComparison.OrdinalIgnoreCase))
  7425. {
  7426. - return !IsBangEscape(lookahead: 1);
  7427. + seenEndScript = true;
  7428. }
  7429. - return NextIs(SyntaxKind.QuestionMark);
  7430. - }
  7431. -
  7432. - return false;
  7433. - }
  7434. - }
  7435. -
  7436. - private bool IsTagRecoveryStopPoint(SyntaxToken token)
  7437. - {
  7438. - return token.Kind == SyntaxKind.CloseAngle ||
  7439. - token.Kind == SyntaxKind.ForwardSlash ||
  7440. - token.Kind == SyntaxKind.OpenAngle ||
  7441. - token.Kind == SyntaxKind.SingleQuote ||
  7442. - token.Kind == SyntaxKind.DoubleQuote;
  7443. - }
  7444. + // We put everything back because we just wanted to look ahead to see if the current end tag that we're parsing is
  7445. + // the script tag. If so we'll generate correct code to encompass it.
  7446. + PutCurrentBack(); // Put back whatever was after the solidus
  7447. + PutBack(solidus); // Put back '/'
  7448. + PutBack(openAngle); // Put back '<'
  7449. - private void TagContent()
  7450. - {
  7451. - if (!At(SyntaxKind.Whitespace) && !At(SyntaxKind.NewLine))
  7452. - {
  7453. - // We should be right after the tag name, so if there's no whitespace or new line, something is wrong
  7454. - RecoverToEndOfTag();
  7455. - }
  7456. - else
  7457. - {
  7458. - // We are here ($): <tag$ foo="bar" biz="~/Baz" />
  7459. - while (!EndOfFile && !IsEndOfTag())
  7460. - {
  7461. - BeforeAttribute();
  7462. + // We just looked ahead, this NextToken will set CurrentToken to an open angle bracket.
  7463. + NextToken();
  7464. }
  7465. - }
  7466. - }
  7467. - private bool IsEndOfTag()
  7468. - {
  7469. - if (At(SyntaxKind.ForwardSlash))
  7470. - {
  7471. - if (NextIs(SyntaxKind.CloseAngle))
  7472. + if (seenEndScript)
  7473. {
  7474. - return true;
  7475. + builder.Add(OutputAsMarkupLiteral());
  7476. +
  7477. + using (var pooledResult = Pool.Allocate<RazorSyntaxNode>())
  7478. + {
  7479. + var tagBuilder = pooledResult.Builder;
  7480. + SpanContext.EditHandler.AcceptedCharacters = endTagAcceptedCharacters;
  7481. +
  7482. + AcceptAndMoveNext(); // '<'
  7483. + AcceptAndMoveNext(); // '/'
  7484. + SkipToAndParseCode(tagBuilder, SyntaxKind.CloseAngle);
  7485. + if (!TryAccept(SyntaxKind.CloseAngle))
  7486. + {
  7487. + Context.ErrorSink.OnError(
  7488. + RazorDiagnosticFactory.CreateParsing_UnfinishedTag(
  7489. + new SourceSpan(SourceLocationTracker.Advance(tagStart, "</"), ScriptTagName.Length),
  7490. + ScriptTagName));
  7491. + var closeAngle = SyntaxFactory.MissingToken(SyntaxKind.CloseAngle);
  7492. + Accept(closeAngle);
  7493. + }
  7494. + tagBuilder.Add(OutputAsMarkupLiteral());
  7495. + builder.Add(SyntaxFactory.MarkupTagBlock(tagBuilder.ToList()));
  7496. + }
  7497. }
  7498. else
  7499. {
  7500. - AcceptAndMoveNext();
  7501. + AcceptAndMoveNext(); // Accept '<' (not the closing script tag's open angle)
  7502. }
  7503. }
  7504. - return At(SyntaxKind.CloseAngle) || At(SyntaxKind.OpenAngle);
  7505. }
  7506. - private void BeforeAttribute()
  7507. + private bool CurrentScriptTagExpectsHtml(in SyntaxListBuilder<RazorSyntaxNode> builder)
  7508. {
  7509. - // http://dev.w3.org/html5/spec/tokenization.html#before-attribute-name-state
  7510. - // Capture whitespace
  7511. - var whitespace = ReadWhile(token => token.Kind == SyntaxKind.Whitespace || token.Kind == SyntaxKind.NewLine);
  7512. + Debug.Assert(!builder.IsNull);
  7513. - if (At(SyntaxKind.Transition) || At(SyntaxKind.RazorCommentTransition))
  7514. + MarkupAttributeBlockSyntax typeAttribute = null;
  7515. + for (var i = 0; i < builder.Count; i++)
  7516. {
  7517. - // Transition outside of attribute value => Switch to recovery mode
  7518. - Accept(whitespace);
  7519. - RecoverToEndOfTag();
  7520. - return;
  7521. - }
  7522. -
  7523. - // http://dev.w3.org/html5/spec/tokenization.html#attribute-name-state
  7524. - // Read the 'name' (i.e. read until the '=' or whitespace/newline)
  7525. - var name = Enumerable.Empty<SyntaxToken>();
  7526. - var whitespaceAfterAttributeName = Enumerable.Empty<SyntaxToken>();
  7527. - if (IsValidAttributeNameToken(CurrentToken))
  7528. - {
  7529. - name = ReadWhile(token =>
  7530. - token.Kind != SyntaxKind.Whitespace &&
  7531. - token.Kind != SyntaxKind.NewLine &&
  7532. - token.Kind != SyntaxKind.Equals &&
  7533. - token.Kind != SyntaxKind.CloseAngle &&
  7534. - token.Kind != SyntaxKind.OpenAngle &&
  7535. - (token.Kind != SyntaxKind.ForwardSlash || !NextIs(SyntaxKind.CloseAngle)));
  7536. + var node = builder[i];
  7537. + if (node.IsToken || node.IsTrivia)
  7538. + {
  7539. + continue;
  7540. + }
  7541. - // capture whitespace after attribute name (if any)
  7542. - whitespaceAfterAttributeName = ReadWhile(
  7543. - token => token.Kind == SyntaxKind.Whitespace || token.Kind == SyntaxKind.NewLine);
  7544. - }
  7545. - else
  7546. - {
  7547. - // Unexpected character in tag, enter recovery
  7548. - Accept(whitespace);
  7549. - RecoverToEndOfTag();
  7550. - return;
  7551. + if (node is MarkupAttributeBlockSyntax attributeBlock &&
  7552. + attributeBlock.Value.Children.Count > 0 &&
  7553. + IsTypeAttribute(attributeBlock))
  7554. + {
  7555. + typeAttribute = attributeBlock;
  7556. + break;
  7557. + }
  7558. }
  7559. - if (!At(SyntaxKind.Equals))
  7560. + if (typeAttribute != null)
  7561. {
  7562. - // Minimized attribute
  7563. + var contentValues = typeAttribute.Value.CreateRed().DescendantNodes().Where(n => n.IsToken).Cast<Syntax.SyntaxToken>();
  7564. - // We are at the prefix of the next attribute or the end of tag. Put it back so it is parsed later.
  7565. - PutCurrentBack();
  7566. - PutBack(whitespaceAfterAttributeName);
  7567. -
  7568. - // Output anything prior to the attribute, in most cases this will be the tag name:
  7569. - // |<input| checked />. If in-between other attributes this will noop or output malformed attribute
  7570. - // content (if the previous attribute was malformed).
  7571. - Output(SpanKindInternal.Markup);
  7572. + var scriptType = string.Concat(contentValues.Select(t => t.Content)).Trim();
  7573. - using (Context.Builder.StartBlock(BlockKindInternal.Markup))
  7574. - {
  7575. - Accept(whitespace);
  7576. - Accept(name);
  7577. - Output(SpanKindInternal.Markup);
  7578. - }
  7579. -
  7580. - return;
  7581. + // Does not allow charset parameter (or any other parameters).
  7582. + return string.Equals(scriptType, "text/html", StringComparison.OrdinalIgnoreCase);
  7583. }
  7584. - // Not a minimized attribute, parse as if it were well-formed (if attribute turns out to be malformed we
  7585. - // will go into recovery).
  7586. - Output(SpanKindInternal.Markup);
  7587. -
  7588. - // Start a new markup block for the attribute
  7589. - using (Context.Builder.StartBlock(BlockKindInternal.Markup))
  7590. - {
  7591. - AttributePrefix(whitespace, name, whitespaceAfterAttributeName);
  7592. - }
  7593. + return false;
  7594. }
  7595. - private void AttributePrefix(
  7596. - IEnumerable<SyntaxToken> whitespace,
  7597. - IEnumerable<SyntaxToken> nameTokens,
  7598. - IEnumerable<SyntaxToken> whitespaceAfterAttributeName)
  7599. + private static bool IsTypeAttribute(MarkupAttributeBlockSyntax attributeBlock)
  7600. {
  7601. - // First, determine if this is a 'data-' attribute (since those can't use conditional attributes)
  7602. - var name = string.Concat(nameTokens.Select(s => s.Content));
  7603. - var attributeCanBeConditional =
  7604. - Context.FeatureFlags.EXPERIMENTAL_AllowConditionalDataDashAttributes ||
  7605. - !name.StartsWith("data-", StringComparison.OrdinalIgnoreCase);
  7606. -
  7607. - // Accept the whitespace and name
  7608. - Accept(whitespace);
  7609. - Accept(nameTokens);
  7610. -
  7611. - // Since this is not a minimized attribute, the whitespace after attribute name belongs to this attribute.
  7612. - Accept(whitespaceAfterAttributeName);
  7613. - Assert(SyntaxKind.Equals); // We should be at "="
  7614. - AcceptAndMoveNext();
  7615. -
  7616. - var whitespaceAfterEquals = ReadWhile(token => token.Kind == SyntaxKind.Whitespace || token.Kind == SyntaxKind.NewLine);
  7617. - var quote = SyntaxKind.Unknown;
  7618. - if (At(SyntaxKind.SingleQuote) || At(SyntaxKind.DoubleQuote))
  7619. + if (attributeBlock.Name.LiteralTokens.Count == 0)
  7620. {
  7621. - // Found a quote, the whitespace belongs to this attribute.
  7622. - Accept(whitespaceAfterEquals);
  7623. - quote = CurrentToken.Kind;
  7624. - AcceptAndMoveNext();
  7625. + return false;
  7626. }
  7627. - else if (whitespaceAfterEquals.Any())
  7628. +
  7629. + var trimmedStartContent = attributeBlock.Name.ToFullString().TrimStart();
  7630. + if (trimmedStartContent.StartsWith("type", StringComparison.OrdinalIgnoreCase) &&
  7631. + (trimmedStartContent.Length == 4 ||
  7632. + ValidAfterTypeAttributeNameCharacters.Contains(trimmedStartContent[4])))
  7633. {
  7634. - // No quotes found after the whitespace. Put it back so that it can be parsed later.
  7635. - PutCurrentBack();
  7636. - PutBack(whitespaceAfterEquals);
  7637. + return true;
  7638. }
  7639. - // We now have the prefix: (i.e. ' foo="')
  7640. - var prefix = new LocationTagged<string>(string.Concat(Span.Tokens.Select(s => s.Content)), Span.Start);
  7641. + return false;
  7642. + }
  7643. - if (attributeCanBeConditional)
  7644. + protected SyntaxToken AcceptAllButLastDoubleHyphens()
  7645. + {
  7646. + var lastDoubleHyphen = CurrentToken;
  7647. + AcceptWhile(s =>
  7648. {
  7649. - Span.ChunkGenerator = SpanChunkGenerator.Null; // The block chunk generator will render the prefix
  7650. - Output(SpanKindInternal.Markup);
  7651. -
  7652. - // Read the attribute value only if the value is quoted
  7653. - // or if there is no whitespace between '=' and the unquoted value.
  7654. - if (quote != SyntaxKind.Unknown || !whitespaceAfterEquals.Any())
  7655. - {
  7656. - // Read the attribute value.
  7657. - while (!EndOfFile && !IsEndOfAttributeValue(quote, CurrentToken))
  7658. - {
  7659. - AttributeValue(quote);
  7660. - }
  7661. - }
  7662. -
  7663. - // Capture the suffix
  7664. - var suffix = new LocationTagged<string>(string.Empty, CurrentStart);
  7665. - if (quote != SyntaxKind.Unknown && At(quote))
  7666. + if (NextIs(SyntaxKind.DoubleHyphen))
  7667. {
  7668. - suffix = new LocationTagged<string>(CurrentToken.Content, CurrentStart);
  7669. - AcceptAndMoveNext();
  7670. + lastDoubleHyphen = s;
  7671. + return true;
  7672. }
  7673. - if (Span.Tokens.Count > 0)
  7674. - {
  7675. - // Again, block chunk generator will render the suffix
  7676. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  7677. - Output(SpanKindInternal.Markup);
  7678. - }
  7679. + return false;
  7680. + });
  7681. - // Create the block chunk generator
  7682. - Context.Builder.CurrentBlock.ChunkGenerator = new AttributeBlockChunkGenerator(
  7683. - name, prefix, suffix);
  7684. - }
  7685. - else
  7686. - {
  7687. - // Output the attribute name, the equals and optional quote. Ex: foo="
  7688. - Output(SpanKindInternal.Markup);
  7689. + NextToken();
  7690. - if (quote == SyntaxKind.Unknown && whitespaceAfterEquals.Any())
  7691. + if (At(SyntaxKind.Text) && IsHyphen(CurrentToken))
  7692. + {
  7693. + // Doing this here to maintain the order of tokens
  7694. + if (!NextIs(SyntaxKind.CloseAngle))
  7695. {
  7696. - return;
  7697. + Accept(lastDoubleHyphen);
  7698. + lastDoubleHyphen = null;
  7699. }
  7700. - // Not a "conditional" attribute, so just read the value
  7701. - SkipToAndParseCode(token => IsEndOfAttributeValue(quote, token));
  7702. + AcceptAndMoveNext();
  7703. + }
  7704. - // Output the attribute value (will include everything in-between the attribute's quotes).
  7705. - Output(SpanKindInternal.Markup);
  7706. + return lastDoubleHyphen;
  7707. + }
  7708. - if (quote != SyntaxKind.Unknown)
  7709. + private bool AcceptTokenUntilAll(in SyntaxListBuilder<RazorSyntaxNode> builder, params SyntaxKind[] endSequence)
  7710. + {
  7711. + while (!EndOfFile)
  7712. + {
  7713. + SkipToAndParseCode(builder, endSequence[0]);
  7714. + if (AcceptAll(endSequence))
  7715. {
  7716. - Optional(quote);
  7717. + return true;
  7718. }
  7719. - Output(SpanKindInternal.Markup);
  7720. }
  7721. + Debug.Assert(EndOfFile);
  7722. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.Any;
  7723. + return false;
  7724. }
  7725. - private void AttributeValue(SyntaxKind quote)
  7726. + public MarkupBlockSyntax ParseBlock()
  7727. {
  7728. - var prefixStart = CurrentStart;
  7729. - var prefix = ReadWhile(token => token.Kind == SyntaxKind.Whitespace || token.Kind == SyntaxKind.NewLine);
  7730. + if (Context == null)
  7731. + {
  7732. + throw new InvalidOperationException(Resources.Parser_Context_Not_Set);
  7733. + }
  7734. - if (At(SyntaxKind.Transition))
  7735. + using (var pooledResult = Pool.Allocate<RazorSyntaxNode>())
  7736. + using (PushSpanContextConfig(DefaultMarkupSpanContext))
  7737. {
  7738. - if (NextIs(SyntaxKind.Transition))
  7739. + var builder = pooledResult.Builder;
  7740. + if (!NextToken())
  7741. {
  7742. - // Wrapping this in a block so that the ConditionalAttributeCollapser doesn't rewrite it.
  7743. - using (Context.Builder.StartBlock(BlockKindInternal.Markup))
  7744. - {
  7745. - Accept(prefix);
  7746. + return null;
  7747. + }
  7748. - // Render a single "@" in place of "@@".
  7749. - Span.ChunkGenerator = new LiteralAttributeChunkGenerator(
  7750. - new LocationTagged<string>(string.Concat(prefix.Select(s => s.Content)), prefixStart),
  7751. - new LocationTagged<string>(CurrentToken.Content, CurrentStart));
  7752. - AcceptAndMoveNext();
  7753. - Output(SpanKindInternal.Markup, AcceptedCharactersInternal.None);
  7754. + AcceptWhile(IsSpacingToken(includeNewLines: true));
  7755. +
  7756. + if (CurrentToken.Kind == SyntaxKind.OpenAngle)
  7757. + {
  7758. + // "<" => Implicit Tag Block
  7759. + ParseTagBlock(builder, new Stack<Tuple<SyntaxToken, SourceLocation>>());
  7760. + }
  7761. + else if (CurrentToken.Kind == SyntaxKind.Transition)
  7762. + {
  7763. + // "@" => Explicit Tag/Single Line Block OR Template
  7764. +
  7765. + // Output whitespace
  7766. + builder.Add(OutputAsMarkupLiteral());
  7767. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  7768. + // Definitely have a transition span
  7769. + Assert(SyntaxKind.Transition);
  7770. + AcceptAndMoveNext();
  7771. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  7772. + SpanContext.ChunkGenerator = SpanChunkGenerator.Null;
  7773. + var transition = GetNodeWithSpanContext(SyntaxFactory.MarkupTransition(Output()));
  7774. + builder.Add(transition);
  7775. + if (At(SyntaxKind.Transition))
  7776. + {
  7777. + SpanContext.ChunkGenerator = SpanChunkGenerator.Null;
  7778. AcceptAndMoveNext();
  7779. - Output(SpanKindInternal.Markup, AcceptedCharactersInternal.None);
  7780. + builder.Add(OutputAsMetaCode(Output(), AcceptedCharactersInternal.Any));
  7781. }
  7782. + ParseAfterTransition(builder);
  7783. }
  7784. else
  7785. {
  7786. - Accept(prefix);
  7787. - var valueStart = CurrentStart;
  7788. - PutCurrentBack();
  7789. + Context.ErrorSink.OnError(
  7790. + RazorDiagnosticFactory.CreateParsing_MarkupBlockMustStartWithTag(
  7791. + new SourceSpan(CurrentStart, CurrentToken.Content.Length)));
  7792. + }
  7793. + builder.Add(OutputAsMarkupLiteral());
  7794. - // Output the prefix but as a null-span. DynamicAttributeBlockChunkGenerator will render it
  7795. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  7796. + var markupBlock = builder.ToList();
  7797. - // Dynamic value, start a new block and set the chunk generator
  7798. - using (Context.Builder.StartBlock(BlockKindInternal.Markup))
  7799. - {
  7800. - Context.Builder.CurrentBlock.ChunkGenerator =
  7801. - new DynamicAttributeBlockChunkGenerator(
  7802. - new LocationTagged<string>(string.Concat(prefix.Select(s => s.Content)), prefixStart),
  7803. - valueStart);
  7804. + return SyntaxFactory.MarkupBlock(markupBlock);
  7805. + }
  7806. + }
  7807. - OtherParserBlock();
  7808. - }
  7809. + private void ParseAfterTransition(in SyntaxListBuilder<RazorSyntaxNode> builder)
  7810. + {
  7811. + // "@:" => Explicit Single Line Block
  7812. + if (CurrentToken.Kind == SyntaxKind.Text && CurrentToken.Content.Length > 0 && CurrentToken.Content[0] == ':')
  7813. + {
  7814. + // Split the token
  7815. + var split = Language.SplitToken(CurrentToken, 1, SyntaxKind.Colon);
  7816. +
  7817. + // The first part (left) is added to this span and we return a MetaCode span
  7818. + Accept(split.Item1);
  7819. + SpanContext.ChunkGenerator = SpanChunkGenerator.Null;
  7820. + builder.Add(OutputAsMetaCode(Output(), AcceptedCharactersInternal.Any));
  7821. + if (split.Item2 != null)
  7822. + {
  7823. + Accept(split.Item2);
  7824. }
  7825. + NextToken();
  7826. + ParseSingleLineMarkup(builder);
  7827. }
  7828. - else
  7829. + else if (CurrentToken.Kind == SyntaxKind.OpenAngle)
  7830. {
  7831. - Accept(prefix);
  7832. -
  7833. - // Literal value
  7834. - // 'quote' should be "Unknown" if not quoted and tokens coming from the tokenizer should never have
  7835. - // "Unknown" type.
  7836. - var valueStart = CurrentStart;
  7837. - var value = ReadWhile(token =>
  7838. - // These three conditions find separators which break the attribute value into portions
  7839. - token.Kind != SyntaxKind.Whitespace &&
  7840. - token.Kind != SyntaxKind.NewLine &&
  7841. - token.Kind != SyntaxKind.Transition &&
  7842. - // This condition checks for the end of the attribute value (it repeats some of the checks above
  7843. - // but for now that's ok)
  7844. - !IsEndOfAttributeValue(quote, token));
  7845. - Accept(value);
  7846. - Span.ChunkGenerator = new LiteralAttributeChunkGenerator(
  7847. - new LocationTagged<string>(string.Concat(prefix.Select(s => s.Content)), prefixStart),
  7848. - new LocationTagged<string>(string.Concat(value.Select(s => s.Content)), valueStart));
  7849. + ParseTagBlock(builder, new Stack<Tuple<SyntaxToken, SourceLocation>>());
  7850. }
  7851. - Output(SpanKindInternal.Markup);
  7852. }
  7853. - private bool IsEndOfAttributeValue(SyntaxKind quote, SyntaxToken token)
  7854. + private void ParseSingleLineMarkup(in SyntaxListBuilder<RazorSyntaxNode> builder)
  7855. {
  7856. - return EndOfFile || token == null ||
  7857. - (quote != SyntaxKind.Unknown
  7858. - ? token.Kind == quote // If quoted, just wait for the quote
  7859. - : IsUnquotedEndOfAttributeValue(token));
  7860. + // Parse until a newline, it's that simple!
  7861. + // First, signal to code parser that whitespace is significant to us.
  7862. + var old = Context.WhiteSpaceIsSignificantToAncestorBlock;
  7863. + Context.WhiteSpaceIsSignificantToAncestorBlock = true;
  7864. + SpanContext.EditHandler = new SpanEditHandler(Language.TokenizeString);
  7865. + SkipToAndParseCode(builder, SyntaxKind.NewLine);
  7866. + if (!EndOfFile && CurrentToken.Kind == SyntaxKind.NewLine)
  7867. + {
  7868. + AcceptAndMoveNext();
  7869. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  7870. + }
  7871. + PutCurrentBack();
  7872. + Context.WhiteSpaceIsSignificantToAncestorBlock = old;
  7873. + builder.Add(OutputAsMarkupLiteral());
  7874. }
  7875. - private bool IsUnquotedEndOfAttributeValue(SyntaxToken token)
  7876. + private void ParseTagBlock(in SyntaxListBuilder<RazorSyntaxNode> builder, Stack<Tuple<SyntaxToken, SourceLocation>> tags)
  7877. {
  7878. - // If unquoted, we have a larger set of terminating characters:
  7879. - // http://dev.w3.org/html5/spec/tokenization.html#attribute-value-unquoted-state
  7880. - // Also we need to detect "/" and ">"
  7881. - return token.Kind == SyntaxKind.DoubleQuote ||
  7882. - token.Kind == SyntaxKind.SingleQuote ||
  7883. - token.Kind == SyntaxKind.OpenAngle ||
  7884. - token.Kind == SyntaxKind.Equals ||
  7885. - (token.Kind == SyntaxKind.ForwardSlash && NextIs(SyntaxKind.CloseAngle)) ||
  7886. - token.Kind == SyntaxKind.CloseAngle ||
  7887. - token.Kind == SyntaxKind.Whitespace ||
  7888. - token.Kind == SyntaxKind.NewLine;
  7889. - }
  7890. + // TODO: This is really ugly and needs to be cleaned up.
  7891. - private void RecoverToEndOfTag()
  7892. - {
  7893. - // Accept until ">", "/" or "<", but parse code
  7894. - while (!EndOfFile)
  7895. + // Skip Whitespace and Text
  7896. + var completeTag = false;
  7897. + var blockAlreadyBuilt = false;
  7898. + do
  7899. {
  7900. - SkipToAndParseCode(IsTagRecoveryStopPoint);
  7901. - if (!EndOfFile)
  7902. + SkipToAndParseCode(builder, SyntaxKind.OpenAngle);
  7903. +
  7904. + // Output everything prior to the OpenAngle into a markup span
  7905. + builder.Add(OutputAsMarkupLiteral());
  7906. +
  7907. + var tagBuilder = builder;
  7908. + IDisposable tagBuilderDisposable = null;
  7909. + try
  7910. {
  7911. - EnsureCurrent();
  7912. - switch (CurrentToken.Kind)
  7913. + if (EndOfFile)
  7914. {
  7915. - case SyntaxKind.SingleQuote:
  7916. - case SyntaxKind.DoubleQuote:
  7917. - ParseQuoted();
  7918. - break;
  7919. - case SyntaxKind.OpenAngle:
  7920. - // Another "<" means this tag is invalid.
  7921. - case SyntaxKind.ForwardSlash:
  7922. - // Empty tag
  7923. - case SyntaxKind.CloseAngle:
  7924. - // End of tag
  7925. - return;
  7926. - default:
  7927. - AcceptAndMoveNext();
  7928. - break;
  7929. + // Do not want to start a new tag block if we're at the end of the file.
  7930. + EndTagBlock(builder, tags, complete: true);
  7931. + }
  7932. + else
  7933. + {
  7934. + var atSpecialTag = AtSpecialTag;
  7935. + if (!atSpecialTag)
  7936. + {
  7937. + // Start a tag block. This is used to wrap things like <p> or <a class="btn"> etc.
  7938. + var pooledResult = Pool.Allocate<RazorSyntaxNode>();
  7939. + tagBuilderDisposable = pooledResult;
  7940. + tagBuilder = pooledResult.Builder;
  7941. + }
  7942. + _bufferedOpenAngle = null;
  7943. + _lastTagStart = CurrentStart;
  7944. + Assert(SyntaxKind.OpenAngle);
  7945. + _bufferedOpenAngle = CurrentToken;
  7946. + var tagStart = CurrentStart;
  7947. + if (!NextToken())
  7948. + {
  7949. + Accept(_bufferedOpenAngle);
  7950. + EndTagBlock(tagBuilder, tags, complete: false);
  7951. + }
  7952. + else if (atSpecialTag && At(SyntaxKind.Bang))
  7953. + {
  7954. + Accept(_bufferedOpenAngle);
  7955. + completeTag = ParseBangTag(builder);
  7956. + blockAlreadyBuilt = completeTag;
  7957. + }
  7958. + else
  7959. + {
  7960. + var result = ParseAfterTagStart(tagBuilder, builder, tagStart, tags);
  7961. + completeTag = result.Item1;
  7962. + blockAlreadyBuilt = result.Item2;
  7963. + }
  7964. + }
  7965. +
  7966. + if (completeTag)
  7967. + {
  7968. + // Completed tags have no accepted characters inside of blocks.
  7969. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  7970. + }
  7971. +
  7972. + if (blockAlreadyBuilt)
  7973. + {
  7974. + // Output the contents of the tag into its own markup span.
  7975. + builder.Add(OutputAsMarkupLiteral());
  7976. + }
  7977. + else if (tagBuilderDisposable != null)
  7978. + {
  7979. + // A new tag block was started. Build it.
  7980. + // Output the contents of the tag into its own markup span.
  7981. + tagBuilder.Add(OutputAsMarkupLiteral());
  7982. + var tagBlock = SyntaxFactory.MarkupTagBlock(tagBuilder.ToList());
  7983. + builder.Add(tagBlock);
  7984. + }
  7985. + }
  7986. + finally
  7987. + {
  7988. + // Will be null if we were at end of file or special tag when initially created.
  7989. + if (tagBuilderDisposable != null)
  7990. + {
  7991. + // End tag block
  7992. + tagBuilderDisposable.Dispose();
  7993. }
  7994. }
  7995. }
  7996. - }
  7997. + while (tags.Count > 0);
  7998. - private void ParseQuoted()
  7999. - {
  8000. - var type = CurrentToken.Kind;
  8001. - AcceptAndMoveNext();
  8002. - ParseQuoted(type);
  8003. + EndTagBlock(builder, tags, completeTag);
  8004. }
  8005. - private void ParseQuoted(SyntaxKind type)
  8006. + private Tuple<bool, bool> ParseAfterTagStart(
  8007. + in SyntaxListBuilder<RazorSyntaxNode> builder,
  8008. + in SyntaxListBuilder<RazorSyntaxNode> parentBuilder,
  8009. + SourceLocation tagStart,
  8010. + Stack<Tuple<SyntaxToken, SourceLocation>> tags)
  8011. {
  8012. - SkipToAndParseCode(type);
  8013. + var blockAlreadyBuilt = false;
  8014. if (!EndOfFile)
  8015. {
  8016. - Assert(type);
  8017. - AcceptAndMoveNext();
  8018. + switch (CurrentToken.Kind)
  8019. + {
  8020. + case SyntaxKind.ForwardSlash:
  8021. + // End Tag
  8022. + return ParseEndTag(builder, parentBuilder, tagStart, tags);
  8023. + case SyntaxKind.QuestionMark:
  8024. + // XML PI
  8025. + Accept(_bufferedOpenAngle);
  8026. + var complete = TryParseXmlPI(builder);
  8027. + // No block is created for Xml PI. So return the same value as complete.
  8028. + blockAlreadyBuilt = complete;
  8029. + return Tuple.Create(complete, blockAlreadyBuilt);
  8030. + default:
  8031. + // Start Tag
  8032. + return ParseStartTag(builder, parentBuilder, tags);
  8033. + }
  8034. }
  8035. + if (tags.Count == 0)
  8036. + {
  8037. + Context.ErrorSink.OnError(
  8038. + RazorDiagnosticFactory.CreateParsing_OuterTagMissingName(
  8039. + new SourceSpan(CurrentStart, contentLength: 1 /* end of file */)));
  8040. + }
  8041. +
  8042. + return Tuple.Create(false, blockAlreadyBuilt);
  8043. }
  8044. - private bool StartTag(Stack<Tuple<SyntaxToken, SourceLocation>> tags, IDisposable tagBlockWrapper)
  8045. + private Tuple<bool, bool> ParseStartTag(
  8046. + in SyntaxListBuilder<RazorSyntaxNode> builder,
  8047. + in SyntaxListBuilder<RazorSyntaxNode> parentBuilder,
  8048. + Stack<Tuple<SyntaxToken, SourceLocation>> tags)
  8049. {
  8050. SyntaxToken bangToken = null;
  8051. SyntaxToken potentialTagNameToken;
  8052. @@ -1189,7 +1348,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8053. if (potentialTagNameToken == null || potentialTagNameToken.Kind != SyntaxKind.Text)
  8054. {
  8055. - tagName = SyntaxFactory.Token(SyntaxKind.Unknown, string.Empty);
  8056. + tagName = SyntaxFactory.Token(SyntaxKind.Marker, string.Empty);
  8057. }
  8058. else if (bangToken != null)
  8059. {
  8060. @@ -1207,8 +1366,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8061. // <!text> tags are treated like any other escaped HTML start tag.
  8062. string.Equals(tag.Item1.Content, SyntaxConstants.TextTagName, StringComparison.OrdinalIgnoreCase))
  8063. {
  8064. - Output(SpanKindInternal.Markup);
  8065. - Span.ChunkGenerator = SpanChunkGenerator.Null;
  8066. + builder.Add(OutputAsMarkupLiteral());
  8067. + SpanContext.ChunkGenerator = SpanChunkGenerator.Null;
  8068. Accept(_bufferedOpenAngle);
  8069. var textLocation = CurrentStart;
  8070. @@ -1228,7 +1387,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8071. tokens = ReadWhile(IsSpacingToken(includeNewLines: true));
  8072. }
  8073. - if (!Optional(SyntaxKind.CloseAngle))
  8074. + if (!TryAccept(SyntaxKind.CloseAngle))
  8075. {
  8076. Context.Source.Position = bookmark;
  8077. NextToken();
  8078. @@ -1241,7 +1400,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8079. else
  8080. {
  8081. Accept(tokens);
  8082. - Span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  8083. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  8084. }
  8085. if (!empty)
  8086. @@ -1249,28 +1408,34 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8087. tags.Push(tag);
  8088. }
  8089. - CompleteTagBlockWithSpan(tagBlockWrapper, Span.EditHandler.AcceptedCharacters, SpanKindInternal.Transition);
  8090. + var transition = GetNodeWithSpanContext(SyntaxFactory.MarkupTransition(Output()));
  8091. + builder.Add(transition);
  8092. + var tagBlock = SyntaxFactory.MarkupTagBlock(builder.ToList());
  8093. + parentBuilder.Add(tagBlock);
  8094. - return true;
  8095. + return Tuple.Create(true, true);
  8096. }
  8097. Accept(_bufferedOpenAngle);
  8098. - OptionalBangEscape();
  8099. - Optional(SyntaxKind.Text);
  8100. - return RestOfTag(tag, tags, tagBlockWrapper);
  8101. + ParseOptionalBangEscape(builder);
  8102. + TryAccept(SyntaxKind.Text);
  8103. + return ParseRestOfTag(builder, parentBuilder, tag, tags);
  8104. }
  8105. - private bool RestOfTag(Tuple<SyntaxToken, SourceLocation> tag,
  8106. - Stack<Tuple<SyntaxToken, SourceLocation>> tags,
  8107. - IDisposable tagBlockWrapper)
  8108. + private Tuple<bool, bool> ParseRestOfTag(
  8109. + in SyntaxListBuilder<RazorSyntaxNode> builder,
  8110. + in SyntaxListBuilder<RazorSyntaxNode> parentBuilder,
  8111. + Tuple<SyntaxToken, SourceLocation> tag,
  8112. + Stack<Tuple<SyntaxToken, SourceLocation>> tags)
  8113. {
  8114. - TagContent();
  8115. + var blockAlreadyBuilt = false;
  8116. + ParseTagContent(builder);
  8117. // We are now at a possible end of the tag
  8118. // Found '<', so we just abort this tag.
  8119. if (At(SyntaxKind.OpenAngle))
  8120. {
  8121. - return false;
  8122. + return Tuple.Create(false, blockAlreadyBuilt);
  8123. }
  8124. var isEmpty = At(SyntaxKind.ForwardSlash);
  8125. @@ -1281,7 +1446,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8126. }
  8127. // Check for the '>' to determine if the tag is finished
  8128. - var seenClose = Optional(SyntaxKind.CloseAngle);
  8129. + var seenClose = TryAccept(SyntaxKind.CloseAngle);
  8130. if (!seenClose)
  8131. {
  8132. Context.ErrorSink.OnError(
  8133. @@ -1299,7 +1464,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8134. var tagName = tag.Item1.Content.Trim();
  8135. if (VoidElements.Contains(tagName))
  8136. {
  8137. - CompleteTagBlockWithSpan(tagBlockWrapper, AcceptedCharactersInternal.None, SpanKindInternal.Markup);
  8138. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  8139. + builder.Add(OutputAsMarkupLiteral());
  8140. + var tagBlock = SyntaxFactory.MarkupTagBlock(builder.ToList());
  8141. + parentBuilder.Add(tagBlock);
  8142. + blockAlreadyBuilt = true;
  8143. // Technically, void elements like "meta" are not allowed to have end tags. Just in case they do,
  8144. // we need to look ahead at the next set of tokens. If we see "<", "/", tag name, accept it and the ">" following it
  8145. @@ -1321,10 +1490,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8146. {
  8147. // Accept up to here
  8148. Accept(whiteSpace);
  8149. - Output(SpanKindInternal.Markup); // Output the whitespace
  8150. + parentBuilder.Add(OutputAsMarkupLiteral()); // Output the whitespace
  8151. - using (Context.Builder.StartBlock(BlockKindInternal.Tag))
  8152. + using (var pooledResult = Pool.Allocate<RazorSyntaxNode>())
  8153. {
  8154. + var tagBuilder = pooledResult.Builder;
  8155. Accept(openAngle);
  8156. Accept(solidus);
  8157. AcceptAndMoveNext();
  8158. @@ -1332,17 +1502,18 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8159. // Accept to '>', '<' or EOF
  8160. AcceptUntil(SyntaxKind.CloseAngle, SyntaxKind.OpenAngle);
  8161. // Accept the '>' if we saw it. And if we do see it, we're complete
  8162. - var complete = Optional(SyntaxKind.CloseAngle);
  8163. + var complete = TryAccept(SyntaxKind.CloseAngle);
  8164. if (complete)
  8165. {
  8166. - Span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  8167. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  8168. }
  8169. // Output the closing void element
  8170. - Output(SpanKindInternal.Markup);
  8171. + tagBuilder.Add(OutputAsMarkupLiteral());
  8172. + parentBuilder.Add(SyntaxFactory.MarkupTagBlock(tagBuilder.ToList()));
  8173. - return complete;
  8174. + return Tuple.Create(complete, blockAlreadyBuilt);
  8175. }
  8176. }
  8177. }
  8178. @@ -1353,11 +1524,15 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8179. }
  8180. else if (string.Equals(tagName, ScriptTagName, StringComparison.OrdinalIgnoreCase))
  8181. {
  8182. - if (!CurrentScriptTagExpectsHtml())
  8183. + if (!CurrentScriptTagExpectsHtml(builder))
  8184. {
  8185. - CompleteTagBlockWithSpan(tagBlockWrapper, AcceptedCharactersInternal.None, SpanKindInternal.Markup);
  8186. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  8187. + builder.Add(OutputAsMarkupLiteral());
  8188. + var tagBlock = SyntaxFactory.MarkupTagBlock(builder.ToList());
  8189. + parentBuilder.Add(tagBlock);
  8190. + blockAlreadyBuilt = true;
  8191. - SkipToEndScriptAndParseCode(endTagAcceptedCharacters: AcceptedCharactersInternal.None);
  8192. + SkipToEndScriptAndParseCode(parentBuilder, endTagAcceptedCharacters: AcceptedCharactersInternal.None);
  8193. }
  8194. else
  8195. {
  8196. @@ -1372,97 +1547,103 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8197. }
  8198. }
  8199. }
  8200. - return seenClose;
  8201. + return Tuple.Create(seenClose, blockAlreadyBuilt);
  8202. }
  8203. - private void SkipToEndScriptAndParseCode(AcceptedCharactersInternal endTagAcceptedCharacters = AcceptedCharactersInternal.Any)
  8204. + private Tuple<bool, bool> ParseEndTag(
  8205. + in SyntaxListBuilder<RazorSyntaxNode> builder,
  8206. + in SyntaxListBuilder<RazorSyntaxNode> parentBuilder,
  8207. + SourceLocation tagStart,
  8208. + Stack<Tuple<SyntaxToken, SourceLocation>> tags)
  8209. {
  8210. - // Special case for <script>: Skip to end of script tag and parse code
  8211. - var seenEndScript = false;
  8212. -
  8213. - while (!seenEndScript && !EndOfFile)
  8214. + // Accept "/" and move next
  8215. + Assert(SyntaxKind.ForwardSlash);
  8216. + var forwardSlash = CurrentToken;
  8217. + if (!NextToken())
  8218. {
  8219. - SkipToAndParseCode(SyntaxKind.OpenAngle);
  8220. - var tagStart = CurrentStart;
  8221. + Accept(_bufferedOpenAngle);
  8222. + Accept(forwardSlash);
  8223. + return Tuple.Create(false, false);
  8224. + }
  8225. + else
  8226. + {
  8227. + var tagName = string.Empty;
  8228. + SyntaxToken bangToken = null;
  8229. - if (NextIs(SyntaxKind.ForwardSlash))
  8230. + if (At(SyntaxKind.Bang))
  8231. {
  8232. - var openAngle = CurrentToken;
  8233. - NextToken(); // Skip over '<', current is '/'
  8234. - var solidus = CurrentToken;
  8235. - NextToken(); // Skip over '/', current should be text
  8236. + bangToken = CurrentToken;
  8237. - if (At(SyntaxKind.Text) &&
  8238. - string.Equals(CurrentToken.Content, ScriptTagName, StringComparison.OrdinalIgnoreCase))
  8239. + var nextToken = Lookahead(count: 1);
  8240. +
  8241. + if (nextToken != null && nextToken.Kind == SyntaxKind.Text)
  8242. {
  8243. - seenEndScript = true;
  8244. + tagName = "!" + nextToken.Content;
  8245. }
  8246. -
  8247. - // We put everything back because we just wanted to look ahead to see if the current end tag that we're parsing is
  8248. - // the script tag. If so we'll generate correct code to encompass it.
  8249. - PutCurrentBack(); // Put back whatever was after the solidus
  8250. - PutBack(solidus); // Put back '/'
  8251. - PutBack(openAngle); // Put back '<'
  8252. -
  8253. - // We just looked ahead, this NextToken will set CurrentToken to an open angle bracket.
  8254. - NextToken();
  8255. }
  8256. -
  8257. - if (seenEndScript)
  8258. + else if (At(SyntaxKind.Text))
  8259. {
  8260. - Output(SpanKindInternal.Markup);
  8261. + tagName = CurrentToken.Content;
  8262. + }
  8263. - using (Context.Builder.StartBlock(BlockKindInternal.Tag))
  8264. - {
  8265. - Span.EditHandler.AcceptedCharacters = endTagAcceptedCharacters;
  8266. + var matched = RemoveTag(tags, tagName, tagStart);
  8267. - AcceptAndMoveNext(); // '<'
  8268. - AcceptAndMoveNext(); // '/'
  8269. - SkipToAndParseCode(SyntaxKind.CloseAngle);
  8270. - if (!Optional(SyntaxKind.CloseAngle))
  8271. - {
  8272. - Context.ErrorSink.OnError(
  8273. - RazorDiagnosticFactory.CreateParsing_UnfinishedTag(
  8274. - new SourceSpan(SourceLocationTracker.Advance(tagStart, "</"), ScriptTagName.Length),
  8275. - ScriptTagName));
  8276. - }
  8277. - Output(SpanKindInternal.Markup);
  8278. - }
  8279. - }
  8280. - else
  8281. + if (tags.Count == 0 &&
  8282. + // Note tagName may contain a '!' escape character. This ensures </!text> doesn't match here.
  8283. + // </!text> tags are treated like any other escaped HTML end tag.
  8284. + string.Equals(tagName, SyntaxConstants.TextTagName, StringComparison.OrdinalIgnoreCase) &&
  8285. + matched)
  8286. {
  8287. - AcceptAndMoveNext(); // Accept '<' (not the closing script tag's open angle)
  8288. + return EndTextTag(builder, parentBuilder, forwardSlash);
  8289. }
  8290. + Accept(_bufferedOpenAngle);
  8291. + Accept(forwardSlash);
  8292. +
  8293. + ParseOptionalBangEscape(builder);
  8294. +
  8295. + AcceptUntil(SyntaxKind.CloseAngle);
  8296. +
  8297. + // Accept the ">"
  8298. + return Tuple.Create(TryAccept(SyntaxKind.CloseAngle), false);
  8299. }
  8300. }
  8301. - private void CompleteTagBlockWithSpan(IDisposable tagBlockWrapper,
  8302. - AcceptedCharactersInternal acceptedCharacters,
  8303. - SpanKindInternal spanKind)
  8304. + private Tuple<bool, bool> EndTextTag(
  8305. + in SyntaxListBuilder<RazorSyntaxNode> builder,
  8306. + in SyntaxListBuilder<RazorSyntaxNode> parentBuilder,
  8307. + SyntaxToken solidus)
  8308. {
  8309. - Debug.Assert(tagBlockWrapper != null,
  8310. - "Tag block wrapper should not be null when attempting to complete a block");
  8311. -
  8312. - Span.EditHandler.AcceptedCharacters = acceptedCharacters;
  8313. - // Write out the current span into the block before closing it.
  8314. - Output(spanKind);
  8315. - // Finish the tag block
  8316. - tagBlockWrapper.Dispose();
  8317. - }
  8318. + Accept(_bufferedOpenAngle);
  8319. + Accept(solidus);
  8320. - private bool AcceptUntilAll(params SyntaxKind[] endSequence)
  8321. - {
  8322. - while (!EndOfFile)
  8323. + var textLocation = CurrentStart;
  8324. + Assert(SyntaxKind.Text);
  8325. + AcceptAndMoveNext();
  8326. +
  8327. + var seenCloseAngle = TryAccept(SyntaxKind.CloseAngle);
  8328. +
  8329. + if (!seenCloseAngle)
  8330. {
  8331. - SkipToAndParseCode(endSequence[0]);
  8332. - if (AcceptAll(endSequence))
  8333. - {
  8334. - return true;
  8335. - }
  8336. + Context.ErrorSink.OnError(
  8337. + RazorDiagnosticFactory.CreateParsing_TextTagCannotContainAttributes(
  8338. + new SourceSpan(textLocation, contentLength: 4 /* text */)));
  8339. +
  8340. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.Any;
  8341. + RecoverTextTag();
  8342. }
  8343. - Debug.Assert(EndOfFile);
  8344. - Span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.Any;
  8345. - return false;
  8346. + else
  8347. + {
  8348. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  8349. + }
  8350. +
  8351. + SpanContext.ChunkGenerator = SpanChunkGenerator.Null;
  8352. +
  8353. + var transition = GetNodeWithSpanContext(SyntaxFactory.MarkupTransition(Output()));
  8354. + builder.Add(transition);
  8355. + var tagBlock = SyntaxFactory.MarkupTagBlock(builder.ToList());
  8356. + parentBuilder.Add(tagBlock);
  8357. +
  8358. + return Tuple.Create(seenCloseAngle, true);
  8359. }
  8360. private bool RemoveTag(Stack<Tuple<SyntaxToken, SourceLocation>> tags, string tagName, SourceLocation tagStart)
  8361. @@ -1495,7 +1676,19 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8362. return false;
  8363. }
  8364. - private void EndTagBlock(Stack<Tuple<SyntaxToken, SourceLocation>> tags, bool complete)
  8365. + private void RecoverTextTag()
  8366. + {
  8367. + // We don't want to skip-to and parse because there shouldn't be anything in the body of text tags.
  8368. + AcceptUntil(SyntaxKind.CloseAngle, SyntaxKind.NewLine);
  8369. +
  8370. + // Include the close angle in the text tag block if it's there, otherwise just move on
  8371. + TryAccept(SyntaxKind.CloseAngle);
  8372. + }
  8373. +
  8374. + private void EndTagBlock(
  8375. + in SyntaxListBuilder<RazorSyntaxNode> builder,
  8376. + Stack<Tuple<SyntaxToken, SourceLocation>> tags,
  8377. + bool complete)
  8378. {
  8379. if (tags.Count > 0)
  8380. {
  8381. @@ -1514,14 +1707,16 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8382. }
  8383. else if (complete)
  8384. {
  8385. - Span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  8386. + SpanContext.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  8387. }
  8388. tags.Clear();
  8389. if (!Context.DesignTimeMode)
  8390. {
  8391. var shouldAcceptWhitespaceAndNewLine = true;
  8392. - if (Context.Builder.LastSpan.Kind == SpanKindInternal.Transition)
  8393. + // Check if the previous span was a transition.
  8394. + var previousSpan = builder.Count > 0 ? GetLastSpan(builder[builder.Count - 1]) : null;
  8395. + if (previousSpan != null && previousSpan.Kind == SyntaxKind.MarkupTransition)
  8396. {
  8397. var tokens = ReadWhile(
  8398. f => (f.Kind == SyntaxKind.Whitespace) || (f.Kind == SyntaxKind.NewLine));
  8399. @@ -1543,272 +1738,57 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8400. {
  8401. // Accept whitespace and a single newline if present
  8402. AcceptWhile(SyntaxKind.Whitespace);
  8403. - Optional(SyntaxKind.NewLine);
  8404. + TryAccept(SyntaxKind.NewLine);
  8405. }
  8406. }
  8407. - else if (Span.EditHandler.AcceptedCharacters == AcceptedCharactersInternal.Any)
  8408. + else if (SpanContext.EditHandler.AcceptedCharacters == AcceptedCharactersInternal.Any)
  8409. {
  8410. AcceptWhile(SyntaxKind.Whitespace);
  8411. - Optional(SyntaxKind.NewLine);
  8412. + TryAccept(SyntaxKind.NewLine);
  8413. }
  8414. PutCurrentBack();
  8415. if (!complete)
  8416. {
  8417. - AddMarkerTokenIfNecessary();
  8418. - }
  8419. - Output(SpanKindInternal.Markup);
  8420. - }
  8421. -
  8422. - internal static bool IsValidAttributeNameToken(SyntaxToken token)
  8423. - {
  8424. - if (token == null)
  8425. - {
  8426. - return false;
  8427. - }
  8428. -
  8429. - // These restrictions cover most of the spec defined: http://www.w3.org/TR/html5/syntax.html#attributes-0
  8430. - // However, it's not all of it. For instance we don't special case control characters or allow OpenAngle.
  8431. - // It also doesn't try to exclude Razor specific features such as the @ transition. This is based on the
  8432. - // expectation that the parser handles such scenarios prior to falling through to name resolution.
  8433. - var tokenType = token.Kind;
  8434. - return tokenType != SyntaxKind.Whitespace &&
  8435. - tokenType != SyntaxKind.NewLine &&
  8436. - tokenType != SyntaxKind.CloseAngle &&
  8437. - tokenType != SyntaxKind.OpenAngle &&
  8438. - tokenType != SyntaxKind.ForwardSlash &&
  8439. - tokenType != SyntaxKind.DoubleQuote &&
  8440. - tokenType != SyntaxKind.SingleQuote &&
  8441. - tokenType != SyntaxKind.Equals &&
  8442. - tokenType != SyntaxKind.Unknown;
  8443. - }
  8444. -
  8445. - public void ParseDocument()
  8446. - {
  8447. - if (Context == null)
  8448. - {
  8449. - throw new InvalidOperationException(Resources.Parser_Context_Not_Set);
  8450. - }
  8451. -
  8452. - using (PushSpanConfig(DefaultMarkupSpan))
  8453. - {
  8454. - using (Context.Builder.StartBlock(BlockKindInternal.Markup))
  8455. - {
  8456. - Span.Start = CurrentLocation;
  8457. -
  8458. - ParserState = ParserState.Misc;
  8459. - NextToken();
  8460. - while (!EndOfFile)
  8461. - {
  8462. - SkipToAndParseCode(SyntaxKind.OpenAngle);
  8463. - ScanTagInDocumentContext();
  8464. - }
  8465. - AddMarkerTokenIfNecessary();
  8466. - Output(SpanKindInternal.Markup);
  8467. - }
  8468. - }
  8469. - }
  8470. -
  8471. - /// <summary>
  8472. - /// Reads the content of a tag (if present) in the MarkupDocument (or MarkupSection) context,
  8473. - /// where we don't care about maintaining a stack of tags.
  8474. - /// </summary>
  8475. - private void ScanTagInDocumentContext()
  8476. - {
  8477. - if (At(SyntaxKind.OpenAngle))
  8478. - {
  8479. - if (NextIs(SyntaxKind.Bang))
  8480. - {
  8481. - // Checking to see if we meet the conditions of a special '!' tag: <!DOCTYPE, <![CDATA[, <!--.
  8482. - if (!IsBangEscape(lookahead: 1))
  8483. - {
  8484. - if (Lookahead(2)?.Kind == SyntaxKind.DoubleHyphen)
  8485. - {
  8486. - Output(SpanKindInternal.Markup);
  8487. - }
  8488. -
  8489. - AcceptAndMoveNext(); // Accept '<'
  8490. - BangTag();
  8491. -
  8492. - return;
  8493. - }
  8494. -
  8495. - // We should behave like a normal tag that has a parser escape, fall through to the normal
  8496. - // tag logic.
  8497. - }
  8498. - else if (NextIs(SyntaxKind.QuestionMark))
  8499. - {
  8500. - AcceptAndMoveNext(); // Accept '<'
  8501. - XmlPI();
  8502. - return;
  8503. - }
  8504. -
  8505. - if (ParserState == ParserState.Content)
  8506. - {
  8507. - Output(SpanKindInternal.Markup, SyntaxKind.HtmlTextLiteral);
  8508. - }
  8509. - else
  8510. - {
  8511. - Output(SpanKindInternal.Markup);
  8512. - }
  8513. -
  8514. - // Start tag block
  8515. - var tagBlock = Context.Builder.StartBlock(BlockKindInternal.Tag);
  8516. -
  8517. - AcceptAndMoveNext(); // Accept '<'
  8518. -
  8519. - if (!At(SyntaxKind.ForwardSlash))
  8520. - {
  8521. - ParserState = ParserState.StartTag;
  8522. - OptionalBangEscape();
  8523. -
  8524. - // Parsing a start tag
  8525. - var scriptTag = At(SyntaxKind.Text) &&
  8526. - string.Equals(CurrentToken.Content, "script", StringComparison.OrdinalIgnoreCase);
  8527. - Optional(SyntaxKind.Text);
  8528. - TagContent(); // Parse the tag, don't care about the content
  8529. - Optional(SyntaxKind.ForwardSlash);
  8530. - Optional(SyntaxKind.CloseAngle);
  8531. -
  8532. - ParserState = ParserState.Content;
  8533. -
  8534. - // If the script tag expects javascript content then we should do minimal parsing until we reach
  8535. - // the end script tag. Don't want to incorrectly parse a "var tag = '<input />';" as an HTML tag.
  8536. - if (scriptTag && !CurrentScriptTagExpectsHtml())
  8537. - {
  8538. - Output(SpanKindInternal.Markup);
  8539. - tagBlock.Dispose();
  8540. -
  8541. - SkipToEndScriptAndParseCode();
  8542. - return;
  8543. - }
  8544. - }
  8545. - else
  8546. - {
  8547. - // Parsing an end tag
  8548. - // This section can accept things like: '</p >' or '</p>' etc.
  8549. - ParserState = ParserState.EndTag;
  8550. - Optional(SyntaxKind.ForwardSlash);
  8551. -
  8552. - // Whitespace here is invalid (according to the spec)
  8553. - OptionalBangEscape();
  8554. - Optional(SyntaxKind.Text);
  8555. - Optional(SyntaxKind.Whitespace);
  8556. - Optional(SyntaxKind.CloseAngle);
  8557. - ParserState = ParserState.Content;
  8558. - }
  8559. -
  8560. - Output(SpanKindInternal.Markup);
  8561. -
  8562. - // End tag block
  8563. - tagBlock.Dispose();
  8564. - }
  8565. - }
  8566. -
  8567. - private bool CurrentScriptTagExpectsHtml()
  8568. - {
  8569. - var blockBuilder = Context.Builder.CurrentBlock;
  8570. -
  8571. - Debug.Assert(blockBuilder != null);
  8572. -
  8573. - var typeAttribute = blockBuilder.Children
  8574. - .OfType<Block>()
  8575. - .Where(block =>
  8576. - block.ChunkGenerator is AttributeBlockChunkGenerator &&
  8577. - block.Children.Count() >= 2)
  8578. - .FirstOrDefault(IsTypeAttribute);
  8579. -
  8580. - if (typeAttribute != null)
  8581. - {
  8582. - var contentValues = typeAttribute.Children
  8583. - .OfType<Span>()
  8584. - .Where(childSpan => childSpan.ChunkGenerator is LiteralAttributeChunkGenerator)
  8585. - .Select(childSpan => childSpan.Content);
  8586. -
  8587. - var scriptType = string.Concat(contentValues).Trim();
  8588. -
  8589. - // Does not allow charset parameter (or any other parameters).
  8590. - return string.Equals(scriptType, "text/html", StringComparison.OrdinalIgnoreCase);
  8591. - }
  8592. -
  8593. - return false;
  8594. - }
  8595. -
  8596. - private static bool IsTypeAttribute(Block block)
  8597. - {
  8598. -
  8599. - if (!(block.Children.First() is Span span))
  8600. - {
  8601. - return false;
  8602. - }
  8603. -
  8604. - var trimmedStartContent = span.Content.TrimStart();
  8605. - if (trimmedStartContent.StartsWith("type", StringComparison.OrdinalIgnoreCase) &&
  8606. - (trimmedStartContent.Length == 4 ||
  8607. - ValidAfterTypeAttributeNameCharacters.Contains(trimmedStartContent[4])))
  8608. - {
  8609. - return true;
  8610. + AcceptMarkerTokenIfNecessary();
  8611. }
  8612. - return false;
  8613. + builder.Add(OutputAsMarkupLiteral());
  8614. }
  8615. - public void ParseRazorBlock(Tuple<string, string> nestingSequences, bool caseSensitive)
  8616. + public MarkupBlockSyntax ParseRazorBlock(Tuple<string, string> nestingSequences, bool caseSensitive)
  8617. {
  8618. if (Context == null)
  8619. {
  8620. throw new InvalidOperationException(Resources.Parser_Context_Not_Set);
  8621. }
  8622. - using (PushSpanConfig(DefaultMarkupSpan))
  8623. + using (var pooledResult = Pool.Allocate<RazorSyntaxNode>())
  8624. + using (PushSpanContextConfig(DefaultMarkupSpanContext))
  8625. {
  8626. - Span.Start = CurrentLocation;
  8627. + var builder = pooledResult.Builder;
  8628. - using (Context.Builder.StartBlock(BlockKindInternal.Markup))
  8629. - {
  8630. - NextToken();
  8631. - CaseSensitive = caseSensitive;
  8632. - if (nestingSequences.Item1 == null)
  8633. - {
  8634. - NonNestingSection(nestingSequences.Item2.Split());
  8635. - }
  8636. - else
  8637. - {
  8638. - NestingSection(nestingSequences);
  8639. - }
  8640. - AddMarkerTokenIfNecessary();
  8641. - Output(SpanKindInternal.Markup);
  8642. - }
  8643. - }
  8644. - }
  8645. + NextToken();
  8646. + CaseSensitive = caseSensitive;
  8647. + NestingBlock(builder, nestingSequences);
  8648. + AcceptMarkerTokenIfNecessary();
  8649. + builder.Add(OutputAsMarkupLiteral());
  8650. - private void NonNestingSection(string[] nestingSequenceComponents)
  8651. - {
  8652. - do
  8653. - {
  8654. - SkipToAndParseCode(token => token.Kind == SyntaxKind.OpenAngle || AtEnd(nestingSequenceComponents));
  8655. - ScanTagInDocumentContext();
  8656. - if (!EndOfFile && AtEnd(nestingSequenceComponents))
  8657. - {
  8658. - break;
  8659. - }
  8660. + return SyntaxFactory.MarkupBlock(builder.ToList());
  8661. }
  8662. - while (!EndOfFile);
  8663. -
  8664. - PutCurrentBack();
  8665. }
  8666. - private void NestingSection(Tuple<string, string> nestingSequences)
  8667. + private void NestingBlock(in SyntaxListBuilder<RazorSyntaxNode> builder, Tuple<string, string> nestingSequences)
  8668. {
  8669. var nesting = 1;
  8670. while (nesting > 0 && !EndOfFile)
  8671. {
  8672. - SkipToAndParseCode(token =>
  8673. + SkipToAndParseCode(builder, token =>
  8674. token.Kind == SyntaxKind.Text ||
  8675. token.Kind == SyntaxKind.OpenAngle);
  8676. if (At(SyntaxKind.Text))
  8677. {
  8678. - nesting += ProcessTextToken(nestingSequences, nesting);
  8679. + nesting += ProcessTextToken(builder, nestingSequences, nesting);
  8680. if (CurrentToken != null)
  8681. {
  8682. AcceptAndMoveNext();
  8683. @@ -1820,50 +1800,19 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8684. }
  8685. else
  8686. {
  8687. - ScanTagInDocumentContext();
  8688. - }
  8689. - }
  8690. - }
  8691. -
  8692. - private bool AtEnd(string[] nestingSequenceComponents)
  8693. - {
  8694. - EnsureCurrent();
  8695. - if (string.Equals(CurrentToken.Content, nestingSequenceComponents[0], Comparison))
  8696. - {
  8697. - var bookmark = Context.Source.Position - CurrentToken.Content.Length;
  8698. - try
  8699. - {
  8700. - foreach (var component in nestingSequenceComponents)
  8701. - {
  8702. - if (!EndOfFile && !string.Equals(CurrentToken.Content, component, Comparison))
  8703. - {
  8704. - return false;
  8705. - }
  8706. - NextToken();
  8707. - while (!EndOfFile && IsSpacingToken(includeNewLines: true)(CurrentToken))
  8708. - {
  8709. - NextToken();
  8710. - }
  8711. - }
  8712. - return true;
  8713. - }
  8714. - finally
  8715. - {
  8716. - Context.Source.Position = bookmark;
  8717. - NextToken();
  8718. + ParseTagInDocumentContext(builder);
  8719. }
  8720. }
  8721. - return false;
  8722. }
  8723. - private int ProcessTextToken(Tuple<string, string> nestingSequences, int currentNesting)
  8724. + private int ProcessTextToken(in SyntaxListBuilder<RazorSyntaxNode> builder, Tuple<string, string> nestingSequences, int currentNesting)
  8725. {
  8726. for (var i = 0; i < CurrentToken.Content.Length; i++)
  8727. {
  8728. - var nestingDelta = HandleNestingSequence(nestingSequences.Item1, i, currentNesting, 1);
  8729. + var nestingDelta = HandleNestingSequence(builder, nestingSequences.Item1, i, currentNesting, 1);
  8730. if (nestingDelta == 0)
  8731. {
  8732. - nestingDelta = HandleNestingSequence(nestingSequences.Item2, i, currentNesting, -1);
  8733. + nestingDelta = HandleNestingSequence(builder, nestingSequences.Item2, i, currentNesting, -1);
  8734. }
  8735. if (nestingDelta != 0)
  8736. @@ -1874,7 +1823,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8737. return 0;
  8738. }
  8739. - private int HandleNestingSequence(string sequence, int position, int currentNesting, int retIfMatched)
  8740. + private int HandleNestingSequence(in SyntaxListBuilder<RazorSyntaxNode> builder, string sequence, int position, int currentNesting, int retIfMatched)
  8741. {
  8742. if (sequence != null &&
  8743. CurrentToken.Content[position] == sequence[0] &&
  8744. @@ -1925,5 +1874,78 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8745. }
  8746. return 0;
  8747. }
  8748. +
  8749. + private Syntax.GreenNode GetLastSpan(RazorSyntaxNode node)
  8750. + {
  8751. + if (node == null)
  8752. + {
  8753. + return null;
  8754. + }
  8755. +
  8756. + // Find the last token of this node and return its immediate non-list parent.
  8757. + var red = node.CreateRed();
  8758. + var last = red.GetLastTerminal();
  8759. + if (last == null)
  8760. + {
  8761. + return null;
  8762. + }
  8763. +
  8764. + while (last.Green.IsToken || last.Green.IsList)
  8765. + {
  8766. + last = last.Parent;
  8767. + }
  8768. +
  8769. + return last.Green;
  8770. + }
  8771. +
  8772. + private void DefaultMarkupSpanContext(SpanContextBuilder spanContext)
  8773. + {
  8774. + spanContext.ChunkGenerator = new MarkupChunkGenerator();
  8775. + spanContext.EditHandler = new SpanEditHandler(Language.TokenizeString, AcceptedCharactersInternal.Any);
  8776. + }
  8777. +
  8778. + private void OtherParserBlock(in SyntaxListBuilder<RazorSyntaxNode> builder)
  8779. + {
  8780. + AcceptMarkerTokenIfNecessary();
  8781. + builder.Add(OutputAsMarkupLiteral());
  8782. +
  8783. + RazorSyntaxNode codeBlock;
  8784. + using (PushSpanContextConfig())
  8785. + {
  8786. + codeBlock = CodeParser.ParseBlock();
  8787. + }
  8788. +
  8789. + builder.Add(codeBlock);
  8790. + InitializeContext(SpanContext);
  8791. + NextToken();
  8792. + }
  8793. +
  8794. + protected static Func<SyntaxToken, bool> IsSpacingToken(bool includeNewLines)
  8795. + {
  8796. + return token => token.Kind == SyntaxKind.Whitespace || (includeNewLines && token.Kind == SyntaxKind.NewLine);
  8797. + }
  8798. +
  8799. + internal static bool IsValidAttributeNameToken(SyntaxToken token)
  8800. + {
  8801. + if (token == null)
  8802. + {
  8803. + return false;
  8804. + }
  8805. +
  8806. + // These restrictions cover most of the spec defined: http://www.w3.org/TR/html5/syntax.html#attributes-0
  8807. + // However, it's not all of it. For instance we don't special case control characters or allow OpenAngle.
  8808. + // It also doesn't try to exclude Razor specific features such as the @ transition. This is based on the
  8809. + // expectation that the parser handles such scenarios prior to falling through to name resolution.
  8810. + var tokenType = token.Kind;
  8811. + return tokenType != SyntaxKind.Whitespace &&
  8812. + tokenType != SyntaxKind.NewLine &&
  8813. + tokenType != SyntaxKind.CloseAngle &&
  8814. + tokenType != SyntaxKind.OpenAngle &&
  8815. + tokenType != SyntaxKind.ForwardSlash &&
  8816. + tokenType != SyntaxKind.DoubleQuote &&
  8817. + tokenType != SyntaxKind.SingleQuote &&
  8818. + tokenType != SyntaxKind.Equals &&
  8819. + tokenType != SyntaxKind.Marker;
  8820. + }
  8821. }
  8822. }
  8823. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/HtmlTokenizer.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/HtmlTokenizer.cs
  8824. index bc55f991a1d..b06f49f9eaa 100644
  8825. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/HtmlTokenizer.cs
  8826. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/HtmlTokenizer.cs
  8827. @@ -227,7 +227,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8828. return EndToken(SyntaxKind.DoubleHyphen);
  8829. default:
  8830. Debug.Fail("Unexpected token!");
  8831. - return EndToken(SyntaxKind.Unknown);
  8832. + return EndToken(SyntaxKind.Marker);
  8833. }
  8834. }
  8835. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/IParentChunkGenerator.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/IParentChunkGenerator.cs
  8836. deleted file mode 100644
  8837. index 355923e2409..00000000000
  8838. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/IParentChunkGenerator.cs
  8839. +++ /dev/null
  8840. @@ -1,13 +0,0 @@
  8841. -// Copyright (c) .NET Foundation. All rights reserved.
  8842. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  8843. -
  8844. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8845. -{
  8846. - internal interface IParentChunkGenerator
  8847. - {
  8848. - void GenerateStartParentChunk(Block target, ChunkGeneratorContext context);
  8849. - void GenerateEndParentChunk(Block target, ChunkGeneratorContext context);
  8850. -
  8851. - void Accept(ParserVisitor visitor, Block block);
  8852. - }
  8853. -}
  8854. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/ISpanChunkGenerator.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/ISpanChunkGenerator.cs
  8855. index ef402d411d1..1ed28f13c8e 100644
  8856. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/ISpanChunkGenerator.cs
  8857. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/ISpanChunkGenerator.cs
  8858. @@ -5,8 +5,5 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8859. {
  8860. internal interface ISpanChunkGenerator
  8861. {
  8862. - void GenerateChunk(Span target, ChunkGeneratorContext context);
  8863. -
  8864. - void Accept(ParserVisitor visitor, Span span);
  8865. }
  8866. }
  8867. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/ImplicitExpressionEditHandler.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/ImplicitExpressionEditHandler.cs
  8868. index fb9efdc7510..6bd5e900ece 100644
  8869. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/ImplicitExpressionEditHandler.cs
  8870. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/ImplicitExpressionEditHandler.cs
  8871. @@ -60,7 +60,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8872. return hashCodeCombiner;
  8873. }
  8874. - protected override PartialParseResultInternal CanAcceptChange(Span target, SourceChange change)
  8875. + protected override PartialParseResultInternal CanAcceptChange(SyntaxNode target, SourceChange change)
  8876. {
  8877. if (AcceptedCharacters == AcceptedCharactersInternal.Any)
  8878. {
  8879. @@ -88,13 +88,13 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8880. {
  8881. return HandleReplacement(target, change);
  8882. }
  8883. - var changeRelativePosition = change.Span.AbsoluteIndex - target.Start.AbsoluteIndex;
  8884. + var changeRelativePosition = change.Span.AbsoluteIndex - target.Position;
  8885. // Get the edit context
  8886. char? lastChar = null;
  8887. - if (changeRelativePosition > 0 && target.Content.Length > 0)
  8888. + if (changeRelativePosition > 0 && target.FullWidth > 0)
  8889. {
  8890. - lastChar = target.Content[changeRelativePosition - 1];
  8891. + lastChar = target.GetContent()[changeRelativePosition - 1];
  8892. }
  8893. // Don't support 0->1 length edits
  8894. @@ -129,18 +129,18 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8895. }
  8896. // A dotless commit is the process of inserting a '.' with an intellisense selection.
  8897. - private static bool IsDotlessCommitInsertion(Span target, SourceChange change)
  8898. + private static bool IsDotlessCommitInsertion(SyntaxNode target, SourceChange change)
  8899. {
  8900. return IsNewDotlessCommitInsertion(target, change) || IsSecondaryDotlessCommitInsertion(target, change);
  8901. }
  8902. // Completing 'DateTime' in intellisense with a '.' could result in: '@DateT' -> '@DateT.' -> '@DateTime.' which is accepted.
  8903. - private static bool IsNewDotlessCommitInsertion(Span target, SourceChange change)
  8904. + private static bool IsNewDotlessCommitInsertion(SyntaxNode target, SourceChange change)
  8905. {
  8906. return !IsAtEndOfSpan(target, change) &&
  8907. change.Span.AbsoluteIndex > 0 &&
  8908. change.NewText.Length > 0 &&
  8909. - target.Content.Last() == '.' &&
  8910. + target.GetContent().Last() == '.' &&
  8911. ParserHelpers.IsIdentifier(change.NewText, requireIdentifierStart: false) &&
  8912. (change.Span.Length == 0 || ParserHelpers.IsIdentifier(change.GetOriginalText(target), requireIdentifierStart: false));
  8913. }
  8914. @@ -148,32 +148,33 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8915. // Once a dotless commit has been performed you then have something like '@DateTime.'. This scenario is used to detect the
  8916. // situation when you try to perform another dotless commit resulting in a textchange with '..'. Completing 'DateTime.Now'
  8917. // in intellisense with a '.' could result in: '@DateTime.' -> '@DateTime..' -> '@DateTime.Now.' which is accepted.
  8918. - private static bool IsSecondaryDotlessCommitInsertion(Span target, SourceChange change)
  8919. + private static bool IsSecondaryDotlessCommitInsertion(SyntaxNode target, SourceChange change)
  8920. {
  8921. // Do not need to worry about other punctuation, just looking for double '.' (after change)
  8922. return change.NewText.Length == 1 &&
  8923. change.NewText == "." &&
  8924. - !string.IsNullOrEmpty(target.Content) &&
  8925. - target.Content.Last() == '.' &&
  8926. + !string.IsNullOrEmpty(target.GetContent()) &&
  8927. + target.GetContent().Last() == '.' &&
  8928. change.Span.Length == 0;
  8929. }
  8930. - private static bool IsAcceptableReplace(Span target, SourceChange change)
  8931. + private static bool IsAcceptableReplace(SyntaxNode target, SourceChange change)
  8932. {
  8933. return IsEndReplace(target, change) ||
  8934. (change.IsReplace && RemainingIsWhitespace(target, change));
  8935. }
  8936. - private bool IsAcceptableIdentifierReplacement(Span target, SourceChange change)
  8937. + private bool IsAcceptableIdentifierReplacement(SyntaxNode target, SourceChange change)
  8938. {
  8939. if (!change.IsReplace)
  8940. {
  8941. return false;
  8942. }
  8943. - for (var i = 0; i < target.Tokens.Count; i++)
  8944. + var tokens = target.DescendantNodes().Where(n => n.IsToken).Cast<SyntaxToken>().ToArray();
  8945. + for (var i = 0; i < tokens.Length; i++)
  8946. {
  8947. - var token = target.Tokens[i];
  8948. + var token = tokens[i];
  8949. if (token == null)
  8950. {
  8951. @@ -217,14 +218,14 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8952. return false;
  8953. }
  8954. - private static bool IsAcceptableDeletion(Span target, SourceChange change)
  8955. + private static bool IsAcceptableDeletion(SyntaxNode target, SourceChange change)
  8956. {
  8957. return IsEndDeletion(target, change) ||
  8958. (change.IsDelete && RemainingIsWhitespace(target, change));
  8959. }
  8960. // Acceptable insertions can occur at the end of a span or when a '.' is inserted within a span.
  8961. - private static bool IsAcceptableInsertion(Span target, SourceChange change)
  8962. + private static bool IsAcceptableInsertion(SyntaxNode target, SourceChange change)
  8963. {
  8964. return change.IsInsert &&
  8965. (IsAcceptableEndInsertion(target, change) ||
  8966. @@ -232,7 +233,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8967. }
  8968. // Internal for testing
  8969. - internal static bool IsAcceptableDeletionInBalancedParenthesis(Span target, SourceChange change)
  8970. + internal static bool IsAcceptableDeletionInBalancedParenthesis(SyntaxNode target, SourceChange change)
  8971. {
  8972. if (!change.IsDelete)
  8973. {
  8974. @@ -242,14 +243,15 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8975. var changeStart = change.Span.AbsoluteIndex;
  8976. var changeLength = change.Span.Length;
  8977. var changeEnd = changeStart + changeLength;
  8978. - if (!IsInsideParenthesis(changeStart, target.Tokens) || !IsInsideParenthesis(changeEnd, target.Tokens))
  8979. + var tokens = target.DescendantNodes().Where(n => n.IsToken).Cast<SyntaxToken>().ToArray();
  8980. + if (!IsInsideParenthesis(changeStart, tokens) || !IsInsideParenthesis(changeEnd, tokens))
  8981. {
  8982. // Either the start or end of the delete does not fall inside of parenthesis, unacceptable inner deletion.
  8983. return false;
  8984. }
  8985. - var relativePosition = changeStart - target.Start.AbsoluteIndex;
  8986. - var deletionContent = target.Content.Substring(relativePosition, changeLength);
  8987. + var relativePosition = changeStart - target.Position;
  8988. + var deletionContent = target.GetContent().Substring(relativePosition, changeLength);
  8989. if (deletionContent.IndexOfAny(new[] { '(', ')' }) >= 0)
  8990. {
  8991. @@ -261,7 +263,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  8992. }
  8993. // Internal for testing
  8994. - internal static bool IsAcceptableInsertionInBalancedParenthesis(Span target, SourceChange change)
  8995. + internal static bool IsAcceptableInsertionInBalancedParenthesis(SyntaxNode target, SourceChange change)
  8996. {
  8997. if (!change.IsInsert)
  8998. {
  8999. @@ -274,7 +276,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9000. return false;
  9001. }
  9002. - if (IsInsideParenthesis(change.Span.AbsoluteIndex, target.Tokens))
  9003. + var tokens = target.DescendantNodes().Where(n => n.IsToken).Cast<SyntaxToken>().ToArray();
  9004. + if (IsInsideParenthesis(change.Span.AbsoluteIndex, tokens))
  9005. {
  9006. return true;
  9007. }
  9008. @@ -418,7 +421,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9009. }
  9010. // Accepts character insertions at the end of spans. AKA: '@foo' -> '@fooo' or '@foo' -> '@foo ' etc.
  9011. - private static bool IsAcceptableEndInsertion(Span target, SourceChange change)
  9012. + private static bool IsAcceptableEndInsertion(SyntaxNode target, SourceChange change)
  9013. {
  9014. Debug.Assert(change.IsInsert);
  9015. @@ -428,7 +431,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9016. // Accepts '.' insertions in the middle of spans. Ex: '@foo.baz.bar' -> '@foo..baz.bar'
  9017. // This is meant to allow intellisense when editing a span.
  9018. - private static bool IsAcceptableInnerInsertion(Span target, SourceChange change)
  9019. + private static bool IsAcceptableInnerInsertion(SyntaxNode target, SourceChange change)
  9020. {
  9021. Debug.Assert(change.IsInsert);
  9022. @@ -440,23 +443,23 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9023. change.NewText == ".";
  9024. }
  9025. - private static bool RemainingIsWhitespace(Span target, SourceChange change)
  9026. + private static bool RemainingIsWhitespace(SyntaxNode target, SourceChange change)
  9027. {
  9028. - var offset = (change.Span.AbsoluteIndex - target.Start.AbsoluteIndex) + change.Span.Length;
  9029. - return string.IsNullOrWhiteSpace(target.Content.Substring(offset));
  9030. + var offset = (change.Span.AbsoluteIndex - target.Position) + change.Span.Length;
  9031. + return string.IsNullOrWhiteSpace(target.GetContent().Substring(offset));
  9032. }
  9033. - private PartialParseResultInternal HandleDotlessCommitInsertion(Span target)
  9034. + private PartialParseResultInternal HandleDotlessCommitInsertion(SyntaxNode target)
  9035. {
  9036. var result = PartialParseResultInternal.Accepted;
  9037. - if (!AcceptTrailingDot && target.Content.LastOrDefault() == '.')
  9038. + if (!AcceptTrailingDot && target.GetContent().LastOrDefault() == '.')
  9039. {
  9040. result |= PartialParseResultInternal.Provisional;
  9041. }
  9042. return result;
  9043. }
  9044. - private PartialParseResultInternal HandleReplacement(Span target, SourceChange change)
  9045. + private PartialParseResultInternal HandleReplacement(SyntaxNode target, SourceChange change)
  9046. {
  9047. // Special Case for IntelliSense commits.
  9048. // When IntelliSense commits, we get two changes (for example user typed "Date", then committed "DateTime" by pressing ".")
  9049. @@ -477,7 +480,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9050. return result;
  9051. }
  9052. - private PartialParseResultInternal HandleDeletion(Span target, char previousChar, SourceChange change)
  9053. + private PartialParseResultInternal HandleDeletion(SyntaxNode target, char previousChar, SourceChange change)
  9054. {
  9055. // What's left after deleting?
  9056. if (previousChar == '.')
  9057. @@ -490,8 +493,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9058. }
  9059. else if (previousChar == '(')
  9060. {
  9061. - var changeRelativePosition = change.Span.AbsoluteIndex - target.Start.AbsoluteIndex;
  9062. - if (target.Content[changeRelativePosition] == ')')
  9063. + var changeRelativePosition = change.Span.AbsoluteIndex - target.Position;
  9064. + if (target.GetContent()[changeRelativePosition] == ')')
  9065. {
  9066. return PartialParseResultInternal.Accepted | PartialParseResultInternal.Provisional;
  9067. }
  9068. @@ -500,7 +503,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9069. return PartialParseResultInternal.Rejected;
  9070. }
  9071. - private PartialParseResultInternal HandleInsertion(Span target, char previousChar, SourceChange change)
  9072. + private PartialParseResultInternal HandleInsertion(SyntaxNode target, char previousChar, SourceChange change)
  9073. {
  9074. // What are we inserting after?
  9075. if (previousChar == '.')
  9076. @@ -521,7 +524,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9077. }
  9078. }
  9079. - private PartialParseResultInternal HandleInsertionAfterIdPart(Span target, SourceChange change)
  9080. + private PartialParseResultInternal HandleInsertionAfterIdPart(SyntaxNode target, SourceChange change)
  9081. {
  9082. // If the insertion is a full identifier part, accept it
  9083. if (ParserHelpers.IsIdentifier(change.NewText, requireIdentifierStart: false))
  9084. @@ -550,7 +553,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9085. }
  9086. }
  9087. - private PartialParseResultInternal HandleInsertionAfterOpenParenthesis(Span target, SourceChange change)
  9088. + private PartialParseResultInternal HandleInsertionAfterOpenParenthesis(SyntaxNode target, SourceChange change)
  9089. {
  9090. if (IsCloseParenthesisInsertion(change))
  9091. {
  9092. @@ -560,6 +563,27 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9093. return PartialParseResultInternal.Rejected;
  9094. }
  9095. + private PartialParseResultInternal HandleInsertionAfterDot(SyntaxNode target, SourceChange change)
  9096. + {
  9097. + // If the insertion is a full identifier or another dot, accept it
  9098. + if (ParserHelpers.IsIdentifier(change.NewText) || change.NewText == ".")
  9099. + {
  9100. + return TryAcceptChange(target, change);
  9101. + }
  9102. + return PartialParseResultInternal.Rejected;
  9103. + }
  9104. +
  9105. + private PartialParseResultInternal TryAcceptChange(SyntaxNode target, SourceChange change, PartialParseResultInternal acceptResult = PartialParseResultInternal.Accepted)
  9106. + {
  9107. + var content = change.GetEditedContent(target);
  9108. + if (StartsWithKeyword(content))
  9109. + {
  9110. + return PartialParseResultInternal.Rejected | PartialParseResultInternal.SpanContextChanged;
  9111. + }
  9112. +
  9113. + return acceptResult;
  9114. + }
  9115. +
  9116. private static bool IsDoubleParenthesisInsertion(SourceChange change)
  9117. {
  9118. return
  9119. @@ -591,27 +615,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9120. content.Take(content.Length - 1).All(ParserHelpers.IsIdentifierPart));
  9121. }
  9122. - private PartialParseResultInternal HandleInsertionAfterDot(Span target, SourceChange change)
  9123. - {
  9124. - // If the insertion is a full identifier or another dot, accept it
  9125. - if (ParserHelpers.IsIdentifier(change.NewText) || change.NewText == ".")
  9126. - {
  9127. - return TryAcceptChange(target, change);
  9128. - }
  9129. - return PartialParseResultInternal.Rejected;
  9130. - }
  9131. -
  9132. - private PartialParseResultInternal TryAcceptChange(Span target, SourceChange change, PartialParseResultInternal acceptResult = PartialParseResultInternal.Accepted)
  9133. - {
  9134. - var content = change.GetEditedContent(target);
  9135. - if (StartsWithKeyword(content))
  9136. - {
  9137. - return PartialParseResultInternal.Rejected | PartialParseResultInternal.SpanContextChanged;
  9138. - }
  9139. -
  9140. - return acceptResult;
  9141. - }
  9142. -
  9143. private bool StartsWithKeyword(string newContent)
  9144. {
  9145. using (var reader = new StringReader(newContent))
  9146. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/KnownTokenType.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/KnownTokenType.cs
  9147. index ca5fad72544..da9290ef531 100644
  9148. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/KnownTokenType.cs
  9149. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/KnownTokenType.cs
  9150. @@ -5,7 +5,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9151. {
  9152. internal enum KnownTokenType
  9153. {
  9154. - WhiteSpace,
  9155. + Whitespace,
  9156. NewLine,
  9157. Identifier,
  9158. Keyword,
  9159. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/LanguageCharacteristics.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/LanguageCharacteristics.cs
  9160. index b08bbb0fe10..94b3f9acee3 100644
  9161. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/LanguageCharacteristics.cs
  9162. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/LanguageCharacteristics.cs
  9163. @@ -33,9 +33,9 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9164. }
  9165. }
  9166. - public virtual bool IsWhiteSpace(SyntaxToken token)
  9167. + public virtual bool IsWhitespace(SyntaxToken token)
  9168. {
  9169. - return IsKnownTokenType(token, KnownTokenType.WhiteSpace);
  9170. + return IsKnownTokenType(token, KnownTokenType.Whitespace);
  9171. }
  9172. public virtual bool IsNewLine(SyntaxToken token)
  9173. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/LegacySyntaxNodeExtensions.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/LegacySyntaxNodeExtensions.cs
  9174. new file mode 100644
  9175. index 00000000000..cfe840d4f33
  9176. --- /dev/null
  9177. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/LegacySyntaxNodeExtensions.cs
  9178. @@ -0,0 +1,248 @@
  9179. +// Copyright (c) .NET Foundation. All rights reserved.
  9180. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  9181. +
  9182. +using System;
  9183. +using System.Collections.Generic;
  9184. +using System.Linq;
  9185. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  9186. +
  9187. +namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9188. +{
  9189. + internal static class LegacySyntaxNodeExtensions
  9190. + {
  9191. + private static readonly SyntaxKind[] TransitionSpanKinds = new SyntaxKind[]
  9192. + {
  9193. + SyntaxKind.CSharpTransition,
  9194. + SyntaxKind.MarkupTransition,
  9195. + };
  9196. +
  9197. + private static readonly SyntaxKind[] MetaCodeSpanKinds = new SyntaxKind[]
  9198. + {
  9199. + SyntaxKind.RazorMetaCode,
  9200. + };
  9201. +
  9202. + private static readonly SyntaxKind[] CommentSpanKinds = new SyntaxKind[]
  9203. + {
  9204. + SyntaxKind.RazorCommentLiteral,
  9205. + };
  9206. +
  9207. + private static readonly SyntaxKind[] CodeSpanKinds = new SyntaxKind[]
  9208. + {
  9209. + SyntaxKind.CSharpStatementLiteral,
  9210. + SyntaxKind.CSharpExpressionLiteral,
  9211. + SyntaxKind.CSharpEphemeralTextLiteral,
  9212. + };
  9213. +
  9214. + private static readonly SyntaxKind[] MarkupSpanKinds = new SyntaxKind[]
  9215. + {
  9216. + SyntaxKind.MarkupTextLiteral,
  9217. + SyntaxKind.MarkupEphemeralTextLiteral,
  9218. + };
  9219. +
  9220. + private static readonly SyntaxKind[] NoneSpanKinds = new SyntaxKind[]
  9221. + {
  9222. + SyntaxKind.UnclassifiedTextLiteral,
  9223. + };
  9224. +
  9225. + public static SpanContext GetSpanContext(this SyntaxNode node)
  9226. + {
  9227. + if (node == null)
  9228. + {
  9229. + throw new ArgumentNullException(nameof(node));
  9230. + }
  9231. +
  9232. + var context = node.GetAnnotationValue(SyntaxConstants.SpanContextKind);
  9233. +
  9234. + return context is SpanContext ? (SpanContext)context : null;
  9235. + }
  9236. +
  9237. + public static TNode WithSpanContext<TNode>(this TNode node, SpanContext spanContext) where TNode : SyntaxNode
  9238. + {
  9239. + if (node == null)
  9240. + {
  9241. + throw new ArgumentNullException(nameof(node));
  9242. + }
  9243. +
  9244. + var newAnnotation = new SyntaxAnnotation(SyntaxConstants.SpanContextKind, spanContext);
  9245. +
  9246. + var newAnnotations = new List<SyntaxAnnotation>();
  9247. + newAnnotations.Add(newAnnotation);
  9248. + foreach (var annotation in node.GetAnnotations())
  9249. + {
  9250. + if (annotation.Kind != newAnnotation.Kind)
  9251. + {
  9252. + newAnnotations.Add(annotation);
  9253. + }
  9254. + }
  9255. +
  9256. + return node.WithAnnotations(newAnnotations.ToArray());
  9257. + }
  9258. +
  9259. + public static SyntaxNode LocateOwner(this SyntaxNode node, SourceChange change)
  9260. + {
  9261. + if (node == null)
  9262. + {
  9263. + throw new ArgumentNullException(nameof(node));
  9264. + }
  9265. +
  9266. + if (change.Span.AbsoluteIndex < node.Position)
  9267. + {
  9268. + // Early escape for cases where changes overlap multiple spans
  9269. + // In those cases, the span will return false, and we don't want to search the whole tree
  9270. + // So if the current span starts after the change, we know we've searched as far as we need to
  9271. + return null;
  9272. + }
  9273. +
  9274. + if (IsSpanKind(node))
  9275. + {
  9276. + var editHandler = node.GetSpanContext()?.EditHandler ?? SpanEditHandler.CreateDefault();
  9277. + return editHandler.OwnsChange(node, change) ? node : null;
  9278. + }
  9279. +
  9280. + SyntaxNode owner = null;
  9281. + var children = node.ChildNodes();
  9282. + foreach (var child in children)
  9283. + {
  9284. + owner = LocateOwner(child, change);
  9285. + if (owner != null)
  9286. + {
  9287. + break;
  9288. + }
  9289. + }
  9290. +
  9291. + return owner;
  9292. + }
  9293. +
  9294. + public static bool IsTransitionSpanKind(this SyntaxNode node)
  9295. + {
  9296. + if (node == null)
  9297. + {
  9298. + throw new ArgumentNullException(nameof(node));
  9299. + }
  9300. +
  9301. + return TransitionSpanKinds.Contains(node.Kind);
  9302. + }
  9303. +
  9304. + public static bool IsMetaCodeSpanKind(this SyntaxNode node)
  9305. + {
  9306. + if (node == null)
  9307. + {
  9308. + throw new ArgumentNullException(nameof(node));
  9309. + }
  9310. +
  9311. + return MetaCodeSpanKinds.Contains(node.Kind);
  9312. + }
  9313. +
  9314. + public static bool IsCommentSpanKind(this SyntaxNode node)
  9315. + {
  9316. + if (node == null)
  9317. + {
  9318. + throw new ArgumentNullException(nameof(node));
  9319. + }
  9320. +
  9321. + return CommentSpanKinds.Contains(node.Kind);
  9322. + }
  9323. +
  9324. + public static bool IsCodeSpanKind(this SyntaxNode node)
  9325. + {
  9326. + if (node == null)
  9327. + {
  9328. + throw new ArgumentNullException(nameof(node));
  9329. + }
  9330. +
  9331. + return CodeSpanKinds.Contains(node.Kind);
  9332. + }
  9333. +
  9334. + public static bool IsMarkupSpanKind(this SyntaxNode node)
  9335. + {
  9336. + if (node == null)
  9337. + {
  9338. + throw new ArgumentNullException(nameof(node));
  9339. + }
  9340. +
  9341. + return MarkupSpanKinds.Contains(node.Kind);
  9342. + }
  9343. +
  9344. + public static bool IsNoneSpanKind(this SyntaxNode node)
  9345. + {
  9346. + if (node == null)
  9347. + {
  9348. + throw new ArgumentNullException(nameof(node));
  9349. + }
  9350. +
  9351. + return NoneSpanKinds.Contains(node.Kind);
  9352. + }
  9353. +
  9354. + public static bool IsSpanKind(this SyntaxNode node)
  9355. + {
  9356. + return IsTransitionSpanKind(node) ||
  9357. + IsMetaCodeSpanKind(node) ||
  9358. + IsCommentSpanKind(node) ||
  9359. + IsCodeSpanKind(node) ||
  9360. + IsMarkupSpanKind(node) ||
  9361. + IsNoneSpanKind(node);
  9362. + }
  9363. +
  9364. + public static IEnumerable<SyntaxNode> FlattenSpans(this SyntaxNode node)
  9365. + {
  9366. + if (node == null)
  9367. + {
  9368. + throw new ArgumentNullException(nameof(node));
  9369. + }
  9370. +
  9371. + foreach (var child in node.DescendantNodes())
  9372. + {
  9373. + if (child.IsSpanKind())
  9374. + {
  9375. + yield return child;
  9376. + }
  9377. + }
  9378. + }
  9379. +
  9380. + public static SyntaxNode PreviousSpan(this SyntaxNode node)
  9381. + {
  9382. + if (node == null)
  9383. + {
  9384. + throw new ArgumentNullException(nameof(node));
  9385. + }
  9386. +
  9387. + var parent = node.Parent;
  9388. + while (parent != null)
  9389. + {
  9390. + var flattenedSpans = parent.FlattenSpans();
  9391. + var prevSpan = flattenedSpans.LastOrDefault(n => n.EndPosition <= node.Position && n != node);
  9392. + if (prevSpan != null)
  9393. + {
  9394. + return prevSpan;
  9395. + }
  9396. +
  9397. + parent = parent.Parent;
  9398. + }
  9399. +
  9400. + return null;
  9401. + }
  9402. +
  9403. + public static SyntaxNode NextSpan(this SyntaxNode node)
  9404. + {
  9405. + if (node == null)
  9406. + {
  9407. + throw new ArgumentNullException(nameof(node));
  9408. + }
  9409. +
  9410. + var parent = node.Parent;
  9411. + while (parent != null)
  9412. + {
  9413. + var flattenedSpans = parent.FlattenSpans();
  9414. + var nextSpan = flattenedSpans.FirstOrDefault(n => n.Position >= node.EndPosition && n != node);
  9415. + if (nextSpan != null)
  9416. + {
  9417. + return nextSpan;
  9418. + }
  9419. +
  9420. + parent = parent.Parent;
  9421. + }
  9422. +
  9423. + return null;
  9424. + }
  9425. + }
  9426. +}
  9427. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/LiteralAttributeChunkGenerator.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/LiteralAttributeChunkGenerator.cs
  9428. index 3cc5f8ca263..4cbdb9bd7a6 100644
  9429. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/LiteralAttributeChunkGenerator.cs
  9430. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/LiteralAttributeChunkGenerator.cs
  9431. @@ -18,29 +18,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9432. public LocationTagged<string> Value { get; }
  9433. - public override void Accept(ParserVisitor visitor, Span span)
  9434. - {
  9435. - visitor.VisitLiteralAttributeSpan(this, span);
  9436. - }
  9437. -
  9438. - public override void GenerateChunk(Span target, ChunkGeneratorContext context)
  9439. - {
  9440. - //var chunk = context.ChunkTreeBuilder.StartParentChunk<LiteralCodeAttributeChunk>(target);
  9441. - //chunk.Prefix = Prefix;
  9442. - //chunk.Value = Value;
  9443. -
  9444. - //if (ValueGenerator != null)
  9445. - //{
  9446. - // chunk.ValueLocation = ValueGenerator.Location;
  9447. -
  9448. - // ValueGenerator.Value.GenerateChunk(target, context);
  9449. -
  9450. - // chunk.ValueLocation = ValueGenerator.Location;
  9451. - //}
  9452. -
  9453. - //context.ChunkTreeBuilder.EndParentChunk();
  9454. - }
  9455. -
  9456. public override string ToString()
  9457. {
  9458. return string.Format(CultureInfo.CurrentCulture, "LitAttr:{0:F}", Prefix);
  9459. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/MarkupChunkGenerator.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/MarkupChunkGenerator.cs
  9460. index d2941ce5183..796bf545a68 100644
  9461. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/MarkupChunkGenerator.cs
  9462. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/MarkupChunkGenerator.cs
  9463. @@ -5,16 +5,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9464. {
  9465. internal class MarkupChunkGenerator : SpanChunkGenerator
  9466. {
  9467. - public override void GenerateChunk(Span target, ChunkGeneratorContext context)
  9468. - {
  9469. - //context.ChunkTreeBuilder.AddLiteralChunk(target.Content, target);
  9470. - }
  9471. -
  9472. - public override void Accept(ParserVisitor visitor, Span span)
  9473. - {
  9474. - visitor.VisitMarkupSpan(this, span);
  9475. - }
  9476. -
  9477. public override string ToString()
  9478. {
  9479. return "Markup";
  9480. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/MarkupRewriter.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/MarkupRewriter.cs
  9481. deleted file mode 100644
  9482. index 95908fb7368..00000000000
  9483. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/MarkupRewriter.cs
  9484. +++ /dev/null
  9485. @@ -1,76 +0,0 @@
  9486. -// Copyright (c) .NET Foundation. All rights reserved.
  9487. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  9488. -
  9489. -using System.Collections.Generic;
  9490. -using System.Diagnostics;
  9491. -
  9492. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9493. -{
  9494. - internal abstract class MarkupRewriter : ParserVisitor
  9495. - {
  9496. - private Stack<BlockBuilder> _blocks;
  9497. -
  9498. - protected MarkupRewriter()
  9499. - {
  9500. - _blocks = new Stack<BlockBuilder>();
  9501. - }
  9502. -
  9503. - protected BlockBuilder Parent => _blocks.Count > 0 ? _blocks.Peek() : null;
  9504. -
  9505. - public Block Rewrite(Block root)
  9506. - {
  9507. - root.Accept(this);
  9508. - Debug.Assert(_blocks.Count == 1);
  9509. - var rewrittenRoot = _blocks.Pop().Build();
  9510. -
  9511. - return rewrittenRoot;
  9512. - }
  9513. -
  9514. - public override void VisitBlock(Block block)
  9515. - {
  9516. - if (CanRewrite(block))
  9517. - {
  9518. - var newNode = RewriteBlock(Parent, block);
  9519. - if (newNode != null)
  9520. - {
  9521. - Parent.Children.Add(newNode);
  9522. - }
  9523. - }
  9524. - else
  9525. - {
  9526. - // Not rewritable.
  9527. - var builder = new BlockBuilder(block);
  9528. - builder.Children.Clear();
  9529. - _blocks.Push(builder);
  9530. - base.VisitBlock(block);
  9531. - Debug.Assert(ReferenceEquals(builder, Parent));
  9532. -
  9533. - if (_blocks.Count > 1)
  9534. - {
  9535. - _blocks.Pop();
  9536. - Parent.Children.Add(builder.Build());
  9537. - }
  9538. - }
  9539. - }
  9540. -
  9541. - protected abstract bool CanRewrite(Block block);
  9542. -
  9543. - protected abstract SyntaxTreeNode RewriteBlock(BlockBuilder parent, Block block);
  9544. -
  9545. - public override void VisitSpan(Span span)
  9546. - {
  9547. - Parent.Children.Add(span);
  9548. - }
  9549. -
  9550. - protected void FillSpan(SpanBuilder builder, SourceLocation start, string content)
  9551. - {
  9552. - builder.Kind = SpanKindInternal.Markup;
  9553. - builder.ChunkGenerator = new MarkupChunkGenerator();
  9554. -
  9555. - foreach (var token in HtmlLanguageCharacteristics.Instance.TokenizeString(start, content))
  9556. - {
  9557. - builder.Accept(token);
  9558. - }
  9559. - }
  9560. - }
  9561. -}
  9562. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/ParentChunkGenerator.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/ParentChunkGenerator.cs
  9563. deleted file mode 100644
  9564. index 09a8c94f28b..00000000000
  9565. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/ParentChunkGenerator.cs
  9566. +++ /dev/null
  9567. @@ -1,54 +0,0 @@
  9568. -// Copyright (c) .NET Foundation. All rights reserved.
  9569. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  9570. -
  9571. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9572. -{
  9573. - internal abstract class ParentChunkGenerator : IParentChunkGenerator
  9574. - {
  9575. - private static readonly int TypeHashCode = typeof(ParentChunkGenerator).GetHashCode();
  9576. -
  9577. - public static readonly IParentChunkGenerator Null = new NullParentChunkGenerator();
  9578. -
  9579. - public abstract void Accept(ParserVisitor visitor, Block block);
  9580. -
  9581. - public virtual void GenerateStartParentChunk(Block target, ChunkGeneratorContext context)
  9582. - {
  9583. - }
  9584. -
  9585. - public virtual void GenerateEndParentChunk(Block target, ChunkGeneratorContext context)
  9586. - {
  9587. - }
  9588. -
  9589. - public override bool Equals(object obj)
  9590. - {
  9591. - return obj != null &&
  9592. - GetType() == obj.GetType();
  9593. - }
  9594. -
  9595. - public override int GetHashCode()
  9596. - {
  9597. - return TypeHashCode;
  9598. - }
  9599. -
  9600. - private class NullParentChunkGenerator : IParentChunkGenerator
  9601. - {
  9602. - public void GenerateStartParentChunk(Block target, ChunkGeneratorContext context)
  9603. - {
  9604. - }
  9605. -
  9606. - public void GenerateEndParentChunk(Block target, ChunkGeneratorContext context)
  9607. - {
  9608. - }
  9609. -
  9610. - public override string ToString()
  9611. - {
  9612. - return "None";
  9613. - }
  9614. -
  9615. - public void Accept(ParserVisitor visitor, Block block)
  9616. - {
  9617. - visitor.VisitDefault(block);
  9618. - }
  9619. - }
  9620. - }
  9621. -}
  9622. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/ParserBase.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/ParserBase.cs
  9623. index 28a60a09d89..6d07a26c602 100644
  9624. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/ParserBase.cs
  9625. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/ParserBase.cs
  9626. @@ -11,9 +11,5 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9627. }
  9628. public ParserContext Context { get; }
  9629. -
  9630. - public abstract void BuildSpan(SpanBuilder span, SourceLocation start, string content);
  9631. -
  9632. - public abstract void ParseBlock();
  9633. }
  9634. }
  9635. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/ParserContext.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/ParserContext.cs
  9636. index 0bd3da36ff7..f8cebfdd354 100644
  9637. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/ParserContext.cs
  9638. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/ParserContext.cs
  9639. @@ -25,13 +25,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9640. DesignTimeMode = options.DesignTime;
  9641. FeatureFlags = options.FeatureFlags;
  9642. ParseLeadingDirectives = options.ParseLeadingDirectives;
  9643. - Builder = new SyntaxTreeBuilder();
  9644. ErrorSink = new ErrorSink();
  9645. SeenDirectives = new HashSet<string>(StringComparer.Ordinal);
  9646. }
  9647. - public SyntaxTreeBuilder Builder { get; }
  9648. -
  9649. public ErrorSink ErrorSink { get; set; }
  9650. public RazorParserFeatureFlags FeatureFlags { get; }
  9651. @@ -50,6 +47,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9652. public bool NullGenerateWhitespaceAndNewLine { get; set; }
  9653. + public bool InTemplateContext { get; set; }
  9654. +
  9655. + public AcceptedCharactersInternal LastAcceptedCharacters { get; set; } = AcceptedCharactersInternal.None;
  9656. +
  9657. public bool EndOfFile
  9658. {
  9659. get { return Source.Peek() == -1; }
  9660. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/ParserVisitor.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/ParserVisitor.cs
  9661. deleted file mode 100644
  9662. index fe6031046ed..00000000000
  9663. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/ParserVisitor.cs
  9664. +++ /dev/null
  9665. @@ -1,121 +0,0 @@
  9666. -// Copyright (c) .NET Foundation. All rights reserved.
  9667. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  9668. -
  9669. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9670. -{
  9671. - internal abstract class ParserVisitor
  9672. - {
  9673. - public virtual void Visit(SyntaxTreeNode node)
  9674. - {
  9675. - node.Accept(this);
  9676. - }
  9677. -
  9678. - public virtual void VisitDefault(Block block)
  9679. - {
  9680. - for (var i = 0; i < block.Children.Count; i++)
  9681. - {
  9682. - block.Children[i].Accept(this);
  9683. - }
  9684. - }
  9685. -
  9686. - public virtual void VisitDefault(Span span)
  9687. - {
  9688. - }
  9689. -
  9690. - public virtual void VisitBlock(Block block)
  9691. - {
  9692. - if (block.ChunkGenerator != null)
  9693. - {
  9694. - block.ChunkGenerator.Accept(this, block);
  9695. - }
  9696. - }
  9697. -
  9698. - public virtual void VisitSpan(Span span)
  9699. - {
  9700. - if (span.ChunkGenerator != null)
  9701. - {
  9702. - span.ChunkGenerator.Accept(this, span);
  9703. - }
  9704. - }
  9705. -
  9706. - public virtual void VisitDynamicAttributeBlock(DynamicAttributeBlockChunkGenerator chunkGenerator, Block block)
  9707. - {
  9708. - VisitDefault(block);
  9709. - }
  9710. -
  9711. - public virtual void VisitExpressionBlock(ExpressionChunkGenerator chunkGenerator, Block block)
  9712. - {
  9713. - VisitDefault(block);
  9714. - }
  9715. -
  9716. - public virtual void VisitAttributeBlock(AttributeBlockChunkGenerator chunkGenerator, Block block)
  9717. - {
  9718. - VisitDefault(block);
  9719. - }
  9720. -
  9721. - public virtual void VisitTemplateBlock(TemplateBlockChunkGenerator chunkGenerator, Block block)
  9722. - {
  9723. - VisitDefault(block);
  9724. - }
  9725. -
  9726. - public virtual void VisitCommentBlock(RazorCommentChunkGenerator chunkGenerator, Block block)
  9727. - {
  9728. - VisitDefault(block);
  9729. - }
  9730. -
  9731. - public virtual void VisitTagHelperBlock(TagHelperChunkGenerator chunkGenerator, Block block)
  9732. - {
  9733. - VisitDefault(block);
  9734. - }
  9735. -
  9736. - public virtual void VisitDirectiveBlock(DirectiveChunkGenerator chunkGenerator, Block block)
  9737. - {
  9738. - VisitDefault(block);
  9739. - }
  9740. -
  9741. - public virtual void VisitExpressionSpan(ExpressionChunkGenerator chunkGenerator, Span span)
  9742. - {
  9743. - VisitDefault(span);
  9744. - }
  9745. -
  9746. - public virtual void VisitMarkupSpan(MarkupChunkGenerator chunkGenerator, Span span)
  9747. - {
  9748. - VisitDefault(span);
  9749. - }
  9750. -
  9751. - public virtual void VisitImportSpan(AddImportChunkGenerator chunkGenerator, Span span)
  9752. - {
  9753. - VisitDefault(span);
  9754. - }
  9755. -
  9756. - public virtual void VisitStatementSpan(StatementChunkGenerator chunkGenerator, Span span)
  9757. - {
  9758. - VisitDefault(span);
  9759. - }
  9760. -
  9761. - public virtual void VisitLiteralAttributeSpan(LiteralAttributeChunkGenerator chunkGenerator, Span span)
  9762. - {
  9763. - VisitDefault(span);
  9764. - }
  9765. -
  9766. - public virtual void VisitDirectiveToken(DirectiveTokenChunkGenerator chunkGenerator, Span span)
  9767. - {
  9768. - VisitDefault(span);
  9769. - }
  9770. -
  9771. - public virtual void VisitAddTagHelperSpan(AddTagHelperChunkGenerator chunkGenerator, Span span)
  9772. - {
  9773. - VisitDefault(span);
  9774. - }
  9775. -
  9776. - public virtual void VisitRemoveTagHelperSpan(RemoveTagHelperChunkGenerator chunkGenerator, Span span)
  9777. - {
  9778. - VisitDefault(span);
  9779. - }
  9780. -
  9781. - public virtual void VisitTagHelperPrefixDirectiveSpan(TagHelperPrefixDirectiveChunkGenerator chunkGenerator, Span span)
  9782. - {
  9783. - VisitDefault(span);
  9784. - }
  9785. - }
  9786. -}
  9787. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/RazorCommentChunkGenerator.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/RazorCommentChunkGenerator.cs
  9788. deleted file mode 100644
  9789. index 4d3d13f0b04..00000000000
  9790. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/RazorCommentChunkGenerator.cs
  9791. +++ /dev/null
  9792. @@ -1,18 +0,0 @@
  9793. -// Copyright (c) .NET Foundation. All rights reserved.
  9794. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  9795. -
  9796. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9797. -{
  9798. - internal class RazorCommentChunkGenerator : ParentChunkGenerator
  9799. - {
  9800. - public override void Accept(ParserVisitor visitor, Block block)
  9801. - {
  9802. - visitor.VisitCommentBlock(this, block);
  9803. - }
  9804. -
  9805. - public override string ToString()
  9806. - {
  9807. - return "RazorComment";
  9808. - }
  9809. - }
  9810. -}
  9811. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/RazorParser.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/RazorParser.cs
  9812. index 8e79907b8c8..c840bcb707e 100644
  9813. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/RazorParser.cs
  9814. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/RazorParser.cs
  9815. @@ -2,7 +2,6 @@
  9816. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  9817. using System;
  9818. -using System.Linq;
  9819. namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9820. {
  9821. @@ -39,12 +38,9 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9822. codeParser.HtmlParser = markupParser;
  9823. markupParser.CodeParser = codeParser;
  9824. - markupParser.ParseDocument();
  9825. -
  9826. - var root = context.Builder.Build();
  9827. -
  9828. var diagnostics = context.ErrorSink.Errors;
  9829. + var root = markupParser.ParseDocument().CreateRed();
  9830. return RazorSyntaxTree.Create(root, source, diagnostics, Options);
  9831. }
  9832. }
  9833. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/RazorSyntaxTreeExtensions.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/RazorSyntaxTreeExtensions.cs
  9834. index a07082152c7..2a3d0162240 100644
  9835. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/RazorSyntaxTreeExtensions.cs
  9836. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/RazorSyntaxTreeExtensions.cs
  9837. @@ -16,31 +16,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9838. throw new ArgumentNullException(nameof(syntaxTree));
  9839. }
  9840. - var spans = Flatten(syntaxTree);
  9841. + var visitor = new ClassifiedSpanVisitor(syntaxTree.Source);
  9842. + visitor.Visit(syntaxTree.Root);
  9843. - var result = new ClassifiedSpanInternal[spans.Count];
  9844. - for (var i = 0; i < spans.Count; i++)
  9845. - {
  9846. - var span = spans[i];
  9847. - result[i] = new ClassifiedSpanInternal(
  9848. - new SourceSpan(
  9849. - span.Start.FilePath ?? syntaxTree.Source.FilePath,
  9850. - span.Start.AbsoluteIndex,
  9851. - span.Start.LineIndex,
  9852. - span.Start.CharacterIndex,
  9853. - span.Length),
  9854. - new SourceSpan(
  9855. - span.Parent.Start.FilePath ?? syntaxTree.Source.FilePath,
  9856. - span.Parent.Start.AbsoluteIndex,
  9857. - span.Parent.Start.LineIndex,
  9858. - span.Parent.Start.CharacterIndex,
  9859. - span.Parent.Length),
  9860. - span.Kind,
  9861. - span.Parent.Type,
  9862. - span.EditHandler.AcceptedCharacters);
  9863. - }
  9864. -
  9865. - return result;
  9866. + return visitor.ClassifiedSpans;
  9867. }
  9868. public static IReadOnlyList<TagHelperSpanInternal> GetTagHelperSpans(this RazorSyntaxTree syntaxTree)
  9869. @@ -50,81 +29,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9870. throw new ArgumentNullException(nameof(syntaxTree));
  9871. }
  9872. - var results = new List<TagHelperSpanInternal>();
  9873. -
  9874. - var toProcess = new List<Block>();
  9875. - var blockChildren = new List<Block>();
  9876. - toProcess.Add(syntaxTree.Root);
  9877. -
  9878. - for (var i = 0; i < toProcess.Count; i++)
  9879. - {
  9880. - var blockNode = toProcess[i];
  9881. - if (blockNode is TagHelperBlock tagHelperNode)
  9882. - {
  9883. - results.Add(new TagHelperSpanInternal(
  9884. - new SourceSpan(
  9885. - tagHelperNode.Start.FilePath ?? syntaxTree.Source.FilePath,
  9886. - tagHelperNode.Start.AbsoluteIndex,
  9887. - tagHelperNode.Start.LineIndex,
  9888. - tagHelperNode.Start.CharacterIndex,
  9889. - tagHelperNode.Length),
  9890. - tagHelperNode.Binding));
  9891. - }
  9892. -
  9893. - // collect all child blocks and inject into toProcess as a single InsertRange
  9894. - foreach (var child in blockNode.Children)
  9895. - {
  9896. - if (child is Block block)
  9897. - {
  9898. - blockChildren.Add(block);
  9899. - }
  9900. - }
  9901. -
  9902. - if (blockChildren.Count > 0)
  9903. - {
  9904. - toProcess.InsertRange(i + 1, blockChildren);
  9905. - blockChildren.Clear();
  9906. - }
  9907. - }
  9908. + var visitor = new TagHelperSpanVisitor(syntaxTree.Source);
  9909. + visitor.Visit(syntaxTree.Root);
  9910. - return results;
  9911. - }
  9912. -
  9913. - private static List<Span> Flatten(RazorSyntaxTree syntaxTree)
  9914. - {
  9915. - var result = new List<Span>();
  9916. - AppendFlattenedSpans(syntaxTree.Root, result);
  9917. - return result;
  9918. -
  9919. - void AppendFlattenedSpans(SyntaxTreeNode node, List<Span> foundSpans)
  9920. - {
  9921. - if (node is Span spanNode)
  9922. - {
  9923. - foundSpans.Add(spanNode);
  9924. - }
  9925. - else
  9926. - {
  9927. - if (node is TagHelperBlock tagHelperNode)
  9928. - {
  9929. - // These aren't in document order, sort them first and then dig in
  9930. - var attributeNodes = tagHelperNode.Attributes.Select(kvp => kvp.Value).Where(att => att != null).ToList();
  9931. - attributeNodes.Sort((x, y) => x.Start.AbsoluteIndex.CompareTo(y.Start.AbsoluteIndex));
  9932. -
  9933. - foreach (var attributeNode in attributeNodes)
  9934. - {
  9935. - AppendFlattenedSpans(attributeNode, foundSpans);
  9936. - }
  9937. - }
  9938. -
  9939. - if (node is Block block)
  9940. - {
  9941. - foreach (var child in block.Children)
  9942. - {
  9943. - AppendFlattenedSpans(child, foundSpans);
  9944. - }
  9945. - }
  9946. - }
  9947. - }
  9948. + return visitor.TagHelperSpans;
  9949. }
  9950. }
  9951. }
  9952. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/RemoveTagHelperChunkGenerator.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/RemoveTagHelperChunkGenerator.cs
  9953. index 58b170d33e4..6a05c951f0a 100644
  9954. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/RemoveTagHelperChunkGenerator.cs
  9955. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/RemoveTagHelperChunkGenerator.cs
  9956. @@ -35,11 +35,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9957. public List<RazorDiagnostic> Diagnostics { get; }
  9958. - public override void Accept(ParserVisitor visitor, Span span)
  9959. - {
  9960. - visitor.VisitRemoveTagHelperSpan(this, span);
  9961. - }
  9962. -
  9963. /// <inheritdoc />
  9964. public override bool Equals(object obj)
  9965. {
  9966. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/Span.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/Span.cs
  9967. deleted file mode 100644
  9968. index b9147e8dacc..00000000000
  9969. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/Span.cs
  9970. +++ /dev/null
  9971. @@ -1,227 +0,0 @@
  9972. -// Copyright (c) .NET Foundation. All rights reserved.
  9973. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  9974. -
  9975. -using System;
  9976. -using System.Collections.Generic;
  9977. -using System.Linq;
  9978. -using System.Text;
  9979. -using Microsoft.AspNetCore.Razor.Language.Syntax;
  9980. -using Microsoft.Extensions.Internal;
  9981. -
  9982. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  9983. -{
  9984. - internal class Span : SyntaxTreeNode
  9985. - {
  9986. - private static readonly List<SyntaxToken> EmptyTokenList = new List<SyntaxToken>(0);
  9987. - private static readonly int TypeHashCode = typeof(Span).GetHashCode();
  9988. - private IReadOnlyList<Syntax.InternalSyntax.SyntaxToken> _greenTokens;
  9989. - private string _content;
  9990. - private int? _length;
  9991. - private SourceLocation _start;
  9992. -
  9993. - public Span(SpanBuilder builder)
  9994. - {
  9995. - ReplaceWith(builder);
  9996. - }
  9997. -
  9998. - public ISpanChunkGenerator ChunkGenerator { get; private set; }
  9999. -
  10000. - public SpanKindInternal Kind { get; private set; }
  10001. -
  10002. - public IReadOnlyList<SyntaxToken> Tokens { get; private set; }
  10003. -
  10004. - // Allow test code to re-link spans
  10005. - public Span Previous { get; internal set; }
  10006. - public Span Next { get; internal set; }
  10007. -
  10008. - public SpanEditHandler EditHandler { get; private set; }
  10009. -
  10010. - public SyntaxNode SyntaxNode { get; private set; }
  10011. -
  10012. - public override bool IsBlock => false;
  10013. -
  10014. - public override int Length
  10015. - {
  10016. - get
  10017. - {
  10018. - if (_length == null)
  10019. - {
  10020. - var length = 0;
  10021. - if (_content == null)
  10022. - {
  10023. - for (var i = 0; i < Tokens.Count; i++)
  10024. - {
  10025. - length += Tokens[i].Content.Length;
  10026. - }
  10027. - }
  10028. - else
  10029. - {
  10030. - length = _content.Length;
  10031. - }
  10032. -
  10033. - _length = length;
  10034. - }
  10035. -
  10036. - return _length.Value;
  10037. - }
  10038. - }
  10039. -
  10040. - public override SourceLocation Start => _start;
  10041. -
  10042. - public string Content
  10043. - {
  10044. - get
  10045. - {
  10046. - if (_content == null)
  10047. - {
  10048. - var tokenCount = Tokens.Count;
  10049. - if (tokenCount == 1)
  10050. - {
  10051. - // Perf: no StringBuilder allocation if not necessary
  10052. - _content = Tokens[0].Content;
  10053. - }
  10054. - else
  10055. - {
  10056. - var builder = new StringBuilder();
  10057. - for (var i = 0; i < tokenCount; i++)
  10058. - {
  10059. - var token = Tokens[i];
  10060. - builder.Append(token.Content);
  10061. - }
  10062. -
  10063. - _content = builder.ToString();
  10064. - }
  10065. - }
  10066. -
  10067. - return _content;
  10068. - }
  10069. - }
  10070. -
  10071. - public void ReplaceWith(SpanBuilder builder)
  10072. - {
  10073. - Kind = builder.Kind;
  10074. - _greenTokens = builder.Tokens;
  10075. - EditHandler = builder.EditHandler;
  10076. - ChunkGenerator = builder.ChunkGenerator ?? SpanChunkGenerator.Null;
  10077. - _start = builder.Start;
  10078. - SyntaxNode = builder.SyntaxNode?.CreateRed(parent: null, position: _start.AbsoluteIndex);
  10079. - _content = null;
  10080. - _length = null;
  10081. -
  10082. - var tokens = EmptyTokenList;
  10083. - if (_greenTokens.Count > 0)
  10084. - {
  10085. - tokens = new List<SyntaxToken>();
  10086. - var currentStart = _start.AbsoluteIndex;
  10087. - for (var i = 0; i < _greenTokens.Count; i++)
  10088. - {
  10089. - var token = new SyntaxToken(_greenTokens[i], parent: SyntaxNode, parentSpan: this, position: currentStart);
  10090. - tokens.Add(token);
  10091. - currentStart += token.FullWidth;
  10092. - }
  10093. - }
  10094. -
  10095. - Tokens = tokens;
  10096. -
  10097. - Parent?.ChildChanged();
  10098. -
  10099. - // Since we took references to the values in SpanBuilder, clear its references out
  10100. - builder.Reset();
  10101. - }
  10102. -
  10103. - public override string ToString()
  10104. - {
  10105. - var builder = new StringBuilder();
  10106. - builder.Append(Kind);
  10107. - builder.AppendFormat(" Span at {0}::{1} - [{2}]", Start, Length, Content);
  10108. - builder.Append(" Edit: <");
  10109. - builder.Append(EditHandler.ToString());
  10110. - builder.Append("> Gen: <");
  10111. - builder.Append(ChunkGenerator.ToString());
  10112. - builder.Append("> {");
  10113. - builder.Append(string.Join(";", Tokens.GroupBy(sym => sym.GetType()).Select(grp => string.Concat(grp.Key.Name, ":", grp.Count()))));
  10114. - builder.Append("}");
  10115. - return builder.ToString();
  10116. - }
  10117. -
  10118. - public void ChangeStart(SourceLocation newStart)
  10119. - {
  10120. - _start = newStart;
  10121. - var current = this;
  10122. - var tracker = new SourceLocationTracker(newStart);
  10123. - tracker.UpdateLocation(Content);
  10124. - while ((current = current.Next) != null)
  10125. - {
  10126. - current._start = tracker.CurrentLocation;
  10127. - tracker.UpdateLocation(current.Content);
  10128. - }
  10129. - }
  10130. -
  10131. - /// <summary>
  10132. - /// Checks that the specified span is equivalent to the other in that it has the same start point and content.
  10133. - /// </summary>
  10134. - public override bool EquivalentTo(SyntaxTreeNode node)
  10135. - {
  10136. - return node is Span other &&
  10137. - Kind.Equals(other.Kind) &&
  10138. - Start.Equals(other.Start) &&
  10139. - EditHandler.Equals(other.EditHandler) &&
  10140. - string.Equals(other.Content, Content, StringComparison.Ordinal);
  10141. - }
  10142. -
  10143. - public override int GetEquivalenceHash()
  10144. - {
  10145. - // Hash code should include only immutable properties but EquivalentTo also checks the type.
  10146. - return TypeHashCode;
  10147. - }
  10148. -
  10149. - public override bool Equals(object obj)
  10150. - {
  10151. - return obj is Span other &&
  10152. - Kind.Equals(other.Kind) &&
  10153. - EditHandler.Equals(other.EditHandler) &&
  10154. - ChunkGenerator.Equals(other.ChunkGenerator) &&
  10155. - Tokens.SequenceEqual(other.Tokens, SyntaxTokenComparer.Default);
  10156. - }
  10157. -
  10158. - public override int GetHashCode()
  10159. - {
  10160. - // Hash code should include only immutable properties but Equals also checks the type.
  10161. - return TypeHashCode;
  10162. - }
  10163. -
  10164. - public override void Accept(ParserVisitor visitor)
  10165. - {
  10166. - visitor.VisitSpan(this);
  10167. - }
  10168. -
  10169. - public override SyntaxTreeNode Clone()
  10170. - {
  10171. - var spanBuilder = new SpanBuilder(this);
  10172. - return spanBuilder.Build();
  10173. - }
  10174. -
  10175. - private class SyntaxTokenComparer : IEqualityComparer<SyntaxToken>
  10176. - {
  10177. - public static readonly SyntaxTokenComparer Default = new SyntaxTokenComparer();
  10178. -
  10179. - private SyntaxTokenComparer()
  10180. - {
  10181. - }
  10182. -
  10183. - public bool Equals(SyntaxToken x, SyntaxToken y)
  10184. - {
  10185. - return x.IsEquivalentTo(y);
  10186. - }
  10187. -
  10188. - public int GetHashCode(SyntaxToken obj)
  10189. - {
  10190. - var hash = HashCodeCombiner.Start();
  10191. - hash.Add(obj.Content, StringComparer.Ordinal);
  10192. - hash.Add(obj.Kind);
  10193. -
  10194. - return hash;
  10195. - }
  10196. - }
  10197. - }
  10198. -}
  10199. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/SpanBuilder.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/SpanBuilder.cs
  10200. deleted file mode 100644
  10201. index ad2b08b61cc..00000000000
  10202. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/SpanBuilder.cs
  10203. +++ /dev/null
  10204. @@ -1,135 +0,0 @@
  10205. -// Copyright (c) .NET Foundation. All rights reserved.
  10206. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  10207. -
  10208. -using System;
  10209. -using System.Collections.Generic;
  10210. -using System.Diagnostics;
  10211. -using System.Linq;
  10212. -using Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax;
  10213. -
  10214. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  10215. -{
  10216. - internal class SpanBuilder
  10217. - {
  10218. - private SourceLocation _start;
  10219. - private List<SyntaxToken> _tokens;
  10220. - private SourceLocationTracker _tracker;
  10221. -
  10222. - public SpanBuilder(Span original)
  10223. - {
  10224. - Kind = original.Kind;
  10225. - EditHandler = original.EditHandler;
  10226. - _start = original.Start;
  10227. - ChunkGenerator = original.ChunkGenerator;
  10228. -
  10229. - _tokens = new List<SyntaxToken>(original.Tokens.Select(t =>t.Green));
  10230. - _tracker = new SourceLocationTracker(original.Start);
  10231. - }
  10232. -
  10233. - public SpanBuilder(SourceLocation location)
  10234. - {
  10235. - _tracker = new SourceLocationTracker();
  10236. -
  10237. - Reset();
  10238. -
  10239. - Start = location;
  10240. - }
  10241. -
  10242. - public Syntax.GreenNode SyntaxNode { get; private set; }
  10243. -
  10244. - public ISpanChunkGenerator ChunkGenerator { get; set; }
  10245. -
  10246. - public SourceLocation Start
  10247. - {
  10248. - get { return _start; }
  10249. - set
  10250. - {
  10251. - _start = value;
  10252. - _tracker.CurrentLocation = value;
  10253. - }
  10254. - }
  10255. -
  10256. - public SourceLocation End => _tracker.CurrentLocation;
  10257. -
  10258. - public SpanKindInternal Kind { get; set; }
  10259. -
  10260. - public IReadOnlyList<SyntaxToken> Tokens
  10261. - {
  10262. - get
  10263. - {
  10264. - if (_tokens == null)
  10265. - {
  10266. - _tokens = new List<SyntaxToken>();
  10267. - }
  10268. -
  10269. - return _tokens;
  10270. - }
  10271. - }
  10272. -
  10273. - public SpanEditHandler EditHandler { get; set; }
  10274. -
  10275. - public void Reset()
  10276. - {
  10277. - // Need to potentially allocate a new list because Span.ReplaceWith takes ownership
  10278. - // of the original list.
  10279. - _tokens = null;
  10280. - _tokens = new List<SyntaxToken>();
  10281. -
  10282. - EditHandler = SpanEditHandler.CreateDefault((content) => Enumerable.Empty<SyntaxToken>());
  10283. - ChunkGenerator = SpanChunkGenerator.Null;
  10284. - Start = SourceLocation.Undefined;
  10285. - }
  10286. -
  10287. - public Span Build(SyntaxKind syntaxKind = SyntaxKind.Unknown)
  10288. - {
  10289. - SyntaxNode = GetSyntaxNode(syntaxKind);
  10290. -
  10291. - var span = new Span(this);
  10292. -
  10293. - return span;
  10294. - }
  10295. -
  10296. - public void ClearTokens()
  10297. - {
  10298. - _tokens?.Clear();
  10299. - }
  10300. -
  10301. - public void Accept(SyntaxToken token)
  10302. - {
  10303. - if (token == null)
  10304. - {
  10305. - return;
  10306. - }
  10307. -
  10308. - if (Start.Equals(SourceLocation.Undefined))
  10309. - {
  10310. - throw new InvalidOperationException("SpanBuilder must have a valid location");
  10311. - }
  10312. -
  10313. - _tokens.Add(token);
  10314. - _tracker.UpdateLocation(token.Content);
  10315. - }
  10316. -
  10317. - private Syntax.GreenNode GetSyntaxNode(SyntaxKind syntaxKind)
  10318. - {
  10319. - if (syntaxKind == SyntaxKind.HtmlTextLiteral)
  10320. - {
  10321. - var textTokens = new SyntaxListBuilder<SyntaxToken>(SyntaxListBuilder.Create());
  10322. - foreach (var token in Tokens)
  10323. - {
  10324. - if (token.Kind == SyntaxKind.Unknown)
  10325. - {
  10326. - Debug.Assert(false, $"Unexpected token {token.Kind}");
  10327. - continue;
  10328. - }
  10329. -
  10330. - textTokens.Add(token);
  10331. - }
  10332. - var textResult = textTokens.ToList();
  10333. - return SyntaxFactory.HtmlTextLiteral(new SyntaxList<SyntaxToken>(textResult.Node));
  10334. - }
  10335. -
  10336. - return null;
  10337. - }
  10338. - }
  10339. -}
  10340. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/SpanChunkGenerator.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/SpanChunkGenerator.cs
  10341. index 4e15538609e..146a5c7d4c6 100644
  10342. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/SpanChunkGenerator.cs
  10343. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/SpanChunkGenerator.cs
  10344. @@ -11,12 +11,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  10345. public static readonly ISpanChunkGenerator Null = new NullSpanChunkGenerator();
  10346. - public abstract void Accept(ParserVisitor visitor, Span span);
  10347. -
  10348. - public virtual void GenerateChunk(Span target, ChunkGeneratorContext context)
  10349. - {
  10350. - }
  10351. -
  10352. public override bool Equals(object obj)
  10353. {
  10354. return obj != null &&
  10355. @@ -30,15 +24,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  10356. private class NullSpanChunkGenerator : ISpanChunkGenerator
  10357. {
  10358. - public void Accept(ParserVisitor visitor, Span span)
  10359. - {
  10360. - visitor.VisitDefault(span);
  10361. - }
  10362. -
  10363. - public void GenerateChunk(Span target, ChunkGeneratorContext context)
  10364. - {
  10365. - }
  10366. -
  10367. public override string ToString()
  10368. {
  10369. return "None";
  10370. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/SpanContext.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/SpanContext.cs
  10371. new file mode 100644
  10372. index 00000000000..2eff0fdac1e
  10373. --- /dev/null
  10374. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/SpanContext.cs
  10375. @@ -0,0 +1,52 @@
  10376. +// Copyright (c) .NET Foundation. All rights reserved.
  10377. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  10378. +
  10379. +using System.Linq;
  10380. +using Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax;
  10381. +
  10382. +namespace Microsoft.AspNetCore.Razor.Language.Legacy
  10383. +{
  10384. + internal class SpanContext
  10385. + {
  10386. + public SpanContext(ISpanChunkGenerator chunkGenerator, SpanEditHandler editHandler)
  10387. + {
  10388. + ChunkGenerator = chunkGenerator;
  10389. + EditHandler = editHandler;
  10390. + }
  10391. +
  10392. + public ISpanChunkGenerator ChunkGenerator { get; }
  10393. +
  10394. + public SpanEditHandler EditHandler { get; }
  10395. + }
  10396. +
  10397. + internal class SpanContextBuilder
  10398. + {
  10399. + public SpanContextBuilder()
  10400. + {
  10401. + Reset();
  10402. + }
  10403. +
  10404. + public SpanContextBuilder(SpanContext context)
  10405. + {
  10406. + EditHandler = context.EditHandler;
  10407. + ChunkGenerator = context.ChunkGenerator;
  10408. + }
  10409. +
  10410. + public ISpanChunkGenerator ChunkGenerator { get; set; }
  10411. +
  10412. + public SpanEditHandler EditHandler { get; set; }
  10413. +
  10414. + public SpanContext Build()
  10415. + {
  10416. + var result = new SpanContext(ChunkGenerator, EditHandler);
  10417. + Reset();
  10418. + return result;
  10419. + }
  10420. +
  10421. + public void Reset()
  10422. + {
  10423. + EditHandler = SpanEditHandler.CreateDefault((content) => Enumerable.Empty<SyntaxToken>());
  10424. + ChunkGenerator = SpanChunkGenerator.Null;
  10425. + }
  10426. + }
  10427. +}
  10428. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/SpanEditHandler.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/SpanEditHandler.cs
  10429. index 321b4d37ceb..cf2d7a629d1 100644
  10430. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/SpanEditHandler.cs
  10431. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/SpanEditHandler.cs
  10432. @@ -3,7 +3,9 @@
  10433. using System;
  10434. using System.Collections.Generic;
  10435. -using Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax;
  10436. +using System.Diagnostics;
  10437. +using System.Linq;
  10438. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  10439. namespace Microsoft.AspNetCore.Razor.Language.Legacy
  10440. {
  10441. @@ -11,12 +13,12 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  10442. {
  10443. private static readonly int TypeHashCode = typeof(SpanEditHandler).GetHashCode();
  10444. - public SpanEditHandler(Func<string, IEnumerable<SyntaxToken>> tokenizer)
  10445. + public SpanEditHandler(Func<string, IEnumerable<Syntax.InternalSyntax.SyntaxToken>> tokenizer)
  10446. : this(tokenizer, AcceptedCharactersInternal.Any)
  10447. {
  10448. }
  10449. - public SpanEditHandler(Func<string, IEnumerable<SyntaxToken>> tokenizer, AcceptedCharactersInternal accepted)
  10450. + public SpanEditHandler(Func<string, IEnumerable<Syntax.InternalSyntax.SyntaxToken>> tokenizer, AcceptedCharactersInternal accepted)
  10451. {
  10452. AcceptedCharacters = accepted;
  10453. Tokenizer = tokenizer;
  10454. @@ -24,19 +26,24 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  10455. public AcceptedCharactersInternal AcceptedCharacters { get; set; }
  10456. - public Func<string, IEnumerable<SyntaxToken>> Tokenizer { get; set; }
  10457. + public Func<string, IEnumerable<Syntax.InternalSyntax.SyntaxToken>> Tokenizer { get; set; }
  10458. - public static SpanEditHandler CreateDefault(Func<string, IEnumerable<SyntaxToken>> tokenizer)
  10459. + public static SpanEditHandler CreateDefault()
  10460. + {
  10461. + return CreateDefault(c => Enumerable.Empty<Syntax.InternalSyntax.SyntaxToken>());
  10462. + }
  10463. +
  10464. + public static SpanEditHandler CreateDefault(Func<string, IEnumerable<Syntax.InternalSyntax.SyntaxToken>> tokenizer)
  10465. {
  10466. return new SpanEditHandler(tokenizer);
  10467. }
  10468. - public virtual EditResult ApplyChange(Span target, SourceChange change)
  10469. + public virtual EditResult ApplyChange(SyntaxNode target, SourceChange change)
  10470. {
  10471. return ApplyChange(target, change, force: false);
  10472. }
  10473. - public virtual EditResult ApplyChange(Span target, SourceChange change, bool force)
  10474. + public virtual EditResult ApplyChange(SyntaxNode target, SourceChange change, bool force)
  10475. {
  10476. var result = PartialParseResultInternal.Accepted;
  10477. if (!force)
  10478. @@ -49,49 +56,81 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  10479. {
  10480. return new EditResult(result, UpdateSpan(target, change));
  10481. }
  10482. - return new EditResult(result, new SpanBuilder(target));
  10483. + return new EditResult(result, target);
  10484. }
  10485. - public virtual bool OwnsChange(Span target, SourceChange change)
  10486. + public virtual bool OwnsChange(SyntaxNode target, SourceChange change)
  10487. {
  10488. - var end = target.Start.AbsoluteIndex + target.Length;
  10489. + var end = target.EndPosition;
  10490. var changeOldEnd = change.Span.AbsoluteIndex + change.Span.Length;
  10491. - return change.Span.AbsoluteIndex >= target.Start.AbsoluteIndex &&
  10492. + return change.Span.AbsoluteIndex >= target.Position &&
  10493. (changeOldEnd < end || (changeOldEnd == end && AcceptedCharacters != AcceptedCharactersInternal.None));
  10494. }
  10495. - protected virtual PartialParseResultInternal CanAcceptChange(Span target, SourceChange change)
  10496. + protected virtual PartialParseResultInternal CanAcceptChange(SyntaxNode target, SourceChange change)
  10497. {
  10498. return PartialParseResultInternal.Rejected;
  10499. }
  10500. - protected virtual SpanBuilder UpdateSpan(Span target, SourceChange change)
  10501. + protected virtual SyntaxNode UpdateSpan(SyntaxNode target, SourceChange change)
  10502. {
  10503. var newContent = change.GetEditedContent(target);
  10504. - var newSpan = new SpanBuilder(target);
  10505. - newSpan.ClearTokens();
  10506. + var builder = Syntax.InternalSyntax.SyntaxListBuilder<Syntax.InternalSyntax.SyntaxToken>.Create();
  10507. foreach (var token in Tokenizer(newContent))
  10508. {
  10509. - newSpan.Accept(token);
  10510. + builder.Add(token);
  10511. + }
  10512. +
  10513. + SyntaxNode newTarget = null;
  10514. + if (target is RazorMetaCodeSyntax)
  10515. + {
  10516. + newTarget = Syntax.InternalSyntax.SyntaxFactory.RazorMetaCode(builder.ToList()).CreateRed(target.Parent, target.Position);
  10517. + }
  10518. + else if (target is MarkupTextLiteralSyntax)
  10519. + {
  10520. + newTarget = Syntax.InternalSyntax.SyntaxFactory.MarkupTextLiteral(builder.ToList()).CreateRed(target.Parent, target.Position);
  10521. + }
  10522. + else if (target is MarkupEphemeralTextLiteralSyntax)
  10523. + {
  10524. + newTarget = Syntax.InternalSyntax.SyntaxFactory.MarkupEphemeralTextLiteral(builder.ToList()).CreateRed(target.Parent, target.Position);
  10525. }
  10526. - if (target.Next != null)
  10527. + else if (target is CSharpStatementLiteralSyntax)
  10528. {
  10529. - var newEnd = SourceLocationTracker.CalculateNewLocation(target.Start, newContent);
  10530. - target.Next.ChangeStart(newEnd);
  10531. + newTarget = Syntax.InternalSyntax.SyntaxFactory.CSharpStatementLiteral(builder.ToList()).CreateRed(target.Parent, target.Position);
  10532. }
  10533. - return newSpan;
  10534. + else if (target is CSharpExpressionLiteralSyntax)
  10535. + {
  10536. + newTarget = Syntax.InternalSyntax.SyntaxFactory.CSharpExpressionLiteral(builder.ToList()).CreateRed(target.Parent, target.Position);
  10537. + }
  10538. + else if (target is CSharpEphemeralTextLiteralSyntax)
  10539. + {
  10540. + newTarget = Syntax.InternalSyntax.SyntaxFactory.CSharpEphemeralTextLiteral(builder.ToList()).CreateRed(target.Parent, target.Position);
  10541. + }
  10542. + else if (target is UnclassifiedTextLiteralSyntax)
  10543. + {
  10544. + newTarget = Syntax.InternalSyntax.SyntaxFactory.UnclassifiedTextLiteral(builder.ToList()).CreateRed(target.Parent, target.Position);
  10545. + }
  10546. + else
  10547. + {
  10548. + Debug.Fail($"The type {target?.GetType().Name} is not a supported span node.");
  10549. + }
  10550. +
  10551. + var context = target.GetSpanContext();
  10552. + newTarget = context != null ? newTarget?.WithSpanContext(context) : newTarget;
  10553. +
  10554. + return newTarget;
  10555. }
  10556. - protected internal static bool IsAtEndOfFirstLine(Span target, SourceChange change)
  10557. + protected internal static bool IsAtEndOfFirstLine(SyntaxNode target, SourceChange change)
  10558. {
  10559. - var endOfFirstLine = target.Content.IndexOfAny(new char[] { (char)0x000d, (char)0x000a, (char)0x2028, (char)0x2029 });
  10560. - return (endOfFirstLine == -1 || (change.Span.AbsoluteIndex - target.Start.AbsoluteIndex) <= endOfFirstLine);
  10561. + var endOfFirstLine = target.GetContent().IndexOfAny(new char[] { (char)0x000d, (char)0x000a, (char)0x2028, (char)0x2029 });
  10562. + return (endOfFirstLine == -1 || (change.Span.AbsoluteIndex - target.Position) <= endOfFirstLine);
  10563. }
  10564. /// <summary>
  10565. /// Returns true if the specified change is an insertion of text at the end of this span.
  10566. /// </summary>
  10567. - protected internal static bool IsEndDeletion(Span target, SourceChange change)
  10568. + protected internal static bool IsEndDeletion(SyntaxNode target, SourceChange change)
  10569. {
  10570. return change.IsDelete && IsAtEndOfSpan(target, change);
  10571. }
  10572. @@ -99,14 +138,14 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  10573. /// <summary>
  10574. /// Returns true if the specified change is a replacement of text at the end of this span.
  10575. /// </summary>
  10576. - protected internal static bool IsEndReplace(Span target, SourceChange change)
  10577. + protected internal static bool IsEndReplace(SyntaxNode target, SourceChange change)
  10578. {
  10579. return change.IsReplace && IsAtEndOfSpan(target, change);
  10580. }
  10581. - protected internal static bool IsAtEndOfSpan(Span target, SourceChange change)
  10582. + protected internal static bool IsAtEndOfSpan(SyntaxNode target, SourceChange change)
  10583. {
  10584. - return (change.Span.AbsoluteIndex + change.Span.Length) == (target.Start.AbsoluteIndex + target.Length);
  10585. + return (change.Span.AbsoluteIndex + change.Span.Length) == target.EndPosition;
  10586. }
  10587. public override string ToString()
  10588. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/StatementChunkGenerator.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/StatementChunkGenerator.cs
  10589. index a2588f16c94..7874800a968 100644
  10590. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/StatementChunkGenerator.cs
  10591. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/StatementChunkGenerator.cs
  10592. @@ -5,16 +5,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  10593. {
  10594. internal class StatementChunkGenerator : SpanChunkGenerator
  10595. {
  10596. - public override void Accept(ParserVisitor visitor, Span span)
  10597. - {
  10598. - visitor.VisitStatementSpan(this, span);
  10599. - }
  10600. -
  10601. - public override void GenerateChunk(Span target, ChunkGeneratorContext context)
  10602. - {
  10603. - //context.ChunkTreeBuilder.AddStatementChunk(target.Content, target);
  10604. - }
  10605. -
  10606. public override string ToString()
  10607. {
  10608. return "Stmt";
  10609. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/SyntaxConstants.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/SyntaxConstants.cs
  10610. index 58540c315fa..a4314b285a9 100644
  10611. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/SyntaxConstants.cs
  10612. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/SyntaxConstants.cs
  10613. @@ -10,6 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  10614. public static readonly string TransitionString = "@";
  10615. public static readonly string StartCommentSequence = "@*";
  10616. public static readonly string EndCommentSequence = "*@";
  10617. + public static readonly string SpanContextKind = "SpanData";
  10618. public static class CSharp
  10619. {
  10620. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/SyntaxTreeBuilder.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/SyntaxTreeBuilder.cs
  10621. deleted file mode 100644
  10622. index 6a48614ad72..00000000000
  10623. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/SyntaxTreeBuilder.cs
  10624. +++ /dev/null
  10625. @@ -1,96 +0,0 @@
  10626. -// Copyright (c) .NET Foundation. All rights reserved.
  10627. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  10628. -
  10629. -using System;
  10630. -using System.Collections.Generic;
  10631. -
  10632. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  10633. -{
  10634. - internal class SyntaxTreeBuilder
  10635. - {
  10636. - private readonly Stack<BlockBuilder> _blockStack;
  10637. - private readonly Action _endBlock;
  10638. -
  10639. - public SyntaxTreeBuilder()
  10640. - {
  10641. - _blockStack = new Stack<BlockBuilder>();
  10642. - _endBlock = EndBlock;
  10643. - }
  10644. -
  10645. - public IReadOnlyCollection<BlockBuilder> ActiveBlocks => _blockStack;
  10646. -
  10647. - public BlockBuilder CurrentBlock => _blockStack.Peek();
  10648. -
  10649. - public Span LastSpan { get; private set; }
  10650. -
  10651. - public AcceptedCharactersInternal LastAcceptedCharacters
  10652. - {
  10653. - get
  10654. - {
  10655. - if (LastSpan == null)
  10656. - {
  10657. - return AcceptedCharactersInternal.None;
  10658. - }
  10659. - return LastSpan.EditHandler.AcceptedCharacters;
  10660. - }
  10661. - }
  10662. -
  10663. - public void Add(Span span)
  10664. - {
  10665. - if (_blockStack.Count == 0)
  10666. - {
  10667. - throw new InvalidOperationException(Resources.ParserContext_NoCurrentBlock);
  10668. - }
  10669. - CurrentBlock.Children.Add(span);
  10670. - LastSpan = span;
  10671. - }
  10672. -
  10673. - /// <summary>
  10674. - /// Starts a block of the specified type
  10675. - /// </summary>
  10676. - /// <param name="blockType">The type of the block to start</param>
  10677. - public IDisposable StartBlock(BlockKindInternal blockType)
  10678. - {
  10679. - var builder = new BlockBuilder() { Type = blockType };
  10680. - _blockStack.Push(builder);
  10681. - return new DisposableAction(_endBlock);
  10682. - }
  10683. -
  10684. - /// <summary>
  10685. - /// Ends the current block
  10686. - /// </summary>
  10687. - public void EndBlock()
  10688. - {
  10689. - if (_blockStack.Count == 0)
  10690. - {
  10691. - throw new InvalidOperationException(Resources.EndBlock_Called_Without_Matching_StartBlock);
  10692. - }
  10693. -
  10694. - if (_blockStack.Count > 1)
  10695. - {
  10696. - var initialBlockBuilder = _blockStack.Pop();
  10697. - var initialBlock = initialBlockBuilder.Build();
  10698. - CurrentBlock.Children.Add(initialBlock);
  10699. - }
  10700. - }
  10701. -
  10702. - public Block Build()
  10703. - {
  10704. - if (_blockStack.Count == 0)
  10705. - {
  10706. - throw new InvalidOperationException(Resources.ParserContext_CannotCompleteTree_NoRootBlock);
  10707. - }
  10708. - if (_blockStack.Count != 1)
  10709. - {
  10710. - throw new InvalidOperationException(Resources.ParserContext_CannotCompleteTree_OutstandingBlocks);
  10711. - }
  10712. -
  10713. - var rootBuilder = _blockStack.Pop();
  10714. - var root = rootBuilder.Build();
  10715. -
  10716. - root.LinkNodes();
  10717. -
  10718. - return root;
  10719. - }
  10720. - }
  10721. -}
  10722. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/SyntaxTreeNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/SyntaxTreeNode.cs
  10723. deleted file mode 100644
  10724. index 1b7b192db93..00000000000
  10725. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/SyntaxTreeNode.cs
  10726. +++ /dev/null
  10727. @@ -1,49 +0,0 @@
  10728. -// Copyright (c) .NET Foundation. All rights reserved.
  10729. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  10730. -
  10731. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  10732. -{
  10733. - internal abstract class SyntaxTreeNode
  10734. - {
  10735. - public Block Parent { get; internal set; }
  10736. -
  10737. - /// <summary>
  10738. - /// Returns true if this element is a block (to avoid casting)
  10739. - /// </summary>
  10740. - public abstract bool IsBlock { get; }
  10741. -
  10742. - /// <summary>
  10743. - /// The length of all the content contained in this node
  10744. - /// </summary>
  10745. - public abstract int Length { get; }
  10746. -
  10747. - /// <summary>
  10748. - /// The start point of this node
  10749. - /// </summary>
  10750. - public abstract SourceLocation Start { get; }
  10751. -
  10752. - /// <summary>
  10753. - /// Determines if the specified node is equivalent to this node
  10754. - /// </summary>
  10755. - /// <param name="node">The node to compare this node with</param>
  10756. - /// <returns>
  10757. - /// true if the provided node has all the same content and metadata, though the specific quantity and type of
  10758. - /// tokens may be different.
  10759. - /// </returns>
  10760. - public abstract bool EquivalentTo(SyntaxTreeNode node);
  10761. -
  10762. - /// <summary>
  10763. - /// Determines a hash code for the <see cref="SyntaxTreeNode"/> using only information relevant in
  10764. - /// <see cref="EquivalentTo"/> comparisons.
  10765. - /// </summary>
  10766. - /// <returns>
  10767. - /// A hash code for the <see cref="SyntaxTreeNode"/> using only information relevant in
  10768. - /// <see cref="EquivalentTo"/> comparisons.
  10769. - /// </returns>
  10770. - public abstract int GetEquivalenceHash();
  10771. -
  10772. - public abstract void Accept(ParserVisitor visitor);
  10773. -
  10774. - public abstract SyntaxTreeNode Clone();
  10775. - }
  10776. -}
  10777. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperAttributeNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperAttributeNode.cs
  10778. index 7fa090259a1..139badfe5e2 100644
  10779. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperAttributeNode.cs
  10780. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperAttributeNode.cs
  10781. @@ -1,11 +1,13 @@
  10782. // Copyright (c) .NET Foundation. All rights reserved.
  10783. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  10784. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  10785. +
  10786. namespace Microsoft.AspNetCore.Razor.Language.Legacy
  10787. {
  10788. internal class TagHelperAttributeNode
  10789. {
  10790. - public TagHelperAttributeNode(string name, SyntaxTreeNode value, AttributeStructure attributeStructure)
  10791. + public TagHelperAttributeNode(string name, SyntaxNode value, AttributeStructure attributeStructure)
  10792. {
  10793. Name = name;
  10794. Value = value;
  10795. @@ -13,14 +15,14 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  10796. }
  10797. // Internal for testing
  10798. - internal TagHelperAttributeNode(string name, SyntaxTreeNode value)
  10799. + internal TagHelperAttributeNode(string name, SyntaxNode value)
  10800. : this(name, value, AttributeStructure.DoubleQuotes)
  10801. {
  10802. }
  10803. public string Name { get; }
  10804. - public SyntaxTreeNode Value { get; }
  10805. + public SyntaxNode Value { get; }
  10806. public AttributeStructure AttributeStructure { get; }
  10807. }
  10808. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperBlock.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperBlock.cs
  10809. deleted file mode 100644
  10810. index b8863247bdc..00000000000
  10811. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperBlock.cs
  10812. +++ /dev/null
  10813. @@ -1,233 +0,0 @@
  10814. -// Copyright (c) .NET Foundation. All rights reserved.
  10815. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  10816. -
  10817. -using System;
  10818. -using System.Collections.Generic;
  10819. -using System.Globalization;
  10820. -using System.Linq;
  10821. -using Microsoft.Extensions.Internal;
  10822. -
  10823. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  10824. -{
  10825. - /// <summary>
  10826. - /// A <see cref="Block"/> that reprents a special HTML element.
  10827. - /// </summary>
  10828. - internal class TagHelperBlock : Block, IEquatable<TagHelperBlock>
  10829. - {
  10830. - private readonly SourceLocation _start;
  10831. -
  10832. - /// <summary>
  10833. - /// Instantiates a new instance of a <see cref="TagHelperBlock"/>.
  10834. - /// </summary>
  10835. - /// <param name="source">A <see cref="TagHelperBlockBuilder"/> used to construct a valid
  10836. - /// <see cref="TagHelperBlock"/>.</param>
  10837. - public TagHelperBlock(TagHelperBlockBuilder source)
  10838. - : base(source.Type, source.Children, source.ChunkGenerator)
  10839. - {
  10840. - TagName = source.TagName;
  10841. - Binding = source.BindingResult;
  10842. - Attributes = new List<TagHelperAttributeNode>(source.Attributes);
  10843. - _start = source.Start;
  10844. - TagMode = source.TagMode;
  10845. - SourceStartTag = source.SourceStartTag;
  10846. - SourceEndTag = source.SourceEndTag;
  10847. -
  10848. - source.Reset();
  10849. -
  10850. - foreach (var attributeChildren in Attributes)
  10851. - {
  10852. - if (attributeChildren.Value != null)
  10853. - {
  10854. - attributeChildren.Value.Parent = this;
  10855. - }
  10856. - }
  10857. - }
  10858. -
  10859. - /// <summary>
  10860. - /// Gets the unrewritten source start tag.
  10861. - /// </summary>
  10862. - /// <remarks>This is used by design time to properly format <see cref="TagHelperBlock"/>s.</remarks>
  10863. - public Block SourceStartTag { get; }
  10864. -
  10865. - /// <summary>
  10866. - /// Gets the unrewritten source end tag.
  10867. - /// </summary>
  10868. - /// <remarks>This is used by design time to properly format <see cref="TagHelperBlock"/>s.</remarks>
  10869. - public Block SourceEndTag { get; }
  10870. -
  10871. - /// <summary>
  10872. - /// Gets the HTML syntax of the element in the Razor source.
  10873. - /// </summary>
  10874. - public TagMode TagMode { get; }
  10875. -
  10876. - /// <summary>
  10877. - /// <see cref="TagHelperDescriptor"/> bindings for the HTML element.
  10878. - /// </summary>
  10879. - public TagHelperBinding Binding { get; }
  10880. -
  10881. - /// <summary>
  10882. - /// The HTML attributes.
  10883. - /// </summary>
  10884. - public IList<TagHelperAttributeNode> Attributes { get; }
  10885. -
  10886. - /// <inheritdoc />
  10887. - public override SourceLocation Start
  10888. - {
  10889. - get
  10890. - {
  10891. - return _start;
  10892. - }
  10893. - }
  10894. -
  10895. - /// <summary>
  10896. - /// The HTML tag name.
  10897. - /// </summary>
  10898. - public string TagName { get; }
  10899. -
  10900. - public override int Length
  10901. - {
  10902. - get
  10903. - {
  10904. - var startTagLength = SourceStartTag?.Length ?? 0;
  10905. - var childrenLength = base.Length;
  10906. - var endTagLength = SourceEndTag?.Length ?? 0;
  10907. -
  10908. - return startTagLength + childrenLength + endTagLength;
  10909. - }
  10910. - }
  10911. -
  10912. - public override IEnumerable<Span> Flatten()
  10913. - {
  10914. - if (SourceStartTag != null)
  10915. - {
  10916. - foreach (var childSpan in SourceStartTag.Flatten())
  10917. - {
  10918. - yield return childSpan;
  10919. - }
  10920. - }
  10921. -
  10922. - foreach (var childSpan in base.Flatten())
  10923. - {
  10924. - yield return childSpan;
  10925. - }
  10926. -
  10927. - if (SourceEndTag != null)
  10928. - {
  10929. - foreach (var childSpan in SourceEndTag.Flatten())
  10930. - {
  10931. - yield return childSpan;
  10932. - }
  10933. - }
  10934. - }
  10935. -
  10936. - public override Span LocateOwner(SourceChange change)
  10937. - {
  10938. - var oldPosition = change.Span.AbsoluteIndex;
  10939. - if (oldPosition < Start.AbsoluteIndex)
  10940. - {
  10941. - // Change occurs prior to the TagHelper.
  10942. - return null;
  10943. - }
  10944. -
  10945. - var bodyEndLocation = SourceStartTag?.Start.AbsoluteIndex + SourceStartTag?.Length + base.Length;
  10946. - if (oldPosition > bodyEndLocation)
  10947. - {
  10948. - // Change occurs after the TagHelpers body. End tags for TagHelpers cannot claim ownership of changes
  10949. - // because any change to them impacts whether or not a tag is a TagHelper.
  10950. - return null;
  10951. - }
  10952. -
  10953. - var startTagEndLocation = Start.AbsoluteIndex + SourceStartTag?.Length;
  10954. - if (oldPosition < startTagEndLocation)
  10955. - {
  10956. - // Change occurs in the start tag.
  10957. -
  10958. - var attributeElements = Attributes
  10959. - .Select(attribute => attribute.Value)
  10960. - .Where(value => value != null);
  10961. -
  10962. - return LocateOwner(change, attributeElements);
  10963. - }
  10964. -
  10965. - if (oldPosition < bodyEndLocation)
  10966. - {
  10967. - // Change occurs in the body
  10968. - return base.LocateOwner(change);
  10969. - }
  10970. -
  10971. - // TagHelper does not contain a Span that can claim ownership.
  10972. - return null;
  10973. - }
  10974. -
  10975. - public override SyntaxTreeNode Clone()
  10976. - {
  10977. - var tagHelperBlockBuilder = new TagHelperBlockBuilder(this);
  10978. -
  10979. - tagHelperBlockBuilder.Children.Clear();
  10980. - for (var i = 0; i < Children.Count; i++)
  10981. - {
  10982. - var clonedChild = Children[i].Clone();
  10983. - tagHelperBlockBuilder.Children.Add(clonedChild);
  10984. - }
  10985. -
  10986. - tagHelperBlockBuilder.Attributes.Clear();
  10987. - for (var i = 0; i < Attributes.Count; i++)
  10988. - {
  10989. - var existingAttribute = Attributes[i];
  10990. - var clonedValue = existingAttribute.Value != null ? existingAttribute.Value.Clone() : null;
  10991. - tagHelperBlockBuilder.Attributes.Add(
  10992. - new TagHelperAttributeNode(existingAttribute.Name, clonedValue, existingAttribute.AttributeStructure));
  10993. - }
  10994. -
  10995. - if (SourceStartTag != null)
  10996. - {
  10997. - var clonedStartTag = (Block)SourceStartTag.Clone();
  10998. - tagHelperBlockBuilder.SourceStartTag = clonedStartTag;
  10999. - }
  11000. -
  11001. - if (SourceEndTag != null)
  11002. - {
  11003. - var clonedEndTag = (Block)SourceEndTag.Clone();
  11004. - tagHelperBlockBuilder.SourceEndTag = clonedEndTag;
  11005. - }
  11006. -
  11007. - return tagHelperBlockBuilder.Build();
  11008. - }
  11009. -
  11010. - /// <inheritdoc />
  11011. - public override string ToString()
  11012. - {
  11013. - return string.Format(CultureInfo.CurrentCulture,
  11014. - "'{0}' (Attrs: {1}) Tag Helper Block at {2}::{3} (Gen:{4})",
  11015. - TagName, Attributes.Count, Start, Length, ChunkGenerator);
  11016. - }
  11017. -
  11018. - /// <summary>
  11019. - /// Determines whether two <see cref="TagHelperBlock"/>s are equal by comparing the <see cref="TagName"/>,
  11020. - /// <see cref="Attributes"/>, <see cref="Block.Type"/>, <see cref="Block.ChunkGenerator"/> and
  11021. - /// <see cref="Block.Children"/>.
  11022. - /// </summary>
  11023. - /// <param name="other">The <see cref="TagHelperBlock"/> to check equality against.</param>
  11024. - /// <returns>
  11025. - /// <c>true</c> if the current <see cref="TagHelperBlock"/> is equivalent to the given
  11026. - /// <paramref name="other"/>, <c>false</c> otherwise.
  11027. - /// </returns>
  11028. - public bool Equals(TagHelperBlock other)
  11029. - {
  11030. - return base.Equals(other) &&
  11031. - string.Equals(TagName, other.TagName, StringComparison.OrdinalIgnoreCase) &&
  11032. - Attributes.SequenceEqual(other.Attributes);
  11033. - }
  11034. -
  11035. - /// <inheritdoc />
  11036. - public override int GetHashCode()
  11037. - {
  11038. - var hashCodeCombiner = HashCodeCombiner.Start();
  11039. - hashCodeCombiner.Add(base.GetHashCode());
  11040. - hashCodeCombiner.Add(TagName, StringComparer.OrdinalIgnoreCase);
  11041. - hashCodeCombiner.Add(Attributes);
  11042. -
  11043. - return hashCodeCombiner;
  11044. - }
  11045. - }
  11046. -}
  11047. \ No newline at end of file
  11048. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperBlockBuilder.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperBlockBuilder.cs
  11049. deleted file mode 100644
  11050. index 29e39bb3aea..00000000000
  11051. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperBlockBuilder.cs
  11052. +++ /dev/null
  11053. @@ -1,136 +0,0 @@
  11054. -// Copyright (c) .NET Foundation. All rights reserved.
  11055. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  11056. -
  11057. -using System.Collections.Generic;
  11058. -
  11059. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  11060. -{
  11061. - /// <summary>
  11062. - /// A <see cref="BlockBuilder"/> used to create <see cref="TagHelperBlock"/>s.
  11063. - /// </summary>
  11064. - internal class TagHelperBlockBuilder : BlockBuilder
  11065. - {
  11066. - /// <summary>
  11067. - /// Instantiates a new <see cref="TagHelperBlockBuilder"/> instance based on the given
  11068. - /// <paramref name="original"/>.
  11069. - /// </summary>
  11070. - /// <param name="original">The original <see cref="TagHelperBlock"/> to copy data from.</param>
  11071. - public TagHelperBlockBuilder(TagHelperBlock original)
  11072. - : base(original)
  11073. - {
  11074. - SourceStartTag = original.SourceStartTag;
  11075. - SourceEndTag = original.SourceEndTag;
  11076. - TagMode = original.TagMode;
  11077. - BindingResult = original.Binding;
  11078. - Attributes = new List<TagHelperAttributeNode>(original.Attributes);
  11079. - TagName = original.TagName;
  11080. - }
  11081. -
  11082. - /// <summary>
  11083. - /// Instantiates a new instance of the <see cref="TagHelperBlockBuilder"/> class
  11084. - /// with the provided values.
  11085. - /// </summary>
  11086. - /// <param name="tagName">An HTML tag name.</param>
  11087. - /// <param name="tagMode">HTML syntax of the element in the Razor source.</param>
  11088. - /// <param name="start">Starting location of the <see cref="TagHelperBlock"/>.</param>
  11089. - /// <param name="attributes">Attributes of the <see cref="TagHelperBlock"/>.</param>
  11090. - /// <param name="bindingResult"></param>
  11091. - public TagHelperBlockBuilder(
  11092. - string tagName,
  11093. - TagMode tagMode,
  11094. - SourceLocation start,
  11095. - IList<TagHelperAttributeNode> attributes,
  11096. - TagHelperBinding bindingResult)
  11097. - {
  11098. - TagName = tagName;
  11099. - TagMode = tagMode;
  11100. - Start = start;
  11101. - BindingResult = bindingResult;
  11102. - Attributes = new List<TagHelperAttributeNode>(attributes);
  11103. - Type = BlockKindInternal.Tag;
  11104. - ChunkGenerator = new TagHelperChunkGenerator();
  11105. - }
  11106. -
  11107. - // Internal for testing
  11108. - internal TagHelperBlockBuilder(
  11109. - string tagName,
  11110. - TagMode tagMode,
  11111. - IList<TagHelperAttributeNode> attributes,
  11112. - IEnumerable<SyntaxTreeNode> children)
  11113. - {
  11114. - TagName = tagName;
  11115. - TagMode = tagMode;
  11116. - Attributes = attributes;
  11117. - Type = BlockKindInternal.Tag;
  11118. - ChunkGenerator = new TagHelperChunkGenerator();
  11119. -
  11120. - // Children is IList, no AddRange
  11121. - foreach (var child in children)
  11122. - {
  11123. - Children.Add(child);
  11124. - }
  11125. - }
  11126. -
  11127. - /// <summary>
  11128. - /// Gets or sets the unrewritten source start tag.
  11129. - /// </summary>
  11130. - /// <remarks>This is used by design time to properly format <see cref="TagHelperBlock"/>s.</remarks>
  11131. - public Block SourceStartTag { get; set; }
  11132. -
  11133. - /// <summary>
  11134. - /// Gets or sets the unrewritten source end tag.
  11135. - /// </summary>
  11136. - /// <remarks>This is used by design time to properly format <see cref="TagHelperBlock"/>s.</remarks>
  11137. - public Block SourceEndTag { get; set; }
  11138. -
  11139. - /// <summary>
  11140. - /// Gets the HTML syntax of the element in the Razor source.
  11141. - /// </summary>
  11142. - public TagMode TagMode { get; }
  11143. -
  11144. - /// <summary>
  11145. - /// <see cref="TagHelperDescriptor"/>s for the HTML element.
  11146. - /// </summary>
  11147. - public TagHelperBinding BindingResult { get; }
  11148. -
  11149. - /// <summary>
  11150. - /// The HTML attributes.
  11151. - /// </summary>
  11152. - public IList<TagHelperAttributeNode> Attributes { get; }
  11153. -
  11154. - /// <summary>
  11155. - /// The HTML tag name.
  11156. - /// </summary>
  11157. - public string TagName { get; set; }
  11158. -
  11159. - /// <summary>
  11160. - /// Constructs a new <see cref="TagHelperBlock"/>.
  11161. - /// </summary>
  11162. - /// <returns>A <see cref="TagHelperBlock"/>.</returns>
  11163. - public override Block Build()
  11164. - {
  11165. - return new TagHelperBlock(this);
  11166. - }
  11167. -
  11168. - /// <inheritdoc />
  11169. - /// <remarks>
  11170. - /// Sets the <see cref="TagName"/> to <c>null</c> and clears the <see cref="Attributes"/>.
  11171. - /// </remarks>
  11172. - public override void Reset()
  11173. - {
  11174. - TagName = null;
  11175. -
  11176. - if (Attributes != null)
  11177. - {
  11178. - Attributes.Clear();
  11179. - }
  11180. -
  11181. - base.Reset();
  11182. - }
  11183. -
  11184. - /// <summary>
  11185. - /// The starting <see cref="SourceLocation"/> of the tag helper.
  11186. - /// </summary>
  11187. - public SourceLocation Start { get; set; }
  11188. - }
  11189. -}
  11190. \ No newline at end of file
  11191. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperBlockRewriter.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperBlockRewriter.cs
  11192. index 1aea40a746e..421485fdcc6 100644
  11193. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperBlockRewriter.cs
  11194. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperBlockRewriter.cs
  11195. @@ -1,11 +1,9 @@
  11196. -// Copyright (c) .NET Foundation. All rights reserved.
  11197. +// Copyright (c) .NET Foundation. All rights reserved.
  11198. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  11199. using System;
  11200. using System.Collections.Generic;
  11201. -using System.Diagnostics;
  11202. using System.Linq;
  11203. -using System.Text;
  11204. using Microsoft.AspNetCore.Razor.Language.Syntax;
  11205. namespace Microsoft.AspNetCore.Razor.Language.Legacy
  11206. @@ -14,107 +12,30 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  11207. {
  11208. private static readonly string StringTypeName = typeof(string).FullName;
  11209. - public static TagHelperBlockBuilder Rewrite(
  11210. + public static MarkupTagHelperStartTagSyntax Rewrite(
  11211. string tagName,
  11212. bool validStructure,
  11213. RazorParserFeatureFlags featureFlags,
  11214. - Block tag,
  11215. - TagHelperBinding bindingResult,
  11216. - ErrorSink errorSink)
  11217. - {
  11218. - // There will always be at least one child for the '<'.
  11219. - var start = tag.Children.First().Start;
  11220. - var attributes = GetTagAttributes(tagName, validStructure, tag, bindingResult, errorSink, featureFlags);
  11221. - var tagMode = GetTagMode(tagName, tag, bindingResult, errorSink);
  11222. -
  11223. - return new TagHelperBlockBuilder(tagName, tagMode, start, attributes, bindingResult);
  11224. - }
  11225. -
  11226. - private static IList<TagHelperAttributeNode> GetTagAttributes(
  11227. - string tagName,
  11228. - bool validStructure,
  11229. - Block tagBlock,
  11230. + MarkupTagBlockSyntax tag,
  11231. TagHelperBinding bindingResult,
  11232. ErrorSink errorSink,
  11233. - RazorParserFeatureFlags featureFlags)
  11234. + RazorSourceDocument source)
  11235. {
  11236. - var attributes = new List<TagHelperAttributeNode>();
  11237. -
  11238. - // We skip the first child "<tagname" and take everything up to the ending portion of the tag ">" or "/>".
  11239. - // The -2 accounts for both the start and end tags. If the tag does not have a valid structure then there's
  11240. - // no end tag to ignore.
  11241. - var tokenOffset = validStructure ? 2 : 1;
  11242. - var attributeChildren = tagBlock.Children.Skip(1).Take(tagBlock.Children.Count() - tokenOffset);
  11243. - var processedBoundAttributeNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
  11244. -
  11245. - foreach (var child in attributeChildren)
  11246. - {
  11247. - TryParseResult result;
  11248. - if (child.IsBlock)
  11249. - {
  11250. - result = TryParseBlock(tagName, (Block)child, bindingResult.Descriptors, errorSink, processedBoundAttributeNames);
  11251. - }
  11252. - else
  11253. - {
  11254. - result = TryParseSpan((Span)child, bindingResult.Descriptors, errorSink, processedBoundAttributeNames);
  11255. - }
  11256. -
  11257. - // Only want to track the attribute if we succeeded in parsing its corresponding Block/Span.
  11258. - if (result != null)
  11259. - {
  11260. - // Check if it's a non-boolean bound attribute that is minimized or if it's a bound
  11261. - // non-string attribute that has null or whitespace content.
  11262. - var isMinimized = result.AttributeValueNode == null;
  11263. - var isValidMinimizedAttribute = featureFlags.AllowMinimizedBooleanTagHelperAttributes && result.IsBoundBooleanAttribute;
  11264. - if ((isMinimized &&
  11265. - result.IsBoundAttribute &&
  11266. - !isValidMinimizedAttribute) ||
  11267. - (!isMinimized &&
  11268. - result.IsBoundNonStringAttribute &&
  11269. - IsNullOrWhitespaceAttributeValue(result.AttributeValueNode)))
  11270. - {
  11271. - var errorLocation = GetAttributeNameLocation(child, result.AttributeName);
  11272. - var propertyTypeName = GetPropertyType(result.AttributeName, bindingResult.Descriptors);
  11273. - var diagnostic = RazorDiagnosticFactory.CreateTagHelper_EmptyBoundAttribute(errorLocation, result.AttributeName, tagName, propertyTypeName);
  11274. - errorSink.OnError(diagnostic);
  11275. - }
  11276. -
  11277. - // Check if the attribute was a prefix match for a tag helper dictionary property but the
  11278. - // dictionary key would be the empty string.
  11279. - if (result.IsMissingDictionaryKey)
  11280. - {
  11281. - var errorLocation = GetAttributeNameLocation(child, result.AttributeName);
  11282. - var diagnostic = RazorDiagnosticFactory.CreateParsing_TagHelperIndexerAttributeNameMustIncludeKey(errorLocation, result.AttributeName, tagName);
  11283. - errorSink.OnError(diagnostic);
  11284. - }
  11285. -
  11286. - var attributeNode = new TagHelperAttributeNode(
  11287. - result.AttributeName,
  11288. - result.AttributeValueNode,
  11289. - result.AttributeStructure);
  11290. -
  11291. - attributes.Add(attributeNode);
  11292. - }
  11293. - else
  11294. - {
  11295. - // Error occurred while parsing the attribute. Don't try parsing the rest to avoid misleading errors.
  11296. - break;
  11297. - }
  11298. - }
  11299. + // There will always be at least one child for the '<'.
  11300. + var rewrittenChildren = GetRewrittenChildren(tagName, validStructure, tag, bindingResult, featureFlags, errorSink, source);
  11301. - return attributes;
  11302. + return SyntaxFactory.MarkupTagHelperStartTag(rewrittenChildren);
  11303. }
  11304. - private static TagMode GetTagMode(
  11305. - string tagName,
  11306. - Block beginTagBlock,
  11307. + public static TagMode GetTagMode(
  11308. + MarkupTagBlockSyntax tagBlock,
  11309. TagHelperBinding bindingResult,
  11310. ErrorSink errorSink)
  11311. {
  11312. - var childSpan = beginTagBlock.FindLastDescendentSpan();
  11313. + var childSpan = tagBlock.GetLastToken()?.Parent;
  11314. // Self-closing tags are always valid despite descriptors[X].TagStructure.
  11315. - if (childSpan?.Content.EndsWith("/>", StringComparison.Ordinal) ?? false)
  11316. + if (childSpan?.GetContent().EndsWith("/>", StringComparison.Ordinal) ?? false)
  11317. {
  11318. return TagMode.SelfClosing;
  11319. }
  11320. @@ -133,258 +54,185 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  11321. return TagMode.StartTagAndEndTag;
  11322. }
  11323. - // This method handles cases when the attribute is a simple span attribute such as
  11324. - // class="something moresomething". This does not handle complex attributes such as
  11325. - // class="@myclass". Therefore the span.Content is equivalent to the entire attribute.
  11326. - private static TryParseResult TryParseSpan(
  11327. - Span span,
  11328. - IEnumerable<TagHelperDescriptor> descriptors,
  11329. + private static SyntaxList<RazorSyntaxNode> GetRewrittenChildren(
  11330. + string tagName,
  11331. + bool validStructure,
  11332. + MarkupTagBlockSyntax tagBlock,
  11333. + TagHelperBinding bindingResult,
  11334. + RazorParserFeatureFlags featureFlags,
  11335. ErrorSink errorSink,
  11336. - HashSet<string> processedBoundAttributeNames)
  11337. + RazorSourceDocument source)
  11338. {
  11339. - var afterEquals = false;
  11340. - var builder = new SpanBuilder(span.Start)
  11341. - {
  11342. - ChunkGenerator = span.ChunkGenerator,
  11343. - EditHandler = span.EditHandler,
  11344. - Kind = span.Kind
  11345. - };
  11346. -
  11347. - // Will contain tokens that represent a single attribute value: <input| class="btn"| />
  11348. - var tokens = span.Tokens;
  11349. - var capturedAttributeValueStart = false;
  11350. - var attributeValueStartLocation = span.Start;
  11351. + var tagHelperBuilder = SyntaxListBuilder<RazorSyntaxNode>.Create();
  11352. + var processedBoundAttributeNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
  11353. - // Default to DoubleQuotes. We purposefully do not persist NoQuotes ValueStyle to stay consistent with the
  11354. - // TryParseBlock() variation of attribute parsing.
  11355. - var attributeValueStyle = AttributeStructure.DoubleQuotes;
  11356. + if (tagBlock.Children.Count == 1)
  11357. + {
  11358. + // Tag with no attributes. We have nothing to rewrite here.
  11359. + return tagBlock.Children;
  11360. + }
  11361. - // The tokenOffset is initialized to 0 to expect worst case: "class=". If a quote is found later on for
  11362. - // the attribute value the tokenOffset is adjusted accordingly.
  11363. - var tokenOffset = 0;
  11364. - string name = null;
  11365. + // Add the tag start
  11366. + tagHelperBuilder.Add(tagBlock.Children.First());
  11367. - // Iterate down through the tokens to find the name and the start of the value.
  11368. - // We subtract the tokenOffset so we don't accept an ending quote of a span.
  11369. - for (var i = 0; i < tokens.Count - tokenOffset; i++)
  11370. + // We skip the first child "<tagname" and take everything up to the ending portion of the tag ">" or "/>".
  11371. + // If the tag does not have a valid structure then there's no close angle to ignore.
  11372. + var tokenOffset = validStructure ? 1 : 0;
  11373. + for (var i = 1; i < tagBlock.Children.Count - tokenOffset; i++)
  11374. {
  11375. - var token = tokens[i];
  11376. -
  11377. - if (afterEquals)
  11378. + var isMinimized = false;
  11379. + var attributeNameLocation = SourceLocation.Undefined;
  11380. + var child = tagBlock.Children[i];
  11381. + TryParseResult result;
  11382. + if (child is MarkupAttributeBlockSyntax attributeBlock)
  11383. {
  11384. - // We've captured all leading whitespace, the attribute name, and an equals with an optional
  11385. - // quote/double quote. We're now at: " asp-for='|...'" or " asp-for=|..."
  11386. - // The goal here is to capture all tokens until the end of the attribute. Note this will not
  11387. - // consume an ending quote due to the tokenOffset.
  11388. -
  11389. - // When tokens are accepted into SpanBuilders, their locations get altered to be offset by the
  11390. - // parent which is why we need to mark our start location prior to adding the token.
  11391. - // This is needed to know the location of the attribute value start within the document.
  11392. - if (!capturedAttributeValueStart)
  11393. - {
  11394. - capturedAttributeValueStart = true;
  11395. -
  11396. - attributeValueStartLocation = token.Start;
  11397. - }
  11398. -
  11399. - builder.Accept(token.Green);
  11400. + attributeNameLocation = attributeBlock.Name.GetSourceLocation(source);
  11401. + result = TryParseAttribute(
  11402. + tagName,
  11403. + attributeBlock,
  11404. + bindingResult.Descriptors,
  11405. + errorSink,
  11406. + processedBoundAttributeNames);
  11407. + tagHelperBuilder.Add(result.RewrittenAttribute);
  11408. }
  11409. - else if (name == null && HtmlMarkupParser.IsValidAttributeNameToken(token.Green))
  11410. + else if (child is MarkupMinimizedAttributeBlockSyntax minimizedAttributeBlock)
  11411. {
  11412. - // We've captured all leading whitespace prior to the attribute name.
  11413. - // We're now at: " |asp-for='...'" or " |asp-for=..."
  11414. - // The goal here is to capture the attribute name.
  11415. + isMinimized = true;
  11416. + attributeNameLocation = minimizedAttributeBlock.Name.GetSourceLocation(source);
  11417. + result = TryParseMinimizedAttribute(
  11418. + tagName,
  11419. + minimizedAttributeBlock,
  11420. + bindingResult.Descriptors,
  11421. + errorSink,
  11422. + processedBoundAttributeNames);
  11423. + tagHelperBuilder.Add(result.RewrittenAttribute);
  11424. + }
  11425. + else if (child is CSharpCodeBlockSyntax)
  11426. + {
  11427. + // TODO: Accept more than just Markup attributes: https://github.com/aspnet/Razor/issues/96.
  11428. + // Something like:
  11429. + // <input @checked />
  11430. + var location = new SourceSpan(child.GetSourceLocation(source), child.FullWidth);
  11431. + var diagnostic = RazorDiagnosticFactory.CreateParsing_TagHelpersCannotHaveCSharpInTagDeclaration(location, tagName);
  11432. + errorSink.OnError(diagnostic);
  11433. - var nameBuilder = new StringBuilder();
  11434. - // Move the indexer past the attribute name tokens.
  11435. - for (var j = i; j < tokens.Count; j++)
  11436. + result = null;
  11437. + }
  11438. + else if (child is MarkupTextLiteralSyntax)
  11439. + {
  11440. + // If the original span content was whitespace it ultimately means the tag
  11441. + // that owns this "attribute" is malformed and is expecting a user to type a new attribute.
  11442. + // ex: <myTH class="btn"| |
  11443. + var literalContent = child.GetContent();
  11444. + if (!string.IsNullOrWhiteSpace(literalContent))
  11445. {
  11446. - var nameToken = tokens[j];
  11447. - if (!HtmlMarkupParser.IsValidAttributeNameToken(nameToken.Green))
  11448. - {
  11449. - break;
  11450. - }
  11451. -
  11452. - nameBuilder.Append(nameToken.Content);
  11453. - i++;
  11454. + var location = child.GetSourceSpan(source);
  11455. + var diagnostic = RazorDiagnosticFactory.CreateParsing_TagHelperAttributeListMustBeWellFormed(location);
  11456. + errorSink.OnError(diagnostic);
  11457. }
  11458. -
  11459. - i--;
  11460. -
  11461. - name = nameBuilder.ToString();
  11462. - attributeValueStartLocation = SourceLocationTracker.Advance(attributeValueStartLocation, name);
  11463. + result = null;
  11464. }
  11465. - else if (token.Kind == SyntaxKind.Equals)
  11466. + else
  11467. {
  11468. - // We've captured all leading whitespace and the attribute name.
  11469. - // We're now at: " asp-for|='...'" or " asp-for|=..."
  11470. - // The goal here is to consume the equal sign and the optional single/double-quote.
  11471. -
  11472. - // The coming tokens will either be a quote or value (in the case that the value is unquoted).
  11473. -
  11474. - SourceLocation tokenStartLocation;
  11475. -
  11476. - // Skip the whitespace preceding the start of the attribute value.
  11477. - do
  11478. - {
  11479. - i++; // Start from the token after '='.
  11480. - } while (i < tokens.Count &&
  11481. - (tokens[i].Kind == SyntaxKind.Whitespace ||
  11482. - tokens[i].Kind == SyntaxKind.NewLine));
  11483. -
  11484. - // Check for attribute start values, aka single or double quote
  11485. - if (i < tokens.Count && IsQuote(tokens[i]))
  11486. - {
  11487. - if (tokens[i].Kind == SyntaxKind.SingleQuote)
  11488. - {
  11489. - attributeValueStyle = AttributeStructure.SingleQuotes;
  11490. - }
  11491. -
  11492. - tokenStartLocation = tokens[i].Start;
  11493. + result = null;
  11494. + }
  11495. - // If there's a start quote then there must be an end quote to be valid, skip it.
  11496. - tokenOffset = 1;
  11497. - }
  11498. - else
  11499. + // Only want to track the attribute if we succeeded in parsing its corresponding Block/Span.
  11500. + if (result == null)
  11501. + {
  11502. + // Error occurred while parsing the attribute. Don't try parsing the rest to avoid misleading errors.
  11503. + for (var j = i; j < tagBlock.Children.Count; j++)
  11504. {
  11505. - // We are at the token after equals. Go back to equals to ensure we don't skip past that token.
  11506. - i--;
  11507. -
  11508. - tokenStartLocation = token.Start;
  11509. + tagHelperBuilder.Add(tagBlock.Children[j]);
  11510. }
  11511. - attributeValueStartLocation = new SourceLocation(
  11512. - tokenStartLocation.FilePath,
  11513. - tokenStartLocation.AbsoluteIndex + 1,
  11514. - tokenStartLocation.LineIndex,
  11515. - tokenStartLocation.CharacterIndex + 1);
  11516. -
  11517. - afterEquals = true;
  11518. + return tagHelperBuilder.ToList();
  11519. }
  11520. - else if (token.Kind == SyntaxKind.Whitespace)
  11521. +
  11522. + // Check if it's a non-boolean bound attribute that is minimized or if it's a bound
  11523. + // non-string attribute that has null or whitespace content.
  11524. + var isValidMinimizedAttribute = featureFlags.AllowMinimizedBooleanTagHelperAttributes && result.IsBoundBooleanAttribute;
  11525. + if ((isMinimized &&
  11526. + result.IsBoundAttribute &&
  11527. + !isValidMinimizedAttribute) ||
  11528. + (!isMinimized &&
  11529. + result.IsBoundNonStringAttribute &&
  11530. + string.IsNullOrWhiteSpace(GetAttributeValueContent(result.RewrittenAttribute))))
  11531. {
  11532. - // We're at the start of the attribute, this branch may be hit on the first iterations of
  11533. - // the loop since the parser separates attributes with their spaces included as tokens.
  11534. - // We're at: "| asp-for='...'" or "| asp-for=..."
  11535. - // Note: This will not be hit even for situations like asp-for ="..." because the core Razor
  11536. - // parser currently does not know how to handle attributes in that format. This will be addressed
  11537. - // by https://github.com/aspnet/Razor/issues/123.
  11538. -
  11539. - attributeValueStartLocation = SourceLocationTracker.Advance(attributeValueStartLocation, token.Content);
  11540. + var errorLocation = new SourceSpan(attributeNameLocation, result.AttributeName.Length);
  11541. + var propertyTypeName = GetPropertyType(result.AttributeName, bindingResult.Descriptors);
  11542. + var diagnostic = RazorDiagnosticFactory.CreateTagHelper_EmptyBoundAttribute(errorLocation, result.AttributeName, tagName, propertyTypeName);
  11543. + errorSink.OnError(diagnostic);
  11544. }
  11545. - }
  11546. -
  11547. - // After all tokens have been added we need to set the builders start position so we do not indirectly
  11548. - // modify the span's start location.
  11549. - builder.Start = attributeValueStartLocation;
  11550. - if (name == null)
  11551. - {
  11552. - // We couldn't find a name, if the original span content was whitespace it ultimately means the tag
  11553. - // that owns this "attribute" is malformed and is expecting a user to type a new attribute.
  11554. - // ex: <myTH class="btn"| |
  11555. - if (!string.IsNullOrWhiteSpace(span.Content))
  11556. + // Check if the attribute was a prefix match for a tag helper dictionary property but the
  11557. + // dictionary key would be the empty string.
  11558. + if (result.IsMissingDictionaryKey)
  11559. {
  11560. - var location = new SourceSpan(span.Start, span.Content.Length);
  11561. - var diagnostic = RazorDiagnosticFactory.CreateParsing_TagHelperAttributeListMustBeWellFormed(location);
  11562. + var errorLocation = new SourceSpan(attributeNameLocation, result.AttributeName.Length);
  11563. + var diagnostic = RazorDiagnosticFactory.CreateParsing_TagHelperIndexerAttributeNameMustIncludeKey(errorLocation, result.AttributeName, tagName);
  11564. errorSink.OnError(diagnostic);
  11565. }
  11566. -
  11567. - return null;
  11568. }
  11569. - var result = CreateTryParseResult(name, descriptors, processedBoundAttributeNames);
  11570. -
  11571. - // If we're not after an equal then we should treat the value as if it were a minimized attribute.
  11572. - Span attributeValue = null;
  11573. - if (afterEquals)
  11574. + if (validStructure)
  11575. {
  11576. - attributeValue = CreateMarkupAttribute(builder, result);
  11577. - }
  11578. - else
  11579. - {
  11580. - attributeValueStyle = AttributeStructure.Minimized;
  11581. + // Add the tag end.
  11582. + tagHelperBuilder.Add(tagBlock.Children[tagBlock.Children.Count - 1]);
  11583. }
  11584. - result.AttributeValueNode = attributeValue;
  11585. - result.AttributeStructure = attributeValueStyle;
  11586. - return result;
  11587. + return tagHelperBuilder.ToList();
  11588. }
  11589. - private static TryParseResult TryParseBlock(
  11590. + private static TryParseResult TryParseMinimizedAttribute(
  11591. string tagName,
  11592. - Block block,
  11593. + MarkupMinimizedAttributeBlockSyntax attributeBlock,
  11594. IEnumerable<TagHelperDescriptor> descriptors,
  11595. ErrorSink errorSink,
  11596. HashSet<string> processedBoundAttributeNames)
  11597. {
  11598. - // TODO: Accept more than just spans: https://github.com/aspnet/Razor/issues/96.
  11599. - // The first child will only ever NOT be a Span if a user is doing something like:
  11600. - // <input @checked />
  11601. -
  11602. - var childSpan = block.Children.First() as Span;
  11603. + // Have a name now. Able to determine correct isBoundNonStringAttribute value.
  11604. + var result = CreateTryParseResult(attributeBlock.Name.GetContent(), descriptors, processedBoundAttributeNames);
  11605. - if (childSpan == null || childSpan.Kind != SpanKindInternal.Markup)
  11606. - {
  11607. - var location = new SourceSpan(block.Start, block.Length);
  11608. - var diagnostic = RazorDiagnosticFactory.CreateParsing_TagHelpersCannotHaveCSharpInTagDeclaration(location, tagName);
  11609. - errorSink.OnError(diagnostic);
  11610. + result.AttributeStructure = AttributeStructure.Minimized;
  11611. + var rewritten = SyntaxFactory.MarkupMinimizedTagHelperAttribute(
  11612. + attributeBlock.NamePrefix,
  11613. + attributeBlock.Name);
  11614. - return null;
  11615. - }
  11616. + rewritten = rewritten.WithTagHelperAttributeInfo(
  11617. + new TagHelperAttributeInfo(result.AttributeName, result.AttributeStructure, result.IsBoundAttribute));
  11618. - var builder = new BlockBuilder(block);
  11619. + result.RewrittenAttribute = rewritten;
  11620. - // If there's only 1 child it means that it's plain text inside of the attribute.
  11621. - // i.e. <div class="plain text in attribute">
  11622. - if (builder.Children.Count == 1)
  11623. - {
  11624. - return TryParseSpan(childSpan, descriptors, errorSink, processedBoundAttributeNames);
  11625. - }
  11626. + return result;
  11627. + }
  11628. - var nameTokens = childSpan
  11629. - .Tokens
  11630. - .SkipWhile(token => !HtmlMarkupParser.IsValidAttributeNameToken(token.Green)) // Skip prefix
  11631. - .TakeWhile(nameToken => HtmlMarkupParser.IsValidAttributeNameToken(nameToken.Green))
  11632. - .Select(nameToken => nameToken.Content);
  11633. + private static TryParseResult TryParseAttribute(
  11634. + string tagName,
  11635. + MarkupAttributeBlockSyntax attributeBlock,
  11636. + IEnumerable<TagHelperDescriptor> descriptors,
  11637. + ErrorSink errorSink,
  11638. + HashSet<string> processedBoundAttributeNames)
  11639. + {
  11640. + // Have a name now. Able to determine correct isBoundNonStringAttribute value.
  11641. + var result = CreateTryParseResult(attributeBlock.Name.GetContent(), descriptors, processedBoundAttributeNames);
  11642. - var name = string.Concat(nameTokens);
  11643. - if (string.IsNullOrEmpty(name))
  11644. + if (attributeBlock.ValuePrefix == null)
  11645. {
  11646. - var location = new SourceSpan(childSpan.Start, childSpan.Length);
  11647. - var diagnostic = RazorDiagnosticFactory.CreateParsing_TagHelperAttributesMustHaveAName(location, tagName);
  11648. - errorSink.OnError(diagnostic);
  11649. -
  11650. - return null;
  11651. + // We are purposefully not persisting NoQuotes even for unbound attributes because it is still possible to
  11652. + // rewrite the values that introduces a space like in UrlResolutionTagHelper.
  11653. + // The other case is it could be an expression, treat NoQuotes and DoubleQuotes equivalently. We purposefully do not persist NoQuotes
  11654. + // ValueStyles at code generation time to protect users from rendering dynamic content with spaces
  11655. + // that can break attributes.
  11656. + // Ex: <tag my-attribute=@value /> where @value results in the test "hello world".
  11657. + // This way, the above code would render <tag my-attribute="hello world" />.
  11658. + result.AttributeStructure = AttributeStructure.DoubleQuotes;
  11659. }
  11660. -
  11661. - // Have a name now. Able to determine correct isBoundNonStringAttribute value.
  11662. - var result = CreateTryParseResult(name, descriptors, processedBoundAttributeNames);
  11663. -
  11664. - var firstChild = builder.Children[0] as Span;
  11665. - if (firstChild != null)
  11666. + else
  11667. {
  11668. - var token = firstChild.Tokens[firstChild.Tokens.Count - 1];
  11669. - switch (token.Kind)
  11670. + var lastToken = attributeBlock.ValuePrefix.GetLastToken();
  11671. + switch (lastToken.Kind)
  11672. {
  11673. - case SyntaxKind.Equals:
  11674. - if (builder.Children.Count == 2 &&
  11675. - builder.Children[1] is Span value &&
  11676. - value.Kind == SpanKindInternal.Markup)
  11677. - {
  11678. - // Attribute value is a string literal. Eg: <tag my-attribute=foo />.
  11679. - result.AttributeStructure = AttributeStructure.NoQuotes;
  11680. - }
  11681. - else
  11682. - {
  11683. - // Could be an expression, treat NoQuotes and DoubleQuotes equivalently. We purposefully do not persist NoQuotes
  11684. - // ValueStyles at code generation time to protect users from rendering dynamic content with spaces
  11685. - // that can break attributes.
  11686. - // Ex: <tag my-attribute=@value /> where @value results in the test "hello world".
  11687. - // This way, the above code would render <tag my-attribute="hello world" />.
  11688. - result.AttributeStructure = AttributeStructure.DoubleQuotes;
  11689. - }
  11690. - break;
  11691. case SyntaxKind.DoubleQuote:
  11692. result.AttributeStructure = AttributeStructure.DoubleQuotes;
  11693. break;
  11694. @@ -397,262 +245,48 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  11695. }
  11696. }
  11697. - // Remove first child i.e. foo="
  11698. - builder.Children.RemoveAt(0);
  11699. -
  11700. - // Grabbing last child to check if the attribute value is quoted.
  11701. - var endNode = block.Children.Last();
  11702. - if (!endNode.IsBlock)
  11703. - {
  11704. - var endSpan = (Span)endNode;
  11705. -
  11706. - // In some malformed cases e.g. <p bar="false', the last Span (false' in the ex.) may contain more
  11707. - // than a single HTML token. Do not ignore those other tokens.
  11708. - var tokenCount = endSpan.Tokens.Count;
  11709. - var endToken = tokenCount == 1 ? endSpan.Tokens.First() : null;
  11710. -
  11711. - // Checking to see if it's a quoted attribute, if so we should remove end quote
  11712. - if (endToken != null && IsQuote(endToken))
  11713. - {
  11714. - builder.Children.RemoveAt(builder.Children.Count - 1);
  11715. - }
  11716. - }
  11717. -
  11718. - // We need to rebuild the chunk generators of the builder and its children (this is needed to
  11719. - // ensure we don't do special attribute chunk generation since this is a tag helper).
  11720. - block = RebuildChunkGenerators(builder.Build(), result.IsBoundAttribute);
  11721. -
  11722. - // If there's only 1 child at this point its value could be a simple markup span (treated differently than
  11723. - // block level elements for attributes).
  11724. - if (block.Children.Count() == 1)
  11725. + var attributeValue = attributeBlock.Value;
  11726. + if (attributeValue == null)
  11727. {
  11728. - var child = block.Children.First() as Span;
  11729. - if (child != null)
  11730. - {
  11731. - // After pulling apart the block we just have a value span.
  11732. - var spanBuilder = new SpanBuilder(child);
  11733. + var builder = SyntaxListBuilder<RazorSyntaxNode>.Create();
  11734. - result.AttributeValueNode =
  11735. - CreateMarkupAttribute(spanBuilder, result);
  11736. + // Add a marker for attribute value when there are no quotes like, <p class= >
  11737. + builder.Add(SyntaxFactory.MarkupTextLiteral(new SyntaxList<SyntaxToken>()));
  11738. - return result;
  11739. - }
  11740. + attributeValue = SyntaxFactory.GenericBlock(builder.ToList());
  11741. }
  11742. + var rewrittenValue = RewriteAttributeValue(result, attributeValue);
  11743. - var isFirstSpan = true;
  11744. + var rewritten = SyntaxFactory.MarkupTagHelperAttribute(
  11745. + attributeBlock.NamePrefix,
  11746. + attributeBlock.Name,
  11747. + attributeBlock.NameSuffix,
  11748. + attributeBlock.EqualsToken,
  11749. + attributeBlock.ValuePrefix,
  11750. + rewrittenValue,
  11751. + attributeBlock.ValueSuffix);
  11752. - result.AttributeValueNode = ConvertToMarkupAttributeBlock(
  11753. - block,
  11754. - (parentBlock, span) =>
  11755. - {
  11756. - // If the attribute was requested by a tag helper but the corresponding property was not a
  11757. - // string, then treat its value as code. A non-string value can be any C# value so we need
  11758. - // to ensure the SyntaxTreeNode reflects that.
  11759. - if (result.IsBoundNonStringAttribute)
  11760. - {
  11761. - // For bound non-string attributes, we'll only allow a transition span to appear at the very
  11762. - // beginning of the attribute expression. All later transitions would appear as code so that
  11763. - // they are part of the generated output. E.g.
  11764. - // key="@value" -> MyTagHelper.key = value
  11765. - // key=" @value" -> MyTagHelper.key = @value
  11766. - // key="1 + @case" -> MyTagHelper.key = 1 + @case
  11767. - // key="@int + @case" -> MyTagHelper.key = int + @case
  11768. - // key="@(a + b) -> MyTagHelper.key = a + b
  11769. - // key="4 + @(a + b)" -> MyTagHelper.key = 4 + @(a + b)
  11770. - if (isFirstSpan && span.Kind == SpanKindInternal.Transition)
  11771. - {
  11772. - // do nothing.
  11773. - }
  11774. - else
  11775. - {
  11776. - var spanBuilder = new SpanBuilder(span);
  11777. -
  11778. - if (parentBlock.Type == BlockKindInternal.Expression &&
  11779. - (spanBuilder.Kind == SpanKindInternal.Transition ||
  11780. - spanBuilder.Kind == SpanKindInternal.MetaCode))
  11781. - {
  11782. - // Change to a MarkupChunkGenerator so that the '@' \ parenthesis is generated as part of the output.
  11783. - spanBuilder.ChunkGenerator = new MarkupChunkGenerator();
  11784. - }
  11785. -
  11786. - ConfigureNonStringAttribute(spanBuilder, result.IsDuplicateAttribute);
  11787. -
  11788. - span = spanBuilder.Build();
  11789. - }
  11790. - }
  11791. + rewritten = rewritten.WithTagHelperAttributeInfo(
  11792. + new TagHelperAttributeInfo(result.AttributeName, result.AttributeStructure, result.IsBoundAttribute));
  11793. - isFirstSpan = false;
  11794. -
  11795. - return span;
  11796. - });
  11797. + result.RewrittenAttribute = rewritten;
  11798. return result;
  11799. }
  11800. - private static Block ConvertToMarkupAttributeBlock(
  11801. - Block block,
  11802. - Func<Block, Span, Span> createMarkupAttribute)
  11803. + private static MarkupTagHelperAttributeValueSyntax RewriteAttributeValue(TryParseResult result, RazorBlockSyntax attributeValue)
  11804. {
  11805. - var blockBuilder = new BlockBuilder
  11806. + var rewriter = new AttributeValueRewriter(result);
  11807. + var rewrittenValue = attributeValue;
  11808. + if (result.IsBoundAttribute)
  11809. {
  11810. - ChunkGenerator = block.ChunkGenerator,
  11811. - Type = block.Type
  11812. - };
  11813. -
  11814. - foreach (var child in block.Children)
  11815. - {
  11816. - SyntaxTreeNode markupAttributeChild;
  11817. -
  11818. - if (child.IsBlock)
  11819. - {
  11820. - markupAttributeChild = ConvertToMarkupAttributeBlock((Block)child, createMarkupAttribute);
  11821. - }
  11822. - else
  11823. - {
  11824. - markupAttributeChild = createMarkupAttribute(block, (Span)child);
  11825. - }
  11826. -
  11827. - blockBuilder.Children.Add(markupAttributeChild);
  11828. + // If the attribute was requested by a tag helper but the corresponding property was not a
  11829. + // string, then treat its value as code. A non-string value can be any C# value so we need
  11830. + // to ensure the tree reflects that.
  11831. + rewrittenValue = (RazorBlockSyntax)rewriter.Visit(attributeValue);
  11832. }
  11833. - return blockBuilder.Build();
  11834. - }
  11835. -
  11836. - private static Block RebuildChunkGenerators(Block block, bool isBound)
  11837. - {
  11838. - var builder = new BlockBuilder(block);
  11839. -
  11840. - // Don't want to rebuild unbound dynamic attributes. They need to run through the conditional attribute
  11841. - // removal system at runtime. A conditional attribute at the parse tree rewriting level is defined by
  11842. - // having at least 1 child with a DynamicAttributeBlockChunkGenerator.
  11843. - if (!isBound &&
  11844. - block.Children.Any(
  11845. - child => child.IsBlock &&
  11846. - ((Block)child).ChunkGenerator is DynamicAttributeBlockChunkGenerator))
  11847. - {
  11848. - // The parent chunk generator must be removed because it's normally responsible for conditionally
  11849. - // generating the attribute prefix (class=") and suffix ("). The prefix and suffix concepts aren't
  11850. - // applicable for the TagHelper use case since the attributes are put into a dictionary like object as
  11851. - // name value pairs.
  11852. - builder.ChunkGenerator = ParentChunkGenerator.Null;
  11853. -
  11854. - return builder.Build();
  11855. - }
  11856. -
  11857. - var isDynamic = builder.ChunkGenerator is DynamicAttributeBlockChunkGenerator;
  11858. -
  11859. - // We don't want any attribute specific logic here, null out the block chunk generator.
  11860. - if (isDynamic || builder.ChunkGenerator is AttributeBlockChunkGenerator)
  11861. - {
  11862. - builder.ChunkGenerator = ParentChunkGenerator.Null;
  11863. - }
  11864. -
  11865. - for (var i = 0; i < builder.Children.Count; i++)
  11866. - {
  11867. - var child = builder.Children[i];
  11868. -
  11869. - if (child.IsBlock)
  11870. - {
  11871. - // The child is a block, recurse down into the block to rebuild its children
  11872. - builder.Children[i] = RebuildChunkGenerators((Block)child, isBound);
  11873. - }
  11874. - else
  11875. - {
  11876. - var childSpan = (Span)child;
  11877. - ISpanChunkGenerator newChunkGenerator = null;
  11878. - var literalGenerator = childSpan.ChunkGenerator as LiteralAttributeChunkGenerator;
  11879. -
  11880. - if (literalGenerator != null)
  11881. - {
  11882. - newChunkGenerator = new MarkupChunkGenerator();
  11883. - }
  11884. - else if (isDynamic && childSpan.ChunkGenerator == SpanChunkGenerator.Null)
  11885. - {
  11886. - // Usually the dynamic chunk generator handles creating the null chunk generators underneath
  11887. - // it. This doesn't make sense in terms of tag helpers though, we need to change null code
  11888. - // generators to markup chunk generators.
  11889. -
  11890. - newChunkGenerator = new MarkupChunkGenerator();
  11891. - }
  11892. -
  11893. - // If we have a new chunk generator we'll need to re-build the child
  11894. - if (newChunkGenerator != null)
  11895. - {
  11896. - var childSpanBuilder = new SpanBuilder(childSpan)
  11897. - {
  11898. - ChunkGenerator = newChunkGenerator
  11899. - };
  11900. -
  11901. - builder.Children[i] = childSpanBuilder.Build();
  11902. - }
  11903. - }
  11904. - }
  11905. -
  11906. - return builder.Build();
  11907. - }
  11908. -
  11909. - private static SourceSpan GetAttributeNameLocation(SyntaxTreeNode node, string attributeName)
  11910. - {
  11911. - Span span;
  11912. - var nodeStart = SourceLocation.Undefined;
  11913. -
  11914. - if (node.IsBlock)
  11915. - {
  11916. - span = ((Block)node).FindFirstDescendentSpan();
  11917. - nodeStart = span.Parent.Start;
  11918. - }
  11919. - else
  11920. - {
  11921. - span = (Span)node;
  11922. - nodeStart = span.Start;
  11923. - }
  11924. -
  11925. - // Span should never be null here, this should only ever be called if an attribute was successfully parsed.
  11926. - Debug.Assert(span != null);
  11927. -
  11928. - // Attributes must have at least one non-whitespace character to represent the tagName (even if its a C#
  11929. - // expression).
  11930. - var firstNonWhitespaceToken = span
  11931. - .Tokens
  11932. - .First(token => token.Kind != SyntaxKind.Whitespace && token.Kind != SyntaxKind.NewLine);
  11933. -
  11934. - var location = new SourceSpan(firstNonWhitespaceToken.Start, attributeName.Length);
  11935. - return location;
  11936. - }
  11937. -
  11938. - private static Span CreateMarkupAttribute(SpanBuilder builder, TryParseResult result)
  11939. - {
  11940. - Debug.Assert(builder != null);
  11941. -
  11942. - // If the attribute was requested by a tag helper but the corresponding property was not a string,
  11943. - // then treat its value as code. A non-string value can be any C# value so we need to ensure the
  11944. - // SyntaxTreeNode reflects that.
  11945. - if (result.IsBoundNonStringAttribute)
  11946. - {
  11947. - ConfigureNonStringAttribute(builder, result.IsDuplicateAttribute);
  11948. - }
  11949. -
  11950. - return builder.Build();
  11951. - }
  11952. -
  11953. - private static bool IsNullOrWhitespaceAttributeValue(SyntaxTreeNode attributeValue)
  11954. - {
  11955. - if (attributeValue.IsBlock)
  11956. - {
  11957. - foreach (var span in ((Block)attributeValue).Flatten())
  11958. - {
  11959. - if (!string.IsNullOrWhiteSpace(span.Content))
  11960. - {
  11961. - return false;
  11962. - }
  11963. - }
  11964. -
  11965. - return true;
  11966. - }
  11967. - else
  11968. - {
  11969. - return string.IsNullOrWhiteSpace(((Span)attributeValue).Content);
  11970. - }
  11971. + return SyntaxFactory.MarkupTagHelperAttributeValue(rewrittenValue.Children);
  11972. }
  11973. // Determines the full name of the Type of the property corresponding to an attribute with the given name.
  11974. @@ -715,31 +349,281 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  11975. return firstBoundAttribute;
  11976. }
  11977. - private static bool IsQuote(SyntaxToken token)
  11978. + private static string GetAttributeValueContent(RazorSyntaxNode attributeBlock)
  11979. {
  11980. - return token.Kind == SyntaxKind.DoubleQuote ||
  11981. - token.Kind == SyntaxKind.SingleQuote;
  11982. + if (attributeBlock is MarkupTagHelperAttributeSyntax tagHelperAttribute)
  11983. + {
  11984. + return tagHelperAttribute.Value?.GetContent();
  11985. + }
  11986. + else if (attributeBlock is MarkupAttributeBlockSyntax attribute)
  11987. + {
  11988. + return attribute.Value?.GetContent();
  11989. + }
  11990. +
  11991. + return null;
  11992. }
  11993. - private static void ConfigureNonStringAttribute(SpanBuilder builder, bool isDuplicateAttribute)
  11994. + private class AttributeValueRewriter : SyntaxRewriter
  11995. {
  11996. - builder.Kind = SpanKindInternal.Code;
  11997. - builder.EditHandler = new ImplicitExpressionEditHandler(
  11998. - builder.EditHandler.Tokenizer,
  11999. - CSharpCodeParser.DefaultKeywords,
  12000. - acceptTrailingDot: true)
  12001. + private readonly TryParseResult _tryParseResult;
  12002. + private bool _rewriteAsMarkup = false;
  12003. +
  12004. + public AttributeValueRewriter(TryParseResult result)
  12005. {
  12006. - AcceptedCharacters = AcceptedCharactersInternal.AnyExceptNewline
  12007. - };
  12008. + _tryParseResult = result;
  12009. + }
  12010. +
  12011. + public override SyntaxNode VisitCSharpTransition(CSharpTransitionSyntax node)
  12012. + {
  12013. + if (!_tryParseResult.IsBoundNonStringAttribute)
  12014. + {
  12015. + return base.VisitCSharpTransition(node);
  12016. + }
  12017. +
  12018. + // For bound non-string attributes, we'll only allow a transition span to appear at the very
  12019. + // beginning of the attribute expression. All later transitions would appear as code so that
  12020. + // they are part of the generated output. E.g.
  12021. + // key="@value" -> MyTagHelper.key = value
  12022. + // key=" @value" -> MyTagHelper.key = @value
  12023. + // key="1 + @case" -> MyTagHelper.key = 1 + @case
  12024. + // key="@int + @case" -> MyTagHelper.key = int + @case
  12025. + // key="@(a + b) -> MyTagHelper.key = a + b
  12026. + // key="4 + @(a + b)" -> MyTagHelper.key = 4 + @(a + b)
  12027. + if (_rewriteAsMarkup)
  12028. + {
  12029. + // Change to a MarkupChunkGenerator so that the '@' \ parenthesis is generated as part of the output.
  12030. + var context = node.GetSpanContext();
  12031. + var newContext = new SpanContext(new MarkupChunkGenerator(), context.EditHandler);
  12032. +
  12033. + var expression = SyntaxFactory.CSharpExpressionLiteral(new SyntaxList<SyntaxToken>(node.Transition)).WithSpanContext(newContext);
  12034. +
  12035. + return base.VisitCSharpExpressionLiteral(expression);
  12036. + }
  12037. +
  12038. + _rewriteAsMarkup = true;
  12039. + return base.VisitCSharpTransition(node);
  12040. + }
  12041. - if (!isDuplicateAttribute && builder.ChunkGenerator != SpanChunkGenerator.Null)
  12042. + public override SyntaxNode VisitCSharpImplicitExpression(CSharpImplicitExpressionSyntax node)
  12043. {
  12044. - // We want to mark the value of non-string bound attributes to be CSharp.
  12045. - // Except in two cases,
  12046. - // 1. Cases when we don't want to render the span. Eg: Transition span '@'.
  12047. - // 2. Cases when it is a duplicate of a bound attribute. This should just be rendered as html.
  12048. + if (_rewriteAsMarkup)
  12049. + {
  12050. + var builder = SyntaxListBuilder<RazorSyntaxNode>.Create();
  12051. +
  12052. + // Convert transition.
  12053. + // Change to a MarkupChunkGenerator so that the '@' \ parenthesis is generated as part of the output.
  12054. + var context = node.GetSpanContext();
  12055. + var newContext = new SpanContext(new MarkupChunkGenerator(), context?.EditHandler ?? SpanEditHandler.CreateDefault((content) => Enumerable.Empty<Syntax.InternalSyntax.SyntaxToken>()));
  12056. +
  12057. + var expression = SyntaxFactory.CSharpExpressionLiteral(new SyntaxList<SyntaxToken>(node.Transition.Transition)).WithSpanContext(newContext);
  12058. + expression = (CSharpExpressionLiteralSyntax)VisitCSharpExpressionLiteral(expression);
  12059. + builder.Add(expression);
  12060. +
  12061. + var rewrittenBody = (CSharpCodeBlockSyntax)VisitCSharpCodeBlock(((CSharpImplicitExpressionBodySyntax)node.Body).CSharpCode);
  12062. + builder.AddRange(rewrittenBody.Children);
  12063. +
  12064. + // Since the original transition is part of the body, we need something to take it's place.
  12065. + var transition = SyntaxFactory.CSharpTransition(SyntaxFactory.MissingToken(SyntaxKind.Transition));
  12066. +
  12067. + var rewrittenCodeBlock = SyntaxFactory.CSharpCodeBlock(builder.ToList());
  12068. + return SyntaxFactory.CSharpImplicitExpression(transition, SyntaxFactory.CSharpImplicitExpressionBody(rewrittenCodeBlock));
  12069. + }
  12070. +
  12071. + return base.VisitCSharpImplicitExpression(node);
  12072. + }
  12073. +
  12074. + public override SyntaxNode VisitCSharpExplicitExpression(CSharpExplicitExpressionSyntax node)
  12075. + {
  12076. + CSharpTransitionSyntax transition = null;
  12077. + var builder = SyntaxListBuilder<RazorSyntaxNode>.Create();
  12078. + if (_rewriteAsMarkup)
  12079. + {
  12080. + // Convert transition.
  12081. + // Change to a MarkupChunkGenerator so that the '@' \ parenthesis is generated as part of the output.
  12082. + var context = node.GetSpanContext();
  12083. + var newContext = new SpanContext(new MarkupChunkGenerator(), context?.EditHandler ?? SpanEditHandler.CreateDefault((content) => Enumerable.Empty<Syntax.InternalSyntax.SyntaxToken>()));
  12084. +
  12085. + var expression = SyntaxFactory.CSharpExpressionLiteral(new SyntaxList<SyntaxToken>(node.Transition.Transition)).WithSpanContext(newContext);
  12086. + expression = (CSharpExpressionLiteralSyntax)VisitCSharpExpressionLiteral(expression);
  12087. + builder.Add(expression);
  12088. +
  12089. + // Since the original transition is part of the body, we need something to take it's place.
  12090. + transition = SyntaxFactory.CSharpTransition(SyntaxFactory.MissingToken(SyntaxKind.Transition));
  12091. +
  12092. + var body = (CSharpExplicitExpressionBodySyntax)node.Body;
  12093. + var rewrittenOpenParen = (RazorSyntaxNode)VisitRazorMetaCode(body.OpenParen);
  12094. + var rewrittenBody = (CSharpCodeBlockSyntax)VisitCSharpCodeBlock(body.CSharpCode);
  12095. + var rewrittenCloseParen = (RazorSyntaxNode)VisitRazorMetaCode(body.CloseParen);
  12096. + builder.Add(rewrittenOpenParen);
  12097. + builder.AddRange(rewrittenBody.Children);
  12098. + builder.Add(rewrittenCloseParen);
  12099. + }
  12100. + else
  12101. + {
  12102. + // This is the first expression of a non-string attribute like attr=@(a + b)
  12103. + // Below code converts this to an implicit expression to make the parens
  12104. + // part of the expression so that it is rendered.
  12105. + transition = (CSharpTransitionSyntax)Visit(node.Transition);
  12106. + var body = (CSharpExplicitExpressionBodySyntax)node.Body;
  12107. + var rewrittenOpenParen = (RazorSyntaxNode)VisitRazorMetaCode(body.OpenParen);
  12108. + var rewrittenBody = (CSharpCodeBlockSyntax)VisitCSharpCodeBlock(body.CSharpCode);
  12109. + var rewrittenCloseParen = (RazorSyntaxNode)VisitRazorMetaCode(body.CloseParen);
  12110. + builder.Add(rewrittenOpenParen);
  12111. + builder.AddRange(rewrittenBody.Children);
  12112. + builder.Add(rewrittenCloseParen);
  12113. + }
  12114. +
  12115. + var rewrittenCodeBlock = SyntaxFactory.CSharpCodeBlock(builder.ToList());
  12116. + return SyntaxFactory.CSharpImplicitExpression(transition, SyntaxFactory.CSharpImplicitExpressionBody(rewrittenCodeBlock));
  12117. + }
  12118. +
  12119. + public override SyntaxNode VisitRazorMetaCode(RazorMetaCodeSyntax node)
  12120. + {
  12121. + if (!_tryParseResult.IsBoundNonStringAttribute)
  12122. + {
  12123. + return base.VisitRazorMetaCode(node);
  12124. + }
  12125. +
  12126. + if (_rewriteAsMarkup)
  12127. + {
  12128. + // Change to a MarkupChunkGenerator so that the '@' \ parenthesis is generated as part of the output.
  12129. + var context = node.GetSpanContext();
  12130. + var newContext = new SpanContext(new MarkupChunkGenerator(), context.EditHandler);
  12131. +
  12132. + var expression = SyntaxFactory.CSharpExpressionLiteral(new SyntaxList<SyntaxToken>(node.MetaCode)).WithSpanContext(newContext);
  12133. +
  12134. + return VisitCSharpExpressionLiteral(expression);
  12135. + }
  12136. +
  12137. + _rewriteAsMarkup = true;
  12138. + return base.VisitRazorMetaCode(node);
  12139. + }
  12140. +
  12141. + public override SyntaxNode VisitCSharpExpressionLiteral(CSharpExpressionLiteralSyntax node)
  12142. + {
  12143. + if (!_tryParseResult.IsBoundNonStringAttribute)
  12144. + {
  12145. + return base.VisitCSharpExpressionLiteral(node);
  12146. + }
  12147. +
  12148. + node = (CSharpExpressionLiteralSyntax)ConfigureNonStringAttribute(node);
  12149. +
  12150. + _rewriteAsMarkup = true;
  12151. + return base.VisitCSharpExpressionLiteral(node);
  12152. + }
  12153. +
  12154. + public override SyntaxNode VisitMarkupLiteralAttributeValue(MarkupLiteralAttributeValueSyntax node)
  12155. + {
  12156. + var builder = SyntaxListBuilder<SyntaxToken>.Create();
  12157. + if (node.Prefix != null)
  12158. + {
  12159. + builder.AddRange(node.Prefix.LiteralTokens);
  12160. + }
  12161. + if (node.Value != null)
  12162. + {
  12163. + builder.AddRange(node.Value.LiteralTokens);
  12164. + }
  12165. +
  12166. + if (_tryParseResult.IsBoundNonStringAttribute)
  12167. + {
  12168. + _rewriteAsMarkup = true;
  12169. + // Since this is a bound non-string attribute, we want to convert LiteralAttributeValue to just be a CSharp Expression literal.
  12170. + var expression = SyntaxFactory.CSharpExpressionLiteral(builder.ToList());
  12171. + return VisitCSharpExpressionLiteral(expression);
  12172. + }
  12173. + else
  12174. + {
  12175. + var literal = SyntaxFactory.MarkupTextLiteral(builder.ToList());
  12176. + var context = node.Value?.GetSpanContext();
  12177. + literal = context != null ? literal.WithSpanContext(context) : literal;
  12178. +
  12179. + return Visit(literal);
  12180. + }
  12181. + }
  12182. +
  12183. + public override SyntaxNode VisitMarkupDynamicAttributeValue(MarkupDynamicAttributeValueSyntax node)
  12184. + {
  12185. + // Move the prefix to be part of the actual value.
  12186. + var builder = SyntaxListBuilder<RazorSyntaxNode>.Create();
  12187. + if (node.Prefix != null)
  12188. + {
  12189. + builder.Add(node.Prefix);
  12190. + }
  12191. + if (node.Value?.Children != null)
  12192. + {
  12193. + builder.AddRange(node.Value.Children);
  12194. + }
  12195. + var rewrittenValue = SyntaxFactory.MarkupBlock(builder.ToList());
  12196. +
  12197. + return base.VisitMarkupBlock(rewrittenValue);
  12198. + }
  12199. +
  12200. + public override SyntaxNode VisitCSharpStatementLiteral(CSharpStatementLiteralSyntax node)
  12201. + {
  12202. + if (!_tryParseResult.IsBoundNonStringAttribute)
  12203. + {
  12204. + return base.VisitCSharpStatementLiteral(node);
  12205. + }
  12206. +
  12207. + _rewriteAsMarkup = true;
  12208. + return base.VisitCSharpStatementLiteral(node);
  12209. + }
  12210. +
  12211. + public override SyntaxNode VisitMarkupTextLiteral(MarkupTextLiteralSyntax node)
  12212. + {
  12213. + if (!_tryParseResult.IsBoundNonStringAttribute)
  12214. + {
  12215. + return base.VisitMarkupTextLiteral(node);
  12216. + }
  12217. +
  12218. + _rewriteAsMarkup = true;
  12219. + node = (MarkupTextLiteralSyntax)ConfigureNonStringAttribute(node);
  12220. + var tokens = new SyntaxList<SyntaxToken>(node.LiteralTokens);
  12221. + var value = SyntaxFactory.CSharpExpressionLiteral(tokens);
  12222. + return value.WithSpanContext(node.GetSpanContext());
  12223. + }
  12224. +
  12225. + public override SyntaxNode VisitMarkupEphemeralTextLiteral(MarkupEphemeralTextLiteralSyntax node)
  12226. + {
  12227. + if (!_tryParseResult.IsBoundNonStringAttribute)
  12228. + {
  12229. + return base.VisitMarkupEphemeralTextLiteral(node);
  12230. + }
  12231. +
  12232. + // Since this is a non-string attribute we need to rewrite this as code.
  12233. + // Rewriting it to CSharpEphemeralTextLiteral so that it is not rendered to output.
  12234. + _rewriteAsMarkup = true;
  12235. + node = (MarkupEphemeralTextLiteralSyntax)ConfigureNonStringAttribute(node);
  12236. + var tokens = new SyntaxList<SyntaxToken>(node.LiteralTokens);
  12237. + var value = SyntaxFactory.CSharpEphemeralTextLiteral(tokens);
  12238. + return value.WithSpanContext(node.GetSpanContext());
  12239. + }
  12240. +
  12241. + private SyntaxNode ConfigureNonStringAttribute(SyntaxNode node)
  12242. + {
  12243. + var context = node.GetSpanContext();
  12244. + var builder = context != null ? new SpanContextBuilder(context) : new SpanContextBuilder();
  12245. + builder.EditHandler = new ImplicitExpressionEditHandler(
  12246. + builder.EditHandler.Tokenizer,
  12247. + CSharpCodeParser.DefaultKeywords,
  12248. + acceptTrailingDot: true)
  12249. + {
  12250. + AcceptedCharacters = AcceptedCharactersInternal.AnyExceptNewline
  12251. + };
  12252. +
  12253. + if (!_tryParseResult.IsDuplicateAttribute && builder.ChunkGenerator != SpanChunkGenerator.Null)
  12254. + {
  12255. + // We want to mark the value of non-string bound attributes to be CSharp.
  12256. + // Except in two cases,
  12257. + // 1. Cases when we don't want to render the span. Eg: Transition span '@'.
  12258. + // 2. Cases when it is a duplicate of a bound attribute. This should just be rendered as html.
  12259. +
  12260. + builder.ChunkGenerator = new ExpressionChunkGenerator();
  12261. + }
  12262. +
  12263. + context = builder.Build();
  12264. - builder.ChunkGenerator = new ExpressionChunkGenerator();
  12265. + return node.WithSpanContext(context);
  12266. }
  12267. }
  12268. @@ -747,7 +631,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  12269. {
  12270. public string AttributeName { get; set; }
  12271. - public SyntaxTreeNode AttributeValueNode { get; set; }
  12272. + public RazorSyntaxNode RewrittenAttribute { get; set; }
  12273. public AttributeStructure AttributeStructure { get; set; }
  12274. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperChunkGenerator.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperChunkGenerator.cs
  12275. deleted file mode 100644
  12276. index 8f278edb2c7..00000000000
  12277. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperChunkGenerator.cs
  12278. +++ /dev/null
  12279. @@ -1,82 +0,0 @@
  12280. -// Copyright (c) .NET Foundation. All rights reserved.
  12281. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  12282. -
  12283. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  12284. -{
  12285. - internal class TagHelperChunkGenerator : ParentChunkGenerator
  12286. - {
  12287. - public override void GenerateStartParentChunk(Block target, ChunkGeneratorContext context)
  12288. - {
  12289. - //var tagHelperBlock = target as TagHelperBlock;
  12290. -
  12291. - //Debug.Assert(
  12292. - // tagHelperBlock != null,
  12293. - // $"A {nameof(TagHelperChunkGenerator)} must only be used with {nameof(TagHelperBlock)}s.");
  12294. -
  12295. - //var attributes = new List<TagHelperAttributeTracker>();
  12296. -
  12297. - //// We need to create a chunk generator to create chunks for each of the attributes.
  12298. - //var chunkGenerator = context.Host.CreateChunkGenerator(
  12299. - // context.ClassName,
  12300. - // context.RootNamespace,
  12301. - // context.SourceFile);
  12302. -
  12303. - //foreach (var attribute in tagHelperBlock.Attributes)
  12304. - //{
  12305. - // ParentChunk attributeChunkValue = null;
  12306. -
  12307. - // if (attribute.Value != null)
  12308. - // {
  12309. - // // Populates the chunk tree with chunks associated with attributes
  12310. - // attribute.Value.Accept(chunkGenerator);
  12311. -
  12312. - // var chunks = chunkGenerator.Context.ChunkTreeBuilder.Root.Children;
  12313. - // var first = chunks.FirstOrDefault();
  12314. -
  12315. - // attributeChunkValue = new ParentChunk
  12316. - // {
  12317. - // Association = first?.Association,
  12318. - // Children = chunks,
  12319. - // Start = first == null ? SourceLocation.Zero : first.Start
  12320. - // };
  12321. - // }
  12322. -
  12323. - // var attributeChunk = new TagHelperAttributeTracker(
  12324. - // attribute.Name,
  12325. - // attributeChunkValue,
  12326. - // attribute.ValueStyle);
  12327. -
  12328. - // attributes.Add(attributeChunk);
  12329. -
  12330. - // // Reset the chunk tree builder so we can build a new one for the next attribute
  12331. - // chunkGenerator.Context.ChunkTreeBuilder = new ChunkTreeBuilder();
  12332. - //}
  12333. -
  12334. - //var unprefixedTagName = tagHelperBlock.TagName.Substring(_tagHelperDescriptors.First().Prefix.Length);
  12335. -
  12336. - //context.ChunkTreeBuilder.StartParentChunk(
  12337. - // new TagHelperChunk(
  12338. - // unprefixedTagName,
  12339. - // tagHelperBlock.TagMode,
  12340. - // attributes,
  12341. - // _tagHelperDescriptors),
  12342. - // target,
  12343. - // topLevel: false);
  12344. - }
  12345. -
  12346. - public override void GenerateEndParentChunk(Block target, ChunkGeneratorContext context)
  12347. - {
  12348. - //context.ChunkTreeBuilder.EndParentChunk();
  12349. - }
  12350. -
  12351. - public override void Accept(ParserVisitor visitor, Block block)
  12352. - {
  12353. - visitor.VisitTagHelperBlock(this, block);
  12354. - }
  12355. -
  12356. - public override string ToString()
  12357. - {
  12358. - return "TagHelper";
  12359. - }
  12360. - }
  12361. -}
  12362. \ No newline at end of file
  12363. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperParseTreeRewriter.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperParseTreeRewriter.cs
  12364. index 9264d8e5ec6..18b1cf5c4de 100644
  12365. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperParseTreeRewriter.cs
  12366. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperParseTreeRewriter.cs
  12367. @@ -1,4 +1,4 @@
  12368. -// Copyright (c) .NET Foundation. All rights reserved.
  12369. +// Copyright (c) .NET Foundation. All rights reserved.
  12370. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  12371. using System;
  12372. @@ -12,189 +12,233 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  12373. {
  12374. internal class TagHelperParseTreeRewriter
  12375. {
  12376. - // Internal for testing.
  12377. - // Null characters are invalid markup for HTML attribute values.
  12378. - internal static readonly string InvalidAttributeValueMarker = "\0";
  12379. -
  12380. - // From http://dev.w3.org/html5/spec/Overview.html#elements-0
  12381. - private static readonly HashSet<string> VoidElements = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
  12382. - {
  12383. - "area",
  12384. - "base",
  12385. - "br",
  12386. - "col",
  12387. - "command",
  12388. - "embed",
  12389. - "hr",
  12390. - "img",
  12391. - "input",
  12392. - "keygen",
  12393. - "link",
  12394. - "meta",
  12395. - "param",
  12396. - "source",
  12397. - "track",
  12398. - "wbr"
  12399. - };
  12400. -
  12401. - private readonly string _tagHelperPrefix;
  12402. - private readonly List<KeyValuePair<string, string>> _htmlAttributeTracker;
  12403. - private readonly StringBuilder _attributeValueBuilder;
  12404. - private readonly TagHelperBinder _tagHelperBinder;
  12405. - private readonly Stack<TagBlockTracker> _trackerStack;
  12406. - private readonly Stack<BlockBuilder> _blockStack;
  12407. - private TagHelperBlockTracker _currentTagHelperTracker;
  12408. - private BlockBuilder _currentBlock;
  12409. - private RazorParserFeatureFlags _featureFlags;
  12410. -
  12411. - public TagHelperParseTreeRewriter(
  12412. - string tagHelperPrefix,
  12413. - IEnumerable<TagHelperDescriptor> descriptors,
  12414. - RazorParserFeatureFlags featureFlags)
  12415. + public static RazorSyntaxTree Rewrite(RazorSyntaxTree syntaxTree, string tagHelperPrefix, IEnumerable<TagHelperDescriptor> descriptors)
  12416. {
  12417. - _tagHelperPrefix = tagHelperPrefix;
  12418. - _tagHelperBinder = new TagHelperBinder(tagHelperPrefix, descriptors);
  12419. - _trackerStack = new Stack<TagBlockTracker>();
  12420. - _blockStack = new Stack<BlockBuilder>();
  12421. - _attributeValueBuilder = new StringBuilder();
  12422. - _htmlAttributeTracker = new List<KeyValuePair<string, string>>();
  12423. - _featureFlags = featureFlags;
  12424. - }
  12425. + var errorSink = new ErrorSink();
  12426. + syntaxTree = MarkupElementRewriter.AddMarkupElements(syntaxTree);
  12427. - private TagBlockTracker CurrentTracker => _trackerStack.Count > 0 ? _trackerStack.Peek() : null;
  12428. + var rewriter = new Rewriter(
  12429. + syntaxTree.Source,
  12430. + tagHelperPrefix,
  12431. + descriptors,
  12432. + syntaxTree.Options.FeatureFlags,
  12433. + errorSink);
  12434. - private string CurrentParentTagName => CurrentTracker?.TagName;
  12435. + var rewritten = rewriter.Visit(syntaxTree.Root);
  12436. - private bool CurrentParentIsTagHelper => CurrentTracker?.IsTagHelper ?? false;
  12437. + var errorList = new List<RazorDiagnostic>();
  12438. + errorList.AddRange(errorSink.Errors);
  12439. + errorList.AddRange(descriptors.SelectMany(d => d.GetAllDiagnostics()));
  12440. - public Block Rewrite(Block syntaxTree, ErrorSink errorSink)
  12441. - {
  12442. - RewriteTags(syntaxTree, errorSink, depth: 0);
  12443. + var diagnostics = CombineErrors(syntaxTree.Diagnostics, errorList).OrderBy(error => error.Span.AbsoluteIndex);
  12444. - var rewritten = _currentBlock.Build();
  12445. + var newSyntaxTree = RazorSyntaxTree.Create(rewritten, syntaxTree.Source, diagnostics, syntaxTree.Options);
  12446. + newSyntaxTree = MarkupElementRewriter.RemoveMarkupElements(newSyntaxTree);
  12447. - return rewritten;
  12448. + return newSyntaxTree;
  12449. }
  12450. - private void RewriteTags(Block input, ErrorSink errorSink, int depth)
  12451. + private static IReadOnlyList<RazorDiagnostic> CombineErrors(IReadOnlyList<RazorDiagnostic> errors1, IReadOnlyList<RazorDiagnostic> errors2)
  12452. {
  12453. - // We want to start a new block without the children from existing (we rebuild them).
  12454. - TrackBlock(new BlockBuilder
  12455. - {
  12456. - Type = input.Type,
  12457. - ChunkGenerator = input.ChunkGenerator
  12458. - });
  12459. + var combinedErrors = new List<RazorDiagnostic>(errors1.Count + errors2.Count);
  12460. + combinedErrors.AddRange(errors1);
  12461. + combinedErrors.AddRange(errors2);
  12462. - var activeTrackers = _trackerStack.Count;
  12463. + return combinedErrors;
  12464. + }
  12465. - foreach (var child in input.Children)
  12466. + // Internal for testing.
  12467. + internal class Rewriter : SyntaxRewriter
  12468. + {
  12469. + // Internal for testing.
  12470. + // Null characters are invalid markup for HTML attribute values.
  12471. + internal static readonly string InvalidAttributeValueMarker = "\0";
  12472. +
  12473. + private readonly RazorSourceDocument _source;
  12474. + private readonly string _tagHelperPrefix;
  12475. + private readonly List<KeyValuePair<string, string>> _htmlAttributeTracker;
  12476. + private readonly StringBuilder _attributeValueBuilder;
  12477. + private readonly TagHelperBinder _tagHelperBinder;
  12478. + private readonly Stack<TagTracker> _trackerStack;
  12479. + private readonly ErrorSink _errorSink;
  12480. + private RazorParserFeatureFlags _featureFlags;
  12481. +
  12482. + public Rewriter(
  12483. + RazorSourceDocument source,
  12484. + string tagHelperPrefix,
  12485. + IEnumerable<TagHelperDescriptor> descriptors,
  12486. + RazorParserFeatureFlags featureFlags,
  12487. + ErrorSink errorSink)
  12488. + {
  12489. + _source = source;
  12490. + _tagHelperPrefix = tagHelperPrefix;
  12491. + _tagHelperBinder = new TagHelperBinder(tagHelperPrefix, descriptors);
  12492. + _trackerStack = new Stack<TagTracker>();
  12493. + _attributeValueBuilder = new StringBuilder();
  12494. + _htmlAttributeTracker = new List<KeyValuePair<string, string>>();
  12495. + _featureFlags = featureFlags;
  12496. + _errorSink = errorSink;
  12497. + }
  12498. +
  12499. + private TagTracker CurrentTracker => _trackerStack.Count > 0 ? _trackerStack.Peek() : null;
  12500. +
  12501. + private string CurrentParentTagName => CurrentTracker?.TagName;
  12502. +
  12503. + private bool CurrentParentIsTagHelper => CurrentTracker?.IsTagHelper ?? false;
  12504. +
  12505. + private TagHelperTracker CurrentTagHelperTracker => _trackerStack.FirstOrDefault(t => t.IsTagHelper) as TagHelperTracker;
  12506. +
  12507. + public override SyntaxNode VisitMarkupElement(MarkupElementSyntax node)
  12508. {
  12509. - if (child.IsBlock)
  12510. + if (IsPartOfStartTag(node))
  12511. {
  12512. - var childBlock = (Block)child;
  12513. + // If this element is inside a start tag, it is some sort of malformed case like
  12514. + // <p @do { someattribute=\"btn\"></p>, where the end "p" tag is inside the start "p" tag.
  12515. + // We don't want to do tag helper parsing for this tag.
  12516. + return base.VisitMarkupElement(node);
  12517. + }
  12518. - if (childBlock.Type == BlockKindInternal.Tag)
  12519. + MarkupTagHelperStartTagSyntax tagHelperStart = null;
  12520. + MarkupTagHelperEndTagSyntax tagHelperEnd = null;
  12521. + TagHelperInfo tagHelperInfo = null;
  12522. +
  12523. + // Visit the start tag.
  12524. + var startTag = (MarkupTagBlockSyntax)Visit(node.StartTag);
  12525. + if (startTag != null)
  12526. + {
  12527. + var tagName = startTag.GetTagName();
  12528. + if (TryRewriteTagHelperStart(startTag, out tagHelperStart, out tagHelperInfo))
  12529. {
  12530. - if (TryRewriteTagHelper(childBlock, errorSink))
  12531. + // This is a tag helper.
  12532. + if (tagHelperInfo.TagMode == TagMode.SelfClosing || tagHelperInfo.TagMode == TagMode.StartTagOnly)
  12533. {
  12534. - continue;
  12535. + var tagHelperElement = SyntaxFactory.MarkupTagHelperElement(tagHelperStart, body: new SyntaxList<RazorSyntaxNode>(), endTag: null);
  12536. + var rewrittenTagHelper = tagHelperElement.WithTagHelperInfo(tagHelperInfo);
  12537. + if (node.Body.Count == 0)
  12538. + {
  12539. + return rewrittenTagHelper;
  12540. + }
  12541. +
  12542. + // This tag contains a body which needs to be moved to the parent.
  12543. + var rewrittenNodes = SyntaxListBuilder<RazorSyntaxNode>.Create();
  12544. + rewrittenNodes.Add(rewrittenTagHelper);
  12545. + var rewrittenBody = VisitList(node.Body);
  12546. + rewrittenNodes.AddRange(rewrittenBody);
  12547. +
  12548. + return SyntaxFactory.MarkupElement(startTag: null, body: rewrittenNodes.ToList(), endTag: null);
  12549. + }
  12550. + else if (node.EndTag == null)
  12551. + {
  12552. + // Start tag helper with no corresponding end tag.
  12553. + _errorSink.OnError(
  12554. + RazorDiagnosticFactory.CreateParsing_TagHelperFoundMalformedTagHelper(
  12555. + new SourceSpan(SourceLocationTracker.Advance(startTag.GetSourceLocation(_source), "<"), tagName.Length),
  12556. + tagName));
  12557. }
  12558. else
  12559. {
  12560. - // Non-TagHelper tag.
  12561. - ValidateParentAllowsPlainTag(childBlock, errorSink);
  12562. + // Tag helper start tag. Keep track.
  12563. + var tracker = new TagHelperTracker(_tagHelperPrefix, tagHelperInfo);
  12564. + _trackerStack.Push(tracker);
  12565. + }
  12566. + }
  12567. + else
  12568. + {
  12569. + // Non-TagHelper tag.
  12570. + ValidateParentAllowsPlainTag(startTag);
  12571. - TrackTagBlock(childBlock, depth);
  12572. + if (!startTag.IsSelfClosing() && !startTag.IsVoidElement())
  12573. + {
  12574. + var tracker = new TagTracker(tagName, isTagHelper: false);
  12575. + _trackerStack.Push(tracker);
  12576. }
  12577. + }
  12578. + }
  12579. - // If we get to here it means that we're a normal html tag. No need to iterate any deeper into
  12580. - // the children of it because they wont be tag helpers.
  12581. + // Visit body between start and end tags.
  12582. + var body = VisitList(node.Body);
  12583. +
  12584. + // Visit end tag.
  12585. + var endTag = (MarkupTagBlockSyntax)Visit(node.EndTag);
  12586. + if (endTag != null)
  12587. + {
  12588. + var tagName = endTag.GetTagName();
  12589. + if (TryRewriteTagHelperEnd(endTag, out tagHelperEnd))
  12590. + {
  12591. + // This is a tag helper
  12592. + if (startTag == null)
  12593. + {
  12594. + // The end tag helper has no corresponding start tag, create an error.
  12595. + _errorSink.OnError(
  12596. + RazorDiagnosticFactory.CreateParsing_TagHelperFoundMalformedTagHelper(
  12597. + new SourceSpan(SourceLocationTracker.Advance(endTag.GetSourceLocation(_source), "</"), tagName.Length), tagName));
  12598. + }
  12599. }
  12600. else
  12601. {
  12602. - // We're not an Html tag so iterate through children recursively.
  12603. - RewriteTags(childBlock, errorSink, depth + 1);
  12604. - continue;
  12605. + // Non tag helper end tag.
  12606. + if (startTag == null)
  12607. + {
  12608. + // Standalone end tag. We may need to error if it is not supposed to be here.
  12609. + // If there was a corresponding start tag, we would have already added this error.
  12610. + ValidateParentAllowsPlainTag(endTag);
  12611. + }
  12612. + else if (!endTag.IsVoidElement())
  12613. + {
  12614. + // Since a start tag exists, we must already be tracking it.
  12615. + // Pop the stack as we're done with the end tag.
  12616. + _trackerStack.Pop();
  12617. + }
  12618. }
  12619. }
  12620. - else
  12621. +
  12622. + if (tagHelperInfo != null)
  12623. {
  12624. - ValidateParentAllowsContent((Span)child, errorSink);
  12625. + // If we get here it means this element was rewritten as a tag helper.
  12626. + var tagHelperElement = SyntaxFactory.MarkupTagHelperElement(tagHelperStart, body, tagHelperEnd);
  12627. + return tagHelperElement.WithTagHelperInfo(tagHelperInfo);
  12628. }
  12629. - // At this point the child is a Span or Block with Type BlockType.Tag that doesn't happen to be a
  12630. - // tag helper.
  12631. -
  12632. - // Add the child to current block.
  12633. - _currentBlock.Children.Add(child);
  12634. - }
  12635. -
  12636. - // We captured the number of active tag helpers at the start of our logic, it should be the same. If not
  12637. - // it means that there are malformed tag helpers at the top of our stack.
  12638. - if (activeTrackers != _trackerStack.Count)
  12639. - {
  12640. - // Malformed tag helpers built here will be tag helpers that do not have end tags in the current block
  12641. - // scope. Block scopes are special cases in Razor such as @<p> would cause an error because there's no
  12642. - // matching end </p> tag in the template block scope and therefore doesn't make sense as a tag helper.
  12643. - BuildMalformedTagHelpers(_trackerStack.Count - activeTrackers, errorSink);
  12644. - }
  12645. -
  12646. - BuildCurrentlyTrackedBlock();
  12647. - }
  12648. -
  12649. - private void TrackTagBlock(Block childBlock, int depth)
  12650. - {
  12651. - var tagName = GetTagName(childBlock);
  12652. -
  12653. - // Don't want to track incomplete tags that have no tag name.
  12654. - if (string.IsNullOrWhiteSpace(tagName))
  12655. - {
  12656. - return;
  12657. + // There was no matching tag helper for this element. Return.
  12658. + return node.Update(startTag, body, endTag);
  12659. }
  12660. - if (IsEndTag(childBlock))
  12661. + public override SyntaxNode VisitMarkupTextLiteral(MarkupTextLiteralSyntax node)
  12662. {
  12663. - var parentTracker = _trackerStack.Count > 0 ? _trackerStack.Peek() : null;
  12664. - if (parentTracker != null &&
  12665. - !parentTracker.IsTagHelper &&
  12666. - depth == parentTracker.Depth &&
  12667. - string.Equals(parentTracker.TagName, tagName, StringComparison.OrdinalIgnoreCase))
  12668. + var tagParent = node.FirstAncestorOrSelf<SyntaxNode>(n => n is MarkupTagBlockSyntax);
  12669. + var isPartofTagBlock = tagParent != null;
  12670. + if (!isPartofTagBlock)
  12671. {
  12672. - PopTrackerStack();
  12673. + ValidateParentAllowsContent(node);
  12674. }
  12675. +
  12676. + return base.VisitMarkupTextLiteral(node);
  12677. }
  12678. - else if (!VoidElements.Contains(tagName) && !IsSelfClosing(childBlock))
  12679. +
  12680. + private bool TryRewriteTagHelperStart(MarkupTagBlockSyntax tagBlock, out MarkupTagHelperStartTagSyntax rewritten, out TagHelperInfo tagHelperInfo)
  12681. {
  12682. - // If it's not a void element and it's not self-closing then we need to create a tag
  12683. - // tracker for it.
  12684. - var tracker = new TagBlockTracker(tagName, isTagHelper: false, depth: depth);
  12685. - PushTrackerStack(tracker);
  12686. - }
  12687. - }
  12688. + rewritten = null;
  12689. + tagHelperInfo = null;
  12690. - private bool TryRewriteTagHelper(Block tagBlock, ErrorSink errorSink)
  12691. - {
  12692. - // Get tag name of the current block (doesn't matter if it's an end or start tag)
  12693. - var tagName = GetTagName(tagBlock);
  12694. + // Get tag name of the current block
  12695. + var tagName = tagBlock.GetTagName();
  12696. - // Could not determine tag name, it can't be a TagHelper, continue on and track the element.
  12697. - if (tagName == null)
  12698. - {
  12699. - return false;
  12700. - }
  12701. + // Could not determine tag name, it can't be a TagHelper, continue on and track the element.
  12702. + if (tagName == null)
  12703. + {
  12704. + return false;
  12705. + }
  12706. - TagHelperBinding tagHelperBinding;
  12707. + TagHelperBinding tagHelperBinding;
  12708. - if (!IsPotentialTagHelper(tagName, tagBlock))
  12709. - {
  12710. - return false;
  12711. - }
  12712. + if (!IsPotentialTagHelper(tagName, tagBlock))
  12713. + {
  12714. + return false;
  12715. + }
  12716. - var tracker = _currentTagHelperTracker;
  12717. - var tagNameScope = tracker?.TagName ?? string.Empty;
  12718. + var tracker = CurrentTagHelperTracker;
  12719. + var tagNameScope = tracker?.TagName ?? string.Empty;
  12720. - if (!IsEndTag(tagBlock))
  12721. - {
  12722. // We're now in a start tag block, we first need to see if the tag block is a tag helper.
  12723. var elementAttributes = GetAttributeNameValuePairs(tagBlock);
  12724. @@ -220,36 +264,45 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  12725. return false;
  12726. }
  12727. - ValidateParentAllowsTagHelper(tagName, tagBlock, errorSink);
  12728. - ValidateBinding(tagHelperBinding, tagName, tagBlock, errorSink);
  12729. + ValidateParentAllowsTagHelper(tagName, tagBlock);
  12730. + ValidateBinding(tagHelperBinding, tagName, tagBlock);
  12731. // We're in a start TagHelper block.
  12732. - var validTagStructure = ValidateTagSyntax(tagName, tagBlock, errorSink);
  12733. + var validTagStructure = ValidateTagSyntax(tagName, tagBlock);
  12734. - var builder = TagHelperBlockRewriter.Rewrite(
  12735. + var startTag = TagHelperBlockRewriter.Rewrite(
  12736. tagName,
  12737. validTagStructure,
  12738. _featureFlags,
  12739. tagBlock,
  12740. tagHelperBinding,
  12741. - errorSink);
  12742. + _errorSink,
  12743. + _source);
  12744. - // Track the original start tag so the editor knows where each piece of the TagHelperBlock lies
  12745. - // for formatting.
  12746. - builder.SourceStartTag = tagBlock;
  12747. + var tagMode = TagHelperBlockRewriter.GetTagMode(tagBlock, tagHelperBinding, _errorSink);
  12748. + tagHelperInfo = new TagHelperInfo(tagName, tagMode, tagHelperBinding);
  12749. + rewritten = startTag;
  12750. - // Found a new tag helper block
  12751. - TrackTagHelperBlock(builder);
  12752. + return true;
  12753. + }
  12754. - // If it's a non-content expecting block then we don't have to worry about nested children within the
  12755. - // tag. Complete it.
  12756. - if (builder.TagMode == TagMode.SelfClosing || builder.TagMode == TagMode.StartTagOnly)
  12757. + private bool TryRewriteTagHelperEnd(MarkupTagBlockSyntax tagBlock, out MarkupTagHelperEndTagSyntax rewritten)
  12758. + {
  12759. + rewritten = null;
  12760. + var tagName = tagBlock.GetTagName();
  12761. + // Could not determine tag name, it can't be a TagHelper, continue on and track the element.
  12762. + if (tagName == null)
  12763. {
  12764. - BuildCurrentlyTrackedTagHelperBlock(endTag: null);
  12765. + return false;
  12766. }
  12767. - }
  12768. - else
  12769. - {
  12770. +
  12771. + var tracker = CurrentTagHelperTracker;
  12772. + var tagNameScope = tracker?.TagName ?? string.Empty;
  12773. + if (!IsPotentialTagHelper(tagName, tagBlock))
  12774. + {
  12775. + return false;
  12776. + }
  12777. +
  12778. // Validate that our end tag matches the currently scoped tag, if not we may need to error.
  12779. if (tagNameScope.Equals(tagName, StringComparison.OrdinalIgnoreCase))
  12780. {
  12781. @@ -262,13 +315,13 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  12782. return false;
  12783. }
  12784. - ValidateTagSyntax(tagName, tagBlock, errorSink);
  12785. + ValidateTagSyntax(tagName, tagBlock);
  12786. - BuildCurrentlyTrackedTagHelperBlock(tagBlock);
  12787. + _trackerStack.Pop();
  12788. }
  12789. else
  12790. {
  12791. - tagHelperBinding = _tagHelperBinder.GetBinding(
  12792. + var tagHelperBinding = _tagHelperBinder.GetBinding(
  12793. tagName,
  12794. attributes: Array.Empty<KeyValuePair<string, string>>(),
  12795. parentTagName: CurrentParentTagName,
  12796. @@ -289,9 +342,9 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  12797. if (invalidRule != null)
  12798. {
  12799. // End tag TagHelper that states it shouldn't have an end tag.
  12800. - errorSink.OnError(
  12801. + _errorSink.OnError(
  12802. RazorDiagnosticFactory.CreateParsing_TagHelperMustNotHaveAnEndTag(
  12803. - new SourceSpan(SourceLocationTracker.Advance(tagBlock.Start, "</"), tagName.Length),
  12804. + new SourceSpan(SourceLocationTracker.Advance(tagBlock.GetSourceLocation(_source), "</"), tagName.Length),
  12805. tagName,
  12806. descriptor.DisplayName,
  12807. invalidRule.TagStructure));
  12808. @@ -299,626 +352,376 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  12809. return false;
  12810. }
  12811. }
  12812. -
  12813. - // Current tag helper scope does not match the end tag. Attempt to recover the tag
  12814. - // helper by looking up the previous tag helper scopes for a matching tag. If we
  12815. - // can't recover it means there was no corresponding tag helper start tag.
  12816. - if (TryRecoverTagHelper(tagName, tagBlock, errorSink))
  12817. - {
  12818. - ValidateParentAllowsTagHelper(tagName, tagBlock, errorSink);
  12819. - ValidateTagSyntax(tagName, tagBlock, errorSink);
  12820. -
  12821. - // Successfully recovered, move onto the next element.
  12822. - }
  12823. - else
  12824. - {
  12825. - // Could not recover, the end tag helper has no corresponding start tag, create
  12826. - // an error based on the current childBlock.
  12827. - errorSink.OnError(
  12828. - RazorDiagnosticFactory.CreateParsing_TagHelperFoundMalformedTagHelper(
  12829. - new SourceSpan(SourceLocationTracker.Advance(tagBlock.Start, "</"), tagName.Length), tagName));
  12830. -
  12831. - return false;
  12832. - }
  12833. }
  12834. - }
  12835. - return true;
  12836. - }
  12837. + rewritten = SyntaxFactory.MarkupTagHelperEndTag(tagBlock.Children);
  12838. - // Internal for testing
  12839. - internal IReadOnlyList<KeyValuePair<string, string>> GetAttributeNameValuePairs(Block tagBlock)
  12840. - {
  12841. - // Need to calculate how many children we should take that represent the attributes.
  12842. - var childrenOffset = IsPartialTag(tagBlock) ? 0 : 1;
  12843. - var childCount = tagBlock.Children.Count - childrenOffset;
  12844. + return true;
  12845. + }
  12846. - if (childCount <= 1)
  12847. + // Internal for testing
  12848. + internal IReadOnlyList<KeyValuePair<string, string>> GetAttributeNameValuePairs(MarkupTagBlockSyntax tagBlock)
  12849. {
  12850. - return Array.Empty<KeyValuePair<string, string>>();
  12851. - }
  12852. + // Need to calculate how many children we should take that represent the attributes.
  12853. + var childrenOffset = IsPartialTag(tagBlock) ? 0 : 1;
  12854. + var childCount = tagBlock.Children.Count - childrenOffset;
  12855. - _htmlAttributeTracker.Clear();
  12856. + if (childCount <= 1)
  12857. + {
  12858. + return Array.Empty<KeyValuePair<string, string>>();
  12859. + }
  12860. - var attributes = _htmlAttributeTracker;
  12861. + _htmlAttributeTracker.Clear();
  12862. - for (var i = 1; i < childCount; i++)
  12863. - {
  12864. - var child = tagBlock.Children[i];
  12865. - Span childSpan;
  12866. + var attributes = _htmlAttributeTracker;
  12867. - if (child.IsBlock)
  12868. + for (var i = 1; i < childCount; i++)
  12869. {
  12870. - var childBlock = (Block)child;
  12871. -
  12872. - if (childBlock.Type != BlockKindInternal.Markup)
  12873. + if (tagBlock.Children[i] is CSharpCodeBlockSyntax)
  12874. {
  12875. - // Anything other than markup blocks in the attribute area of tags mangles following attributes.
  12876. + // Code blocks in the attribute area of tags mangles following attributes.
  12877. // It's also not supported by TagHelpers, bail early to avoid creating bad attribute value pairs.
  12878. break;
  12879. }
  12880. - childSpan = childBlock.FindFirstDescendentSpan();
  12881. -
  12882. - if (childSpan == null)
  12883. + if (tagBlock.Children[i] is MarkupMinimizedAttributeBlockSyntax minimizedAttributeBlock)
  12884. {
  12885. - _attributeValueBuilder.Append(InvalidAttributeValueMarker);
  12886. + if (minimizedAttributeBlock.Name == null)
  12887. + {
  12888. + _attributeValueBuilder.Append(InvalidAttributeValueMarker);
  12889. + continue;
  12890. + }
  12891. +
  12892. + var minimizedAttribute = new KeyValuePair<string, string>(minimizedAttributeBlock.Name.GetContent(), string.Empty);
  12893. + attributes.Add(minimizedAttribute);
  12894. continue;
  12895. }
  12896. - // We can assume the first span will always contain attributename=" and the last span will always
  12897. - // contain the final quote. Therefore, if the values not quoted there's no ending quote to skip.
  12898. - var childOffset = 0;
  12899. - if (childSpan.Tokens.Count > 0)
  12900. + if (!(tagBlock.Children[i] is MarkupAttributeBlockSyntax attributeBlock))
  12901. {
  12902. - var potentialQuote = childSpan.Tokens[childSpan.Tokens.Count - 1];
  12903. - if (potentialQuote != null &&
  12904. - (potentialQuote.Kind == SyntaxKind.DoubleQuote ||
  12905. - potentialQuote.Kind == SyntaxKind.SingleQuote))
  12906. - {
  12907. - childOffset = 1;
  12908. - }
  12909. + // If the parser thought these aren't attributes, we don't care about them. Move on.
  12910. + continue;
  12911. }
  12912. - for (var j = 1; j < childBlock.Children.Count - childOffset; j++)
  12913. + if (attributeBlock.Name == null)
  12914. {
  12915. - var valueChild = childBlock.Children[j];
  12916. - if (valueChild.IsBlock)
  12917. - {
  12918. - _attributeValueBuilder.Append(InvalidAttributeValueMarker);
  12919. - }
  12920. - else
  12921. - {
  12922. - var valueChildSpan = (Span)valueChild;
  12923. - for (var k = 0; k < valueChildSpan.Tokens.Count; k++)
  12924. - {
  12925. - _attributeValueBuilder.Append(valueChildSpan.Tokens[k].Content);
  12926. - }
  12927. - }
  12928. + _attributeValueBuilder.Append(InvalidAttributeValueMarker);
  12929. + continue;
  12930. }
  12931. - }
  12932. - else
  12933. - {
  12934. - childSpan = (Span)child;
  12935. -
  12936. - var afterEquals = false;
  12937. - var atValue = false;
  12938. - var endValueMarker = childSpan.Tokens.Count;
  12939. - // Entire attribute is a string
  12940. - for (var j = 0; j < endValueMarker; j++)
  12941. + if (attributeBlock.Value != null)
  12942. {
  12943. - var token = childSpan.Tokens[j];
  12944. -
  12945. - if (!afterEquals)
  12946. - {
  12947. - afterEquals = token.Kind == SyntaxKind.Equals;
  12948. - continue;
  12949. - }
  12950. -
  12951. - if (!atValue)
  12952. + for (var j = 0; j < attributeBlock.Value.Children.Count; j++)
  12953. {
  12954. - atValue = token.Kind != SyntaxKind.Whitespace &&
  12955. - token.Kind != SyntaxKind.NewLine;
  12956. -
  12957. - if (atValue)
  12958. + var child = attributeBlock.Value.Children[j];
  12959. + if (child is MarkupLiteralAttributeValueSyntax literalValue)
  12960. {
  12961. - if (token.Kind == SyntaxKind.DoubleQuote ||
  12962. - token.Kind == SyntaxKind.SingleQuote)
  12963. - {
  12964. - endValueMarker--;
  12965. - }
  12966. - else
  12967. - {
  12968. - // Current token is considered the value (unquoted). Add its content to the
  12969. - // attribute value builder before we move past it.
  12970. - _attributeValueBuilder.Append(token.Content);
  12971. - }
  12972. + _attributeValueBuilder.Append(literalValue.GetContent());
  12973. + }
  12974. + else
  12975. + {
  12976. + _attributeValueBuilder.Append(InvalidAttributeValueMarker);
  12977. }
  12978. -
  12979. - continue;
  12980. }
  12981. -
  12982. - _attributeValueBuilder.Append(token.Content);
  12983. }
  12984. - }
  12985. - var start = 0;
  12986. - for (; start < childSpan.Content.Length; start++)
  12987. - {
  12988. - if (!char.IsWhiteSpace(childSpan.Content[start]))
  12989. - {
  12990. - break;
  12991. - }
  12992. - }
  12993. + var attributeName = attributeBlock.Name.GetContent();
  12994. + var attributeValue = _attributeValueBuilder.ToString();
  12995. + var attribute = new KeyValuePair<string, string>(attributeName, attributeValue);
  12996. + attributes.Add(attribute);
  12997. - var end = start;
  12998. - for (; end < childSpan.Content.Length; end++)
  12999. - {
  13000. - if (childSpan.Content[end] == '=')
  13001. - {
  13002. - break;
  13003. - }
  13004. + _attributeValueBuilder.Clear();
  13005. }
  13006. - var attributeName = childSpan.Content.Substring(start, end - start);
  13007. - var attributeValue = _attributeValueBuilder.ToString();
  13008. - var attribute = new KeyValuePair<string, string>(attributeName, attributeValue);
  13009. - attributes.Add(attribute);
  13010. -
  13011. - _attributeValueBuilder.Clear();
  13012. + return attributes;
  13013. }
  13014. - return attributes;
  13015. - }
  13016. -
  13017. - private bool HasAllowedChildren()
  13018. - {
  13019. - var currentTracker = _trackerStack.Count > 0 ? _trackerStack.Peek() : null;
  13020. -
  13021. - // If the current tracker is not a TagHelper then there's no AllowedChildren to enforce.
  13022. - if (currentTracker == null || !currentTracker.IsTagHelper)
  13023. - {
  13024. - return false;
  13025. - }
  13026. -
  13027. - return _currentTagHelperTracker.AllowedChildren != null && _currentTagHelperTracker.AllowedChildren.Count > 0;
  13028. - }
  13029. -
  13030. - private void ValidateParentAllowsContent(Span child, ErrorSink errorSink)
  13031. - {
  13032. - if (HasAllowedChildren())
  13033. + private void ValidateParentAllowsTagHelper(string tagName, MarkupTagBlockSyntax tagBlock)
  13034. {
  13035. - var isDisallowedContent = true;
  13036. - if (_featureFlags.AllowHtmlCommentsInTagHelpers)
  13037. + if (HasAllowedChildren() &&
  13038. + !CurrentTagHelperTracker.PrefixedAllowedChildren.Contains(tagName, StringComparer.OrdinalIgnoreCase))
  13039. {
  13040. - isDisallowedContent = !IsComment(child) && child.Kind != SpanKindInternal.Transition && child.Kind != SpanKindInternal.Code;
  13041. + OnAllowedChildrenTagError(CurrentTagHelperTracker, tagName, tagBlock, _errorSink, _source);
  13042. }
  13043. + }
  13044. - if (isDisallowedContent)
  13045. + private void ValidateBinding(
  13046. + TagHelperBinding bindingResult,
  13047. + string tagName,
  13048. + MarkupTagBlockSyntax tagBlock)
  13049. + {
  13050. + // Ensure that all descriptors associated with this tag have appropriate TagStructures. Cannot have
  13051. + // multiple descriptors that expect different TagStructures (other than TagStructure.Unspecified).
  13052. + TagHelperDescriptor baseDescriptor = null;
  13053. + TagStructure? baseStructure = null;
  13054. + foreach (var descriptor in bindingResult.Descriptors)
  13055. {
  13056. - var content = child.Content;
  13057. - if (!string.IsNullOrWhiteSpace(content))
  13058. + var boundRules = bindingResult.GetBoundRules(descriptor);
  13059. + foreach (var rule in boundRules)
  13060. {
  13061. - var trimmedStart = content.TrimStart();
  13062. - var whitespace = content.Substring(0, content.Length - trimmedStart.Length);
  13063. - var errorStart = SourceLocationTracker.Advance(child.Start, whitespace);
  13064. - var length = trimmedStart.TrimEnd().Length;
  13065. - var allowedChildren = _currentTagHelperTracker.AllowedChildren;
  13066. - var allowedChildrenString = string.Join(", ", allowedChildren);
  13067. - errorSink.OnError(
  13068. - RazorDiagnosticFactory.CreateTagHelper_CannotHaveNonTagContent(
  13069. - new SourceSpan(errorStart, length),
  13070. - _currentTagHelperTracker.TagName,
  13071. - allowedChildrenString));
  13072. + if (rule.TagStructure != TagStructure.Unspecified)
  13073. + {
  13074. + // Can't have a set of TagHelpers that expect different structures.
  13075. + if (baseStructure.HasValue && baseStructure != rule.TagStructure)
  13076. + {
  13077. + _errorSink.OnError(
  13078. + RazorDiagnosticFactory.CreateTagHelper_InconsistentTagStructure(
  13079. + new SourceSpan(tagBlock.GetSourceLocation(_source), tagBlock.FullWidth),
  13080. + baseDescriptor.DisplayName,
  13081. + descriptor.DisplayName,
  13082. + tagName));
  13083. + }
  13084. +
  13085. + baseDescriptor = descriptor;
  13086. + baseStructure = rule.TagStructure;
  13087. + }
  13088. }
  13089. }
  13090. }
  13091. - }
  13092. -
  13093. - private void ValidateParentAllowsPlainTag(Block tagBlock, ErrorSink errorSink)
  13094. - {
  13095. - var tagName = GetTagName(tagBlock);
  13096. - // Treat partial tags such as '</' which have no tag names as content.
  13097. - if (string.IsNullOrEmpty(tagName))
  13098. + private bool ValidateTagSyntax(string tagName, MarkupTagBlockSyntax tag)
  13099. {
  13100. - Debug.Assert(tagBlock.Children.First() is Span);
  13101. + // We assume an invalid syntax until we verify that the tag meets all of our "valid syntax" criteria.
  13102. + if (IsPartialTag(tag))
  13103. + {
  13104. + var errorStart = GetTagDeclarationErrorStart(tag);
  13105. +
  13106. + _errorSink.OnError(
  13107. + RazorDiagnosticFactory.CreateParsing_TagHelperMissingCloseAngle(
  13108. + new SourceSpan(errorStart, tagName.Length), tagName));
  13109. +
  13110. + return false;
  13111. + }
  13112. - ValidateParentAllowsContent((Span)tagBlock.Children.First(), errorSink);
  13113. - return;
  13114. + return true;
  13115. }
  13116. - if (!HasAllowedChildren())
  13117. + private bool IsPotentialTagHelper(string tagName, MarkupTagBlockSyntax childBlock)
  13118. {
  13119. - return;
  13120. - }
  13121. + Debug.Assert(childBlock.Children.Count > 0);
  13122. + var child = childBlock.Children[0];
  13123. - var tagHelperBinding = _tagHelperBinder.GetBinding(
  13124. - tagName,
  13125. - attributes: Array.Empty<KeyValuePair<string, string>>(),
  13126. - parentTagName: CurrentParentTagName,
  13127. - parentIsTagHelper: CurrentParentIsTagHelper);
  13128. + return !string.Equals(tagName, SyntaxConstants.TextTagName, StringComparison.OrdinalIgnoreCase) ||
  13129. + child.Kind != SyntaxKind.MarkupTransition;
  13130. + }
  13131. - // If we found a binding for the current tag, then it is a tag helper. Use the prefixed allowed children to compare.
  13132. - var allowedChildren = tagHelperBinding != null ? _currentTagHelperTracker.PrefixedAllowedChildren : _currentTagHelperTracker.AllowedChildren;
  13133. - if (!allowedChildren.Contains(tagName, StringComparer.OrdinalIgnoreCase))
  13134. + private SourceLocation GetTagDeclarationErrorStart(MarkupTagBlockSyntax tagBlock)
  13135. {
  13136. - OnAllowedChildrenTagError(_currentTagHelperTracker, tagName, tagBlock, errorSink);
  13137. + var advanceBy = IsEndTag(tagBlock) ? "</" : "<";
  13138. +
  13139. + return SourceLocationTracker.Advance(tagBlock.GetSourceLocation(_source), advanceBy);
  13140. }
  13141. - }
  13142. - private void ValidateParentAllowsTagHelper(string tagName, Block tagBlock, ErrorSink errorSink)
  13143. - {
  13144. - if (HasAllowedChildren() &&
  13145. - !_currentTagHelperTracker.PrefixedAllowedChildren.Contains(tagName, StringComparer.OrdinalIgnoreCase))
  13146. + private static bool IsPartialTag(MarkupTagBlockSyntax tagBlock)
  13147. {
  13148. - OnAllowedChildrenTagError(_currentTagHelperTracker, tagName, tagBlock, errorSink);
  13149. - }
  13150. - }
  13151. + // No need to validate the tag end because in order to be a tag block it must start with '<'.
  13152. + var tagEnd = tagBlock.Children[tagBlock.Children.Count - 1];
  13153. - private static void OnAllowedChildrenTagError(
  13154. - TagHelperBlockTracker tracker,
  13155. - string tagName,
  13156. - Block tagBlock,
  13157. - ErrorSink errorSink)
  13158. - {
  13159. - var allowedChildrenString = string.Join(", ", tracker.AllowedChildren);
  13160. - var errorStart = GetTagDeclarationErrorStart(tagBlock);
  13161. + // If our tag end is not a markup span it means it's some sort of code SyntaxTreeNode (not a valid format)
  13162. + if (tagEnd != null && tagEnd is MarkupTextLiteralSyntax tagEndLiteral)
  13163. + {
  13164. + var endToken = tagEndLiteral.LiteralTokens.Count > 0 ?
  13165. + tagEndLiteral.LiteralTokens[tagEndLiteral.LiteralTokens.Count - 1] :
  13166. + null;
  13167. - errorSink.OnError(
  13168. - RazorDiagnosticFactory.CreateTagHelper_InvalidNestedTag(
  13169. - new SourceSpan(errorStart, tagName.Length),
  13170. - tagName,
  13171. - tracker.TagName,
  13172. - allowedChildrenString));
  13173. - }
  13174. + if (endToken != null && endToken.Kind == SyntaxKind.CloseAngle)
  13175. + {
  13176. + return false;
  13177. + }
  13178. + }
  13179. - private static void ValidateBinding(
  13180. - TagHelperBinding bindingResult,
  13181. - string tagName,
  13182. - Block tagBlock,
  13183. - ErrorSink errorSink)
  13184. - {
  13185. - // Ensure that all descriptors associated with this tag have appropriate TagStructures. Cannot have
  13186. - // multiple descriptors that expect different TagStructures (other than TagStructure.Unspecified).
  13187. - TagHelperDescriptor baseDescriptor = null;
  13188. - TagStructure? baseStructure = null;
  13189. - foreach (var descriptor in bindingResult.Descriptors)
  13190. + return true;
  13191. + }
  13192. +
  13193. + private void ValidateParentAllowsContent(SyntaxNode child)
  13194. {
  13195. - var boundRules = bindingResult.GetBoundRules(descriptor);
  13196. - foreach (var rule in boundRules)
  13197. + if (HasAllowedChildren())
  13198. {
  13199. - if (rule.TagStructure != TagStructure.Unspecified)
  13200. + var isDisallowedContent = true;
  13201. + if (_featureFlags.AllowHtmlCommentsInTagHelpers)
  13202. {
  13203. - // Can't have a set of TagHelpers that expect different structures.
  13204. - if (baseStructure.HasValue && baseStructure != rule.TagStructure)
  13205. + isDisallowedContent = !IsComment(child) &&
  13206. + !child.IsTransitionSpanKind() &&
  13207. + !child.IsCodeSpanKind();
  13208. + }
  13209. +
  13210. + if (isDisallowedContent)
  13211. + {
  13212. + var content = child.GetContent();
  13213. + if (!string.IsNullOrWhiteSpace(content))
  13214. {
  13215. - errorSink.OnError(
  13216. - RazorDiagnosticFactory.CreateTagHelper_InconsistentTagStructure(
  13217. - new SourceSpan(tagBlock.Start, tagBlock.Length),
  13218. - baseDescriptor.DisplayName,
  13219. - descriptor.DisplayName,
  13220. - tagName));
  13221. + var trimmedStart = content.TrimStart();
  13222. + var whitespace = content.Substring(0, content.Length - trimmedStart.Length);
  13223. + var errorStart = SourceLocationTracker.Advance(child.GetSourceLocation(_source), whitespace);
  13224. + var length = trimmedStart.TrimEnd().Length;
  13225. + var allowedChildren = CurrentTagHelperTracker.AllowedChildren;
  13226. + var allowedChildrenString = string.Join(", ", allowedChildren);
  13227. + _errorSink.OnError(
  13228. + RazorDiagnosticFactory.CreateTagHelper_CannotHaveNonTagContent(
  13229. + new SourceSpan(errorStart, length),
  13230. + CurrentTagHelperTracker.TagName,
  13231. + allowedChildrenString));
  13232. }
  13233. -
  13234. - baseDescriptor = descriptor;
  13235. - baseStructure = rule.TagStructure;
  13236. }
  13237. }
  13238. }
  13239. - }
  13240. - private static bool ValidateTagSyntax(string tagName, Block tag, ErrorSink errorSink)
  13241. - {
  13242. - // We assume an invalid syntax until we verify that the tag meets all of our "valid syntax" criteria.
  13243. - if (IsPartialTag(tag))
  13244. + private void ValidateParentAllowsPlainTag(MarkupTagBlockSyntax tagBlock)
  13245. {
  13246. - var errorStart = GetTagDeclarationErrorStart(tag);
  13247. -
  13248. - errorSink.OnError(
  13249. - RazorDiagnosticFactory.CreateParsing_TagHelperMissingCloseAngle(
  13250. - new SourceSpan(errorStart, tagName.Length), tagName));
  13251. + var tagName = tagBlock.GetTagName();
  13252. - return false;
  13253. - }
  13254. -
  13255. - return true;
  13256. - }
  13257. -
  13258. - private static SourceLocation GetTagDeclarationErrorStart(Block tagBlock)
  13259. - {
  13260. - var advanceBy = IsEndTag(tagBlock) ? "</" : "<";
  13261. + // Treat partial tags such as '</' which have no tag names as content.
  13262. + if (string.IsNullOrEmpty(tagName))
  13263. + {
  13264. + var firstChild = tagBlock.Children.First();
  13265. + Debug.Assert(firstChild is MarkupTextLiteralSyntax || firstChild is MarkupTransitionSyntax);
  13266. - return SourceLocationTracker.Advance(tagBlock.Start, advanceBy);
  13267. - }
  13268. + ValidateParentAllowsContent(tagBlock.Children.First());
  13269. + return;
  13270. + }
  13271. - private static bool IsPartialTag(Block tagBlock)
  13272. - {
  13273. - // No need to validate the tag end because in order to be a tag block it must start with '<'.
  13274. - var tagEnd = tagBlock.Children[tagBlock.Children.Count - 1] as Span;
  13275. + if (!HasAllowedChildren())
  13276. + {
  13277. + return;
  13278. + }
  13279. - // If our tag end is not a markup span it means it's some sort of code SyntaxTreeNode (not a valid format)
  13280. - if (tagEnd != null && tagEnd.Kind == SpanKindInternal.Markup)
  13281. - {
  13282. - var endToken = tagEnd.Tokens.Count > 0 ?
  13283. - tagEnd.Tokens[tagEnd.Tokens.Count - 1] :
  13284. - null;
  13285. + var tagHelperBinding = _tagHelperBinder.GetBinding(
  13286. + tagName,
  13287. + attributes: Array.Empty<KeyValuePair<string, string>>(),
  13288. + parentTagName: CurrentParentTagName,
  13289. + parentIsTagHelper: CurrentParentIsTagHelper);
  13290. - if (endToken != null && endToken.Kind == SyntaxKind.CloseAngle)
  13291. + // If we found a binding for the current tag, then it is a tag helper. Use the prefixed allowed children to compare.
  13292. + var allowedChildren = tagHelperBinding != null ? CurrentTagHelperTracker.PrefixedAllowedChildren : CurrentTagHelperTracker.AllowedChildren;
  13293. + if (!allowedChildren.Contains(tagName, StringComparer.OrdinalIgnoreCase))
  13294. {
  13295. - return false;
  13296. + OnAllowedChildrenTagError(CurrentTagHelperTracker, tagName, tagBlock, _errorSink, _source);
  13297. }
  13298. }
  13299. - return true;
  13300. - }
  13301. -
  13302. - private void BuildCurrentlyTrackedBlock()
  13303. - {
  13304. - // Going to remove the current BlockBuilder from the stack because it's complete.
  13305. - var currentBlock = _blockStack.Pop();
  13306. -
  13307. - // If there are block stacks left it means we're not at the root.
  13308. - if (_blockStack.Count > 0)
  13309. - {
  13310. - // Grab the next block in line so we can continue managing its children (it's not done).
  13311. - var previousBlock = _blockStack.Peek();
  13312. -
  13313. - // We've finished the currentBlock so build it and add it to its parent.
  13314. - previousBlock.Children.Add(currentBlock.Build());
  13315. -
  13316. - // Update the _currentBlock to point at the last tracked block because it's not complete.
  13317. - _currentBlock = previousBlock;
  13318. - }
  13319. - else
  13320. + private bool HasAllowedChildren()
  13321. {
  13322. - _currentBlock = currentBlock;
  13323. - }
  13324. - }
  13325. + // TODO: Questionable logic. Need to revisit
  13326. + var currentTracker = _trackerStack.Count > 0 ? _trackerStack.Peek() : null;
  13327. - private void BuildCurrentlyTrackedTagHelperBlock(Block endTag)
  13328. - {
  13329. - Debug.Assert(_trackerStack.Any(tracker => tracker.IsTagHelper));
  13330. + // If the current tracker is not a TagHelper then there's no AllowedChildren to enforce.
  13331. + if (currentTracker == null || !currentTracker.IsTagHelper)
  13332. + {
  13333. + return false;
  13334. + }
  13335. - // We need to pop all trackers until we reach our TagHelperBlock. We can throw away any non-TagHelper
  13336. - // trackers because they don't need to be well-formed.
  13337. - TagHelperBlockTracker tagHelperTracker;
  13338. - do
  13339. - {
  13340. - tagHelperTracker = PopTrackerStack() as TagHelperBlockTracker;
  13341. + return CurrentTagHelperTracker.AllowedChildren != null && CurrentTagHelperTracker.AllowedChildren.Count > 0;
  13342. }
  13343. - while (tagHelperTracker == null);
  13344. -
  13345. - // Track the original end tag so the editor knows where each piece of the TagHelperBlock lies
  13346. - // for formatting.
  13347. - tagHelperTracker.Builder.SourceEndTag = endTag;
  13348. -
  13349. - _currentTagHelperTracker =
  13350. - (TagHelperBlockTracker)_trackerStack.FirstOrDefault(tagBlockTracker => tagBlockTracker.IsTagHelper);
  13351. -
  13352. - BuildCurrentlyTrackedBlock();
  13353. - }
  13354. -
  13355. - private bool IsPotentialTagHelper(string tagName, Block childBlock)
  13356. - {
  13357. - Debug.Assert(childBlock.Children.Count > 0);
  13358. - var child = childBlock.Children[0];
  13359. - var childSpan = (Span)child;
  13360. -
  13361. - // text tags that are labeled as transitions should be ignored aka they're not tag helpers.
  13362. - return !string.Equals(tagName, SyntaxConstants.TextTagName, StringComparison.OrdinalIgnoreCase) ||
  13363. - childSpan.Kind != SpanKindInternal.Transition;
  13364. - }
  13365. -
  13366. - private void TrackBlock(BlockBuilder builder)
  13367. - {
  13368. - _currentBlock = builder;
  13369. -
  13370. - _blockStack.Push(builder);
  13371. - }
  13372. -
  13373. - private void TrackTagHelperBlock(TagHelperBlockBuilder builder)
  13374. - {
  13375. - _currentTagHelperTracker = new TagHelperBlockTracker(_tagHelperPrefix, builder);
  13376. - PushTrackerStack(_currentTagHelperTracker);
  13377. -
  13378. - TrackBlock(builder);
  13379. - }
  13380. -
  13381. - private bool TryRecoverTagHelper(string tagName, Block endTag, ErrorSink errorSink)
  13382. - {
  13383. - var malformedTagHelperCount = 0;
  13384. -
  13385. - foreach (var tracker in _trackerStack)
  13386. + private bool IsPartOfStartTag(SyntaxNode node)
  13387. {
  13388. - if (tracker.IsTagHelper && tracker.TagName.Equals(tagName, StringComparison.OrdinalIgnoreCase))
  13389. + // Check if an ancestor is a start tag of a MarkupElement.
  13390. + var parent = node.FirstAncestorOrSelf<SyntaxNode>(n =>
  13391. {
  13392. - break;
  13393. - }
  13394. + return n.Parent is MarkupElementSyntax element && element.StartTag == n;
  13395. + });
  13396. - malformedTagHelperCount++;
  13397. + return parent != null;
  13398. }
  13399. - // If the malformedTagHelperCount == _tagStack.Count it means we couldn't find a start tag for the tag
  13400. - // helper, can't recover.
  13401. - if (malformedTagHelperCount != _trackerStack.Count)
  13402. + internal static bool IsComment(SyntaxNode node)
  13403. {
  13404. - BuildMalformedTagHelpers(malformedTagHelperCount, errorSink);
  13405. -
  13406. - // One final build, this is the build that completes our target tag helper block which is not malformed.
  13407. - BuildCurrentlyTrackedTagHelperBlock(endTag);
  13408. + var commentParent = node.FirstAncestorOrSelf<SyntaxNode>(
  13409. + n => n is RazorCommentBlockSyntax || n is MarkupCommentBlockSyntax);
  13410. - // We were able to recover
  13411. - return true;
  13412. + return commentParent != null;
  13413. }
  13414. - // Could not recover tag helper. Aka we found a tag helper end tag without a corresponding start tag.
  13415. - return false;
  13416. - }
  13417. -
  13418. - private void BuildMalformedTagHelpers(int count, ErrorSink errorSink)
  13419. - {
  13420. - for (var i = 0; i < count; i++)
  13421. + private static void OnAllowedChildrenTagError(
  13422. + TagHelperTracker tracker,
  13423. + string tagName,
  13424. + MarkupTagBlockSyntax tagBlock,
  13425. + ErrorSink errorSink,
  13426. + RazorSourceDocument source)
  13427. {
  13428. - var tracker = _trackerStack.Peek();
  13429. -
  13430. - // Skip all non-TagHelper entries. Non TagHelper trackers do not need to represent well-formed HTML.
  13431. - if (!tracker.IsTagHelper)
  13432. - {
  13433. - PopTrackerStack();
  13434. - continue;
  13435. - }
  13436. -
  13437. - var malformedTagHelper = ((TagHelperBlockTracker)tracker).Builder;
  13438. + var allowedChildrenString = string.Join(", ", tracker.AllowedChildren);
  13439. + var errorStart = GetTagDeclarationErrorStart(tagBlock, source);
  13440. errorSink.OnError(
  13441. - RazorDiagnosticFactory.CreateParsing_TagHelperFoundMalformedTagHelper(
  13442. - new SourceSpan(SourceLocationTracker.Advance(malformedTagHelper.Start, "<"), malformedTagHelper.TagName.Length),
  13443. - malformedTagHelper.TagName));
  13444. -
  13445. - BuildCurrentlyTrackedTagHelperBlock(endTag: null);
  13446. - }
  13447. - }
  13448. -
  13449. - private static string GetTagName(Block tagBlock)
  13450. - {
  13451. - var child = tagBlock.Children[0];
  13452. -
  13453. - if (tagBlock.Type != BlockKindInternal.Tag || tagBlock.Children.Count == 0 || !(child is Span))
  13454. - {
  13455. - return null;
  13456. + RazorDiagnosticFactory.CreateTagHelper_InvalidNestedTag(
  13457. + new SourceSpan(errorStart, tagName.Length),
  13458. + tagName,
  13459. + tracker.TagName,
  13460. + allowedChildrenString));
  13461. }
  13462. - var childSpan = (Span)child;
  13463. - SyntaxToken textToken = null;
  13464. - for (var i = 0; i < childSpan.Tokens.Count; i++)
  13465. + private static SourceLocation GetTagDeclarationErrorStart(MarkupTagBlockSyntax tagBlock, RazorSourceDocument source)
  13466. {
  13467. - var token = childSpan.Tokens[i];
  13468. + var advanceBy = IsEndTag(tagBlock) ? "</" : "<";
  13469. - if (token != null &&
  13470. - (token.Kind == SyntaxKind.Whitespace || token.Kind == SyntaxKind.Text))
  13471. - {
  13472. - textToken = token;
  13473. - break;
  13474. - }
  13475. + return SourceLocationTracker.Advance(tagBlock.GetSourceLocation(source), advanceBy);
  13476. }
  13477. - if (textToken == null)
  13478. + private static bool IsEndTag(MarkupTagBlockSyntax tagBlock)
  13479. {
  13480. - return null;
  13481. - }
  13482. -
  13483. - return textToken.Kind == SyntaxKind.Whitespace ? null : textToken.Content;
  13484. - }
  13485. -
  13486. - private static bool IsEndTag(Block tagBlock)
  13487. - {
  13488. - EnsureTagBlock(tagBlock);
  13489. -
  13490. - var childSpan = (Span)tagBlock.Children.First();
  13491. -
  13492. - // We grab the token that could be forward slash
  13493. - var relevantToken = childSpan.Tokens[childSpan.Tokens.Count == 1 ? 0 : 1];
  13494. + var childSpan = (MarkupTextLiteralSyntax)tagBlock.Children.First();
  13495. - return relevantToken.Kind == SyntaxKind.ForwardSlash;
  13496. - }
  13497. + // We grab the token that could be forward slash
  13498. + var relevantToken = childSpan.LiteralTokens[childSpan.LiteralTokens.Count == 1 ? 0 : 1];
  13499. - internal static bool IsComment(Span span)
  13500. - {
  13501. - Block currentBlock = span.Parent;
  13502. - while (currentBlock != null && currentBlock.Type != BlockKindInternal.Comment && currentBlock.Type != BlockKindInternal.HtmlComment)
  13503. - {
  13504. - currentBlock = currentBlock.Parent;
  13505. + return relevantToken.Kind == SyntaxKind.ForwardSlash;
  13506. }
  13507. - return currentBlock != null;
  13508. - }
  13509. -
  13510. -
  13511. - private static void EnsureTagBlock(Block tagBlock)
  13512. - {
  13513. - Debug.Assert(tagBlock.Type == BlockKindInternal.Tag);
  13514. - Debug.Assert(tagBlock.Children.First() is Span);
  13515. - }
  13516. -
  13517. - private static bool IsSelfClosing(Block childBlock)
  13518. - {
  13519. - var childSpan = childBlock.FindLastDescendentSpan();
  13520. -
  13521. - return childSpan?.Content.EndsWith("/>", StringComparison.Ordinal) ?? false;
  13522. - }
  13523. -
  13524. - private void PushTrackerStack(TagBlockTracker tracker)
  13525. - {
  13526. - _trackerStack.Push(tracker);
  13527. - }
  13528. -
  13529. - private TagBlockTracker PopTrackerStack()
  13530. - {
  13531. - var poppedTracker = _trackerStack.Pop();
  13532. -
  13533. - return poppedTracker;
  13534. - }
  13535. -
  13536. - private class TagBlockTracker
  13537. - {
  13538. - public TagBlockTracker(string tagName, bool isTagHelper, int depth)
  13539. + private class TagTracker
  13540. {
  13541. - TagName = tagName;
  13542. - IsTagHelper = isTagHelper;
  13543. - Depth = depth;
  13544. - }
  13545. -
  13546. - public string TagName { get; }
  13547. -
  13548. - public bool IsTagHelper { get; }
  13549. + public TagTracker(string tagName, bool isTagHelper)
  13550. + {
  13551. + TagName = tagName;
  13552. + IsTagHelper = isTagHelper;
  13553. + }
  13554. - public int Depth { get; }
  13555. - }
  13556. + public string TagName { get; }
  13557. - private class TagHelperBlockTracker : TagBlockTracker
  13558. - {
  13559. - private IReadOnlyList<string> _prefixedAllowedChildren;
  13560. - private readonly string _tagHelperPrefix;
  13561. + public bool IsTagHelper { get; }
  13562. + }
  13563. - public TagHelperBlockTracker(string tagHelperPrefix, TagHelperBlockBuilder builder)
  13564. - : base(builder.TagName, isTagHelper: true, depth: 0)
  13565. + private class TagHelperTracker : TagTracker
  13566. {
  13567. - _tagHelperPrefix = tagHelperPrefix;
  13568. - Builder = builder;
  13569. + private IReadOnlyList<string> _prefixedAllowedChildren;
  13570. + private readonly string _tagHelperPrefix;
  13571. - if (Builder.BindingResult.Descriptors.Any(descriptor => descriptor.AllowedChildTags != null))
  13572. + public TagHelperTracker(string tagHelperPrefix, TagHelperInfo info)
  13573. + : base(info.TagName, isTagHelper: true)
  13574. {
  13575. - AllowedChildren = Builder.BindingResult.Descriptors
  13576. - .Where(descriptor => descriptor.AllowedChildTags != null)
  13577. - .SelectMany(descriptor => descriptor.AllowedChildTags.Select(childTag => childTag.Name))
  13578. - .Distinct(StringComparer.OrdinalIgnoreCase)
  13579. - .ToList();
  13580. + _tagHelperPrefix = tagHelperPrefix;
  13581. + Info = info;
  13582. +
  13583. + if (Info.BindingResult.Descriptors.Any(descriptor => descriptor.AllowedChildTags != null))
  13584. + {
  13585. + AllowedChildren = Info.BindingResult.Descriptors
  13586. + .Where(descriptor => descriptor.AllowedChildTags != null)
  13587. + .SelectMany(descriptor => descriptor.AllowedChildTags.Select(childTag => childTag.Name))
  13588. + .Distinct(StringComparer.OrdinalIgnoreCase)
  13589. + .ToList();
  13590. + }
  13591. }
  13592. - }
  13593. - public TagHelperBlockBuilder Builder { get; }
  13594. + public TagHelperInfo Info { get; }
  13595. - public uint OpenMatchingTags { get; set; }
  13596. + public uint OpenMatchingTags { get; set; }
  13597. - public IReadOnlyList<string> AllowedChildren { get; }
  13598. + public IReadOnlyList<string> AllowedChildren { get; }
  13599. - public IReadOnlyList<string> PrefixedAllowedChildren
  13600. - {
  13601. - get
  13602. + public IReadOnlyList<string> PrefixedAllowedChildren
  13603. {
  13604. - if (AllowedChildren != null && _prefixedAllowedChildren == null)
  13605. + get
  13606. {
  13607. - Debug.Assert(Builder.BindingResult.Descriptors.Count() >= 1);
  13608. + if (AllowedChildren != null && _prefixedAllowedChildren == null)
  13609. + {
  13610. + Debug.Assert(Info.BindingResult.Descriptors.Count() >= 1);
  13611. - _prefixedAllowedChildren = AllowedChildren.Select(allowedChild => _tagHelperPrefix + allowedChild).ToList();
  13612. - }
  13613. + _prefixedAllowedChildren = AllowedChildren.Select(allowedChild => _tagHelperPrefix + allowedChild).ToList();
  13614. + }
  13615. - return _prefixedAllowedChildren;
  13616. + return _prefixedAllowedChildren;
  13617. + }
  13618. }
  13619. }
  13620. }
  13621. }
  13622. -}
  13623. \ No newline at end of file
  13624. +}
  13625. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperPrefixDirectiveChunkGenerator.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperPrefixDirectiveChunkGenerator.cs
  13626. index f559ed585cf..094ec2e9c9a 100644
  13627. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperPrefixDirectiveChunkGenerator.cs
  13628. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/TagHelperPrefixDirectiveChunkGenerator.cs
  13629. @@ -24,11 +24,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  13630. public List<RazorDiagnostic> Diagnostics { get; }
  13631. - public override void Accept(ParserVisitor visitor, Span span)
  13632. - {
  13633. - visitor.VisitTagHelperPrefixDirectiveSpan(this, span);
  13634. - }
  13635. -
  13636. /// <inheritdoc />
  13637. public override bool Equals(object obj)
  13638. {
  13639. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/TemplateBlockChunkGenerator.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/TemplateBlockChunkGenerator.cs
  13640. deleted file mode 100644
  13641. index 02940c1c31b..00000000000
  13642. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/TemplateBlockChunkGenerator.cs
  13643. +++ /dev/null
  13644. @@ -1,28 +0,0 @@
  13645. -// Copyright (c) .NET Foundation. All rights reserved.
  13646. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  13647. -
  13648. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  13649. -{
  13650. - internal class TemplateBlockChunkGenerator : ParentChunkGenerator
  13651. - {
  13652. - public override void Accept(ParserVisitor visitor, Block block)
  13653. - {
  13654. - visitor.VisitTemplateBlock(this, block);
  13655. - }
  13656. -
  13657. - public override void GenerateStartParentChunk(Block target, ChunkGeneratorContext context)
  13658. - {
  13659. - //context.ChunkTreeBuilder.StartParentChunk<TemplateChunk>(target);
  13660. - }
  13661. -
  13662. - public override void GenerateEndParentChunk(Block target, ChunkGeneratorContext context)
  13663. - {
  13664. - //context.ChunkTreeBuilder.EndParentChunk();
  13665. - }
  13666. -
  13667. - public override string ToString()
  13668. - {
  13669. - return "Template";
  13670. - }
  13671. - }
  13672. -}
  13673. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/TokenizerBackedParser.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/TokenizerBackedParser.cs
  13674. index 5168dbe79cf..ed4b881939b 100644
  13675. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/TokenizerBackedParser.cs
  13676. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/TokenizerBackedParser.cs
  13677. @@ -12,7 +12,9 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  13678. internal abstract class TokenizerBackedParser<TTokenizer> : ParserBase
  13679. where TTokenizer : Tokenizer
  13680. {
  13681. + private readonly SyntaxListPool _pool = new SyntaxListPool();
  13682. private readonly TokenizerView<TTokenizer> _tokenizer;
  13683. + private SyntaxListBuilder<SyntaxToken>? _tokenBuilder;
  13684. protected TokenizerBackedParser(LanguageCharacteristics<TTokenizer> language, ParserContext context)
  13685. : base(context)
  13686. @@ -21,14 +23,28 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  13687. var languageTokenizer = Language.CreateTokenizer(Context.Source);
  13688. _tokenizer = new TokenizerView<TTokenizer>(languageTokenizer);
  13689. - Span = new SpanBuilder(CurrentLocation);
  13690. + SpanContext = new SpanContextBuilder();
  13691. }
  13692. - protected ParserState ParserState { get; set; }
  13693. + protected SyntaxListPool Pool => _pool;
  13694. - protected SpanBuilder Span { get; private set; }
  13695. + protected SyntaxListBuilder<SyntaxToken> TokenBuilder
  13696. + {
  13697. + get
  13698. + {
  13699. + if (_tokenBuilder == null)
  13700. + {
  13701. + var result = _pool.Allocate<SyntaxToken>();
  13702. + _tokenBuilder = result.Builder;
  13703. + }
  13704. - protected Action<SpanBuilder> SpanConfig { get; set; }
  13705. + return _tokenBuilder.Value;
  13706. + }
  13707. + }
  13708. +
  13709. + protected SpanContextBuilder SpanContext { get; private set; }
  13710. +
  13711. + protected Action<SpanContextBuilder> SpanContextConfig { get; set; }
  13712. protected SyntaxToken CurrentToken
  13713. {
  13714. @@ -37,8 +53,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  13715. protected SyntaxToken PreviousToken { get; private set; }
  13716. - protected SourceLocation CurrentLocation => _tokenizer.Tokenizer.CurrentLocation;
  13717. -
  13718. protected SourceLocation CurrentStart => _tokenizer.Tokenizer.CurrentStart;
  13719. protected bool EndOfFile
  13720. @@ -48,28 +62,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  13721. protected LanguageCharacteristics<TTokenizer> Language { get; }
  13722. - protected virtual void HandleEmbeddedTransition()
  13723. - {
  13724. - }
  13725. -
  13726. - protected virtual bool IsAtEmbeddedTransition(bool allowTemplatesAndComments, bool allowTransitions)
  13727. - {
  13728. - return false;
  13729. - }
  13730. -
  13731. - public override void BuildSpan(SpanBuilder span, SourceLocation start, string content)
  13732. - {
  13733. - foreach (var token in Language.TokenizeString(start, content))
  13734. - {
  13735. - span.Accept(token);
  13736. - }
  13737. - }
  13738. -
  13739. - protected void Initialize(SpanBuilder span)
  13740. - {
  13741. - SpanConfig?.Invoke(span);
  13742. - }
  13743. -
  13744. protected SyntaxToken Lookahead(int count)
  13745. {
  13746. if (count < 0)
  13747. @@ -163,11 +155,9 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  13748. [Conditional("DEBUG")]
  13749. internal void Assert(SyntaxKind expectedType)
  13750. {
  13751. - Debug.Assert(!EndOfFile && TokenKindEquals(CurrentToken.Kind, expectedType));
  13752. + Debug.Assert(!EndOfFile && CurrentToken.Kind == expectedType);
  13753. }
  13754. - protected abstract bool TokenKindEquals(SyntaxKind x, SyntaxKind y);
  13755. -
  13756. protected internal void PutBack(SyntaxToken token)
  13757. {
  13758. if (token != null)
  13759. @@ -203,96 +193,14 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  13760. }
  13761. }
  13762. - protected internal bool Balance(BalancingModes mode)
  13763. - {
  13764. - var left = CurrentToken.Kind;
  13765. - var right = Language.FlipBracket(left);
  13766. - var start = CurrentStart;
  13767. - AcceptAndMoveNext();
  13768. - if (EndOfFile && ((mode & BalancingModes.NoErrorOnFailure) != BalancingModes.NoErrorOnFailure))
  13769. - {
  13770. - Context.ErrorSink.OnError(
  13771. - RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF(
  13772. - new SourceSpan(start, contentLength: 1 /* { OR } */),
  13773. - Language.GetSample(left),
  13774. - Language.GetSample(right)));
  13775. - }
  13776. -
  13777. - return Balance(mode, left, right, start);
  13778. - }
  13779. -
  13780. - protected internal bool Balance(BalancingModes mode, SyntaxKind left, SyntaxKind right, SourceLocation start)
  13781. - {
  13782. - var startPosition = CurrentStart.AbsoluteIndex;
  13783. - var nesting = 1;
  13784. - if (!EndOfFile)
  13785. - {
  13786. - var tokens = new List<SyntaxToken>();
  13787. - do
  13788. - {
  13789. - if (IsAtEmbeddedTransition(
  13790. - (mode & BalancingModes.AllowCommentsAndTemplates) == BalancingModes.AllowCommentsAndTemplates,
  13791. - (mode & BalancingModes.AllowEmbeddedTransitions) == BalancingModes.AllowEmbeddedTransitions))
  13792. - {
  13793. - Accept(tokens);
  13794. - tokens.Clear();
  13795. - HandleEmbeddedTransition();
  13796. -
  13797. - // Reset backtracking since we've already outputted some spans.
  13798. - startPosition = CurrentStart.AbsoluteIndex;
  13799. - }
  13800. - if (At(left))
  13801. - {
  13802. - nesting++;
  13803. - }
  13804. - else if (At(right))
  13805. - {
  13806. - nesting--;
  13807. - }
  13808. - if (nesting > 0)
  13809. - {
  13810. - tokens.Add(CurrentToken);
  13811. - }
  13812. - }
  13813. - while (nesting > 0 && NextToken());
  13814. -
  13815. - if (nesting > 0)
  13816. - {
  13817. - if ((mode & BalancingModes.NoErrorOnFailure) != BalancingModes.NoErrorOnFailure)
  13818. - {
  13819. - Context.ErrorSink.OnError(
  13820. - RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF(
  13821. - new SourceSpan(start, contentLength: 1 /* { OR } */),
  13822. - Language.GetSample(left),
  13823. - Language.GetSample(right)));
  13824. - }
  13825. - if ((mode & BalancingModes.BacktrackOnFailure) == BalancingModes.BacktrackOnFailure)
  13826. - {
  13827. - Context.Source.Position = startPosition;
  13828. - NextToken();
  13829. - }
  13830. - else
  13831. - {
  13832. - Accept(tokens);
  13833. - }
  13834. - }
  13835. - else
  13836. - {
  13837. - // Accept all the tokens we saw
  13838. - Accept(tokens);
  13839. - }
  13840. - }
  13841. - return nesting == 0;
  13842. - }
  13843. -
  13844. protected internal bool NextIs(SyntaxKind type)
  13845. {
  13846. - return NextIs(token => token != null && TokenKindEquals(type, token.Kind));
  13847. + return NextIs(token => token != null && type == token.Kind);
  13848. }
  13849. protected internal bool NextIs(params SyntaxKind[] types)
  13850. {
  13851. - return NextIs(token => token != null && types.Any(t => TokenKindEquals(t, token.Kind)));
  13852. + return NextIs(token => token != null && types.Any(t => t == token.Kind));
  13853. }
  13854. protected internal bool NextIs(Func<SyntaxToken, bool> condition)
  13855. @@ -317,225 +225,179 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  13856. protected internal bool Was(SyntaxKind type)
  13857. {
  13858. - return PreviousToken != null && TokenKindEquals(PreviousToken.Kind, type);
  13859. + return PreviousToken != null && PreviousToken.Kind == type;
  13860. }
  13861. protected internal bool At(SyntaxKind type)
  13862. {
  13863. - return !EndOfFile && CurrentToken != null && TokenKindEquals(CurrentToken.Kind, type);
  13864. + return !EndOfFile && CurrentToken != null && CurrentToken.Kind == type;
  13865. }
  13866. - protected internal bool AcceptAndMoveNext()
  13867. - {
  13868. - Accept(CurrentToken);
  13869. - return NextToken();
  13870. - }
  13871. -
  13872. - protected SyntaxToken AcceptSingleWhiteSpaceCharacter()
  13873. + protected bool EnsureCurrent()
  13874. {
  13875. - if (Language.IsWhiteSpace(CurrentToken))
  13876. + if (CurrentToken == null)
  13877. {
  13878. - var pair = Language.SplitToken(CurrentToken, 1, Language.GetKnownTokenType(KnownTokenType.WhiteSpace));
  13879. - Accept(pair.Item1);
  13880. - Span.EditHandler.AcceptedCharacters = AcceptedCharactersInternal.None;
  13881. - NextToken();
  13882. - return pair.Item2;
  13883. + return NextToken();
  13884. }
  13885. - return null;
  13886. - }
  13887. - protected internal void Accept(IEnumerable<SyntaxToken> tokens)
  13888. - {
  13889. - foreach (var token in tokens)
  13890. - {
  13891. - Accept(token);
  13892. - }
  13893. + return true;
  13894. }
  13895. - protected internal void Accept(SyntaxToken token)
  13896. + protected internal IEnumerable<SyntaxToken> ReadWhile(Func<SyntaxToken, bool> condition)
  13897. {
  13898. - if (token != null)
  13899. - {
  13900. - foreach (var error in token.GetDiagnostics())
  13901. - {
  13902. - Context.ErrorSink.OnError(error);
  13903. - }
  13904. -
  13905. - Span.Accept(token);
  13906. - }
  13907. + return ReadWhileLazy(condition).ToList();
  13908. }
  13909. - protected internal bool AcceptAll(params SyntaxKind[] kinds)
  13910. + protected bool AtIdentifier(bool allowKeywords)
  13911. {
  13912. - foreach (var kind in kinds)
  13913. - {
  13914. - if (CurrentToken == null || !TokenKindEquals(CurrentToken.Kind, kind))
  13915. - {
  13916. - return false;
  13917. - }
  13918. - AcceptAndMoveNext();
  13919. - }
  13920. - return true;
  13921. + return CurrentToken != null &&
  13922. + (Language.IsIdentifier(CurrentToken) ||
  13923. + (allowKeywords && Language.IsKeyword(CurrentToken)));
  13924. }
  13925. - protected internal void AddMarkerTokenIfNecessary()
  13926. + // Don't open this to sub classes because it's lazy but it looks eager.
  13927. + // You have to advance the Enumerable to read the next characters.
  13928. + internal IEnumerable<SyntaxToken> ReadWhileLazy(Func<SyntaxToken, bool> condition)
  13929. {
  13930. - if (Span.Tokens.Count == 0 && Context.Builder.LastAcceptedCharacters != AcceptedCharactersInternal.Any)
  13931. + while (EnsureCurrent() && condition(CurrentToken))
  13932. {
  13933. - Accept(Language.CreateMarkerToken());
  13934. + yield return CurrentToken;
  13935. + NextToken();
  13936. }
  13937. }
  13938. - protected internal void Output(SpanKindInternal kind, SyntaxKind syntaxKind = SyntaxKind.Unknown)
  13939. + protected RazorCommentBlockSyntax ParseRazorComment()
  13940. {
  13941. - Configure(kind, null);
  13942. - Output(syntaxKind);
  13943. - }
  13944. -
  13945. - protected internal void Output(SpanKindInternal kind, AcceptedCharactersInternal accepts, SyntaxKind syntaxKind = SyntaxKind.Unknown)
  13946. - {
  13947. - Configure(kind, accepts);
  13948. - Output(syntaxKind);
  13949. - }
  13950. -
  13951. - protected internal void Output(AcceptedCharactersInternal accepts, SyntaxKind syntaxKind = SyntaxKind.Unknown)
  13952. - {
  13953. - Configure(null, accepts);
  13954. - Output(syntaxKind);
  13955. - }
  13956. -
  13957. - private void Output(SyntaxKind syntaxKind)
  13958. - {
  13959. - if (Span.Tokens.Count > 0)
  13960. + if (!Language.KnowsTokenType(KnownTokenType.CommentStart) ||
  13961. + !Language.KnowsTokenType(KnownTokenType.CommentStar) ||
  13962. + !Language.KnowsTokenType(KnownTokenType.CommentBody))
  13963. {
  13964. - var nextStart = Span.End;
  13965. -
  13966. - var builtSpan = Span.Build(syntaxKind);
  13967. - Context.Builder.Add(builtSpan);
  13968. - Initialize(Span);
  13969. -
  13970. - // Ensure spans are contiguous.
  13971. - //
  13972. - // Note: Using Span.End here to avoid CurrentLocation. CurrentLocation will
  13973. - // vary depending on what tokens have been read. We often read a token and *then*
  13974. - // make a decision about whether to include it in the current span.
  13975. - Span.Start = nextStart;
  13976. + throw new InvalidOperationException(Resources.Language_Does_Not_Support_RazorComment);
  13977. }
  13978. - }
  13979. -
  13980. - protected IDisposable PushSpanConfig()
  13981. - {
  13982. - return PushSpanConfig(newConfig: (Action<SpanBuilder, Action<SpanBuilder>>)null);
  13983. - }
  13984. - protected IDisposable PushSpanConfig(Action<SpanBuilder> newConfig)
  13985. - {
  13986. - return PushSpanConfig(newConfig == null ? (Action<SpanBuilder, Action<SpanBuilder>>)null : (span, _) => newConfig(span));
  13987. - }
  13988. + RazorCommentBlockSyntax commentBlock;
  13989. + using (PushSpanContextConfig(CommentSpanContextConfig))
  13990. + {
  13991. + EnsureCurrent();
  13992. + var start = CurrentStart;
  13993. + Debug.Assert(At(SyntaxKind.RazorCommentTransition));
  13994. + var startTransition = EatExpectedToken(SyntaxKind.RazorCommentTransition);
  13995. + var startStar = EatExpectedToken(SyntaxKind.RazorCommentStar);
  13996. + var comment = GetOptionalToken(SyntaxKind.RazorCommentLiteral);
  13997. + if (comment == null)
  13998. + {
  13999. + comment = SyntaxFactory.MissingToken(SyntaxKind.RazorCommentLiteral);
  14000. + }
  14001. + var endStar = GetOptionalToken(SyntaxKind.RazorCommentStar);
  14002. + if (endStar == null)
  14003. + {
  14004. + var diagnostic = RazorDiagnosticFactory.CreateParsing_RazorCommentNotTerminated(
  14005. + new SourceSpan(start, contentLength: 2 /* @* */));
  14006. + endStar = SyntaxFactory.MissingToken(SyntaxKind.RazorCommentStar, diagnostic);
  14007. + Context.ErrorSink.OnError(diagnostic);
  14008. + }
  14009. + var endTransition = GetOptionalToken(SyntaxKind.RazorCommentTransition);
  14010. + if (endTransition == null)
  14011. + {
  14012. + if (!endStar.IsMissing)
  14013. + {
  14014. + var diagnostic = RazorDiagnosticFactory.CreateParsing_RazorCommentNotTerminated(
  14015. + new SourceSpan(start, contentLength: 2 /* @* */));
  14016. + Context.ErrorSink.OnError(diagnostic);
  14017. + endTransition = SyntaxFactory.MissingToken(SyntaxKind.RazorCommentTransition, diagnostic);
  14018. + }
  14019. - protected IDisposable PushSpanConfig(Action<SpanBuilder, Action<SpanBuilder>> newConfig)
  14020. - {
  14021. - var old = SpanConfig;
  14022. - ConfigureSpan(newConfig);
  14023. - return new DisposableAction(() => SpanConfig = old);
  14024. - }
  14025. + endTransition = SyntaxFactory.MissingToken(SyntaxKind.RazorCommentTransition);
  14026. + }
  14027. - protected void ConfigureSpan(Action<SpanBuilder> config)
  14028. - {
  14029. - SpanConfig = config;
  14030. - Initialize(Span);
  14031. - }
  14032. + commentBlock = SyntaxFactory.RazorCommentBlock(startTransition, startStar, comment, endStar, endTransition);
  14033. - protected void ConfigureSpan(Action<SpanBuilder, Action<SpanBuilder>> config)
  14034. - {
  14035. - var prev = SpanConfig;
  14036. - if (config == null)
  14037. - {
  14038. - SpanConfig = null;
  14039. - }
  14040. - else
  14041. - {
  14042. - SpanConfig = span => config(span, prev);
  14043. + // Make sure we generate a marker symbol after a comment if necessary.
  14044. + if (!comment.IsMissing || !endStar.IsMissing || !endTransition.IsMissing)
  14045. + {
  14046. + Context.LastAcceptedCharacters = AcceptedCharactersInternal.None;
  14047. + }
  14048. }
  14049. - Initialize(Span);
  14050. - }
  14051. - protected internal void Expected(KnownTokenType type)
  14052. - {
  14053. - Expected(Language.GetKnownTokenType(type));
  14054. + InitializeContext(SpanContext);
  14055. +
  14056. + return commentBlock;
  14057. }
  14058. - protected internal void Expected(params SyntaxKind[] types)
  14059. + private void CommentSpanContextConfig(SpanContextBuilder spanContext)
  14060. {
  14061. - Debug.Assert(!EndOfFile && CurrentToken != null && types.Contains(CurrentToken.Kind));
  14062. - AcceptAndMoveNext();
  14063. + spanContext.ChunkGenerator = SpanChunkGenerator.Null;
  14064. + spanContext.EditHandler = SpanEditHandler.CreateDefault(Language.TokenizeString);
  14065. }
  14066. - protected internal bool Optional(KnownTokenType type)
  14067. + protected SyntaxToken EatCurrentToken()
  14068. {
  14069. - return Optional(Language.GetKnownTokenType(type));
  14070. + Debug.Assert(!EndOfFile && CurrentToken != null);
  14071. + var token = CurrentToken;
  14072. + NextToken();
  14073. + return token;
  14074. }
  14075. - protected internal bool Optional(SyntaxKind type)
  14076. + protected SyntaxToken EatExpectedToken(params SyntaxKind[] kinds)
  14077. {
  14078. - if (At(type))
  14079. - {
  14080. - AcceptAndMoveNext();
  14081. - return true;
  14082. - }
  14083. - return false;
  14084. + Debug.Assert(!EndOfFile && CurrentToken != null && kinds.Contains(CurrentToken.Kind));
  14085. + var token = CurrentToken;
  14086. + NextToken();
  14087. + return token;
  14088. }
  14089. - protected bool EnsureCurrent()
  14090. + protected SyntaxToken GetOptionalToken(SyntaxKind kind)
  14091. {
  14092. - if (CurrentToken == null)
  14093. + if (At(kind))
  14094. {
  14095. - return NextToken();
  14096. + var token = CurrentToken;
  14097. + NextToken();
  14098. + return token;
  14099. }
  14100. - return true;
  14101. + return null;
  14102. }
  14103. protected internal void AcceptWhile(SyntaxKind type)
  14104. {
  14105. - AcceptWhile(token => TokenKindEquals(type, token.Kind));
  14106. + AcceptWhile(token => type == token.Kind);
  14107. }
  14108. // We want to avoid array allocations and enumeration where possible, so we use the same technique as string.Format
  14109. protected internal void AcceptWhile(SyntaxKind type1, SyntaxKind type2)
  14110. {
  14111. - AcceptWhile(token => TokenKindEquals(type1, token.Kind) || TokenKindEquals(type2, token.Kind));
  14112. + AcceptWhile(token => type1 == token.Kind || type2 == token.Kind);
  14113. }
  14114. protected internal void AcceptWhile(SyntaxKind type1, SyntaxKind type2, SyntaxKind type3)
  14115. {
  14116. - AcceptWhile(token => TokenKindEquals(type1, token.Kind) || TokenKindEquals(type2, token.Kind) || TokenKindEquals(type3, token.Kind));
  14117. + AcceptWhile(token => type1 == token.Kind || type2 == token.Kind || type3 == token.Kind);
  14118. }
  14119. protected internal void AcceptWhile(params SyntaxKind[] types)
  14120. {
  14121. - AcceptWhile(token => types.Any(expected => TokenKindEquals(expected, token.Kind)));
  14122. + AcceptWhile(token => types.Any(expected => expected == token.Kind));
  14123. }
  14124. protected internal void AcceptUntil(SyntaxKind type)
  14125. {
  14126. - AcceptWhile(token => !TokenKindEquals(type, token.Kind));
  14127. + AcceptWhile(token => type != token.Kind);
  14128. }
  14129. // We want to avoid array allocations and enumeration where possible, so we use the same technique as string.Format
  14130. protected internal void AcceptUntil(SyntaxKind type1, SyntaxKind type2)
  14131. {
  14132. - AcceptWhile(token => !TokenKindEquals(type1, token.Kind) && !TokenKindEquals(type2, token.Kind));
  14133. + AcceptWhile(token => type1 != token.Kind && type2 != token.Kind);
  14134. }
  14135. protected internal void AcceptUntil(SyntaxKind type1, SyntaxKind type2, SyntaxKind type3)
  14136. {
  14137. - AcceptWhile(token => !TokenKindEquals(type1, token.Kind) && !TokenKindEquals(type2, token.Kind) && !TokenKindEquals(type3, token.Kind));
  14138. + AcceptWhile(token => type1 != token.Kind && type2 != token.Kind && type3 != token.Kind);
  14139. }
  14140. protected internal void AcceptUntil(params SyntaxKind[] types)
  14141. {
  14142. - AcceptWhile(token => types.All(expected => !TokenKindEquals(expected, token.Kind)));
  14143. + AcceptWhile(token => types.All(expected => expected != token.Kind));
  14144. }
  14145. protected internal void AcceptWhile(Func<SyntaxToken, bool> condition)
  14146. @@ -543,15 +405,62 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  14147. Accept(ReadWhileLazy(condition));
  14148. }
  14149. - protected internal IEnumerable<SyntaxToken> ReadWhile(Func<SyntaxToken, bool> condition)
  14150. + protected internal void Accept(IEnumerable<SyntaxToken> tokens)
  14151. {
  14152. - return ReadWhileLazy(condition).ToList();
  14153. + foreach (var token in tokens)
  14154. + {
  14155. + foreach (var error in token.GetDiagnostics())
  14156. + {
  14157. + Context.ErrorSink.OnError(error);
  14158. + }
  14159. +
  14160. + TokenBuilder.Add(token);
  14161. + }
  14162. + }
  14163. +
  14164. + protected internal void Accept(SyntaxToken token)
  14165. + {
  14166. + if (token != null)
  14167. + {
  14168. + foreach (var error in token.GetDiagnostics())
  14169. + {
  14170. + Context.ErrorSink.OnError(error);
  14171. + }
  14172. +
  14173. + TokenBuilder.Add(token);
  14174. + }
  14175. }
  14176. - protected SyntaxToken AcceptWhiteSpaceInLines()
  14177. + protected internal bool AcceptAll(params SyntaxKind[] kinds)
  14178. + {
  14179. + foreach (var kind in kinds)
  14180. + {
  14181. + if (CurrentToken == null || CurrentToken.Kind != kind)
  14182. + {
  14183. + return false;
  14184. + }
  14185. + AcceptAndMoveNext();
  14186. + }
  14187. + return true;
  14188. + }
  14189. +
  14190. + protected internal bool AcceptAndMoveNext()
  14191. + {
  14192. + Accept(CurrentToken);
  14193. + return NextToken();
  14194. + }
  14195. +
  14196. + protected SyntaxList<SyntaxToken> Output()
  14197. + {
  14198. + var list = TokenBuilder.ToList();
  14199. + TokenBuilder.Clear();
  14200. + return list;
  14201. + }
  14202. +
  14203. + protected SyntaxToken AcceptWhitespaceInLines()
  14204. {
  14205. SyntaxToken lastWs = null;
  14206. - while (Language.IsWhiteSpace(CurrentToken) || Language.IsNewLine(CurrentToken))
  14207. + while (Language.IsWhitespace(CurrentToken) || Language.IsNewLine(CurrentToken))
  14208. {
  14209. // Capture the previous whitespace node
  14210. if (lastWs != null)
  14211. @@ -559,7 +468,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  14212. Accept(lastWs);
  14213. }
  14214. - if (Language.IsWhiteSpace(CurrentToken))
  14215. + if (Language.IsWhitespace(CurrentToken))
  14216. {
  14217. lastWs = CurrentToken;
  14218. }
  14219. @@ -570,108 +479,116 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  14220. lastWs = null;
  14221. }
  14222. - _tokenizer.Next();
  14223. + NextToken();
  14224. }
  14225. +
  14226. return lastWs;
  14227. }
  14228. - protected bool AtIdentifier(bool allowKeywords)
  14229. + protected internal bool TryAccept(SyntaxKind type)
  14230. {
  14231. - return CurrentToken != null &&
  14232. - (Language.IsIdentifier(CurrentToken) ||
  14233. - (allowKeywords && Language.IsKeyword(CurrentToken)));
  14234. + if (At(type))
  14235. + {
  14236. + AcceptAndMoveNext();
  14237. + return true;
  14238. + }
  14239. + return false;
  14240. }
  14241. - // Don't open this to sub classes because it's lazy but it looks eager.
  14242. - // You have to advance the Enumerable to read the next characters.
  14243. - internal IEnumerable<SyntaxToken> ReadWhileLazy(Func<SyntaxToken, bool> condition)
  14244. + protected internal void AcceptMarkerTokenIfNecessary()
  14245. {
  14246. - while (EnsureCurrent() && condition(CurrentToken))
  14247. + if (TokenBuilder.Count == 0 && Context.LastAcceptedCharacters != AcceptedCharactersInternal.Any)
  14248. {
  14249. - yield return CurrentToken;
  14250. - NextToken();
  14251. + Accept(Language.CreateMarkerToken());
  14252. }
  14253. }
  14254. - private void Configure(SpanKindInternal? kind, AcceptedCharactersInternal? accepts)
  14255. + protected MarkupTextLiteralSyntax OutputAsMarkupLiteral()
  14256. {
  14257. - if (kind != null)
  14258. + var tokens = Output();
  14259. + if (tokens.Count == 0)
  14260. {
  14261. - Span.Kind = kind.Value;
  14262. + return null;
  14263. }
  14264. - if (accepts != null)
  14265. +
  14266. + return GetNodeWithSpanContext(SyntaxFactory.MarkupTextLiteral(tokens));
  14267. + }
  14268. +
  14269. + protected MarkupEphemeralTextLiteralSyntax OutputAsMarkupEphemeralLiteral()
  14270. + {
  14271. + var tokens = Output();
  14272. + if (tokens.Count == 0)
  14273. {
  14274. - Span.EditHandler.AcceptedCharacters = accepts.Value;
  14275. + return null;
  14276. }
  14277. +
  14278. + return GetNodeWithSpanContext(SyntaxFactory.MarkupEphemeralTextLiteral(tokens));
  14279. }
  14280. - protected virtual void OutputSpanBeforeRazorComment()
  14281. + protected RazorMetaCodeSyntax OutputAsMetaCode(SyntaxList<SyntaxToken> tokens, AcceptedCharactersInternal? accepted = null)
  14282. {
  14283. - throw new InvalidOperationException(Resources.Language_Does_Not_Support_RazorComment);
  14284. + if (tokens.Count == 0)
  14285. + {
  14286. + return null;
  14287. + }
  14288. +
  14289. + var metacode = SyntaxFactory.RazorMetaCode(tokens);
  14290. + SpanContext.ChunkGenerator = SpanChunkGenerator.Null;
  14291. + SpanContext.EditHandler.AcceptedCharacters = accepted ?? AcceptedCharactersInternal.None;
  14292. +
  14293. + return GetNodeWithSpanContext(metacode);
  14294. }
  14295. - private void CommentSpanConfig(SpanBuilder span)
  14296. + protected TNode GetNodeWithSpanContext<TNode>(TNode node) where TNode : Syntax.GreenNode
  14297. {
  14298. - span.ChunkGenerator = SpanChunkGenerator.Null;
  14299. - span.EditHandler = SpanEditHandler.CreateDefault(Language.TokenizeString);
  14300. + var spanContext = SpanContext.Build();
  14301. + Context.LastAcceptedCharacters = spanContext.EditHandler.AcceptedCharacters;
  14302. + InitializeContext(SpanContext);
  14303. + var annotation = new Syntax.SyntaxAnnotation(SyntaxConstants.SpanContextKind, spanContext);
  14304. +
  14305. + return (TNode)node.SetAnnotations(new[] { annotation });
  14306. }
  14307. - protected void RazorComment()
  14308. + protected IDisposable PushSpanContextConfig()
  14309. {
  14310. - if (!Language.KnowsTokenType(KnownTokenType.CommentStart) ||
  14311. - !Language.KnowsTokenType(KnownTokenType.CommentStar) ||
  14312. - !Language.KnowsTokenType(KnownTokenType.CommentBody))
  14313. - {
  14314. - throw new InvalidOperationException(Resources.Language_Does_Not_Support_RazorComment);
  14315. - }
  14316. - OutputSpanBeforeRazorComment();
  14317. - using (PushSpanConfig(CommentSpanConfig))
  14318. - {
  14319. - using (Context.Builder.StartBlock(BlockKindInternal.Comment))
  14320. - {
  14321. - Context.Builder.CurrentBlock.ChunkGenerator = new RazorCommentChunkGenerator();
  14322. - var start = CurrentStart;
  14323. -
  14324. - Expected(KnownTokenType.CommentStart);
  14325. - Output(SpanKindInternal.Transition, AcceptedCharactersInternal.None);
  14326. + return PushSpanContextConfig(newConfig: (Action<SpanContextBuilder, Action<SpanContextBuilder>>)null);
  14327. + }
  14328. - Expected(KnownTokenType.CommentStar);
  14329. - Output(SpanKindInternal.MetaCode, AcceptedCharactersInternal.None);
  14330. + protected IDisposable PushSpanContextConfig(Action<SpanContextBuilder> newConfig)
  14331. + {
  14332. + return PushSpanContextConfig(newConfig == null ? (Action<SpanContextBuilder, Action<SpanContextBuilder>>)null : (span, _) => newConfig(span));
  14333. + }
  14334. - Optional(KnownTokenType.CommentBody);
  14335. - AddMarkerTokenIfNecessary();
  14336. - Output(SpanKindInternal.Comment);
  14337. + protected IDisposable PushSpanContextConfig(Action<SpanContextBuilder, Action<SpanContextBuilder>> newConfig)
  14338. + {
  14339. + var old = SpanContextConfig;
  14340. + ConfigureSpanContext(newConfig);
  14341. + return new DisposableAction(() => SpanContextConfig = old);
  14342. + }
  14343. - var errorReported = false;
  14344. - if (!Optional(KnownTokenType.CommentStar))
  14345. - {
  14346. - errorReported = true;
  14347. - Context.ErrorSink.OnError(
  14348. - RazorDiagnosticFactory.CreateParsing_RazorCommentNotTerminated(
  14349. - new SourceSpan(start, contentLength: 2 /* @* */)));
  14350. - }
  14351. - else
  14352. - {
  14353. - Output(SpanKindInternal.MetaCode, AcceptedCharactersInternal.None);
  14354. - }
  14355. + protected void ConfigureSpanContext(Action<SpanContextBuilder> config)
  14356. + {
  14357. + SpanContextConfig = config;
  14358. + InitializeContext(SpanContext);
  14359. + }
  14360. - if (!Optional(KnownTokenType.CommentStart))
  14361. - {
  14362. - if (!errorReported)
  14363. - {
  14364. - errorReported = true;
  14365. - Context.ErrorSink.OnError(
  14366. - RazorDiagnosticFactory.CreateParsing_RazorCommentNotTerminated(
  14367. - new SourceSpan(start, contentLength: 2 /* @* */)));
  14368. - }
  14369. - }
  14370. - else
  14371. - {
  14372. - Output(SpanKindInternal.Transition, AcceptedCharactersInternal.None);
  14373. - }
  14374. - }
  14375. + protected void ConfigureSpanContext(Action<SpanContextBuilder, Action<SpanContextBuilder>> config)
  14376. + {
  14377. + var prev = SpanContextConfig;
  14378. + if (config == null)
  14379. + {
  14380. + SpanContextConfig = null;
  14381. + }
  14382. + else
  14383. + {
  14384. + SpanContextConfig = span => config(span, prev);
  14385. }
  14386. - Initialize(Span);
  14387. + InitializeContext(SpanContext);
  14388. + }
  14389. +
  14390. + protected void InitializeContext(SpanContextBuilder spanContext)
  14391. + {
  14392. + SpanContextConfig?.Invoke(spanContext);
  14393. }
  14394. }
  14395. }
  14396. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/WhiteSpaceRewriter.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/WhiteSpaceRewriter.cs
  14397. index cf71b0a0243..af20b925f1f 100644
  14398. --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/WhiteSpaceRewriter.cs
  14399. +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/WhiteSpaceRewriter.cs
  14400. @@ -1,41 +1,70 @@
  14401. -// Copyright (c) .NET Foundation. All rights reserved.
  14402. +// Copyright (c) .NET Foundation. All rights reserved.
  14403. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  14404. -using System.Collections.Generic;
  14405. using System.Linq;
  14406. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  14407. namespace Microsoft.AspNetCore.Razor.Language.Legacy
  14408. {
  14409. - internal class WhiteSpaceRewriter : MarkupRewriter
  14410. + internal class WhitespaceRewriter : SyntaxRewriter
  14411. {
  14412. - protected override bool CanRewrite(Block block)
  14413. + public override SyntaxNode Visit(SyntaxNode node)
  14414. {
  14415. - return block.Type == BlockKindInternal.Expression && Parent != null;
  14416. + if (node == null)
  14417. + {
  14418. + return base.Visit(node);
  14419. + }
  14420. +
  14421. + var children = node.ChildNodes();
  14422. + for (var i = 0; i < children.Count; i++)
  14423. + {
  14424. + var child = children[i];
  14425. + if (child is CSharpCodeBlockSyntax codeBlock &&
  14426. + TryRewriteWhitespace(codeBlock, out var rewritten, out var whitespaceLiteral))
  14427. + {
  14428. + // Replace the existing code block with the whitespace literal
  14429. + // followed by the rewritten code block (with the code whitespace removed).
  14430. + node = node.ReplaceNode(codeBlock, new SyntaxNode[] { whitespaceLiteral, rewritten });
  14431. +
  14432. + // Since we replaced node, its children are different. Update our collection.
  14433. + children = node.ChildNodes();
  14434. + }
  14435. + }
  14436. +
  14437. + return base.Visit(node);
  14438. }
  14439. - protected override SyntaxTreeNode RewriteBlock(BlockBuilder parent, Block block)
  14440. + private bool TryRewriteWhitespace(CSharpCodeBlockSyntax codeBlock, out CSharpCodeBlockSyntax rewritten, out SyntaxNode whitespaceLiteral)
  14441. {
  14442. - var newBlock = new BlockBuilder(block);
  14443. - newBlock.Children.Clear();
  14444. - var ws = block.Children.FirstOrDefault() as Span;
  14445. - IEnumerable<SyntaxTreeNode> newNodes = block.Children;
  14446. - if (ws.Content.All(char.IsWhiteSpace))
  14447. + // Rewrite any whitespace represented as code at the start of a line preceding an expression block.
  14448. + // We want it to be rendered as Markup.
  14449. +
  14450. + rewritten = null;
  14451. + whitespaceLiteral = null;
  14452. + var children = codeBlock.ChildNodes();
  14453. + if (children.Count < 2)
  14454. {
  14455. - // Add this node to the parent
  14456. - var builder = new SpanBuilder(ws);
  14457. - builder.ClearTokens();
  14458. - FillSpan(builder, ws.Start, ws.Content);
  14459. - parent.Children.Add(builder.Build());
  14460. -
  14461. - // Remove the old whitespace node
  14462. - newNodes = block.Children.Skip(1);
  14463. + return false;
  14464. }
  14465. - foreach (SyntaxTreeNode node in newNodes)
  14466. + if (children[0] is CSharpStatementLiteralSyntax literal &&
  14467. + (children[1] is CSharpExplicitExpressionSyntax || children[1] is CSharpImplicitExpressionSyntax))
  14468. {
  14469. - newBlock.Children.Add(node);
  14470. + var containsNonWhitespace = literal.DescendantNodes()
  14471. + .Where(n => n.IsToken)
  14472. + .Cast<SyntaxToken>()
  14473. + .Any(t => !string.IsNullOrWhiteSpace(t.Content));
  14474. +
  14475. + if (!containsNonWhitespace)
  14476. + {
  14477. + // Literal node is all whitespace. Can rewrite.
  14478. + whitespaceLiteral = SyntaxFactory.MarkupTextLiteral(literal.LiteralTokens);
  14479. + rewritten = codeBlock.ReplaceNode(literal, newNode: null);
  14480. + return true;
  14481. + }
  14482. }
  14483. - return newBlock.Build();
  14484. +
  14485. + return false;
  14486. }
  14487. }
  14488. }
  14489. diff --git a/src/Microsoft.AspNetCore.Razor.Language/RazorSyntaxTree.cs b/src/Microsoft.AspNetCore.Razor.Language/RazorSyntaxTree.cs
  14490. index 55a32ba1d37..340129b2aa5 100644
  14491. --- a/src/Microsoft.AspNetCore.Razor.Language/RazorSyntaxTree.cs
  14492. +++ b/src/Microsoft.AspNetCore.Razor.Language/RazorSyntaxTree.cs
  14493. @@ -4,13 +4,14 @@
  14494. using System;
  14495. using System.Collections.Generic;
  14496. using Microsoft.AspNetCore.Razor.Language.Legacy;
  14497. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  14498. namespace Microsoft.AspNetCore.Razor.Language
  14499. {
  14500. public abstract class RazorSyntaxTree
  14501. {
  14502. internal static RazorSyntaxTree Create(
  14503. - Block root,
  14504. + SyntaxNode root,
  14505. RazorSourceDocument source,
  14506. IEnumerable<RazorDiagnostic> diagnostics,
  14507. RazorParserOptions options)
  14508. @@ -63,7 +64,7 @@ namespace Microsoft.AspNetCore.Razor.Language
  14509. public abstract RazorParserOptions Options { get; }
  14510. - internal abstract Block Root { get; }
  14511. + internal abstract SyntaxNode Root { get; }
  14512. public abstract RazorSourceDocument Source { get; }
  14513. }
  14514. diff --git a/src/Microsoft.AspNetCore.Razor.Language/SourceChange.cs b/src/Microsoft.AspNetCore.Razor.Language/SourceChange.cs
  14515. index 75e4b8e44e4..bc5d96312f4 100644
  14516. --- a/src/Microsoft.AspNetCore.Razor.Language/SourceChange.cs
  14517. +++ b/src/Microsoft.AspNetCore.Razor.Language/SourceChange.cs
  14518. @@ -3,6 +3,7 @@
  14519. using System;
  14520. using Microsoft.AspNetCore.Razor.Language.Legacy;
  14521. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  14522. using Microsoft.Extensions.Internal;
  14523. namespace Microsoft.AspNetCore.Razor.Language
  14524. @@ -51,15 +52,15 @@ namespace Microsoft.AspNetCore.Razor.Language
  14525. public string NewText { get; }
  14526. - internal string GetEditedContent(Span span)
  14527. + internal string GetEditedContent(SyntaxNode node)
  14528. {
  14529. - if (span == null)
  14530. + if (node == null)
  14531. {
  14532. - throw new ArgumentNullException(nameof(span));
  14533. + throw new ArgumentNullException(nameof(node));
  14534. }
  14535. - var offset = GetOffset(span);
  14536. - return GetEditedContent(span.Content, offset);
  14537. + var offset = GetOffset(node);
  14538. + return GetEditedContent(node.GetContent(), offset);
  14539. }
  14540. internal string GetEditedContent(string text, int offset)
  14541. @@ -72,41 +73,41 @@ namespace Microsoft.AspNetCore.Razor.Language
  14542. return text.Remove(offset, Span.Length).Insert(offset, NewText);
  14543. }
  14544. - internal int GetOffset(Span span)
  14545. + internal int GetOffset(SyntaxNode node)
  14546. {
  14547. - if (span == null)
  14548. + if (node == null)
  14549. {
  14550. - throw new ArgumentNullException(nameof(span));
  14551. + throw new ArgumentNullException(nameof(node));
  14552. }
  14553. var start = Span.AbsoluteIndex;
  14554. var end = Span.AbsoluteIndex + Span.Length;
  14555. - if (start < span.Start.AbsoluteIndex ||
  14556. - start > span.Start.AbsoluteIndex + span.Length ||
  14557. - end < span.Start.AbsoluteIndex ||
  14558. - end > span.Start.AbsoluteIndex + span.Length)
  14559. + if (start < node.Position ||
  14560. + start > node.EndPosition ||
  14561. + end < node.Position ||
  14562. + end > node.EndPosition)
  14563. {
  14564. - throw new InvalidOperationException(Resources.FormatInvalidOperation_SpanIsNotChangeOwner(span, this));
  14565. + throw new InvalidOperationException(Resources.FormatInvalidOperation_SpanIsNotChangeOwner(node, this));
  14566. }
  14567. - return start - span.Start.AbsoluteIndex;
  14568. + return start - node.Position;
  14569. }
  14570. - internal string GetOriginalText(Span span)
  14571. + internal string GetOriginalText(SyntaxNode node)
  14572. {
  14573. - if (span == null)
  14574. + if (node == null)
  14575. {
  14576. - throw new ArgumentNullException(nameof(span));
  14577. + throw new ArgumentNullException(nameof(node));
  14578. }
  14579. - if (span.Length == 0)
  14580. + if (node.FullWidth == 0)
  14581. {
  14582. return string.Empty;
  14583. }
  14584. - var offset = GetOffset(span);
  14585. - return span.Content.Substring(offset, Span.Length);
  14586. + var offset = GetOffset(node);
  14587. + return node.GetContent().Substring(offset, Span.Length);
  14588. }
  14589. public bool Equals(SourceChange other)
  14590. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/ChildSyntaxList.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/ChildSyntaxList.cs
  14591. new file mode 100644
  14592. index 00000000000..5671a5c9f0e
  14593. --- /dev/null
  14594. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/ChildSyntaxList.cs
  14595. @@ -0,0 +1,710 @@
  14596. +// Copyright (c) .NET Foundation. All rights reserved.
  14597. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  14598. +
  14599. +using System;
  14600. +using System.Collections;
  14601. +using System.Collections.Generic;
  14602. +using System.Diagnostics;
  14603. +using System.Linq;
  14604. +using Microsoft.Extensions.Internal;
  14605. +
  14606. +namespace Microsoft.AspNetCore.Razor.Language.Syntax
  14607. +{
  14608. + internal readonly struct ChildSyntaxList : IEquatable<ChildSyntaxList>, IReadOnlyList<SyntaxNode>
  14609. + {
  14610. + private readonly SyntaxNode _node;
  14611. + private readonly int _count;
  14612. +
  14613. + internal ChildSyntaxList(SyntaxNode node)
  14614. + {
  14615. + _node = node;
  14616. + _count = CountNodes(node.Green);
  14617. + }
  14618. +
  14619. + /// <summary>
  14620. + /// Gets the number of children contained in the <see cref="ChildSyntaxList"/>.
  14621. + /// </summary>
  14622. + public int Count
  14623. + {
  14624. + get
  14625. + {
  14626. + return _count;
  14627. + }
  14628. + }
  14629. +
  14630. + internal static int CountNodes(GreenNode green)
  14631. + {
  14632. + var n = 0;
  14633. +
  14634. + for (int i = 0, s = green.SlotCount; i < s; i++)
  14635. + {
  14636. + var child = green.GetSlot(i);
  14637. + if (child != null)
  14638. + {
  14639. + if (!child.IsList)
  14640. + {
  14641. + n++;
  14642. + }
  14643. + else
  14644. + {
  14645. + n += child.SlotCount;
  14646. + }
  14647. + }
  14648. + }
  14649. +
  14650. + return n;
  14651. + }
  14652. +
  14653. + /// <summary>Gets the child at the specified index.</summary>
  14654. + /// <param name="index">The zero-based index of the child to get.</param>
  14655. + /// <exception cref="System.ArgumentOutOfRangeException">
  14656. + /// <paramref name="index"/> is less than 0.-or-<paramref name="index" /> is equal to or greater than <see cref="ChildSyntaxList.Count"/>. </exception>
  14657. + public SyntaxNode this[int index]
  14658. + {
  14659. + get
  14660. + {
  14661. + if (unchecked((uint)index < (uint)_count))
  14662. + {
  14663. + return ItemInternal(_node, index);
  14664. + }
  14665. +
  14666. + throw new ArgumentOutOfRangeException(nameof(index));
  14667. + }
  14668. + }
  14669. +
  14670. + internal SyntaxNode Node
  14671. + {
  14672. + get { return _node; }
  14673. + }
  14674. +
  14675. + private static int Occupancy(GreenNode green)
  14676. + {
  14677. + return green.IsList ? green.SlotCount : 1;
  14678. + }
  14679. +
  14680. + /// <summary>
  14681. + /// internal indexer that does not verify index.
  14682. + /// Used when caller has already ensured that index is within bounds.
  14683. + /// </summary>
  14684. + internal static SyntaxNode ItemInternal(SyntaxNode node, int index)
  14685. + {
  14686. + GreenNode greenChild;
  14687. + var green = node.Green;
  14688. + var idx = index;
  14689. + var slotIndex = 0;
  14690. + var position = node.Position;
  14691. +
  14692. + // find a slot that contains the node or its parent list (if node is in a list)
  14693. + // we will be skipping whole slots here so we will not loop for long
  14694. + //
  14695. + // at the end of this loop we will have
  14696. + // 1) slot index - slotIdx
  14697. + // 2) if the slot is a list, node index in the list - idx
  14698. + // 3) slot position - position
  14699. + while (true)
  14700. + {
  14701. + greenChild = green.GetSlot(slotIndex);
  14702. + if (greenChild != null)
  14703. + {
  14704. + var currentOccupancy = Occupancy(greenChild);
  14705. + if (idx < currentOccupancy)
  14706. + {
  14707. + break;
  14708. + }
  14709. +
  14710. + idx -= currentOccupancy;
  14711. + position += greenChild.FullWidth;
  14712. + }
  14713. +
  14714. + slotIndex++;
  14715. + }
  14716. +
  14717. + // get node that represents this slot
  14718. + var red = node.GetNodeSlot(slotIndex);
  14719. + if (!greenChild.IsList)
  14720. + {
  14721. + // this is a single node
  14722. + // if it is a node, we are done
  14723. + if (red != null)
  14724. + {
  14725. + return red;
  14726. + }
  14727. + }
  14728. + else if (red != null)
  14729. + {
  14730. + // it is a red list of nodes (separated or not), most common case
  14731. + var redChild = red.GetNodeSlot(idx);
  14732. + if (redChild != null)
  14733. + {
  14734. + // this is our node
  14735. + return redChild;
  14736. + }
  14737. + }
  14738. +
  14739. + return node;
  14740. + }
  14741. +
  14742. + /// <summary>
  14743. + /// Locate the node that is a child of the given <see cref="SyntaxNode"/> and contains the given position.
  14744. + /// </summary>
  14745. + /// <param name="node">The <see cref="SyntaxNode"/> to search.</param>
  14746. + /// <param name="targetPosition">The position.</param>
  14747. + /// <returns>The node that spans the given position.</returns>
  14748. + /// <remarks>
  14749. + /// Assumes that <paramref name="targetPosition"/> is within the span of <paramref name="node"/>.
  14750. + /// </remarks>
  14751. + internal static SyntaxNode ChildThatContainsPosition(SyntaxNode node, int targetPosition)
  14752. + {
  14753. + // The targetPosition must already be within this node
  14754. + Debug.Assert(node.FullSpan.Contains(targetPosition));
  14755. +
  14756. + var green = node.Green;
  14757. + var position = node.Position;
  14758. + var index = 0;
  14759. +
  14760. + Debug.Assert(!green.IsList);
  14761. +
  14762. + // Find the green node that spans the target position.
  14763. + // We will be skipping whole slots here so we will not loop for long
  14764. + int slot;
  14765. + for (slot = 0; ; slot++)
  14766. + {
  14767. + var greenChild = green.GetSlot(slot);
  14768. + if (greenChild != null)
  14769. + {
  14770. + var endPosition = position + greenChild.FullWidth;
  14771. + if (targetPosition < endPosition)
  14772. + {
  14773. + // Descend into the child element
  14774. + green = greenChild;
  14775. + break;
  14776. + }
  14777. +
  14778. + position = endPosition;
  14779. + index += Occupancy(greenChild);
  14780. + }
  14781. + }
  14782. +
  14783. + // Realize the red node (if any)
  14784. + var red = node.GetNodeSlot(slot);
  14785. + if (!green.IsList)
  14786. + {
  14787. + // This is a single node.
  14788. + // If it is a node, we are done.
  14789. + if (red != null)
  14790. + {
  14791. + return red;
  14792. + }
  14793. + }
  14794. + else
  14795. + {
  14796. + slot = green.FindSlotIndexContainingOffset(targetPosition - position);
  14797. +
  14798. + // Realize the red node (if any)
  14799. + if (red != null)
  14800. + {
  14801. + // It is a red list of nodes
  14802. + red = red.GetNodeSlot(slot);
  14803. + if (red != null)
  14804. + {
  14805. + return red;
  14806. + }
  14807. + }
  14808. +
  14809. + // Since we can't have "lists of lists", the Occupancy calculation for
  14810. + // child elements in a list is simple.
  14811. + index += slot;
  14812. + }
  14813. +
  14814. + return node;
  14815. + }
  14816. +
  14817. + /// <summary>
  14818. + /// internal indexer that does not verify index.
  14819. + /// Used when caller has already ensured that index is within bounds.
  14820. + /// </summary>
  14821. + internal static SyntaxNode ItemInternalAsNode(SyntaxNode node, int index)
  14822. + {
  14823. + GreenNode greenChild;
  14824. + var green = node.Green;
  14825. + var idx = index;
  14826. + var slotIndex = 0;
  14827. +
  14828. + // find a slot that contains the node or its parent list (if node is in a list)
  14829. + // we will be skipping whole slots here so we will not loop for long
  14830. + //
  14831. + // at the end of this loop we will have
  14832. + // 1) slot index - slotIdx
  14833. + // 2) if the slot is a list, node index in the list - idx
  14834. + while (true)
  14835. + {
  14836. + greenChild = green.GetSlot(slotIndex);
  14837. + if (greenChild != null)
  14838. + {
  14839. + var currentOccupancy = Occupancy(greenChild);
  14840. + if (idx < currentOccupancy)
  14841. + {
  14842. + break;
  14843. + }
  14844. +
  14845. + idx -= currentOccupancy;
  14846. + }
  14847. +
  14848. + slotIndex++;
  14849. + }
  14850. +
  14851. + // get node that represents this slot
  14852. + var red = node.GetNodeSlot(slotIndex);
  14853. + if (greenChild.IsList && red != null)
  14854. + {
  14855. + // it is a red list of nodes, most common case
  14856. + return red.GetNodeSlot(idx);
  14857. + }
  14858. +
  14859. + // this is a single node
  14860. + return red;
  14861. + }
  14862. +
  14863. + // for debugging
  14864. + private SyntaxNode[] Nodes
  14865. + {
  14866. + get
  14867. + {
  14868. + return this.ToArray();
  14869. + }
  14870. + }
  14871. +
  14872. + public bool Any()
  14873. + {
  14874. + return _count != 0;
  14875. + }
  14876. +
  14877. + /// <summary>
  14878. + /// Returns the first child in the list.
  14879. + /// </summary>
  14880. + /// <returns>The first child in the list.</returns>
  14881. + /// <exception cref="System.InvalidOperationException">The list is empty.</exception>
  14882. + public SyntaxNode First()
  14883. + {
  14884. + if (Any())
  14885. + {
  14886. + return this[0];
  14887. + }
  14888. +
  14889. + throw new InvalidOperationException();
  14890. + }
  14891. +
  14892. + /// <summary>
  14893. + /// Returns the last child in the list.
  14894. + /// </summary>
  14895. + /// <returns>The last child in the list.</returns>
  14896. + /// <exception cref="System.InvalidOperationException">The list is empty.</exception>
  14897. + public SyntaxNode Last()
  14898. + {
  14899. + if (Any())
  14900. + {
  14901. + return this[_count - 1];
  14902. + }
  14903. +
  14904. + throw new InvalidOperationException();
  14905. + }
  14906. +
  14907. + /// <summary>
  14908. + /// Returns a list which contains all children of <see cref="ChildSyntaxList"/> in reversed order.
  14909. + /// </summary>
  14910. + /// <returns><see cref="Reversed"/> which contains all children of <see cref="ChildSyntaxList"/> in reversed order</returns>
  14911. + public Reversed Reverse()
  14912. + {
  14913. + return new Reversed(_node, _count);
  14914. + }
  14915. +
  14916. + /// <summary>Returns an enumerator that iterates through the <see cref="ChildSyntaxList"/>.</summary>
  14917. + /// <returns>A <see cref="Enumerator"/> for the <see cref="ChildSyntaxList"/>.</returns>
  14918. + public Enumerator GetEnumerator()
  14919. + {
  14920. + if (_node == null)
  14921. + {
  14922. + return default;
  14923. + }
  14924. +
  14925. + return new Enumerator(_node, _count);
  14926. + }
  14927. +
  14928. + IEnumerator<SyntaxNode> IEnumerable<SyntaxNode>.GetEnumerator()
  14929. + {
  14930. + if (_node == null)
  14931. + {
  14932. + return EmptyEnumerator<SyntaxNode>.Instance;
  14933. + }
  14934. +
  14935. + return new EnumeratorImpl(_node, _count);
  14936. + }
  14937. +
  14938. + IEnumerator IEnumerable.GetEnumerator()
  14939. + {
  14940. + if (_node == null)
  14941. + {
  14942. + return EmptyEnumerator<SyntaxNode>.Instance;
  14943. + }
  14944. +
  14945. + return new EnumeratorImpl(_node, _count);
  14946. + }
  14947. +
  14948. + /// <summary>Determines whether the specified object is equal to the current instance.</summary>
  14949. + /// <returns>true if the specified object is a <see cref="ChildSyntaxList" /> structure and is equal to the current instance; otherwise, false.</returns>
  14950. + /// <param name="obj">The object to be compared with the current instance.</param>
  14951. + public override bool Equals(object obj)
  14952. + {
  14953. + return obj is ChildSyntaxList && Equals((ChildSyntaxList)obj);
  14954. + }
  14955. +
  14956. + /// <summary>Determines whether the specified <see cref="ChildSyntaxList" /> structure is equal to the current instance.</summary>
  14957. + /// <returns>true if the specified <see cref="ChildSyntaxList" /> structure is equal to the current instance; otherwise, false.</returns>
  14958. + /// <param name="other">The <see cref="ChildSyntaxList" /> structure to be compared with the current instance.</param>
  14959. + public bool Equals(ChildSyntaxList other)
  14960. + {
  14961. + return _node == other._node;
  14962. + }
  14963. +
  14964. + /// <summary>Returns the hash code for the current instance.</summary>
  14965. + /// <returns>A 32-bit signed integer hash code.</returns>
  14966. + public override int GetHashCode()
  14967. + {
  14968. + return _node?.GetHashCode() ?? 0;
  14969. + }
  14970. +
  14971. + /// <summary>Indicates whether two <see cref="ChildSyntaxList" /> structures are equal.</summary>
  14972. + /// <returns>true if <paramref name="list1" /> is equal to <paramref name="list2" />; otherwise, false.</returns>
  14973. + /// <param name="list1">The <see cref="ChildSyntaxList" /> structure on the left side of the equality operator.</param>
  14974. + /// <param name="list2">The <see cref="ChildSyntaxList" /> structure on the right side of the equality operator.</param>
  14975. + public static bool operator ==(ChildSyntaxList list1, ChildSyntaxList list2)
  14976. + {
  14977. + return list1.Equals(list2);
  14978. + }
  14979. +
  14980. + /// <summary>Indicates whether two <see cref="ChildSyntaxList" /> structures are unequal.</summary>
  14981. + /// <returns>true if <paramref name="list1" /> is equal to <paramref name="list2" />; otherwise, false.</returns>
  14982. + /// <param name="list1">The <see cref="ChildSyntaxList" /> structure on the left side of the inequality operator.</param>
  14983. + /// <param name="list2">The <see cref="ChildSyntaxList" /> structure on the right side of the inequality operator.</param>
  14984. + public static bool operator !=(ChildSyntaxList list1, ChildSyntaxList list2)
  14985. + {
  14986. + return !list1.Equals(list2);
  14987. + }
  14988. +
  14989. + /// <summary>Enumerates the elements of a <see cref="ChildSyntaxList" />.</summary>
  14990. + public struct Enumerator
  14991. + {
  14992. + private SyntaxNode _node;
  14993. + private int _count;
  14994. + private int _childIndex;
  14995. +
  14996. + internal Enumerator(SyntaxNode node, int count)
  14997. + {
  14998. + _node = node;
  14999. + _count = count;
  15000. + _childIndex = -1;
  15001. + }
  15002. +
  15003. + // PERF: Initialize an Enumerator directly from a SyntaxNode without going
  15004. + // via ChildNodes. This saves constructing an intermediate ChildSyntaxList
  15005. + internal void InitializeFrom(SyntaxNode node)
  15006. + {
  15007. + _node = node;
  15008. + _count = CountNodes(node.Green);
  15009. + _childIndex = -1;
  15010. + }
  15011. +
  15012. + /// <summary>Advances the enumerator to the next element of the <see cref="ChildSyntaxList" />.</summary>
  15013. + /// <returns>true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection.</returns>
  15014. + public bool MoveNext()
  15015. + {
  15016. + var newIndex = _childIndex + 1;
  15017. + if (newIndex < _count)
  15018. + {
  15019. + _childIndex = newIndex;
  15020. + return true;
  15021. + }
  15022. +
  15023. + return false;
  15024. + }
  15025. +
  15026. + /// <summary>Gets the element at the current position of the enumerator.</summary>
  15027. + /// <returns>The element in the <see cref="ChildSyntaxList" /> at the current position of the enumerator.</returns>
  15028. + public SyntaxNode Current
  15029. + {
  15030. + get
  15031. + {
  15032. + return ItemInternal(_node, _childIndex);
  15033. + }
  15034. + }
  15035. +
  15036. + /// <summary>Sets the enumerator to its initial position, which is before the first element in the collection.</summary>
  15037. + public void Reset()
  15038. + {
  15039. + _childIndex = -1;
  15040. + }
  15041. +
  15042. + internal bool TryMoveNextAndGetCurrent(out SyntaxNode current)
  15043. + {
  15044. + if (!MoveNext())
  15045. + {
  15046. + current = default;
  15047. + return false;
  15048. + }
  15049. +
  15050. + current = ItemInternal(_node, _childIndex);
  15051. + return true;
  15052. + }
  15053. +
  15054. + internal SyntaxNode TryMoveNextAndGetCurrentAsNode()
  15055. + {
  15056. + while (MoveNext())
  15057. + {
  15058. + var nodeValue = ItemInternalAsNode(_node, _childIndex);
  15059. + if (nodeValue != null)
  15060. + {
  15061. + return nodeValue;
  15062. + }
  15063. + }
  15064. +
  15065. + return null;
  15066. + }
  15067. + }
  15068. +
  15069. + private class EnumeratorImpl : IEnumerator<SyntaxNode>
  15070. + {
  15071. + private Enumerator _enumerator;
  15072. +
  15073. + internal EnumeratorImpl(SyntaxNode node, int count)
  15074. + {
  15075. + _enumerator = new Enumerator(node, count);
  15076. + }
  15077. +
  15078. + /// <summary>
  15079. + /// Gets the element in the collection at the current position of the enumerator.
  15080. + /// </summary>
  15081. + /// <returns>
  15082. + /// The element in the collection at the current position of the enumerator.
  15083. + /// </returns>
  15084. + public SyntaxNode Current
  15085. + {
  15086. + get { return _enumerator.Current; }
  15087. + }
  15088. +
  15089. + /// <summary>
  15090. + /// Gets the element in the collection at the current position of the enumerator.
  15091. + /// </summary>
  15092. + /// <returns>
  15093. + /// The element in the collection at the current position of the enumerator.
  15094. + /// </returns>
  15095. + object IEnumerator.Current
  15096. + {
  15097. + get { return _enumerator.Current; }
  15098. + }
  15099. +
  15100. + /// <summary>
  15101. + /// Advances the enumerator to the next element of the collection.
  15102. + /// </summary>
  15103. + /// <returns>
  15104. + /// true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection.
  15105. + /// </returns>
  15106. + public bool MoveNext()
  15107. + {
  15108. + return _enumerator.MoveNext();
  15109. + }
  15110. +
  15111. + /// <summary>
  15112. + /// Sets the enumerator to its initial position, which is before the first element in the collection.
  15113. + /// </summary>
  15114. + public void Reset()
  15115. + {
  15116. + _enumerator.Reset();
  15117. + }
  15118. +
  15119. + /// <summary>
  15120. + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
  15121. + /// </summary>
  15122. + public void Dispose()
  15123. + { }
  15124. + }
  15125. +
  15126. + public readonly partial struct Reversed : IEnumerable<SyntaxNode>, IEquatable<Reversed>
  15127. + {
  15128. + private readonly SyntaxNode _node;
  15129. + private readonly int _count;
  15130. +
  15131. + internal Reversed(SyntaxNode node, int count)
  15132. + {
  15133. + _node = node;
  15134. + _count = count;
  15135. + }
  15136. +
  15137. + public Enumerator GetEnumerator()
  15138. + {
  15139. + return new Enumerator(_node, _count);
  15140. + }
  15141. +
  15142. + IEnumerator<SyntaxNode> IEnumerable<SyntaxNode>.GetEnumerator()
  15143. + {
  15144. + if (_node == null)
  15145. + {
  15146. + return EmptyEnumerator<SyntaxNode>.Instance;
  15147. + }
  15148. +
  15149. + return new EnumeratorImpl(_node, _count);
  15150. + }
  15151. +
  15152. + IEnumerator IEnumerable.GetEnumerator()
  15153. + {
  15154. + if (_node == null)
  15155. + {
  15156. + return EmptyEnumerator<SyntaxNode>.Instance;
  15157. + }
  15158. +
  15159. + return new EnumeratorImpl(_node, _count);
  15160. + }
  15161. +
  15162. + public override int GetHashCode()
  15163. + {
  15164. + if (_node == null)
  15165. + {
  15166. + return 0;
  15167. + }
  15168. +
  15169. + var hash = HashCodeCombiner.Start();
  15170. + hash.Add(_node.GetHashCode());
  15171. + hash.Add(_count);
  15172. + return hash.CombinedHash;
  15173. + }
  15174. +
  15175. + public override bool Equals(object obj)
  15176. + {
  15177. + return (obj is Reversed) && Equals((Reversed)obj);
  15178. + }
  15179. +
  15180. + public bool Equals(Reversed other)
  15181. + {
  15182. + return _node == other._node
  15183. + && _count == other._count;
  15184. + }
  15185. +
  15186. + public struct Enumerator
  15187. + {
  15188. + private readonly SyntaxNode _node;
  15189. + private readonly int _count;
  15190. + private int _childIndex;
  15191. +
  15192. + internal Enumerator(SyntaxNode node, int count)
  15193. + {
  15194. + _node = node;
  15195. + _count = count;
  15196. + _childIndex = count;
  15197. + }
  15198. +
  15199. + public bool MoveNext()
  15200. + {
  15201. + return --_childIndex >= 0;
  15202. + }
  15203. +
  15204. + public SyntaxNode Current
  15205. + {
  15206. + get
  15207. + {
  15208. + return ItemInternal(_node, _childIndex);
  15209. + }
  15210. + }
  15211. +
  15212. + public void Reset()
  15213. + {
  15214. + _childIndex = _count;
  15215. + }
  15216. + }
  15217. +
  15218. + private class EnumeratorImpl : IEnumerator<SyntaxNode>
  15219. + {
  15220. + private Enumerator _enumerator;
  15221. +
  15222. + internal EnumeratorImpl(SyntaxNode node, int count)
  15223. + {
  15224. + _enumerator = new Enumerator(node, count);
  15225. + }
  15226. +
  15227. + /// <summary>
  15228. + /// Gets the element in the collection at the current position of the enumerator.
  15229. + /// </summary>
  15230. + /// <returns>
  15231. + /// The element in the collection at the current position of the enumerator.
  15232. + /// </returns>
  15233. + public SyntaxNode Current
  15234. + {
  15235. + get { return _enumerator.Current; }
  15236. + }
  15237. +
  15238. + /// <summary>
  15239. + /// Gets the element in the collection at the current position of the enumerator.
  15240. + /// </summary>
  15241. + /// <returns>
  15242. + /// The element in the collection at the current position of the enumerator.
  15243. + /// </returns>
  15244. + object IEnumerator.Current
  15245. + {
  15246. + get { return _enumerator.Current; }
  15247. + }
  15248. +
  15249. + /// <summary>
  15250. + /// Advances the enumerator to the next element of the collection.
  15251. + /// </summary>
  15252. + /// <returns>
  15253. + /// true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection.
  15254. + /// </returns>
  15255. + /// <exception cref="InvalidOperationException">The collection was modified after the enumerator was created. </exception>
  15256. + public bool MoveNext()
  15257. + {
  15258. + return _enumerator.MoveNext();
  15259. + }
  15260. +
  15261. + /// <summary>
  15262. + /// Sets the enumerator to its initial position, which is before the first element in the collection.
  15263. + /// </summary>
  15264. + /// <exception cref="InvalidOperationException">The collection was modified after the enumerator was created. </exception>
  15265. + public void Reset()
  15266. + {
  15267. + _enumerator.Reset();
  15268. + }
  15269. +
  15270. + /// <summary>
  15271. + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
  15272. + /// </summary>
  15273. + public void Dispose()
  15274. + { }
  15275. + }
  15276. + }
  15277. +
  15278. + internal class EmptyEnumerator<T> : IEnumerator<T>
  15279. + {
  15280. + public static readonly IEnumerator<T> Instance = new EmptyEnumerator<T>();
  15281. +
  15282. + protected EmptyEnumerator()
  15283. + {
  15284. + }
  15285. +
  15286. + public T Current => throw new InvalidOperationException();
  15287. +
  15288. + object IEnumerator.Current => throw new NotImplementedException();
  15289. +
  15290. + public void Dispose()
  15291. + {
  15292. + }
  15293. +
  15294. + public bool MoveNext()
  15295. + {
  15296. + return false;
  15297. + }
  15298. +
  15299. + public void Reset()
  15300. + {
  15301. + throw new NotImplementedException();
  15302. + }
  15303. + }
  15304. + }
  15305. +}
  15306. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/Generated/Syntax.xml.Internal.Generated.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/Generated/Syntax.xml.Internal.Generated.cs
  15307. index aee8330582a..1849a7b4104 100644
  15308. --- a/src/Microsoft.AspNetCore.Razor.Language/Syntax/Generated/Syntax.xml.Internal.Generated.cs
  15309. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/Generated/Syntax.xml.Internal.Generated.cs
  15310. @@ -8,16 +8,93 @@ using System.Threading;
  15311. namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  15312. {
  15313. - internal abstract partial class RazorSyntaxNode : GreenNode
  15314. + internal abstract partial class RazorBlockSyntax : RazorSyntaxNode
  15315. {
  15316. - internal RazorSyntaxNode(SyntaxKind kind, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  15317. + internal RazorBlockSyntax(SyntaxKind kind, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  15318. : base(kind, diagnostics, annotations)
  15319. {
  15320. }
  15321. - internal RazorSyntaxNode(SyntaxKind kind)
  15322. + internal RazorBlockSyntax(SyntaxKind kind)
  15323. : base(kind)
  15324. {
  15325. }
  15326. +
  15327. + public abstract SyntaxList<RazorSyntaxNode> Children { get; }
  15328. + }
  15329. +
  15330. + internal sealed partial class RazorDocumentSyntax : RazorSyntaxNode
  15331. + {
  15332. + private readonly RazorBlockSyntax _document;
  15333. +
  15334. + internal RazorDocumentSyntax(SyntaxKind kind, RazorBlockSyntax document, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  15335. + : base(kind, diagnostics, annotations)
  15336. + {
  15337. + SlotCount = 1;
  15338. + AdjustFlagsAndWidth(document);
  15339. + _document = document;
  15340. + }
  15341. +
  15342. +
  15343. + internal RazorDocumentSyntax(SyntaxKind kind, RazorBlockSyntax document)
  15344. + : base(kind)
  15345. + {
  15346. + SlotCount = 1;
  15347. + AdjustFlagsAndWidth(document);
  15348. + _document = document;
  15349. + }
  15350. +
  15351. + public RazorBlockSyntax Document { get { return _document; } }
  15352. +
  15353. + internal override GreenNode GetSlot(int index)
  15354. + {
  15355. + switch (index)
  15356. + {
  15357. + case 0: return _document;
  15358. + default: return null;
  15359. + }
  15360. + }
  15361. +
  15362. + internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  15363. + {
  15364. + return new Syntax.RazorDocumentSyntax(this, parent, position);
  15365. + }
  15366. +
  15367. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  15368. + {
  15369. + return visitor.VisitRazorDocument(this);
  15370. + }
  15371. +
  15372. + public override void Accept(SyntaxVisitor visitor)
  15373. + {
  15374. + visitor.VisitRazorDocument(this);
  15375. + }
  15376. +
  15377. + public RazorDocumentSyntax Update(RazorBlockSyntax document)
  15378. + {
  15379. + if (document != Document)
  15380. + {
  15381. + var newNode = SyntaxFactory.RazorDocument(document);
  15382. + var diags = GetDiagnostics();
  15383. + if (diags != null && diags.Length > 0)
  15384. + newNode = newNode.WithDiagnosticsGreen(diags);
  15385. + var annotations = GetAnnotations();
  15386. + if (annotations != null && annotations.Length > 0)
  15387. + newNode = newNode.WithAnnotationsGreen(annotations);
  15388. + return newNode;
  15389. + }
  15390. +
  15391. + return this;
  15392. + }
  15393. +
  15394. + internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  15395. + {
  15396. + return new RazorDocumentSyntax(Kind, _document, diagnostics, GetAnnotations());
  15397. + }
  15398. +
  15399. + internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  15400. + {
  15401. + return new RazorDocumentSyntax(Kind, _document, GetDiagnostics(), annotations);
  15402. + }
  15403. }
  15404. internal sealed partial class RazorCommentBlockSyntax : RazorSyntaxNode
  15405. @@ -36,11 +113,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  15406. _startCommentTransition = startCommentTransition;
  15407. AdjustFlagsAndWidth(startCommentStar);
  15408. _startCommentStar = startCommentStar;
  15409. - if (comment != null)
  15410. - {
  15411. - AdjustFlagsAndWidth(comment);
  15412. - _comment = comment;
  15413. - }
  15414. + AdjustFlagsAndWidth(comment);
  15415. + _comment = comment;
  15416. AdjustFlagsAndWidth(endCommentStar);
  15417. _endCommentStar = endCommentStar;
  15418. AdjustFlagsAndWidth(endCommentTransition);
  15419. @@ -56,11 +130,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  15420. _startCommentTransition = startCommentTransition;
  15421. AdjustFlagsAndWidth(startCommentStar);
  15422. _startCommentStar = startCommentStar;
  15423. - if (comment != null)
  15424. - {
  15425. - AdjustFlagsAndWidth(comment);
  15426. - _comment = comment;
  15427. - }
  15428. + AdjustFlagsAndWidth(comment);
  15429. + _comment = comment;
  15430. AdjustFlagsAndWidth(endCommentStar);
  15431. _endCommentStar = endCommentStar;
  15432. AdjustFlagsAndWidth(endCommentTransition);
  15433. @@ -129,76 +200,64 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  15434. }
  15435. }
  15436. - internal abstract partial class HtmlSyntaxNode : RazorSyntaxNode
  15437. - {
  15438. - internal HtmlSyntaxNode(SyntaxKind kind, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  15439. - : base(kind, diagnostics, annotations)
  15440. - {
  15441. - }
  15442. - internal HtmlSyntaxNode(SyntaxKind kind)
  15443. - : base(kind)
  15444. - {
  15445. - }
  15446. - }
  15447. -
  15448. - internal sealed partial class HtmlTextLiteralSyntax : HtmlSyntaxNode
  15449. + internal sealed partial class RazorMetaCodeSyntax : RazorSyntaxNode
  15450. {
  15451. - private readonly GreenNode _textTokens;
  15452. + private readonly GreenNode _metaCode;
  15453. - internal HtmlTextLiteralSyntax(SyntaxKind kind, GreenNode textTokens, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  15454. + internal RazorMetaCodeSyntax(SyntaxKind kind, GreenNode metaCode, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  15455. : base(kind, diagnostics, annotations)
  15456. {
  15457. SlotCount = 1;
  15458. - if (textTokens != null)
  15459. + if (metaCode != null)
  15460. {
  15461. - AdjustFlagsAndWidth(textTokens);
  15462. - _textTokens = textTokens;
  15463. + AdjustFlagsAndWidth(metaCode);
  15464. + _metaCode = metaCode;
  15465. }
  15466. }
  15467. - internal HtmlTextLiteralSyntax(SyntaxKind kind, GreenNode textTokens)
  15468. + internal RazorMetaCodeSyntax(SyntaxKind kind, GreenNode metaCode)
  15469. : base(kind)
  15470. {
  15471. SlotCount = 1;
  15472. - if (textTokens != null)
  15473. + if (metaCode != null)
  15474. {
  15475. - AdjustFlagsAndWidth(textTokens);
  15476. - _textTokens = textTokens;
  15477. + AdjustFlagsAndWidth(metaCode);
  15478. + _metaCode = metaCode;
  15479. }
  15480. }
  15481. - public SyntaxList<SyntaxToken> TextTokens { get { return new SyntaxList<SyntaxToken>(_textTokens); } }
  15482. + public SyntaxList<SyntaxToken> MetaCode { get { return new SyntaxList<SyntaxToken>(_metaCode); } }
  15483. internal override GreenNode GetSlot(int index)
  15484. {
  15485. switch (index)
  15486. {
  15487. - case 0: return _textTokens;
  15488. + case 0: return _metaCode;
  15489. default: return null;
  15490. }
  15491. }
  15492. internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  15493. {
  15494. - return new Syntax.HtmlTextLiteralSyntax(this, parent, position);
  15495. + return new Syntax.RazorMetaCodeSyntax(this, parent, position);
  15496. }
  15497. public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  15498. {
  15499. - return visitor.VisitHtmlTextLiteral(this);
  15500. + return visitor.VisitRazorMetaCode(this);
  15501. }
  15502. public override void Accept(SyntaxVisitor visitor)
  15503. {
  15504. - visitor.VisitHtmlTextLiteral(this);
  15505. + visitor.VisitRazorMetaCode(this);
  15506. }
  15507. - public HtmlTextLiteralSyntax Update(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<SyntaxToken> textTokens)
  15508. + public RazorMetaCodeSyntax Update(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<SyntaxToken> metaCode)
  15509. {
  15510. - if (textTokens != TextTokens)
  15511. + if (metaCode != MetaCode)
  15512. {
  15513. - var newNode = SyntaxFactory.HtmlTextLiteral(textTokens);
  15514. + var newNode = SyntaxFactory.RazorMetaCode(metaCode);
  15515. var diags = GetDiagnostics();
  15516. if (diags != null && diags.Length > 0)
  15517. newNode = newNode.WithDiagnosticsGreen(diags);
  15518. @@ -213,79 +272,73 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  15519. internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  15520. {
  15521. - return new HtmlTextLiteralSyntax(Kind, _textTokens, diagnostics, GetAnnotations());
  15522. + return new RazorMetaCodeSyntax(Kind, _metaCode, diagnostics, GetAnnotations());
  15523. }
  15524. internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  15525. {
  15526. - return new HtmlTextLiteralSyntax(Kind, _textTokens, GetDiagnostics(), annotations);
  15527. - }
  15528. - }
  15529. -
  15530. - internal abstract partial class CSharpSyntaxNode : RazorSyntaxNode
  15531. - {
  15532. - internal CSharpSyntaxNode(SyntaxKind kind, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  15533. - : base(kind, diagnostics, annotations)
  15534. - {
  15535. - }
  15536. - internal CSharpSyntaxNode(SyntaxKind kind)
  15537. - : base(kind)
  15538. - {
  15539. + return new RazorMetaCodeSyntax(Kind, _metaCode, GetDiagnostics(), annotations);
  15540. }
  15541. }
  15542. - internal sealed partial class CSharpTransitionSyntax : CSharpSyntaxNode
  15543. + internal sealed partial class GenericBlockSyntax : RazorBlockSyntax
  15544. {
  15545. - private readonly SyntaxToken _transition;
  15546. + private readonly GreenNode _children;
  15547. - internal CSharpTransitionSyntax(SyntaxKind kind, SyntaxToken transition, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  15548. + internal GenericBlockSyntax(SyntaxKind kind, GreenNode children, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  15549. : base(kind, diagnostics, annotations)
  15550. {
  15551. SlotCount = 1;
  15552. - AdjustFlagsAndWidth(transition);
  15553. - _transition = transition;
  15554. + if (children != null)
  15555. + {
  15556. + AdjustFlagsAndWidth(children);
  15557. + _children = children;
  15558. + }
  15559. }
  15560. - internal CSharpTransitionSyntax(SyntaxKind kind, SyntaxToken transition)
  15561. + internal GenericBlockSyntax(SyntaxKind kind, GreenNode children)
  15562. : base(kind)
  15563. {
  15564. SlotCount = 1;
  15565. - AdjustFlagsAndWidth(transition);
  15566. - _transition = transition;
  15567. + if (children != null)
  15568. + {
  15569. + AdjustFlagsAndWidth(children);
  15570. + _children = children;
  15571. + }
  15572. }
  15573. - public SyntaxToken Transition { get { return _transition; } }
  15574. + public override SyntaxList<RazorSyntaxNode> Children { get { return new SyntaxList<RazorSyntaxNode>(_children); } }
  15575. internal override GreenNode GetSlot(int index)
  15576. {
  15577. switch (index)
  15578. {
  15579. - case 0: return _transition;
  15580. + case 0: return _children;
  15581. default: return null;
  15582. }
  15583. }
  15584. internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  15585. {
  15586. - return new Syntax.CSharpTransitionSyntax(this, parent, position);
  15587. + return new Syntax.GenericBlockSyntax(this, parent, position);
  15588. }
  15589. public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  15590. {
  15591. - return visitor.VisitCSharpTransition(this);
  15592. + return visitor.VisitGenericBlock(this);
  15593. }
  15594. public override void Accept(SyntaxVisitor visitor)
  15595. {
  15596. - visitor.VisitCSharpTransition(this);
  15597. + visitor.VisitGenericBlock(this);
  15598. }
  15599. - public CSharpTransitionSyntax Update(SyntaxToken transition)
  15600. + public GenericBlockSyntax Update(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<RazorSyntaxNode> children)
  15601. {
  15602. - if (transition != Transition)
  15603. + if (children != Children)
  15604. {
  15605. - var newNode = SyntaxFactory.CSharpTransition(transition);
  15606. + var newNode = SyntaxFactory.GenericBlock(children);
  15607. var diags = GetDiagnostics();
  15608. if (diags != null && diags.Length > 0)
  15609. newNode = newNode.WithDiagnosticsGreen(diags);
  15610. @@ -300,73 +353,73 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  15611. internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  15612. {
  15613. - return new CSharpTransitionSyntax(Kind, _transition, diagnostics, GetAnnotations());
  15614. + return new GenericBlockSyntax(Kind, _children, diagnostics, GetAnnotations());
  15615. }
  15616. internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  15617. {
  15618. - return new CSharpTransitionSyntax(Kind, _transition, GetDiagnostics(), annotations);
  15619. + return new GenericBlockSyntax(Kind, _children, GetDiagnostics(), annotations);
  15620. }
  15621. }
  15622. - internal sealed partial class CSharpMetaCodeSyntax : CSharpSyntaxNode
  15623. + internal sealed partial class UnclassifiedTextLiteralSyntax : RazorSyntaxNode
  15624. {
  15625. - private readonly GreenNode _metaCode;
  15626. + private readonly GreenNode _literalTokens;
  15627. - internal CSharpMetaCodeSyntax(SyntaxKind kind, GreenNode metaCode, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  15628. + internal UnclassifiedTextLiteralSyntax(SyntaxKind kind, GreenNode literalTokens, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  15629. : base(kind, diagnostics, annotations)
  15630. {
  15631. SlotCount = 1;
  15632. - if (metaCode != null)
  15633. + if (literalTokens != null)
  15634. {
  15635. - AdjustFlagsAndWidth(metaCode);
  15636. - _metaCode = metaCode;
  15637. + AdjustFlagsAndWidth(literalTokens);
  15638. + _literalTokens = literalTokens;
  15639. }
  15640. }
  15641. - internal CSharpMetaCodeSyntax(SyntaxKind kind, GreenNode metaCode)
  15642. + internal UnclassifiedTextLiteralSyntax(SyntaxKind kind, GreenNode literalTokens)
  15643. : base(kind)
  15644. {
  15645. SlotCount = 1;
  15646. - if (metaCode != null)
  15647. + if (literalTokens != null)
  15648. {
  15649. - AdjustFlagsAndWidth(metaCode);
  15650. - _metaCode = metaCode;
  15651. + AdjustFlagsAndWidth(literalTokens);
  15652. + _literalTokens = literalTokens;
  15653. }
  15654. }
  15655. - public SyntaxList<SyntaxToken> MetaCode { get { return new SyntaxList<SyntaxToken>(_metaCode); } }
  15656. + public SyntaxList<SyntaxToken> LiteralTokens { get { return new SyntaxList<SyntaxToken>(_literalTokens); } }
  15657. internal override GreenNode GetSlot(int index)
  15658. {
  15659. switch (index)
  15660. {
  15661. - case 0: return _metaCode;
  15662. + case 0: return _literalTokens;
  15663. default: return null;
  15664. }
  15665. }
  15666. internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  15667. {
  15668. - return new Syntax.CSharpMetaCodeSyntax(this, parent, position);
  15669. + return new Syntax.UnclassifiedTextLiteralSyntax(this, parent, position);
  15670. }
  15671. public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  15672. {
  15673. - return visitor.VisitCSharpMetaCode(this);
  15674. + return visitor.VisitUnclassifiedTextLiteral(this);
  15675. }
  15676. public override void Accept(SyntaxVisitor visitor)
  15677. {
  15678. - visitor.VisitCSharpMetaCode(this);
  15679. + visitor.VisitUnclassifiedTextLiteral(this);
  15680. }
  15681. - public CSharpMetaCodeSyntax Update(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<SyntaxToken> metaCode)
  15682. + public UnclassifiedTextLiteralSyntax Update(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<SyntaxToken> literalTokens)
  15683. {
  15684. - if (metaCode != MetaCode)
  15685. + if (literalTokens != LiteralTokens)
  15686. {
  15687. - var newNode = SyntaxFactory.CSharpMetaCode(metaCode);
  15688. + var newNode = SyntaxFactory.UnclassifiedTextLiteral(literalTokens);
  15689. var diags = GetDiagnostics();
  15690. if (diags != null && diags.Length > 0)
  15691. newNode = newNode.WithDiagnosticsGreen(diags);
  15692. @@ -381,73 +434,85 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  15693. internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  15694. {
  15695. - return new CSharpMetaCodeSyntax(Kind, _metaCode, diagnostics, GetAnnotations());
  15696. + return new UnclassifiedTextLiteralSyntax(Kind, _literalTokens, diagnostics, GetAnnotations());
  15697. }
  15698. internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  15699. {
  15700. - return new CSharpMetaCodeSyntax(Kind, _metaCode, GetDiagnostics(), annotations);
  15701. + return new UnclassifiedTextLiteralSyntax(Kind, _literalTokens, GetDiagnostics(), annotations);
  15702. + }
  15703. + }
  15704. +
  15705. + internal abstract partial class MarkupSyntaxNode : RazorSyntaxNode
  15706. + {
  15707. + internal MarkupSyntaxNode(SyntaxKind kind, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  15708. + : base(kind, diagnostics, annotations)
  15709. + {
  15710. + }
  15711. + internal MarkupSyntaxNode(SyntaxKind kind)
  15712. + : base(kind)
  15713. + {
  15714. }
  15715. }
  15716. - internal sealed partial class CSharpCodeLiteralSyntax : CSharpSyntaxNode
  15717. + internal sealed partial class MarkupBlockSyntax : RazorBlockSyntax
  15718. {
  15719. - private readonly GreenNode _cSharpTokens;
  15720. + private readonly GreenNode _children;
  15721. - internal CSharpCodeLiteralSyntax(SyntaxKind kind, GreenNode cSharpTokens, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  15722. + internal MarkupBlockSyntax(SyntaxKind kind, GreenNode children, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  15723. : base(kind, diagnostics, annotations)
  15724. {
  15725. SlotCount = 1;
  15726. - if (cSharpTokens != null)
  15727. + if (children != null)
  15728. {
  15729. - AdjustFlagsAndWidth(cSharpTokens);
  15730. - _cSharpTokens = cSharpTokens;
  15731. + AdjustFlagsAndWidth(children);
  15732. + _children = children;
  15733. }
  15734. }
  15735. - internal CSharpCodeLiteralSyntax(SyntaxKind kind, GreenNode cSharpTokens)
  15736. + internal MarkupBlockSyntax(SyntaxKind kind, GreenNode children)
  15737. : base(kind)
  15738. {
  15739. SlotCount = 1;
  15740. - if (cSharpTokens != null)
  15741. + if (children != null)
  15742. {
  15743. - AdjustFlagsAndWidth(cSharpTokens);
  15744. - _cSharpTokens = cSharpTokens;
  15745. + AdjustFlagsAndWidth(children);
  15746. + _children = children;
  15747. }
  15748. }
  15749. - public SyntaxList<SyntaxToken> CSharpTokens { get { return new SyntaxList<SyntaxToken>(_cSharpTokens); } }
  15750. + public override SyntaxList<RazorSyntaxNode> Children { get { return new SyntaxList<RazorSyntaxNode>(_children); } }
  15751. internal override GreenNode GetSlot(int index)
  15752. {
  15753. switch (index)
  15754. {
  15755. - case 0: return _cSharpTokens;
  15756. + case 0: return _children;
  15757. default: return null;
  15758. }
  15759. }
  15760. internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  15761. {
  15762. - return new Syntax.CSharpCodeLiteralSyntax(this, parent, position);
  15763. + return new Syntax.MarkupBlockSyntax(this, parent, position);
  15764. }
  15765. public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  15766. {
  15767. - return visitor.VisitCSharpCodeLiteral(this);
  15768. + return visitor.VisitMarkupBlock(this);
  15769. }
  15770. public override void Accept(SyntaxVisitor visitor)
  15771. {
  15772. - visitor.VisitCSharpCodeLiteral(this);
  15773. + visitor.VisitMarkupBlock(this);
  15774. }
  15775. - public CSharpCodeLiteralSyntax Update(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<SyntaxToken> cSharpTokens)
  15776. + public MarkupBlockSyntax Update(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<RazorSyntaxNode> children)
  15777. {
  15778. - if (cSharpTokens != CSharpTokens)
  15779. + if (children != Children)
  15780. {
  15781. - var newNode = SyntaxFactory.CSharpCodeLiteral(cSharpTokens);
  15782. + var newNode = SyntaxFactory.MarkupBlock(children);
  15783. var diags = GetDiagnostics();
  15784. if (diags != null && diags.Length > 0)
  15785. newNode = newNode.WithDiagnosticsGreen(diags);
  15786. @@ -462,73 +527,73 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  15787. internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  15788. {
  15789. - return new CSharpCodeLiteralSyntax(Kind, _cSharpTokens, diagnostics, GetAnnotations());
  15790. + return new MarkupBlockSyntax(Kind, _children, diagnostics, GetAnnotations());
  15791. }
  15792. internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  15793. {
  15794. - return new CSharpCodeLiteralSyntax(Kind, _cSharpTokens, GetDiagnostics(), annotations);
  15795. + return new MarkupBlockSyntax(Kind, _children, GetDiagnostics(), annotations);
  15796. }
  15797. }
  15798. - internal sealed partial class CSharpCodeBlockSyntax : CSharpSyntaxNode
  15799. + internal sealed partial class MarkupTransitionSyntax : MarkupSyntaxNode
  15800. {
  15801. - private readonly GreenNode _children;
  15802. + private readonly GreenNode _transitionTokens;
  15803. - internal CSharpCodeBlockSyntax(SyntaxKind kind, GreenNode children, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  15804. + internal MarkupTransitionSyntax(SyntaxKind kind, GreenNode transitionTokens, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  15805. : base(kind, diagnostics, annotations)
  15806. {
  15807. SlotCount = 1;
  15808. - if (children != null)
  15809. + if (transitionTokens != null)
  15810. {
  15811. - AdjustFlagsAndWidth(children);
  15812. - _children = children;
  15813. + AdjustFlagsAndWidth(transitionTokens);
  15814. + _transitionTokens = transitionTokens;
  15815. }
  15816. }
  15817. - internal CSharpCodeBlockSyntax(SyntaxKind kind, GreenNode children)
  15818. + internal MarkupTransitionSyntax(SyntaxKind kind, GreenNode transitionTokens)
  15819. : base(kind)
  15820. {
  15821. SlotCount = 1;
  15822. - if (children != null)
  15823. + if (transitionTokens != null)
  15824. {
  15825. - AdjustFlagsAndWidth(children);
  15826. - _children = children;
  15827. + AdjustFlagsAndWidth(transitionTokens);
  15828. + _transitionTokens = transitionTokens;
  15829. }
  15830. }
  15831. - public SyntaxList<RazorSyntaxNode> Children { get { return new SyntaxList<RazorSyntaxNode>(_children); } }
  15832. + public SyntaxList<SyntaxToken> TransitionTokens { get { return new SyntaxList<SyntaxToken>(_transitionTokens); } }
  15833. internal override GreenNode GetSlot(int index)
  15834. {
  15835. switch (index)
  15836. {
  15837. - case 0: return _children;
  15838. + case 0: return _transitionTokens;
  15839. default: return null;
  15840. }
  15841. }
  15842. internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  15843. {
  15844. - return new Syntax.CSharpCodeBlockSyntax(this, parent, position);
  15845. + return new Syntax.MarkupTransitionSyntax(this, parent, position);
  15846. }
  15847. public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  15848. {
  15849. - return visitor.VisitCSharpCodeBlock(this);
  15850. + return visitor.VisitMarkupTransition(this);
  15851. }
  15852. public override void Accept(SyntaxVisitor visitor)
  15853. {
  15854. - visitor.VisitCSharpCodeBlock(this);
  15855. + visitor.VisitMarkupTransition(this);
  15856. }
  15857. - public CSharpCodeBlockSyntax Update(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<RazorSyntaxNode> children)
  15858. + public MarkupTransitionSyntax Update(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<SyntaxToken> transitionTokens)
  15859. {
  15860. - if (children != Children)
  15861. + if (transitionTokens != TransitionTokens)
  15862. {
  15863. - var newNode = SyntaxFactory.CSharpCodeBlock(children);
  15864. + var newNode = SyntaxFactory.MarkupTransition(transitionTokens);
  15865. var diags = GetDiagnostics();
  15866. if (diags != null && diags.Length > 0)
  15867. newNode = newNode.WithDiagnosticsGreen(diags);
  15868. @@ -543,90 +608,73 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  15869. internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  15870. {
  15871. - return new CSharpCodeBlockSyntax(Kind, _children, diagnostics, GetAnnotations());
  15872. + return new MarkupTransitionSyntax(Kind, _transitionTokens, diagnostics, GetAnnotations());
  15873. }
  15874. internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  15875. {
  15876. - return new CSharpCodeBlockSyntax(Kind, _children, GetDiagnostics(), annotations);
  15877. - }
  15878. - }
  15879. -
  15880. - internal abstract partial class CSharpBlockSyntax : CSharpSyntaxNode
  15881. - {
  15882. - internal CSharpBlockSyntax(SyntaxKind kind, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  15883. - : base(kind, diagnostics, annotations)
  15884. - {
  15885. + return new MarkupTransitionSyntax(Kind, _transitionTokens, GetDiagnostics(), annotations);
  15886. }
  15887. - internal CSharpBlockSyntax(SyntaxKind kind)
  15888. - : base(kind)
  15889. - {
  15890. - }
  15891. -
  15892. - public abstract CSharpTransitionSyntax Transition { get; }
  15893. -
  15894. - public abstract CSharpSyntaxNode Body { get; }
  15895. }
  15896. - internal sealed partial class CSharpStatement : CSharpBlockSyntax
  15897. + internal sealed partial class MarkupTextLiteralSyntax : MarkupSyntaxNode
  15898. {
  15899. - private readonly CSharpTransitionSyntax _transition;
  15900. - private readonly CSharpSyntaxNode _body;
  15901. + private readonly GreenNode _literalTokens;
  15902. - internal CSharpStatement(SyntaxKind kind, CSharpTransitionSyntax transition, CSharpSyntaxNode body, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  15903. + internal MarkupTextLiteralSyntax(SyntaxKind kind, GreenNode literalTokens, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  15904. : base(kind, diagnostics, annotations)
  15905. {
  15906. - SlotCount = 2;
  15907. - AdjustFlagsAndWidth(transition);
  15908. - _transition = transition;
  15909. - AdjustFlagsAndWidth(body);
  15910. - _body = body;
  15911. + SlotCount = 1;
  15912. + if (literalTokens != null)
  15913. + {
  15914. + AdjustFlagsAndWidth(literalTokens);
  15915. + _literalTokens = literalTokens;
  15916. + }
  15917. }
  15918. - internal CSharpStatement(SyntaxKind kind, CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  15919. + internal MarkupTextLiteralSyntax(SyntaxKind kind, GreenNode literalTokens)
  15920. : base(kind)
  15921. {
  15922. - SlotCount = 2;
  15923. - AdjustFlagsAndWidth(transition);
  15924. - _transition = transition;
  15925. - AdjustFlagsAndWidth(body);
  15926. - _body = body;
  15927. + SlotCount = 1;
  15928. + if (literalTokens != null)
  15929. + {
  15930. + AdjustFlagsAndWidth(literalTokens);
  15931. + _literalTokens = literalTokens;
  15932. + }
  15933. }
  15934. - public override CSharpTransitionSyntax Transition { get { return _transition; } }
  15935. - public override CSharpSyntaxNode Body { get { return _body; } }
  15936. + public SyntaxList<SyntaxToken> LiteralTokens { get { return new SyntaxList<SyntaxToken>(_literalTokens); } }
  15937. internal override GreenNode GetSlot(int index)
  15938. {
  15939. switch (index)
  15940. {
  15941. - case 0: return _transition;
  15942. - case 1: return _body;
  15943. + case 0: return _literalTokens;
  15944. default: return null;
  15945. }
  15946. }
  15947. internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  15948. {
  15949. - return new Syntax.CSharpStatement(this, parent, position);
  15950. + return new Syntax.MarkupTextLiteralSyntax(this, parent, position);
  15951. }
  15952. public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  15953. {
  15954. - return visitor.VisitCSharpStatement(this);
  15955. + return visitor.VisitMarkupTextLiteral(this);
  15956. }
  15957. public override void Accept(SyntaxVisitor visitor)
  15958. {
  15959. - visitor.VisitCSharpStatement(this);
  15960. + visitor.VisitMarkupTextLiteral(this);
  15961. }
  15962. - public CSharpStatement Update(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  15963. + public MarkupTextLiteralSyntax Update(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<SyntaxToken> literalTokens)
  15964. {
  15965. - if (transition != Transition || body != Body)
  15966. + if (literalTokens != LiteralTokens)
  15967. {
  15968. - var newNode = SyntaxFactory.CSharpStatement(transition, body);
  15969. + var newNode = SyntaxFactory.MarkupTextLiteral(literalTokens);
  15970. var diags = GetDiagnostics();
  15971. if (diags != null && diags.Length > 0)
  15972. newNode = newNode.WithDiagnosticsGreen(diags);
  15973. @@ -641,81 +689,73 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  15974. internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  15975. {
  15976. - return new CSharpStatement(Kind, _transition, _body, diagnostics, GetAnnotations());
  15977. + return new MarkupTextLiteralSyntax(Kind, _literalTokens, diagnostics, GetAnnotations());
  15978. }
  15979. internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  15980. {
  15981. - return new CSharpStatement(Kind, _transition, _body, GetDiagnostics(), annotations);
  15982. + return new MarkupTextLiteralSyntax(Kind, _literalTokens, GetDiagnostics(), annotations);
  15983. }
  15984. }
  15985. - internal sealed partial class CSharpStatementBodySyntax : CSharpSyntaxNode
  15986. + internal sealed partial class MarkupEphemeralTextLiteralSyntax : MarkupSyntaxNode
  15987. {
  15988. - private readonly CSharpMetaCodeSyntax _openBrace;
  15989. - private readonly CSharpCodeBlockSyntax _cSharpCode;
  15990. - private readonly CSharpMetaCodeSyntax _closeBrace;
  15991. + private readonly GreenNode _literalTokens;
  15992. - internal CSharpStatementBodySyntax(SyntaxKind kind, CSharpMetaCodeSyntax openBrace, CSharpCodeBlockSyntax cSharpCode, CSharpMetaCodeSyntax closeBrace, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  15993. + internal MarkupEphemeralTextLiteralSyntax(SyntaxKind kind, GreenNode literalTokens, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  15994. : base(kind, diagnostics, annotations)
  15995. {
  15996. - SlotCount = 3;
  15997. - AdjustFlagsAndWidth(openBrace);
  15998. - _openBrace = openBrace;
  15999. - AdjustFlagsAndWidth(cSharpCode);
  16000. - _cSharpCode = cSharpCode;
  16001. - AdjustFlagsAndWidth(closeBrace);
  16002. - _closeBrace = closeBrace;
  16003. + SlotCount = 1;
  16004. + if (literalTokens != null)
  16005. + {
  16006. + AdjustFlagsAndWidth(literalTokens);
  16007. + _literalTokens = literalTokens;
  16008. + }
  16009. }
  16010. - internal CSharpStatementBodySyntax(SyntaxKind kind, CSharpMetaCodeSyntax openBrace, CSharpCodeBlockSyntax cSharpCode, CSharpMetaCodeSyntax closeBrace)
  16011. + internal MarkupEphemeralTextLiteralSyntax(SyntaxKind kind, GreenNode literalTokens)
  16012. : base(kind)
  16013. {
  16014. - SlotCount = 3;
  16015. - AdjustFlagsAndWidth(openBrace);
  16016. - _openBrace = openBrace;
  16017. - AdjustFlagsAndWidth(cSharpCode);
  16018. - _cSharpCode = cSharpCode;
  16019. - AdjustFlagsAndWidth(closeBrace);
  16020. - _closeBrace = closeBrace;
  16021. + SlotCount = 1;
  16022. + if (literalTokens != null)
  16023. + {
  16024. + AdjustFlagsAndWidth(literalTokens);
  16025. + _literalTokens = literalTokens;
  16026. + }
  16027. }
  16028. - public CSharpMetaCodeSyntax OpenBrace { get { return _openBrace; } }
  16029. - public CSharpCodeBlockSyntax CSharpCode { get { return _cSharpCode; } }
  16030. - public CSharpMetaCodeSyntax CloseBrace { get { return _closeBrace; } }
  16031. + public SyntaxList<SyntaxToken> LiteralTokens { get { return new SyntaxList<SyntaxToken>(_literalTokens); } }
  16032. internal override GreenNode GetSlot(int index)
  16033. {
  16034. switch (index)
  16035. {
  16036. - case 0: return _openBrace;
  16037. - case 1: return _cSharpCode;
  16038. - case 2: return _closeBrace;
  16039. + case 0: return _literalTokens;
  16040. default: return null;
  16041. }
  16042. }
  16043. internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  16044. {
  16045. - return new Syntax.CSharpStatementBodySyntax(this, parent, position);
  16046. + return new Syntax.MarkupEphemeralTextLiteralSyntax(this, parent, position);
  16047. }
  16048. public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  16049. {
  16050. - return visitor.VisitCSharpStatementBody(this);
  16051. + return visitor.VisitMarkupEphemeralTextLiteral(this);
  16052. }
  16053. public override void Accept(SyntaxVisitor visitor)
  16054. {
  16055. - visitor.VisitCSharpStatementBody(this);
  16056. + visitor.VisitMarkupEphemeralTextLiteral(this);
  16057. }
  16058. - public CSharpStatementBodySyntax Update(CSharpMetaCodeSyntax openBrace, CSharpCodeBlockSyntax cSharpCode, CSharpMetaCodeSyntax closeBrace)
  16059. + public MarkupEphemeralTextLiteralSyntax Update(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<SyntaxToken> literalTokens)
  16060. {
  16061. - if (openBrace != OpenBrace || cSharpCode != CSharpCode || closeBrace != CloseBrace)
  16062. + if (literalTokens != LiteralTokens)
  16063. {
  16064. - var newNode = SyntaxFactory.CSharpStatementBody(openBrace, cSharpCode, closeBrace);
  16065. + var newNode = SyntaxFactory.MarkupEphemeralTextLiteral(literalTokens);
  16066. var diags = GetDiagnostics();
  16067. if (diags != null && diags.Length > 0)
  16068. newNode = newNode.WithDiagnosticsGreen(diags);
  16069. @@ -730,74 +770,73 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  16070. internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  16071. {
  16072. - return new CSharpStatementBodySyntax(Kind, _openBrace, _cSharpCode, _closeBrace, diagnostics, GetAnnotations());
  16073. + return new MarkupEphemeralTextLiteralSyntax(Kind, _literalTokens, diagnostics, GetAnnotations());
  16074. }
  16075. internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  16076. {
  16077. - return new CSharpStatementBodySyntax(Kind, _openBrace, _cSharpCode, _closeBrace, GetDiagnostics(), annotations);
  16078. + return new MarkupEphemeralTextLiteralSyntax(Kind, _literalTokens, GetDiagnostics(), annotations);
  16079. }
  16080. }
  16081. - internal sealed partial class CSharpExpression : CSharpBlockSyntax
  16082. + internal sealed partial class MarkupCommentBlockSyntax : RazorBlockSyntax
  16083. {
  16084. - private readonly CSharpTransitionSyntax _transition;
  16085. - private readonly CSharpSyntaxNode _body;
  16086. + private readonly GreenNode _children;
  16087. - internal CSharpExpression(SyntaxKind kind, CSharpTransitionSyntax transition, CSharpSyntaxNode body, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  16088. + internal MarkupCommentBlockSyntax(SyntaxKind kind, GreenNode children, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  16089. : base(kind, diagnostics, annotations)
  16090. {
  16091. - SlotCount = 2;
  16092. - AdjustFlagsAndWidth(transition);
  16093. - _transition = transition;
  16094. - AdjustFlagsAndWidth(body);
  16095. - _body = body;
  16096. + SlotCount = 1;
  16097. + if (children != null)
  16098. + {
  16099. + AdjustFlagsAndWidth(children);
  16100. + _children = children;
  16101. + }
  16102. }
  16103. - internal CSharpExpression(SyntaxKind kind, CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  16104. + internal MarkupCommentBlockSyntax(SyntaxKind kind, GreenNode children)
  16105. : base(kind)
  16106. {
  16107. - SlotCount = 2;
  16108. - AdjustFlagsAndWidth(transition);
  16109. - _transition = transition;
  16110. - AdjustFlagsAndWidth(body);
  16111. - _body = body;
  16112. + SlotCount = 1;
  16113. + if (children != null)
  16114. + {
  16115. + AdjustFlagsAndWidth(children);
  16116. + _children = children;
  16117. + }
  16118. }
  16119. - public override CSharpTransitionSyntax Transition { get { return _transition; } }
  16120. - public override CSharpSyntaxNode Body { get { return _body; } }
  16121. + public override SyntaxList<RazorSyntaxNode> Children { get { return new SyntaxList<RazorSyntaxNode>(_children); } }
  16122. internal override GreenNode GetSlot(int index)
  16123. {
  16124. switch (index)
  16125. {
  16126. - case 0: return _transition;
  16127. - case 1: return _body;
  16128. + case 0: return _children;
  16129. default: return null;
  16130. }
  16131. }
  16132. internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  16133. {
  16134. - return new Syntax.CSharpExpression(this, parent, position);
  16135. + return new Syntax.MarkupCommentBlockSyntax(this, parent, position);
  16136. }
  16137. public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  16138. {
  16139. - return visitor.VisitCSharpExpression(this);
  16140. + return visitor.VisitMarkupCommentBlock(this);
  16141. }
  16142. public override void Accept(SyntaxVisitor visitor)
  16143. {
  16144. - visitor.VisitCSharpExpression(this);
  16145. + visitor.VisitMarkupCommentBlock(this);
  16146. }
  16147. - public CSharpExpression Update(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  16148. + public MarkupCommentBlockSyntax Update(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<RazorSyntaxNode> children)
  16149. {
  16150. - if (transition != Transition || body != Body)
  16151. + if (children != Children)
  16152. {
  16153. - var newNode = SyntaxFactory.CSharpExpression(transition, body);
  16154. + var newNode = SyntaxFactory.MarkupCommentBlock(children);
  16155. var diags = GetDiagnostics();
  16156. if (diags != null && diags.Length > 0)
  16157. newNode = newNode.WithDiagnosticsGreen(diags);
  16158. @@ -812,93 +851,73 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  16159. internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  16160. {
  16161. - return new CSharpExpression(Kind, _transition, _body, diagnostics, GetAnnotations());
  16162. + return new MarkupCommentBlockSyntax(Kind, _children, diagnostics, GetAnnotations());
  16163. }
  16164. internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  16165. {
  16166. - return new CSharpExpression(Kind, _transition, _body, GetDiagnostics(), annotations);
  16167. + return new MarkupCommentBlockSyntax(Kind, _children, GetDiagnostics(), annotations);
  16168. }
  16169. }
  16170. - internal sealed partial class CSharpExpressionBodySyntax : CSharpSyntaxNode
  16171. + internal sealed partial class MarkupTagBlockSyntax : RazorBlockSyntax
  16172. {
  16173. - private readonly CSharpMetaCodeSyntax _openParen;
  16174. - private readonly CSharpCodeBlockSyntax _cSharpCode;
  16175. - private readonly CSharpMetaCodeSyntax _closeParen;
  16176. + private readonly GreenNode _children;
  16177. - internal CSharpExpressionBodySyntax(SyntaxKind kind, CSharpMetaCodeSyntax openParen, CSharpCodeBlockSyntax cSharpCode, CSharpMetaCodeSyntax closeParen, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  16178. + internal MarkupTagBlockSyntax(SyntaxKind kind, GreenNode children, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  16179. : base(kind, diagnostics, annotations)
  16180. {
  16181. - SlotCount = 3;
  16182. - if (openParen != null)
  16183. - {
  16184. - AdjustFlagsAndWidth(openParen);
  16185. - _openParen = openParen;
  16186. - }
  16187. - AdjustFlagsAndWidth(cSharpCode);
  16188. - _cSharpCode = cSharpCode;
  16189. - if (closeParen != null)
  16190. + SlotCount = 1;
  16191. + if (children != null)
  16192. {
  16193. - AdjustFlagsAndWidth(closeParen);
  16194. - _closeParen = closeParen;
  16195. + AdjustFlagsAndWidth(children);
  16196. + _children = children;
  16197. }
  16198. }
  16199. - internal CSharpExpressionBodySyntax(SyntaxKind kind, CSharpMetaCodeSyntax openParen, CSharpCodeBlockSyntax cSharpCode, CSharpMetaCodeSyntax closeParen)
  16200. + internal MarkupTagBlockSyntax(SyntaxKind kind, GreenNode children)
  16201. : base(kind)
  16202. {
  16203. - SlotCount = 3;
  16204. - if (openParen != null)
  16205. - {
  16206. - AdjustFlagsAndWidth(openParen);
  16207. - _openParen = openParen;
  16208. - }
  16209. - AdjustFlagsAndWidth(cSharpCode);
  16210. - _cSharpCode = cSharpCode;
  16211. - if (closeParen != null)
  16212. + SlotCount = 1;
  16213. + if (children != null)
  16214. {
  16215. - AdjustFlagsAndWidth(closeParen);
  16216. - _closeParen = closeParen;
  16217. + AdjustFlagsAndWidth(children);
  16218. + _children = children;
  16219. }
  16220. }
  16221. - public CSharpMetaCodeSyntax OpenParen { get { return _openParen; } }
  16222. - public CSharpCodeBlockSyntax CSharpCode { get { return _cSharpCode; } }
  16223. - public CSharpMetaCodeSyntax CloseParen { get { return _closeParen; } }
  16224. + public override SyntaxList<RazorSyntaxNode> Children { get { return new SyntaxList<RazorSyntaxNode>(_children); } }
  16225. internal override GreenNode GetSlot(int index)
  16226. {
  16227. switch (index)
  16228. {
  16229. - case 0: return _openParen;
  16230. - case 1: return _cSharpCode;
  16231. - case 2: return _closeParen;
  16232. + case 0: return _children;
  16233. default: return null;
  16234. }
  16235. }
  16236. internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  16237. {
  16238. - return new Syntax.CSharpExpressionBodySyntax(this, parent, position);
  16239. + return new Syntax.MarkupTagBlockSyntax(this, parent, position);
  16240. }
  16241. public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  16242. {
  16243. - return visitor.VisitCSharpExpressionBody(this);
  16244. + return visitor.VisitMarkupTagBlock(this);
  16245. }
  16246. public override void Accept(SyntaxVisitor visitor)
  16247. {
  16248. - visitor.VisitCSharpExpressionBody(this);
  16249. + visitor.VisitMarkupTagBlock(this);
  16250. }
  16251. - public CSharpExpressionBodySyntax Update(CSharpMetaCodeSyntax openParen, CSharpCodeBlockSyntax cSharpCode, CSharpMetaCodeSyntax closeParen)
  16252. + public MarkupTagBlockSyntax Update(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<RazorSyntaxNode> children)
  16253. {
  16254. - if (openParen != OpenParen || cSharpCode != CSharpCode || closeParen != CloseParen)
  16255. + if (children != Children)
  16256. {
  16257. - var newNode = SyntaxFactory.CSharpExpressionBody(openParen, cSharpCode, closeParen);
  16258. + var newNode = SyntaxFactory.MarkupTagBlock(children);
  16259. var diags = GetDiagnostics();
  16260. if (diags != null && diags.Length > 0)
  16261. newNode = newNode.WithDiagnosticsGreen(diags);
  16262. @@ -913,74 +932,80 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  16263. internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  16264. {
  16265. - return new CSharpExpressionBodySyntax(Kind, _openParen, _cSharpCode, _closeParen, diagnostics, GetAnnotations());
  16266. + return new MarkupTagBlockSyntax(Kind, _children, diagnostics, GetAnnotations());
  16267. }
  16268. internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  16269. {
  16270. - return new CSharpExpressionBodySyntax(Kind, _openParen, _cSharpCode, _closeParen, GetDiagnostics(), annotations);
  16271. + return new MarkupTagBlockSyntax(Kind, _children, GetDiagnostics(), annotations);
  16272. }
  16273. }
  16274. - internal sealed partial class CSharpDirectiveSyntax : CSharpBlockSyntax
  16275. + internal sealed partial class MarkupMinimizedAttributeBlockSyntax : MarkupSyntaxNode
  16276. {
  16277. - private readonly CSharpTransitionSyntax _transition;
  16278. - private readonly CSharpSyntaxNode _body;
  16279. + private readonly MarkupTextLiteralSyntax _namePrefix;
  16280. + private readonly MarkupTextLiteralSyntax _name;
  16281. - internal CSharpDirectiveSyntax(SyntaxKind kind, CSharpTransitionSyntax transition, CSharpSyntaxNode body, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  16282. + internal MarkupMinimizedAttributeBlockSyntax(SyntaxKind kind, MarkupTextLiteralSyntax namePrefix, MarkupTextLiteralSyntax name, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  16283. : base(kind, diagnostics, annotations)
  16284. {
  16285. SlotCount = 2;
  16286. - AdjustFlagsAndWidth(transition);
  16287. - _transition = transition;
  16288. - AdjustFlagsAndWidth(body);
  16289. - _body = body;
  16290. + if (namePrefix != null)
  16291. + {
  16292. + AdjustFlagsAndWidth(namePrefix);
  16293. + _namePrefix = namePrefix;
  16294. + }
  16295. + AdjustFlagsAndWidth(name);
  16296. + _name = name;
  16297. }
  16298. - internal CSharpDirectiveSyntax(SyntaxKind kind, CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  16299. + internal MarkupMinimizedAttributeBlockSyntax(SyntaxKind kind, MarkupTextLiteralSyntax namePrefix, MarkupTextLiteralSyntax name)
  16300. : base(kind)
  16301. {
  16302. SlotCount = 2;
  16303. - AdjustFlagsAndWidth(transition);
  16304. - _transition = transition;
  16305. - AdjustFlagsAndWidth(body);
  16306. - _body = body;
  16307. + if (namePrefix != null)
  16308. + {
  16309. + AdjustFlagsAndWidth(namePrefix);
  16310. + _namePrefix = namePrefix;
  16311. + }
  16312. + AdjustFlagsAndWidth(name);
  16313. + _name = name;
  16314. }
  16315. - public override CSharpTransitionSyntax Transition { get { return _transition; } }
  16316. - public override CSharpSyntaxNode Body { get { return _body; } }
  16317. + public MarkupTextLiteralSyntax NamePrefix { get { return _namePrefix; } }
  16318. + public MarkupTextLiteralSyntax Name { get { return _name; } }
  16319. internal override GreenNode GetSlot(int index)
  16320. {
  16321. switch (index)
  16322. {
  16323. - case 0: return _transition;
  16324. - case 1: return _body;
  16325. + case 0: return _namePrefix;
  16326. + case 1: return _name;
  16327. default: return null;
  16328. }
  16329. }
  16330. internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  16331. {
  16332. - return new Syntax.CSharpDirectiveSyntax(this, parent, position);
  16333. + return new Syntax.MarkupMinimizedAttributeBlockSyntax(this, parent, position);
  16334. }
  16335. public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  16336. {
  16337. - return visitor.VisitCSharpDirective(this);
  16338. + return visitor.VisitMarkupMinimizedAttributeBlock(this);
  16339. }
  16340. public override void Accept(SyntaxVisitor visitor)
  16341. {
  16342. - visitor.VisitCSharpDirective(this);
  16343. + visitor.VisitMarkupMinimizedAttributeBlock(this);
  16344. }
  16345. - public CSharpDirectiveSyntax Update(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  16346. + public MarkupMinimizedAttributeBlockSyntax Update(MarkupTextLiteralSyntax namePrefix, MarkupTextLiteralSyntax name)
  16347. {
  16348. - if (transition != Transition || body != Body)
  16349. + if (namePrefix != NamePrefix || name != Name)
  16350. {
  16351. - var newNode = SyntaxFactory.CSharpDirective(transition, body);
  16352. + var newNode = SyntaxFactory.MarkupMinimizedAttributeBlock(namePrefix, name);
  16353. var diags = GetDiagnostics();
  16354. if (diags != null && diags.Length > 0)
  16355. newNode = newNode.WithDiagnosticsGreen(diags);
  16356. @@ -995,74 +1020,139 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  16357. internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  16358. {
  16359. - return new CSharpDirectiveSyntax(Kind, _transition, _body, diagnostics, GetAnnotations());
  16360. + return new MarkupMinimizedAttributeBlockSyntax(Kind, _namePrefix, _name, diagnostics, GetAnnotations());
  16361. }
  16362. internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  16363. {
  16364. - return new CSharpDirectiveSyntax(Kind, _transition, _body, GetDiagnostics(), annotations);
  16365. + return new MarkupMinimizedAttributeBlockSyntax(Kind, _namePrefix, _name, GetDiagnostics(), annotations);
  16366. }
  16367. }
  16368. - internal sealed partial class CSharpDirectiveBodySyntax : CSharpSyntaxNode
  16369. + internal sealed partial class MarkupAttributeBlockSyntax : MarkupSyntaxNode
  16370. {
  16371. - private readonly CSharpMetaCodeSyntax _keyword;
  16372. - private readonly CSharpCodeBlockSyntax _cSharpCode;
  16373. -
  16374. - internal CSharpDirectiveBodySyntax(SyntaxKind kind, CSharpMetaCodeSyntax keyword, CSharpCodeBlockSyntax cSharpCode, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  16375. + private readonly MarkupTextLiteralSyntax _namePrefix;
  16376. + private readonly MarkupTextLiteralSyntax _name;
  16377. + private readonly MarkupTextLiteralSyntax _nameSuffix;
  16378. + private readonly SyntaxToken _equalsToken;
  16379. + private readonly MarkupTextLiteralSyntax _valuePrefix;
  16380. + private readonly RazorBlockSyntax _value;
  16381. + private readonly MarkupTextLiteralSyntax _valueSuffix;
  16382. +
  16383. + internal MarkupAttributeBlockSyntax(SyntaxKind kind, MarkupTextLiteralSyntax namePrefix, MarkupTextLiteralSyntax name, MarkupTextLiteralSyntax nameSuffix, SyntaxToken equalsToken, MarkupTextLiteralSyntax valuePrefix, RazorBlockSyntax value, MarkupTextLiteralSyntax valueSuffix, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  16384. : base(kind, diagnostics, annotations)
  16385. {
  16386. - SlotCount = 2;
  16387. - AdjustFlagsAndWidth(keyword);
  16388. - _keyword = keyword;
  16389. - AdjustFlagsAndWidth(cSharpCode);
  16390. - _cSharpCode = cSharpCode;
  16391. + SlotCount = 7;
  16392. + if (namePrefix != null)
  16393. + {
  16394. + AdjustFlagsAndWidth(namePrefix);
  16395. + _namePrefix = namePrefix;
  16396. + }
  16397. + AdjustFlagsAndWidth(name);
  16398. + _name = name;
  16399. + if (nameSuffix != null)
  16400. + {
  16401. + AdjustFlagsAndWidth(nameSuffix);
  16402. + _nameSuffix = nameSuffix;
  16403. + }
  16404. + AdjustFlagsAndWidth(equalsToken);
  16405. + _equalsToken = equalsToken;
  16406. + if (valuePrefix != null)
  16407. + {
  16408. + AdjustFlagsAndWidth(valuePrefix);
  16409. + _valuePrefix = valuePrefix;
  16410. + }
  16411. + if (value != null)
  16412. + {
  16413. + AdjustFlagsAndWidth(value);
  16414. + _value = value;
  16415. + }
  16416. + if (valueSuffix != null)
  16417. + {
  16418. + AdjustFlagsAndWidth(valueSuffix);
  16419. + _valueSuffix = valueSuffix;
  16420. + }
  16421. }
  16422. - internal CSharpDirectiveBodySyntax(SyntaxKind kind, CSharpMetaCodeSyntax keyword, CSharpCodeBlockSyntax cSharpCode)
  16423. + internal MarkupAttributeBlockSyntax(SyntaxKind kind, MarkupTextLiteralSyntax namePrefix, MarkupTextLiteralSyntax name, MarkupTextLiteralSyntax nameSuffix, SyntaxToken equalsToken, MarkupTextLiteralSyntax valuePrefix, RazorBlockSyntax value, MarkupTextLiteralSyntax valueSuffix)
  16424. : base(kind)
  16425. {
  16426. - SlotCount = 2;
  16427. - AdjustFlagsAndWidth(keyword);
  16428. - _keyword = keyword;
  16429. - AdjustFlagsAndWidth(cSharpCode);
  16430. - _cSharpCode = cSharpCode;
  16431. + SlotCount = 7;
  16432. + if (namePrefix != null)
  16433. + {
  16434. + AdjustFlagsAndWidth(namePrefix);
  16435. + _namePrefix = namePrefix;
  16436. + }
  16437. + AdjustFlagsAndWidth(name);
  16438. + _name = name;
  16439. + if (nameSuffix != null)
  16440. + {
  16441. + AdjustFlagsAndWidth(nameSuffix);
  16442. + _nameSuffix = nameSuffix;
  16443. + }
  16444. + AdjustFlagsAndWidth(equalsToken);
  16445. + _equalsToken = equalsToken;
  16446. + if (valuePrefix != null)
  16447. + {
  16448. + AdjustFlagsAndWidth(valuePrefix);
  16449. + _valuePrefix = valuePrefix;
  16450. + }
  16451. + if (value != null)
  16452. + {
  16453. + AdjustFlagsAndWidth(value);
  16454. + _value = value;
  16455. + }
  16456. + if (valueSuffix != null)
  16457. + {
  16458. + AdjustFlagsAndWidth(valueSuffix);
  16459. + _valueSuffix = valueSuffix;
  16460. + }
  16461. }
  16462. - public CSharpMetaCodeSyntax Keyword { get { return _keyword; } }
  16463. - public CSharpCodeBlockSyntax CSharpCode { get { return _cSharpCode; } }
  16464. + public MarkupTextLiteralSyntax NamePrefix { get { return _namePrefix; } }
  16465. + public MarkupTextLiteralSyntax Name { get { return _name; } }
  16466. + public MarkupTextLiteralSyntax NameSuffix { get { return _nameSuffix; } }
  16467. + public SyntaxToken EqualsToken { get { return _equalsToken; } }
  16468. + public MarkupTextLiteralSyntax ValuePrefix { get { return _valuePrefix; } }
  16469. + public RazorBlockSyntax Value { get { return _value; } }
  16470. + public MarkupTextLiteralSyntax ValueSuffix { get { return _valueSuffix; } }
  16471. internal override GreenNode GetSlot(int index)
  16472. {
  16473. switch (index)
  16474. {
  16475. - case 0: return _keyword;
  16476. - case 1: return _cSharpCode;
  16477. + case 0: return _namePrefix;
  16478. + case 1: return _name;
  16479. + case 2: return _nameSuffix;
  16480. + case 3: return _equalsToken;
  16481. + case 4: return _valuePrefix;
  16482. + case 5: return _value;
  16483. + case 6: return _valueSuffix;
  16484. default: return null;
  16485. }
  16486. }
  16487. internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  16488. {
  16489. - return new Syntax.CSharpDirectiveBodySyntax(this, parent, position);
  16490. + return new Syntax.MarkupAttributeBlockSyntax(this, parent, position);
  16491. }
  16492. public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  16493. {
  16494. - return visitor.VisitCSharpDirectiveBody(this);
  16495. + return visitor.VisitMarkupAttributeBlock(this);
  16496. }
  16497. public override void Accept(SyntaxVisitor visitor)
  16498. {
  16499. - visitor.VisitCSharpDirectiveBody(this);
  16500. + visitor.VisitMarkupAttributeBlock(this);
  16501. }
  16502. - public CSharpDirectiveBodySyntax Update(CSharpMetaCodeSyntax keyword, CSharpCodeBlockSyntax cSharpCode)
  16503. + public MarkupAttributeBlockSyntax Update(MarkupTextLiteralSyntax namePrefix, MarkupTextLiteralSyntax name, MarkupTextLiteralSyntax nameSuffix, SyntaxToken equalsToken, MarkupTextLiteralSyntax valuePrefix, RazorBlockSyntax value, MarkupTextLiteralSyntax valueSuffix)
  16504. {
  16505. - if (keyword != Keyword || cSharpCode != CSharpCode)
  16506. + if (namePrefix != NamePrefix || name != Name || nameSuffix != NameSuffix || equalsToken != EqualsToken || valuePrefix != ValuePrefix || value != Value || valueSuffix != ValueSuffix)
  16507. {
  16508. - var newNode = SyntaxFactory.CSharpDirectiveBody(keyword, cSharpCode);
  16509. + var newNode = SyntaxFactory.MarkupAttributeBlock(namePrefix, name, nameSuffix, equalsToken, valuePrefix, value, valueSuffix);
  16510. var diags = GetDiagnostics();
  16511. if (diags != null && diags.Length > 0)
  16512. newNode = newNode.WithDiagnosticsGreen(diags);
  16513. @@ -1077,148 +1167,2689 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  16514. internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  16515. {
  16516. - return new CSharpDirectiveBodySyntax(Kind, _keyword, _cSharpCode, diagnostics, GetAnnotations());
  16517. + return new MarkupAttributeBlockSyntax(Kind, _namePrefix, _name, _nameSuffix, _equalsToken, _valuePrefix, _value, _valueSuffix, diagnostics, GetAnnotations());
  16518. }
  16519. internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  16520. {
  16521. - return new CSharpDirectiveBodySyntax(Kind, _keyword, _cSharpCode, GetDiagnostics(), annotations);
  16522. + return new MarkupAttributeBlockSyntax(Kind, _namePrefix, _name, _nameSuffix, _equalsToken, _valuePrefix, _value, _valueSuffix, GetDiagnostics(), annotations);
  16523. }
  16524. }
  16525. - internal partial class SyntaxVisitor<TResult>
  16526. + internal sealed partial class MarkupLiteralAttributeValueSyntax : MarkupSyntaxNode
  16527. {
  16528. - public virtual TResult VisitRazorCommentBlock(RazorCommentBlockSyntax node)
  16529. + private readonly MarkupTextLiteralSyntax _prefix;
  16530. + private readonly MarkupTextLiteralSyntax _value;
  16531. +
  16532. + internal MarkupLiteralAttributeValueSyntax(SyntaxKind kind, MarkupTextLiteralSyntax prefix, MarkupTextLiteralSyntax value, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  16533. + : base(kind, diagnostics, annotations)
  16534. {
  16535. - return DefaultVisit(node);
  16536. + SlotCount = 2;
  16537. + if (prefix != null)
  16538. + {
  16539. + AdjustFlagsAndWidth(prefix);
  16540. + _prefix = prefix;
  16541. + }
  16542. + if (value != null)
  16543. + {
  16544. + AdjustFlagsAndWidth(value);
  16545. + _value = value;
  16546. + }
  16547. }
  16548. - public virtual TResult VisitHtmlTextLiteral(HtmlTextLiteralSyntax node)
  16549. +
  16550. + internal MarkupLiteralAttributeValueSyntax(SyntaxKind kind, MarkupTextLiteralSyntax prefix, MarkupTextLiteralSyntax value)
  16551. + : base(kind)
  16552. {
  16553. - return DefaultVisit(node);
  16554. + SlotCount = 2;
  16555. + if (prefix != null)
  16556. + {
  16557. + AdjustFlagsAndWidth(prefix);
  16558. + _prefix = prefix;
  16559. + }
  16560. + if (value != null)
  16561. + {
  16562. + AdjustFlagsAndWidth(value);
  16563. + _value = value;
  16564. + }
  16565. }
  16566. - public virtual TResult VisitCSharpTransition(CSharpTransitionSyntax node)
  16567. + public MarkupTextLiteralSyntax Prefix { get { return _prefix; } }
  16568. + public MarkupTextLiteralSyntax Value { get { return _value; } }
  16569. +
  16570. + internal override GreenNode GetSlot(int index)
  16571. {
  16572. - return DefaultVisit(node);
  16573. + switch (index)
  16574. + {
  16575. + case 0: return _prefix;
  16576. + case 1: return _value;
  16577. + default: return null;
  16578. + }
  16579. }
  16580. - public virtual TResult VisitCSharpMetaCode(CSharpMetaCodeSyntax node)
  16581. + internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  16582. {
  16583. - return DefaultVisit(node);
  16584. + return new Syntax.MarkupLiteralAttributeValueSyntax(this, parent, position);
  16585. }
  16586. - public virtual TResult VisitCSharpCodeLiteral(CSharpCodeLiteralSyntax node)
  16587. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  16588. {
  16589. - return DefaultVisit(node);
  16590. + return visitor.VisitMarkupLiteralAttributeValue(this);
  16591. }
  16592. - public virtual TResult VisitCSharpCodeBlock(CSharpCodeBlockSyntax node)
  16593. + public override void Accept(SyntaxVisitor visitor)
  16594. {
  16595. - return DefaultVisit(node);
  16596. + visitor.VisitMarkupLiteralAttributeValue(this);
  16597. }
  16598. - public virtual TResult VisitCSharpStatement(CSharpStatement node)
  16599. + public MarkupLiteralAttributeValueSyntax Update(MarkupTextLiteralSyntax prefix, MarkupTextLiteralSyntax value)
  16600. {
  16601. - return DefaultVisit(node);
  16602. + if (prefix != Prefix || value != Value)
  16603. + {
  16604. + var newNode = SyntaxFactory.MarkupLiteralAttributeValue(prefix, value);
  16605. + var diags = GetDiagnostics();
  16606. + if (diags != null && diags.Length > 0)
  16607. + newNode = newNode.WithDiagnosticsGreen(diags);
  16608. + var annotations = GetAnnotations();
  16609. + if (annotations != null && annotations.Length > 0)
  16610. + newNode = newNode.WithAnnotationsGreen(annotations);
  16611. + return newNode;
  16612. + }
  16613. +
  16614. + return this;
  16615. }
  16616. - public virtual TResult VisitCSharpStatementBody(CSharpStatementBodySyntax node)
  16617. + internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  16618. {
  16619. - return DefaultVisit(node);
  16620. + return new MarkupLiteralAttributeValueSyntax(Kind, _prefix, _value, diagnostics, GetAnnotations());
  16621. }
  16622. - public virtual TResult VisitCSharpExpression(CSharpExpression node)
  16623. + internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  16624. {
  16625. - return DefaultVisit(node);
  16626. + return new MarkupLiteralAttributeValueSyntax(Kind, _prefix, _value, GetDiagnostics(), annotations);
  16627. }
  16628. + }
  16629. +
  16630. + internal sealed partial class MarkupDynamicAttributeValueSyntax : MarkupSyntaxNode
  16631. + {
  16632. + private readonly MarkupTextLiteralSyntax _prefix;
  16633. + private readonly RazorBlockSyntax _value;
  16634. - public virtual TResult VisitCSharpExpressionBody(CSharpExpressionBodySyntax node)
  16635. + internal MarkupDynamicAttributeValueSyntax(SyntaxKind kind, MarkupTextLiteralSyntax prefix, RazorBlockSyntax value, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  16636. + : base(kind, diagnostics, annotations)
  16637. {
  16638. - return DefaultVisit(node);
  16639. + SlotCount = 2;
  16640. + if (prefix != null)
  16641. + {
  16642. + AdjustFlagsAndWidth(prefix);
  16643. + _prefix = prefix;
  16644. + }
  16645. + AdjustFlagsAndWidth(value);
  16646. + _value = value;
  16647. }
  16648. - public virtual TResult VisitCSharpDirective(CSharpDirectiveSyntax node)
  16649. +
  16650. + internal MarkupDynamicAttributeValueSyntax(SyntaxKind kind, MarkupTextLiteralSyntax prefix, RazorBlockSyntax value)
  16651. + : base(kind)
  16652. {
  16653. - return DefaultVisit(node);
  16654. + SlotCount = 2;
  16655. + if (prefix != null)
  16656. + {
  16657. + AdjustFlagsAndWidth(prefix);
  16658. + _prefix = prefix;
  16659. + }
  16660. + AdjustFlagsAndWidth(value);
  16661. + _value = value;
  16662. }
  16663. - public virtual TResult VisitCSharpDirectiveBody(CSharpDirectiveBodySyntax node)
  16664. + public MarkupTextLiteralSyntax Prefix { get { return _prefix; } }
  16665. + public RazorBlockSyntax Value { get { return _value; } }
  16666. +
  16667. + internal override GreenNode GetSlot(int index)
  16668. {
  16669. - return DefaultVisit(node);
  16670. + switch (index)
  16671. + {
  16672. + case 0: return _prefix;
  16673. + case 1: return _value;
  16674. + default: return null;
  16675. + }
  16676. }
  16677. - }
  16678. + internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  16679. + {
  16680. + return new Syntax.MarkupDynamicAttributeValueSyntax(this, parent, position);
  16681. + }
  16682. - internal partial class SyntaxVisitor
  16683. - {
  16684. - public virtual void VisitRazorCommentBlock(RazorCommentBlockSyntax node)
  16685. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  16686. {
  16687. - DefaultVisit(node);
  16688. + return visitor.VisitMarkupDynamicAttributeValue(this);
  16689. }
  16690. - public virtual void VisitHtmlTextLiteral(HtmlTextLiteralSyntax node)
  16691. + public override void Accept(SyntaxVisitor visitor)
  16692. {
  16693. - DefaultVisit(node);
  16694. + visitor.VisitMarkupDynamicAttributeValue(this);
  16695. }
  16696. - public virtual void VisitCSharpTransition(CSharpTransitionSyntax node)
  16697. + public MarkupDynamicAttributeValueSyntax Update(MarkupTextLiteralSyntax prefix, RazorBlockSyntax value)
  16698. {
  16699. - DefaultVisit(node);
  16700. + if (prefix != Prefix || value != Value)
  16701. + {
  16702. + var newNode = SyntaxFactory.MarkupDynamicAttributeValue(prefix, value);
  16703. + var diags = GetDiagnostics();
  16704. + if (diags != null && diags.Length > 0)
  16705. + newNode = newNode.WithDiagnosticsGreen(diags);
  16706. + var annotations = GetAnnotations();
  16707. + if (annotations != null && annotations.Length > 0)
  16708. + newNode = newNode.WithAnnotationsGreen(annotations);
  16709. + return newNode;
  16710. + }
  16711. +
  16712. + return this;
  16713. }
  16714. - public virtual void VisitCSharpMetaCode(CSharpMetaCodeSyntax node)
  16715. + internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  16716. {
  16717. - DefaultVisit(node);
  16718. + return new MarkupDynamicAttributeValueSyntax(Kind, _prefix, _value, diagnostics, GetAnnotations());
  16719. }
  16720. - public virtual void VisitCSharpCodeLiteral(CSharpCodeLiteralSyntax node)
  16721. + internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  16722. {
  16723. - DefaultVisit(node);
  16724. + return new MarkupDynamicAttributeValueSyntax(Kind, _prefix, _value, GetDiagnostics(), annotations);
  16725. }
  16726. + }
  16727. - public virtual void VisitCSharpCodeBlock(CSharpCodeBlockSyntax node)
  16728. + internal sealed partial class MarkupElementSyntax : MarkupSyntaxNode
  16729. + {
  16730. + private readonly MarkupTagBlockSyntax _startTag;
  16731. + private readonly GreenNode _body;
  16732. + private readonly MarkupTagBlockSyntax _endTag;
  16733. +
  16734. + internal MarkupElementSyntax(SyntaxKind kind, MarkupTagBlockSyntax startTag, GreenNode body, MarkupTagBlockSyntax endTag, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  16735. + : base(kind, diagnostics, annotations)
  16736. {
  16737. - DefaultVisit(node);
  16738. + SlotCount = 3;
  16739. + if (startTag != null)
  16740. + {
  16741. + AdjustFlagsAndWidth(startTag);
  16742. + _startTag = startTag;
  16743. + }
  16744. + if (body != null)
  16745. + {
  16746. + AdjustFlagsAndWidth(body);
  16747. + _body = body;
  16748. + }
  16749. + if (endTag != null)
  16750. + {
  16751. + AdjustFlagsAndWidth(endTag);
  16752. + _endTag = endTag;
  16753. + }
  16754. }
  16755. - public virtual void VisitCSharpStatement(CSharpStatement node)
  16756. +
  16757. + internal MarkupElementSyntax(SyntaxKind kind, MarkupTagBlockSyntax startTag, GreenNode body, MarkupTagBlockSyntax endTag)
  16758. + : base(kind)
  16759. {
  16760. - DefaultVisit(node);
  16761. + SlotCount = 3;
  16762. + if (startTag != null)
  16763. + {
  16764. + AdjustFlagsAndWidth(startTag);
  16765. + _startTag = startTag;
  16766. + }
  16767. + if (body != null)
  16768. + {
  16769. + AdjustFlagsAndWidth(body);
  16770. + _body = body;
  16771. + }
  16772. + if (endTag != null)
  16773. + {
  16774. + AdjustFlagsAndWidth(endTag);
  16775. + _endTag = endTag;
  16776. + }
  16777. }
  16778. - public virtual void VisitCSharpStatementBody(CSharpStatementBodySyntax node)
  16779. + public MarkupTagBlockSyntax StartTag { get { return _startTag; } }
  16780. + public SyntaxList<RazorSyntaxNode> Body { get { return new SyntaxList<RazorSyntaxNode>(_body); } }
  16781. + public MarkupTagBlockSyntax EndTag { get { return _endTag; } }
  16782. +
  16783. + internal override GreenNode GetSlot(int index)
  16784. {
  16785. - DefaultVisit(node);
  16786. + switch (index)
  16787. + {
  16788. + case 0: return _startTag;
  16789. + case 1: return _body;
  16790. + case 2: return _endTag;
  16791. + default: return null;
  16792. + }
  16793. }
  16794. - public virtual void VisitCSharpExpression(CSharpExpression node)
  16795. + internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  16796. {
  16797. - DefaultVisit(node);
  16798. + return new Syntax.MarkupElementSyntax(this, parent, position);
  16799. }
  16800. - public virtual void VisitCSharpExpressionBody(CSharpExpressionBodySyntax node)
  16801. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  16802. {
  16803. - DefaultVisit(node);
  16804. + return visitor.VisitMarkupElement(this);
  16805. }
  16806. - public virtual void VisitCSharpDirective(CSharpDirectiveSyntax node)
  16807. + public override void Accept(SyntaxVisitor visitor)
  16808. {
  16809. - DefaultVisit(node);
  16810. + visitor.VisitMarkupElement(this);
  16811. }
  16812. - public virtual void VisitCSharpDirectiveBody(CSharpDirectiveBodySyntax node)
  16813. + public MarkupElementSyntax Update(MarkupTagBlockSyntax startTag, Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<RazorSyntaxNode> body, MarkupTagBlockSyntax endTag)
  16814. {
  16815. - DefaultVisit(node);
  16816. + if (startTag != StartTag || body != Body || endTag != EndTag)
  16817. + {
  16818. + var newNode = SyntaxFactory.MarkupElement(startTag, body, endTag);
  16819. + var diags = GetDiagnostics();
  16820. + if (diags != null && diags.Length > 0)
  16821. + newNode = newNode.WithDiagnosticsGreen(diags);
  16822. + var annotations = GetAnnotations();
  16823. + if (annotations != null && annotations.Length > 0)
  16824. + newNode = newNode.WithAnnotationsGreen(annotations);
  16825. + return newNode;
  16826. + }
  16827. +
  16828. + return this;
  16829. }
  16830. - }
  16831. - internal static partial class SyntaxFactory
  16832. - {
  16833. - public static RazorCommentBlockSyntax RazorCommentBlock(SyntaxToken startCommentTransition, SyntaxToken startCommentStar, SyntaxToken comment, SyntaxToken endCommentStar, SyntaxToken endCommentTransition)
  16834. + internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  16835. {
  16836. - if (startCommentTransition == null)
  16837. - throw new ArgumentNullException(nameof(startCommentTransition));
  16838. + return new MarkupElementSyntax(Kind, _startTag, _body, _endTag, diagnostics, GetAnnotations());
  16839. + }
  16840. +
  16841. + internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  16842. + {
  16843. + return new MarkupElementSyntax(Kind, _startTag, _body, _endTag, GetDiagnostics(), annotations);
  16844. + }
  16845. + }
  16846. +
  16847. + internal sealed partial class MarkupTagHelperElementSyntax : MarkupSyntaxNode
  16848. + {
  16849. + private readonly MarkupTagHelperStartTagSyntax _startTag;
  16850. + private readonly GreenNode _body;
  16851. + private readonly MarkupTagHelperEndTagSyntax _endTag;
  16852. +
  16853. + internal MarkupTagHelperElementSyntax(SyntaxKind kind, MarkupTagHelperStartTagSyntax startTag, GreenNode body, MarkupTagHelperEndTagSyntax endTag, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  16854. + : base(kind, diagnostics, annotations)
  16855. + {
  16856. + SlotCount = 3;
  16857. + AdjustFlagsAndWidth(startTag);
  16858. + _startTag = startTag;
  16859. + if (body != null)
  16860. + {
  16861. + AdjustFlagsAndWidth(body);
  16862. + _body = body;
  16863. + }
  16864. + if (endTag != null)
  16865. + {
  16866. + AdjustFlagsAndWidth(endTag);
  16867. + _endTag = endTag;
  16868. + }
  16869. + }
  16870. +
  16871. +
  16872. + internal MarkupTagHelperElementSyntax(SyntaxKind kind, MarkupTagHelperStartTagSyntax startTag, GreenNode body, MarkupTagHelperEndTagSyntax endTag)
  16873. + : base(kind)
  16874. + {
  16875. + SlotCount = 3;
  16876. + AdjustFlagsAndWidth(startTag);
  16877. + _startTag = startTag;
  16878. + if (body != null)
  16879. + {
  16880. + AdjustFlagsAndWidth(body);
  16881. + _body = body;
  16882. + }
  16883. + if (endTag != null)
  16884. + {
  16885. + AdjustFlagsAndWidth(endTag);
  16886. + _endTag = endTag;
  16887. + }
  16888. + }
  16889. +
  16890. + public MarkupTagHelperStartTagSyntax StartTag { get { return _startTag; } }
  16891. + public SyntaxList<RazorSyntaxNode> Body { get { return new SyntaxList<RazorSyntaxNode>(_body); } }
  16892. + public MarkupTagHelperEndTagSyntax EndTag { get { return _endTag; } }
  16893. +
  16894. + internal override GreenNode GetSlot(int index)
  16895. + {
  16896. + switch (index)
  16897. + {
  16898. + case 0: return _startTag;
  16899. + case 1: return _body;
  16900. + case 2: return _endTag;
  16901. + default: return null;
  16902. + }
  16903. + }
  16904. +
  16905. + internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  16906. + {
  16907. + return new Syntax.MarkupTagHelperElementSyntax(this, parent, position);
  16908. + }
  16909. +
  16910. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  16911. + {
  16912. + return visitor.VisitMarkupTagHelperElement(this);
  16913. + }
  16914. +
  16915. + public override void Accept(SyntaxVisitor visitor)
  16916. + {
  16917. + visitor.VisitMarkupTagHelperElement(this);
  16918. + }
  16919. +
  16920. + public MarkupTagHelperElementSyntax Update(MarkupTagHelperStartTagSyntax startTag, Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<RazorSyntaxNode> body, MarkupTagHelperEndTagSyntax endTag)
  16921. + {
  16922. + if (startTag != StartTag || body != Body || endTag != EndTag)
  16923. + {
  16924. + var newNode = SyntaxFactory.MarkupTagHelperElement(startTag, body, endTag);
  16925. + var diags = GetDiagnostics();
  16926. + if (diags != null && diags.Length > 0)
  16927. + newNode = newNode.WithDiagnosticsGreen(diags);
  16928. + var annotations = GetAnnotations();
  16929. + if (annotations != null && annotations.Length > 0)
  16930. + newNode = newNode.WithAnnotationsGreen(annotations);
  16931. + return newNode;
  16932. + }
  16933. +
  16934. + return this;
  16935. + }
  16936. +
  16937. + internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  16938. + {
  16939. + return new MarkupTagHelperElementSyntax(Kind, _startTag, _body, _endTag, diagnostics, GetAnnotations());
  16940. + }
  16941. +
  16942. + internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  16943. + {
  16944. + return new MarkupTagHelperElementSyntax(Kind, _startTag, _body, _endTag, GetDiagnostics(), annotations);
  16945. + }
  16946. + }
  16947. +
  16948. + internal sealed partial class MarkupTagHelperStartTagSyntax : RazorBlockSyntax
  16949. + {
  16950. + private readonly GreenNode _children;
  16951. +
  16952. + internal MarkupTagHelperStartTagSyntax(SyntaxKind kind, GreenNode children, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  16953. + : base(kind, diagnostics, annotations)
  16954. + {
  16955. + SlotCount = 1;
  16956. + if (children != null)
  16957. + {
  16958. + AdjustFlagsAndWidth(children);
  16959. + _children = children;
  16960. + }
  16961. + }
  16962. +
  16963. +
  16964. + internal MarkupTagHelperStartTagSyntax(SyntaxKind kind, GreenNode children)
  16965. + : base(kind)
  16966. + {
  16967. + SlotCount = 1;
  16968. + if (children != null)
  16969. + {
  16970. + AdjustFlagsAndWidth(children);
  16971. + _children = children;
  16972. + }
  16973. + }
  16974. +
  16975. + public override SyntaxList<RazorSyntaxNode> Children { get { return new SyntaxList<RazorSyntaxNode>(_children); } }
  16976. +
  16977. + internal override GreenNode GetSlot(int index)
  16978. + {
  16979. + switch (index)
  16980. + {
  16981. + case 0: return _children;
  16982. + default: return null;
  16983. + }
  16984. + }
  16985. +
  16986. + internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  16987. + {
  16988. + return new Syntax.MarkupTagHelperStartTagSyntax(this, parent, position);
  16989. + }
  16990. +
  16991. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  16992. + {
  16993. + return visitor.VisitMarkupTagHelperStartTag(this);
  16994. + }
  16995. +
  16996. + public override void Accept(SyntaxVisitor visitor)
  16997. + {
  16998. + visitor.VisitMarkupTagHelperStartTag(this);
  16999. + }
  17000. +
  17001. + public MarkupTagHelperStartTagSyntax Update(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<RazorSyntaxNode> children)
  17002. + {
  17003. + if (children != Children)
  17004. + {
  17005. + var newNode = SyntaxFactory.MarkupTagHelperStartTag(children);
  17006. + var diags = GetDiagnostics();
  17007. + if (diags != null && diags.Length > 0)
  17008. + newNode = newNode.WithDiagnosticsGreen(diags);
  17009. + var annotations = GetAnnotations();
  17010. + if (annotations != null && annotations.Length > 0)
  17011. + newNode = newNode.WithAnnotationsGreen(annotations);
  17012. + return newNode;
  17013. + }
  17014. +
  17015. + return this;
  17016. + }
  17017. +
  17018. + internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  17019. + {
  17020. + return new MarkupTagHelperStartTagSyntax(Kind, _children, diagnostics, GetAnnotations());
  17021. + }
  17022. +
  17023. + internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  17024. + {
  17025. + return new MarkupTagHelperStartTagSyntax(Kind, _children, GetDiagnostics(), annotations);
  17026. + }
  17027. + }
  17028. +
  17029. + internal sealed partial class MarkupTagHelperEndTagSyntax : RazorBlockSyntax
  17030. + {
  17031. + private readonly GreenNode _children;
  17032. +
  17033. + internal MarkupTagHelperEndTagSyntax(SyntaxKind kind, GreenNode children, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  17034. + : base(kind, diagnostics, annotations)
  17035. + {
  17036. + SlotCount = 1;
  17037. + if (children != null)
  17038. + {
  17039. + AdjustFlagsAndWidth(children);
  17040. + _children = children;
  17041. + }
  17042. + }
  17043. +
  17044. +
  17045. + internal MarkupTagHelperEndTagSyntax(SyntaxKind kind, GreenNode children)
  17046. + : base(kind)
  17047. + {
  17048. + SlotCount = 1;
  17049. + if (children != null)
  17050. + {
  17051. + AdjustFlagsAndWidth(children);
  17052. + _children = children;
  17053. + }
  17054. + }
  17055. +
  17056. + public override SyntaxList<RazorSyntaxNode> Children { get { return new SyntaxList<RazorSyntaxNode>(_children); } }
  17057. +
  17058. + internal override GreenNode GetSlot(int index)
  17059. + {
  17060. + switch (index)
  17061. + {
  17062. + case 0: return _children;
  17063. + default: return null;
  17064. + }
  17065. + }
  17066. +
  17067. + internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  17068. + {
  17069. + return new Syntax.MarkupTagHelperEndTagSyntax(this, parent, position);
  17070. + }
  17071. +
  17072. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  17073. + {
  17074. + return visitor.VisitMarkupTagHelperEndTag(this);
  17075. + }
  17076. +
  17077. + public override void Accept(SyntaxVisitor visitor)
  17078. + {
  17079. + visitor.VisitMarkupTagHelperEndTag(this);
  17080. + }
  17081. +
  17082. + public MarkupTagHelperEndTagSyntax Update(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<RazorSyntaxNode> children)
  17083. + {
  17084. + if (children != Children)
  17085. + {
  17086. + var newNode = SyntaxFactory.MarkupTagHelperEndTag(children);
  17087. + var diags = GetDiagnostics();
  17088. + if (diags != null && diags.Length > 0)
  17089. + newNode = newNode.WithDiagnosticsGreen(diags);
  17090. + var annotations = GetAnnotations();
  17091. + if (annotations != null && annotations.Length > 0)
  17092. + newNode = newNode.WithAnnotationsGreen(annotations);
  17093. + return newNode;
  17094. + }
  17095. +
  17096. + return this;
  17097. + }
  17098. +
  17099. + internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  17100. + {
  17101. + return new MarkupTagHelperEndTagSyntax(Kind, _children, diagnostics, GetAnnotations());
  17102. + }
  17103. +
  17104. + internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  17105. + {
  17106. + return new MarkupTagHelperEndTagSyntax(Kind, _children, GetDiagnostics(), annotations);
  17107. + }
  17108. + }
  17109. +
  17110. + internal sealed partial class MarkupTagHelperAttributeSyntax : MarkupSyntaxNode
  17111. + {
  17112. + private readonly MarkupTextLiteralSyntax _namePrefix;
  17113. + private readonly MarkupTextLiteralSyntax _name;
  17114. + private readonly MarkupTextLiteralSyntax _nameSuffix;
  17115. + private readonly SyntaxToken _equalsToken;
  17116. + private readonly MarkupTextLiteralSyntax _valuePrefix;
  17117. + private readonly MarkupTagHelperAttributeValueSyntax _value;
  17118. + private readonly MarkupTextLiteralSyntax _valueSuffix;
  17119. +
  17120. + internal MarkupTagHelperAttributeSyntax(SyntaxKind kind, MarkupTextLiteralSyntax namePrefix, MarkupTextLiteralSyntax name, MarkupTextLiteralSyntax nameSuffix, SyntaxToken equalsToken, MarkupTextLiteralSyntax valuePrefix, MarkupTagHelperAttributeValueSyntax value, MarkupTextLiteralSyntax valueSuffix, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  17121. + : base(kind, diagnostics, annotations)
  17122. + {
  17123. + SlotCount = 7;
  17124. + if (namePrefix != null)
  17125. + {
  17126. + AdjustFlagsAndWidth(namePrefix);
  17127. + _namePrefix = namePrefix;
  17128. + }
  17129. + AdjustFlagsAndWidth(name);
  17130. + _name = name;
  17131. + if (nameSuffix != null)
  17132. + {
  17133. + AdjustFlagsAndWidth(nameSuffix);
  17134. + _nameSuffix = nameSuffix;
  17135. + }
  17136. + AdjustFlagsAndWidth(equalsToken);
  17137. + _equalsToken = equalsToken;
  17138. + if (valuePrefix != null)
  17139. + {
  17140. + AdjustFlagsAndWidth(valuePrefix);
  17141. + _valuePrefix = valuePrefix;
  17142. + }
  17143. + AdjustFlagsAndWidth(value);
  17144. + _value = value;
  17145. + if (valueSuffix != null)
  17146. + {
  17147. + AdjustFlagsAndWidth(valueSuffix);
  17148. + _valueSuffix = valueSuffix;
  17149. + }
  17150. + }
  17151. +
  17152. +
  17153. + internal MarkupTagHelperAttributeSyntax(SyntaxKind kind, MarkupTextLiteralSyntax namePrefix, MarkupTextLiteralSyntax name, MarkupTextLiteralSyntax nameSuffix, SyntaxToken equalsToken, MarkupTextLiteralSyntax valuePrefix, MarkupTagHelperAttributeValueSyntax value, MarkupTextLiteralSyntax valueSuffix)
  17154. + : base(kind)
  17155. + {
  17156. + SlotCount = 7;
  17157. + if (namePrefix != null)
  17158. + {
  17159. + AdjustFlagsAndWidth(namePrefix);
  17160. + _namePrefix = namePrefix;
  17161. + }
  17162. + AdjustFlagsAndWidth(name);
  17163. + _name = name;
  17164. + if (nameSuffix != null)
  17165. + {
  17166. + AdjustFlagsAndWidth(nameSuffix);
  17167. + _nameSuffix = nameSuffix;
  17168. + }
  17169. + AdjustFlagsAndWidth(equalsToken);
  17170. + _equalsToken = equalsToken;
  17171. + if (valuePrefix != null)
  17172. + {
  17173. + AdjustFlagsAndWidth(valuePrefix);
  17174. + _valuePrefix = valuePrefix;
  17175. + }
  17176. + AdjustFlagsAndWidth(value);
  17177. + _value = value;
  17178. + if (valueSuffix != null)
  17179. + {
  17180. + AdjustFlagsAndWidth(valueSuffix);
  17181. + _valueSuffix = valueSuffix;
  17182. + }
  17183. + }
  17184. +
  17185. + public MarkupTextLiteralSyntax NamePrefix { get { return _namePrefix; } }
  17186. + public MarkupTextLiteralSyntax Name { get { return _name; } }
  17187. + public MarkupTextLiteralSyntax NameSuffix { get { return _nameSuffix; } }
  17188. + public SyntaxToken EqualsToken { get { return _equalsToken; } }
  17189. + public MarkupTextLiteralSyntax ValuePrefix { get { return _valuePrefix; } }
  17190. + public MarkupTagHelperAttributeValueSyntax Value { get { return _value; } }
  17191. + public MarkupTextLiteralSyntax ValueSuffix { get { return _valueSuffix; } }
  17192. +
  17193. + internal override GreenNode GetSlot(int index)
  17194. + {
  17195. + switch (index)
  17196. + {
  17197. + case 0: return _namePrefix;
  17198. + case 1: return _name;
  17199. + case 2: return _nameSuffix;
  17200. + case 3: return _equalsToken;
  17201. + case 4: return _valuePrefix;
  17202. + case 5: return _value;
  17203. + case 6: return _valueSuffix;
  17204. + default: return null;
  17205. + }
  17206. + }
  17207. +
  17208. + internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  17209. + {
  17210. + return new Syntax.MarkupTagHelperAttributeSyntax(this, parent, position);
  17211. + }
  17212. +
  17213. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  17214. + {
  17215. + return visitor.VisitMarkupTagHelperAttribute(this);
  17216. + }
  17217. +
  17218. + public override void Accept(SyntaxVisitor visitor)
  17219. + {
  17220. + visitor.VisitMarkupTagHelperAttribute(this);
  17221. + }
  17222. +
  17223. + public MarkupTagHelperAttributeSyntax Update(MarkupTextLiteralSyntax namePrefix, MarkupTextLiteralSyntax name, MarkupTextLiteralSyntax nameSuffix, SyntaxToken equalsToken, MarkupTextLiteralSyntax valuePrefix, MarkupTagHelperAttributeValueSyntax value, MarkupTextLiteralSyntax valueSuffix)
  17224. + {
  17225. + if (namePrefix != NamePrefix || name != Name || nameSuffix != NameSuffix || equalsToken != EqualsToken || valuePrefix != ValuePrefix || value != Value || valueSuffix != ValueSuffix)
  17226. + {
  17227. + var newNode = SyntaxFactory.MarkupTagHelperAttribute(namePrefix, name, nameSuffix, equalsToken, valuePrefix, value, valueSuffix);
  17228. + var diags = GetDiagnostics();
  17229. + if (diags != null && diags.Length > 0)
  17230. + newNode = newNode.WithDiagnosticsGreen(diags);
  17231. + var annotations = GetAnnotations();
  17232. + if (annotations != null && annotations.Length > 0)
  17233. + newNode = newNode.WithAnnotationsGreen(annotations);
  17234. + return newNode;
  17235. + }
  17236. +
  17237. + return this;
  17238. + }
  17239. +
  17240. + internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  17241. + {
  17242. + return new MarkupTagHelperAttributeSyntax(Kind, _namePrefix, _name, _nameSuffix, _equalsToken, _valuePrefix, _value, _valueSuffix, diagnostics, GetAnnotations());
  17243. + }
  17244. +
  17245. + internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  17246. + {
  17247. + return new MarkupTagHelperAttributeSyntax(Kind, _namePrefix, _name, _nameSuffix, _equalsToken, _valuePrefix, _value, _valueSuffix, GetDiagnostics(), annotations);
  17248. + }
  17249. + }
  17250. +
  17251. + internal sealed partial class MarkupMinimizedTagHelperAttributeSyntax : MarkupSyntaxNode
  17252. + {
  17253. + private readonly MarkupTextLiteralSyntax _namePrefix;
  17254. + private readonly MarkupTextLiteralSyntax _name;
  17255. +
  17256. + internal MarkupMinimizedTagHelperAttributeSyntax(SyntaxKind kind, MarkupTextLiteralSyntax namePrefix, MarkupTextLiteralSyntax name, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  17257. + : base(kind, diagnostics, annotations)
  17258. + {
  17259. + SlotCount = 2;
  17260. + if (namePrefix != null)
  17261. + {
  17262. + AdjustFlagsAndWidth(namePrefix);
  17263. + _namePrefix = namePrefix;
  17264. + }
  17265. + AdjustFlagsAndWidth(name);
  17266. + _name = name;
  17267. + }
  17268. +
  17269. +
  17270. + internal MarkupMinimizedTagHelperAttributeSyntax(SyntaxKind kind, MarkupTextLiteralSyntax namePrefix, MarkupTextLiteralSyntax name)
  17271. + : base(kind)
  17272. + {
  17273. + SlotCount = 2;
  17274. + if (namePrefix != null)
  17275. + {
  17276. + AdjustFlagsAndWidth(namePrefix);
  17277. + _namePrefix = namePrefix;
  17278. + }
  17279. + AdjustFlagsAndWidth(name);
  17280. + _name = name;
  17281. + }
  17282. +
  17283. + public MarkupTextLiteralSyntax NamePrefix { get { return _namePrefix; } }
  17284. + public MarkupTextLiteralSyntax Name { get { return _name; } }
  17285. +
  17286. + internal override GreenNode GetSlot(int index)
  17287. + {
  17288. + switch (index)
  17289. + {
  17290. + case 0: return _namePrefix;
  17291. + case 1: return _name;
  17292. + default: return null;
  17293. + }
  17294. + }
  17295. +
  17296. + internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  17297. + {
  17298. + return new Syntax.MarkupMinimizedTagHelperAttributeSyntax(this, parent, position);
  17299. + }
  17300. +
  17301. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  17302. + {
  17303. + return visitor.VisitMarkupMinimizedTagHelperAttribute(this);
  17304. + }
  17305. +
  17306. + public override void Accept(SyntaxVisitor visitor)
  17307. + {
  17308. + visitor.VisitMarkupMinimizedTagHelperAttribute(this);
  17309. + }
  17310. +
  17311. + public MarkupMinimizedTagHelperAttributeSyntax Update(MarkupTextLiteralSyntax namePrefix, MarkupTextLiteralSyntax name)
  17312. + {
  17313. + if (namePrefix != NamePrefix || name != Name)
  17314. + {
  17315. + var newNode = SyntaxFactory.MarkupMinimizedTagHelperAttribute(namePrefix, name);
  17316. + var diags = GetDiagnostics();
  17317. + if (diags != null && diags.Length > 0)
  17318. + newNode = newNode.WithDiagnosticsGreen(diags);
  17319. + var annotations = GetAnnotations();
  17320. + if (annotations != null && annotations.Length > 0)
  17321. + newNode = newNode.WithAnnotationsGreen(annotations);
  17322. + return newNode;
  17323. + }
  17324. +
  17325. + return this;
  17326. + }
  17327. +
  17328. + internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  17329. + {
  17330. + return new MarkupMinimizedTagHelperAttributeSyntax(Kind, _namePrefix, _name, diagnostics, GetAnnotations());
  17331. + }
  17332. +
  17333. + internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  17334. + {
  17335. + return new MarkupMinimizedTagHelperAttributeSyntax(Kind, _namePrefix, _name, GetDiagnostics(), annotations);
  17336. + }
  17337. + }
  17338. +
  17339. + internal sealed partial class MarkupTagHelperAttributeValueSyntax : RazorBlockSyntax
  17340. + {
  17341. + private readonly GreenNode _children;
  17342. +
  17343. + internal MarkupTagHelperAttributeValueSyntax(SyntaxKind kind, GreenNode children, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  17344. + : base(kind, diagnostics, annotations)
  17345. + {
  17346. + SlotCount = 1;
  17347. + if (children != null)
  17348. + {
  17349. + AdjustFlagsAndWidth(children);
  17350. + _children = children;
  17351. + }
  17352. + }
  17353. +
  17354. +
  17355. + internal MarkupTagHelperAttributeValueSyntax(SyntaxKind kind, GreenNode children)
  17356. + : base(kind)
  17357. + {
  17358. + SlotCount = 1;
  17359. + if (children != null)
  17360. + {
  17361. + AdjustFlagsAndWidth(children);
  17362. + _children = children;
  17363. + }
  17364. + }
  17365. +
  17366. + public override SyntaxList<RazorSyntaxNode> Children { get { return new SyntaxList<RazorSyntaxNode>(_children); } }
  17367. +
  17368. + internal override GreenNode GetSlot(int index)
  17369. + {
  17370. + switch (index)
  17371. + {
  17372. + case 0: return _children;
  17373. + default: return null;
  17374. + }
  17375. + }
  17376. +
  17377. + internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  17378. + {
  17379. + return new Syntax.MarkupTagHelperAttributeValueSyntax(this, parent, position);
  17380. + }
  17381. +
  17382. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  17383. + {
  17384. + return visitor.VisitMarkupTagHelperAttributeValue(this);
  17385. + }
  17386. +
  17387. + public override void Accept(SyntaxVisitor visitor)
  17388. + {
  17389. + visitor.VisitMarkupTagHelperAttributeValue(this);
  17390. + }
  17391. +
  17392. + public MarkupTagHelperAttributeValueSyntax Update(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<RazorSyntaxNode> children)
  17393. + {
  17394. + if (children != Children)
  17395. + {
  17396. + var newNode = SyntaxFactory.MarkupTagHelperAttributeValue(children);
  17397. + var diags = GetDiagnostics();
  17398. + if (diags != null && diags.Length > 0)
  17399. + newNode = newNode.WithDiagnosticsGreen(diags);
  17400. + var annotations = GetAnnotations();
  17401. + if (annotations != null && annotations.Length > 0)
  17402. + newNode = newNode.WithAnnotationsGreen(annotations);
  17403. + return newNode;
  17404. + }
  17405. +
  17406. + return this;
  17407. + }
  17408. +
  17409. + internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  17410. + {
  17411. + return new MarkupTagHelperAttributeValueSyntax(Kind, _children, diagnostics, GetAnnotations());
  17412. + }
  17413. +
  17414. + internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  17415. + {
  17416. + return new MarkupTagHelperAttributeValueSyntax(Kind, _children, GetDiagnostics(), annotations);
  17417. + }
  17418. + }
  17419. +
  17420. + internal abstract partial class CSharpSyntaxNode : RazorSyntaxNode
  17421. + {
  17422. + internal CSharpSyntaxNode(SyntaxKind kind, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  17423. + : base(kind, diagnostics, annotations)
  17424. + {
  17425. + }
  17426. + internal CSharpSyntaxNode(SyntaxKind kind)
  17427. + : base(kind)
  17428. + {
  17429. + }
  17430. + }
  17431. +
  17432. + internal sealed partial class CSharpCodeBlockSyntax : RazorBlockSyntax
  17433. + {
  17434. + private readonly GreenNode _children;
  17435. +
  17436. + internal CSharpCodeBlockSyntax(SyntaxKind kind, GreenNode children, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  17437. + : base(kind, diagnostics, annotations)
  17438. + {
  17439. + SlotCount = 1;
  17440. + if (children != null)
  17441. + {
  17442. + AdjustFlagsAndWidth(children);
  17443. + _children = children;
  17444. + }
  17445. + }
  17446. +
  17447. +
  17448. + internal CSharpCodeBlockSyntax(SyntaxKind kind, GreenNode children)
  17449. + : base(kind)
  17450. + {
  17451. + SlotCount = 1;
  17452. + if (children != null)
  17453. + {
  17454. + AdjustFlagsAndWidth(children);
  17455. + _children = children;
  17456. + }
  17457. + }
  17458. +
  17459. + public override SyntaxList<RazorSyntaxNode> Children { get { return new SyntaxList<RazorSyntaxNode>(_children); } }
  17460. +
  17461. + internal override GreenNode GetSlot(int index)
  17462. + {
  17463. + switch (index)
  17464. + {
  17465. + case 0: return _children;
  17466. + default: return null;
  17467. + }
  17468. + }
  17469. +
  17470. + internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  17471. + {
  17472. + return new Syntax.CSharpCodeBlockSyntax(this, parent, position);
  17473. + }
  17474. +
  17475. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  17476. + {
  17477. + return visitor.VisitCSharpCodeBlock(this);
  17478. + }
  17479. +
  17480. + public override void Accept(SyntaxVisitor visitor)
  17481. + {
  17482. + visitor.VisitCSharpCodeBlock(this);
  17483. + }
  17484. +
  17485. + public CSharpCodeBlockSyntax Update(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<RazorSyntaxNode> children)
  17486. + {
  17487. + if (children != Children)
  17488. + {
  17489. + var newNode = SyntaxFactory.CSharpCodeBlock(children);
  17490. + var diags = GetDiagnostics();
  17491. + if (diags != null && diags.Length > 0)
  17492. + newNode = newNode.WithDiagnosticsGreen(diags);
  17493. + var annotations = GetAnnotations();
  17494. + if (annotations != null && annotations.Length > 0)
  17495. + newNode = newNode.WithAnnotationsGreen(annotations);
  17496. + return newNode;
  17497. + }
  17498. +
  17499. + return this;
  17500. + }
  17501. +
  17502. + internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  17503. + {
  17504. + return new CSharpCodeBlockSyntax(Kind, _children, diagnostics, GetAnnotations());
  17505. + }
  17506. +
  17507. + internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  17508. + {
  17509. + return new CSharpCodeBlockSyntax(Kind, _children, GetDiagnostics(), annotations);
  17510. + }
  17511. + }
  17512. +
  17513. + internal sealed partial class CSharpTransitionSyntax : CSharpSyntaxNode
  17514. + {
  17515. + private readonly SyntaxToken _transition;
  17516. +
  17517. + internal CSharpTransitionSyntax(SyntaxKind kind, SyntaxToken transition, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  17518. + : base(kind, diagnostics, annotations)
  17519. + {
  17520. + SlotCount = 1;
  17521. + AdjustFlagsAndWidth(transition);
  17522. + _transition = transition;
  17523. + }
  17524. +
  17525. +
  17526. + internal CSharpTransitionSyntax(SyntaxKind kind, SyntaxToken transition)
  17527. + : base(kind)
  17528. + {
  17529. + SlotCount = 1;
  17530. + AdjustFlagsAndWidth(transition);
  17531. + _transition = transition;
  17532. + }
  17533. +
  17534. + public SyntaxToken Transition { get { return _transition; } }
  17535. +
  17536. + internal override GreenNode GetSlot(int index)
  17537. + {
  17538. + switch (index)
  17539. + {
  17540. + case 0: return _transition;
  17541. + default: return null;
  17542. + }
  17543. + }
  17544. +
  17545. + internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  17546. + {
  17547. + return new Syntax.CSharpTransitionSyntax(this, parent, position);
  17548. + }
  17549. +
  17550. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  17551. + {
  17552. + return visitor.VisitCSharpTransition(this);
  17553. + }
  17554. +
  17555. + public override void Accept(SyntaxVisitor visitor)
  17556. + {
  17557. + visitor.VisitCSharpTransition(this);
  17558. + }
  17559. +
  17560. + public CSharpTransitionSyntax Update(SyntaxToken transition)
  17561. + {
  17562. + if (transition != Transition)
  17563. + {
  17564. + var newNode = SyntaxFactory.CSharpTransition(transition);
  17565. + var diags = GetDiagnostics();
  17566. + if (diags != null && diags.Length > 0)
  17567. + newNode = newNode.WithDiagnosticsGreen(diags);
  17568. + var annotations = GetAnnotations();
  17569. + if (annotations != null && annotations.Length > 0)
  17570. + newNode = newNode.WithAnnotationsGreen(annotations);
  17571. + return newNode;
  17572. + }
  17573. +
  17574. + return this;
  17575. + }
  17576. +
  17577. + internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  17578. + {
  17579. + return new CSharpTransitionSyntax(Kind, _transition, diagnostics, GetAnnotations());
  17580. + }
  17581. +
  17582. + internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  17583. + {
  17584. + return new CSharpTransitionSyntax(Kind, _transition, GetDiagnostics(), annotations);
  17585. + }
  17586. + }
  17587. +
  17588. + internal sealed partial class CSharpStatementLiteralSyntax : CSharpSyntaxNode
  17589. + {
  17590. + private readonly GreenNode _literalTokens;
  17591. +
  17592. + internal CSharpStatementLiteralSyntax(SyntaxKind kind, GreenNode literalTokens, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  17593. + : base(kind, diagnostics, annotations)
  17594. + {
  17595. + SlotCount = 1;
  17596. + if (literalTokens != null)
  17597. + {
  17598. + AdjustFlagsAndWidth(literalTokens);
  17599. + _literalTokens = literalTokens;
  17600. + }
  17601. + }
  17602. +
  17603. +
  17604. + internal CSharpStatementLiteralSyntax(SyntaxKind kind, GreenNode literalTokens)
  17605. + : base(kind)
  17606. + {
  17607. + SlotCount = 1;
  17608. + if (literalTokens != null)
  17609. + {
  17610. + AdjustFlagsAndWidth(literalTokens);
  17611. + _literalTokens = literalTokens;
  17612. + }
  17613. + }
  17614. +
  17615. + public SyntaxList<SyntaxToken> LiteralTokens { get { return new SyntaxList<SyntaxToken>(_literalTokens); } }
  17616. +
  17617. + internal override GreenNode GetSlot(int index)
  17618. + {
  17619. + switch (index)
  17620. + {
  17621. + case 0: return _literalTokens;
  17622. + default: return null;
  17623. + }
  17624. + }
  17625. +
  17626. + internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  17627. + {
  17628. + return new Syntax.CSharpStatementLiteralSyntax(this, parent, position);
  17629. + }
  17630. +
  17631. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  17632. + {
  17633. + return visitor.VisitCSharpStatementLiteral(this);
  17634. + }
  17635. +
  17636. + public override void Accept(SyntaxVisitor visitor)
  17637. + {
  17638. + visitor.VisitCSharpStatementLiteral(this);
  17639. + }
  17640. +
  17641. + public CSharpStatementLiteralSyntax Update(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<SyntaxToken> literalTokens)
  17642. + {
  17643. + if (literalTokens != LiteralTokens)
  17644. + {
  17645. + var newNode = SyntaxFactory.CSharpStatementLiteral(literalTokens);
  17646. + var diags = GetDiagnostics();
  17647. + if (diags != null && diags.Length > 0)
  17648. + newNode = newNode.WithDiagnosticsGreen(diags);
  17649. + var annotations = GetAnnotations();
  17650. + if (annotations != null && annotations.Length > 0)
  17651. + newNode = newNode.WithAnnotationsGreen(annotations);
  17652. + return newNode;
  17653. + }
  17654. +
  17655. + return this;
  17656. + }
  17657. +
  17658. + internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  17659. + {
  17660. + return new CSharpStatementLiteralSyntax(Kind, _literalTokens, diagnostics, GetAnnotations());
  17661. + }
  17662. +
  17663. + internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  17664. + {
  17665. + return new CSharpStatementLiteralSyntax(Kind, _literalTokens, GetDiagnostics(), annotations);
  17666. + }
  17667. + }
  17668. +
  17669. + internal sealed partial class CSharpExpressionLiteralSyntax : CSharpSyntaxNode
  17670. + {
  17671. + private readonly GreenNode _literalTokens;
  17672. +
  17673. + internal CSharpExpressionLiteralSyntax(SyntaxKind kind, GreenNode literalTokens, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  17674. + : base(kind, diagnostics, annotations)
  17675. + {
  17676. + SlotCount = 1;
  17677. + if (literalTokens != null)
  17678. + {
  17679. + AdjustFlagsAndWidth(literalTokens);
  17680. + _literalTokens = literalTokens;
  17681. + }
  17682. + }
  17683. +
  17684. +
  17685. + internal CSharpExpressionLiteralSyntax(SyntaxKind kind, GreenNode literalTokens)
  17686. + : base(kind)
  17687. + {
  17688. + SlotCount = 1;
  17689. + if (literalTokens != null)
  17690. + {
  17691. + AdjustFlagsAndWidth(literalTokens);
  17692. + _literalTokens = literalTokens;
  17693. + }
  17694. + }
  17695. +
  17696. + public SyntaxList<SyntaxToken> LiteralTokens { get { return new SyntaxList<SyntaxToken>(_literalTokens); } }
  17697. +
  17698. + internal override GreenNode GetSlot(int index)
  17699. + {
  17700. + switch (index)
  17701. + {
  17702. + case 0: return _literalTokens;
  17703. + default: return null;
  17704. + }
  17705. + }
  17706. +
  17707. + internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  17708. + {
  17709. + return new Syntax.CSharpExpressionLiteralSyntax(this, parent, position);
  17710. + }
  17711. +
  17712. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  17713. + {
  17714. + return visitor.VisitCSharpExpressionLiteral(this);
  17715. + }
  17716. +
  17717. + public override void Accept(SyntaxVisitor visitor)
  17718. + {
  17719. + visitor.VisitCSharpExpressionLiteral(this);
  17720. + }
  17721. +
  17722. + public CSharpExpressionLiteralSyntax Update(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<SyntaxToken> literalTokens)
  17723. + {
  17724. + if (literalTokens != LiteralTokens)
  17725. + {
  17726. + var newNode = SyntaxFactory.CSharpExpressionLiteral(literalTokens);
  17727. + var diags = GetDiagnostics();
  17728. + if (diags != null && diags.Length > 0)
  17729. + newNode = newNode.WithDiagnosticsGreen(diags);
  17730. + var annotations = GetAnnotations();
  17731. + if (annotations != null && annotations.Length > 0)
  17732. + newNode = newNode.WithAnnotationsGreen(annotations);
  17733. + return newNode;
  17734. + }
  17735. +
  17736. + return this;
  17737. + }
  17738. +
  17739. + internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  17740. + {
  17741. + return new CSharpExpressionLiteralSyntax(Kind, _literalTokens, diagnostics, GetAnnotations());
  17742. + }
  17743. +
  17744. + internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  17745. + {
  17746. + return new CSharpExpressionLiteralSyntax(Kind, _literalTokens, GetDiagnostics(), annotations);
  17747. + }
  17748. + }
  17749. +
  17750. + internal sealed partial class CSharpEphemeralTextLiteralSyntax : CSharpSyntaxNode
  17751. + {
  17752. + private readonly GreenNode _literalTokens;
  17753. +
  17754. + internal CSharpEphemeralTextLiteralSyntax(SyntaxKind kind, GreenNode literalTokens, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  17755. + : base(kind, diagnostics, annotations)
  17756. + {
  17757. + SlotCount = 1;
  17758. + if (literalTokens != null)
  17759. + {
  17760. + AdjustFlagsAndWidth(literalTokens);
  17761. + _literalTokens = literalTokens;
  17762. + }
  17763. + }
  17764. +
  17765. +
  17766. + internal CSharpEphemeralTextLiteralSyntax(SyntaxKind kind, GreenNode literalTokens)
  17767. + : base(kind)
  17768. + {
  17769. + SlotCount = 1;
  17770. + if (literalTokens != null)
  17771. + {
  17772. + AdjustFlagsAndWidth(literalTokens);
  17773. + _literalTokens = literalTokens;
  17774. + }
  17775. + }
  17776. +
  17777. + public SyntaxList<SyntaxToken> LiteralTokens { get { return new SyntaxList<SyntaxToken>(_literalTokens); } }
  17778. +
  17779. + internal override GreenNode GetSlot(int index)
  17780. + {
  17781. + switch (index)
  17782. + {
  17783. + case 0: return _literalTokens;
  17784. + default: return null;
  17785. + }
  17786. + }
  17787. +
  17788. + internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  17789. + {
  17790. + return new Syntax.CSharpEphemeralTextLiteralSyntax(this, parent, position);
  17791. + }
  17792. +
  17793. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  17794. + {
  17795. + return visitor.VisitCSharpEphemeralTextLiteral(this);
  17796. + }
  17797. +
  17798. + public override void Accept(SyntaxVisitor visitor)
  17799. + {
  17800. + visitor.VisitCSharpEphemeralTextLiteral(this);
  17801. + }
  17802. +
  17803. + public CSharpEphemeralTextLiteralSyntax Update(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<SyntaxToken> literalTokens)
  17804. + {
  17805. + if (literalTokens != LiteralTokens)
  17806. + {
  17807. + var newNode = SyntaxFactory.CSharpEphemeralTextLiteral(literalTokens);
  17808. + var diags = GetDiagnostics();
  17809. + if (diags != null && diags.Length > 0)
  17810. + newNode = newNode.WithDiagnosticsGreen(diags);
  17811. + var annotations = GetAnnotations();
  17812. + if (annotations != null && annotations.Length > 0)
  17813. + newNode = newNode.WithAnnotationsGreen(annotations);
  17814. + return newNode;
  17815. + }
  17816. +
  17817. + return this;
  17818. + }
  17819. +
  17820. + internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  17821. + {
  17822. + return new CSharpEphemeralTextLiteralSyntax(Kind, _literalTokens, diagnostics, GetAnnotations());
  17823. + }
  17824. +
  17825. + internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  17826. + {
  17827. + return new CSharpEphemeralTextLiteralSyntax(Kind, _literalTokens, GetDiagnostics(), annotations);
  17828. + }
  17829. + }
  17830. +
  17831. + internal sealed partial class CSharpTemplateBlockSyntax : RazorBlockSyntax
  17832. + {
  17833. + private readonly GreenNode _children;
  17834. +
  17835. + internal CSharpTemplateBlockSyntax(SyntaxKind kind, GreenNode children, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  17836. + : base(kind, diagnostics, annotations)
  17837. + {
  17838. + SlotCount = 1;
  17839. + if (children != null)
  17840. + {
  17841. + AdjustFlagsAndWidth(children);
  17842. + _children = children;
  17843. + }
  17844. + }
  17845. +
  17846. +
  17847. + internal CSharpTemplateBlockSyntax(SyntaxKind kind, GreenNode children)
  17848. + : base(kind)
  17849. + {
  17850. + SlotCount = 1;
  17851. + if (children != null)
  17852. + {
  17853. + AdjustFlagsAndWidth(children);
  17854. + _children = children;
  17855. + }
  17856. + }
  17857. +
  17858. + public override SyntaxList<RazorSyntaxNode> Children { get { return new SyntaxList<RazorSyntaxNode>(_children); } }
  17859. +
  17860. + internal override GreenNode GetSlot(int index)
  17861. + {
  17862. + switch (index)
  17863. + {
  17864. + case 0: return _children;
  17865. + default: return null;
  17866. + }
  17867. + }
  17868. +
  17869. + internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  17870. + {
  17871. + return new Syntax.CSharpTemplateBlockSyntax(this, parent, position);
  17872. + }
  17873. +
  17874. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  17875. + {
  17876. + return visitor.VisitCSharpTemplateBlock(this);
  17877. + }
  17878. +
  17879. + public override void Accept(SyntaxVisitor visitor)
  17880. + {
  17881. + visitor.VisitCSharpTemplateBlock(this);
  17882. + }
  17883. +
  17884. + public CSharpTemplateBlockSyntax Update(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<RazorSyntaxNode> children)
  17885. + {
  17886. + if (children != Children)
  17887. + {
  17888. + var newNode = SyntaxFactory.CSharpTemplateBlock(children);
  17889. + var diags = GetDiagnostics();
  17890. + if (diags != null && diags.Length > 0)
  17891. + newNode = newNode.WithDiagnosticsGreen(diags);
  17892. + var annotations = GetAnnotations();
  17893. + if (annotations != null && annotations.Length > 0)
  17894. + newNode = newNode.WithAnnotationsGreen(annotations);
  17895. + return newNode;
  17896. + }
  17897. +
  17898. + return this;
  17899. + }
  17900. +
  17901. + internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  17902. + {
  17903. + return new CSharpTemplateBlockSyntax(Kind, _children, diagnostics, GetAnnotations());
  17904. + }
  17905. +
  17906. + internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  17907. + {
  17908. + return new CSharpTemplateBlockSyntax(Kind, _children, GetDiagnostics(), annotations);
  17909. + }
  17910. + }
  17911. +
  17912. + internal abstract partial class CSharpRazorBlockSyntax : CSharpSyntaxNode
  17913. + {
  17914. + internal CSharpRazorBlockSyntax(SyntaxKind kind, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  17915. + : base(kind, diagnostics, annotations)
  17916. + {
  17917. + }
  17918. + internal CSharpRazorBlockSyntax(SyntaxKind kind)
  17919. + : base(kind)
  17920. + {
  17921. + }
  17922. +
  17923. + public abstract CSharpTransitionSyntax Transition { get; }
  17924. +
  17925. + public abstract CSharpSyntaxNode Body { get; }
  17926. + }
  17927. +
  17928. + internal sealed partial class CSharpStatementSyntax : CSharpRazorBlockSyntax
  17929. + {
  17930. + private readonly CSharpTransitionSyntax _transition;
  17931. + private readonly CSharpSyntaxNode _body;
  17932. +
  17933. + internal CSharpStatementSyntax(SyntaxKind kind, CSharpTransitionSyntax transition, CSharpSyntaxNode body, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  17934. + : base(kind, diagnostics, annotations)
  17935. + {
  17936. + SlotCount = 2;
  17937. + AdjustFlagsAndWidth(transition);
  17938. + _transition = transition;
  17939. + AdjustFlagsAndWidth(body);
  17940. + _body = body;
  17941. + }
  17942. +
  17943. +
  17944. + internal CSharpStatementSyntax(SyntaxKind kind, CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  17945. + : base(kind)
  17946. + {
  17947. + SlotCount = 2;
  17948. + AdjustFlagsAndWidth(transition);
  17949. + _transition = transition;
  17950. + AdjustFlagsAndWidth(body);
  17951. + _body = body;
  17952. + }
  17953. +
  17954. + public override CSharpTransitionSyntax Transition { get { return _transition; } }
  17955. + public override CSharpSyntaxNode Body { get { return _body; } }
  17956. +
  17957. + internal override GreenNode GetSlot(int index)
  17958. + {
  17959. + switch (index)
  17960. + {
  17961. + case 0: return _transition;
  17962. + case 1: return _body;
  17963. + default: return null;
  17964. + }
  17965. + }
  17966. +
  17967. + internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  17968. + {
  17969. + return new Syntax.CSharpStatementSyntax(this, parent, position);
  17970. + }
  17971. +
  17972. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  17973. + {
  17974. + return visitor.VisitCSharpStatement(this);
  17975. + }
  17976. +
  17977. + public override void Accept(SyntaxVisitor visitor)
  17978. + {
  17979. + visitor.VisitCSharpStatement(this);
  17980. + }
  17981. +
  17982. + public CSharpStatementSyntax Update(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  17983. + {
  17984. + if (transition != Transition || body != Body)
  17985. + {
  17986. + var newNode = SyntaxFactory.CSharpStatement(transition, body);
  17987. + var diags = GetDiagnostics();
  17988. + if (diags != null && diags.Length > 0)
  17989. + newNode = newNode.WithDiagnosticsGreen(diags);
  17990. + var annotations = GetAnnotations();
  17991. + if (annotations != null && annotations.Length > 0)
  17992. + newNode = newNode.WithAnnotationsGreen(annotations);
  17993. + return newNode;
  17994. + }
  17995. +
  17996. + return this;
  17997. + }
  17998. +
  17999. + internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  18000. + {
  18001. + return new CSharpStatementSyntax(Kind, _transition, _body, diagnostics, GetAnnotations());
  18002. + }
  18003. +
  18004. + internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  18005. + {
  18006. + return new CSharpStatementSyntax(Kind, _transition, _body, GetDiagnostics(), annotations);
  18007. + }
  18008. + }
  18009. +
  18010. + internal sealed partial class CSharpStatementBodySyntax : CSharpSyntaxNode
  18011. + {
  18012. + private readonly RazorMetaCodeSyntax _openBrace;
  18013. + private readonly CSharpCodeBlockSyntax _cSharpCode;
  18014. + private readonly RazorMetaCodeSyntax _closeBrace;
  18015. +
  18016. + internal CSharpStatementBodySyntax(SyntaxKind kind, RazorMetaCodeSyntax openBrace, CSharpCodeBlockSyntax cSharpCode, RazorMetaCodeSyntax closeBrace, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  18017. + : base(kind, diagnostics, annotations)
  18018. + {
  18019. + SlotCount = 3;
  18020. + AdjustFlagsAndWidth(openBrace);
  18021. + _openBrace = openBrace;
  18022. + AdjustFlagsAndWidth(cSharpCode);
  18023. + _cSharpCode = cSharpCode;
  18024. + AdjustFlagsAndWidth(closeBrace);
  18025. + _closeBrace = closeBrace;
  18026. + }
  18027. +
  18028. +
  18029. + internal CSharpStatementBodySyntax(SyntaxKind kind, RazorMetaCodeSyntax openBrace, CSharpCodeBlockSyntax cSharpCode, RazorMetaCodeSyntax closeBrace)
  18030. + : base(kind)
  18031. + {
  18032. + SlotCount = 3;
  18033. + AdjustFlagsAndWidth(openBrace);
  18034. + _openBrace = openBrace;
  18035. + AdjustFlagsAndWidth(cSharpCode);
  18036. + _cSharpCode = cSharpCode;
  18037. + AdjustFlagsAndWidth(closeBrace);
  18038. + _closeBrace = closeBrace;
  18039. + }
  18040. +
  18041. + public RazorMetaCodeSyntax OpenBrace { get { return _openBrace; } }
  18042. + public CSharpCodeBlockSyntax CSharpCode { get { return _cSharpCode; } }
  18043. + public RazorMetaCodeSyntax CloseBrace { get { return _closeBrace; } }
  18044. +
  18045. + internal override GreenNode GetSlot(int index)
  18046. + {
  18047. + switch (index)
  18048. + {
  18049. + case 0: return _openBrace;
  18050. + case 1: return _cSharpCode;
  18051. + case 2: return _closeBrace;
  18052. + default: return null;
  18053. + }
  18054. + }
  18055. +
  18056. + internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  18057. + {
  18058. + return new Syntax.CSharpStatementBodySyntax(this, parent, position);
  18059. + }
  18060. +
  18061. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  18062. + {
  18063. + return visitor.VisitCSharpStatementBody(this);
  18064. + }
  18065. +
  18066. + public override void Accept(SyntaxVisitor visitor)
  18067. + {
  18068. + visitor.VisitCSharpStatementBody(this);
  18069. + }
  18070. +
  18071. + public CSharpStatementBodySyntax Update(RazorMetaCodeSyntax openBrace, CSharpCodeBlockSyntax cSharpCode, RazorMetaCodeSyntax closeBrace)
  18072. + {
  18073. + if (openBrace != OpenBrace || cSharpCode != CSharpCode || closeBrace != CloseBrace)
  18074. + {
  18075. + var newNode = SyntaxFactory.CSharpStatementBody(openBrace, cSharpCode, closeBrace);
  18076. + var diags = GetDiagnostics();
  18077. + if (diags != null && diags.Length > 0)
  18078. + newNode = newNode.WithDiagnosticsGreen(diags);
  18079. + var annotations = GetAnnotations();
  18080. + if (annotations != null && annotations.Length > 0)
  18081. + newNode = newNode.WithAnnotationsGreen(annotations);
  18082. + return newNode;
  18083. + }
  18084. +
  18085. + return this;
  18086. + }
  18087. +
  18088. + internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  18089. + {
  18090. + return new CSharpStatementBodySyntax(Kind, _openBrace, _cSharpCode, _closeBrace, diagnostics, GetAnnotations());
  18091. + }
  18092. +
  18093. + internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  18094. + {
  18095. + return new CSharpStatementBodySyntax(Kind, _openBrace, _cSharpCode, _closeBrace, GetDiagnostics(), annotations);
  18096. + }
  18097. + }
  18098. +
  18099. + internal sealed partial class CSharpExplicitExpressionSyntax : CSharpRazorBlockSyntax
  18100. + {
  18101. + private readonly CSharpTransitionSyntax _transition;
  18102. + private readonly CSharpSyntaxNode _body;
  18103. +
  18104. + internal CSharpExplicitExpressionSyntax(SyntaxKind kind, CSharpTransitionSyntax transition, CSharpSyntaxNode body, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  18105. + : base(kind, diagnostics, annotations)
  18106. + {
  18107. + SlotCount = 2;
  18108. + AdjustFlagsAndWidth(transition);
  18109. + _transition = transition;
  18110. + AdjustFlagsAndWidth(body);
  18111. + _body = body;
  18112. + }
  18113. +
  18114. +
  18115. + internal CSharpExplicitExpressionSyntax(SyntaxKind kind, CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  18116. + : base(kind)
  18117. + {
  18118. + SlotCount = 2;
  18119. + AdjustFlagsAndWidth(transition);
  18120. + _transition = transition;
  18121. + AdjustFlagsAndWidth(body);
  18122. + _body = body;
  18123. + }
  18124. +
  18125. + public override CSharpTransitionSyntax Transition { get { return _transition; } }
  18126. + public override CSharpSyntaxNode Body { get { return _body; } }
  18127. +
  18128. + internal override GreenNode GetSlot(int index)
  18129. + {
  18130. + switch (index)
  18131. + {
  18132. + case 0: return _transition;
  18133. + case 1: return _body;
  18134. + default: return null;
  18135. + }
  18136. + }
  18137. +
  18138. + internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  18139. + {
  18140. + return new Syntax.CSharpExplicitExpressionSyntax(this, parent, position);
  18141. + }
  18142. +
  18143. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  18144. + {
  18145. + return visitor.VisitCSharpExplicitExpression(this);
  18146. + }
  18147. +
  18148. + public override void Accept(SyntaxVisitor visitor)
  18149. + {
  18150. + visitor.VisitCSharpExplicitExpression(this);
  18151. + }
  18152. +
  18153. + public CSharpExplicitExpressionSyntax Update(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  18154. + {
  18155. + if (transition != Transition || body != Body)
  18156. + {
  18157. + var newNode = SyntaxFactory.CSharpExplicitExpression(transition, body);
  18158. + var diags = GetDiagnostics();
  18159. + if (diags != null && diags.Length > 0)
  18160. + newNode = newNode.WithDiagnosticsGreen(diags);
  18161. + var annotations = GetAnnotations();
  18162. + if (annotations != null && annotations.Length > 0)
  18163. + newNode = newNode.WithAnnotationsGreen(annotations);
  18164. + return newNode;
  18165. + }
  18166. +
  18167. + return this;
  18168. + }
  18169. +
  18170. + internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  18171. + {
  18172. + return new CSharpExplicitExpressionSyntax(Kind, _transition, _body, diagnostics, GetAnnotations());
  18173. + }
  18174. +
  18175. + internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  18176. + {
  18177. + return new CSharpExplicitExpressionSyntax(Kind, _transition, _body, GetDiagnostics(), annotations);
  18178. + }
  18179. + }
  18180. +
  18181. + internal sealed partial class CSharpExplicitExpressionBodySyntax : CSharpSyntaxNode
  18182. + {
  18183. + private readonly RazorMetaCodeSyntax _openParen;
  18184. + private readonly CSharpCodeBlockSyntax _cSharpCode;
  18185. + private readonly RazorMetaCodeSyntax _closeParen;
  18186. +
  18187. + internal CSharpExplicitExpressionBodySyntax(SyntaxKind kind, RazorMetaCodeSyntax openParen, CSharpCodeBlockSyntax cSharpCode, RazorMetaCodeSyntax closeParen, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  18188. + : base(kind, diagnostics, annotations)
  18189. + {
  18190. + SlotCount = 3;
  18191. + AdjustFlagsAndWidth(openParen);
  18192. + _openParen = openParen;
  18193. + AdjustFlagsAndWidth(cSharpCode);
  18194. + _cSharpCode = cSharpCode;
  18195. + AdjustFlagsAndWidth(closeParen);
  18196. + _closeParen = closeParen;
  18197. + }
  18198. +
  18199. +
  18200. + internal CSharpExplicitExpressionBodySyntax(SyntaxKind kind, RazorMetaCodeSyntax openParen, CSharpCodeBlockSyntax cSharpCode, RazorMetaCodeSyntax closeParen)
  18201. + : base(kind)
  18202. + {
  18203. + SlotCount = 3;
  18204. + AdjustFlagsAndWidth(openParen);
  18205. + _openParen = openParen;
  18206. + AdjustFlagsAndWidth(cSharpCode);
  18207. + _cSharpCode = cSharpCode;
  18208. + AdjustFlagsAndWidth(closeParen);
  18209. + _closeParen = closeParen;
  18210. + }
  18211. +
  18212. + public RazorMetaCodeSyntax OpenParen { get { return _openParen; } }
  18213. + public CSharpCodeBlockSyntax CSharpCode { get { return _cSharpCode; } }
  18214. + public RazorMetaCodeSyntax CloseParen { get { return _closeParen; } }
  18215. +
  18216. + internal override GreenNode GetSlot(int index)
  18217. + {
  18218. + switch (index)
  18219. + {
  18220. + case 0: return _openParen;
  18221. + case 1: return _cSharpCode;
  18222. + case 2: return _closeParen;
  18223. + default: return null;
  18224. + }
  18225. + }
  18226. +
  18227. + internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  18228. + {
  18229. + return new Syntax.CSharpExplicitExpressionBodySyntax(this, parent, position);
  18230. + }
  18231. +
  18232. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  18233. + {
  18234. + return visitor.VisitCSharpExplicitExpressionBody(this);
  18235. + }
  18236. +
  18237. + public override void Accept(SyntaxVisitor visitor)
  18238. + {
  18239. + visitor.VisitCSharpExplicitExpressionBody(this);
  18240. + }
  18241. +
  18242. + public CSharpExplicitExpressionBodySyntax Update(RazorMetaCodeSyntax openParen, CSharpCodeBlockSyntax cSharpCode, RazorMetaCodeSyntax closeParen)
  18243. + {
  18244. + if (openParen != OpenParen || cSharpCode != CSharpCode || closeParen != CloseParen)
  18245. + {
  18246. + var newNode = SyntaxFactory.CSharpExplicitExpressionBody(openParen, cSharpCode, closeParen);
  18247. + var diags = GetDiagnostics();
  18248. + if (diags != null && diags.Length > 0)
  18249. + newNode = newNode.WithDiagnosticsGreen(diags);
  18250. + var annotations = GetAnnotations();
  18251. + if (annotations != null && annotations.Length > 0)
  18252. + newNode = newNode.WithAnnotationsGreen(annotations);
  18253. + return newNode;
  18254. + }
  18255. +
  18256. + return this;
  18257. + }
  18258. +
  18259. + internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  18260. + {
  18261. + return new CSharpExplicitExpressionBodySyntax(Kind, _openParen, _cSharpCode, _closeParen, diagnostics, GetAnnotations());
  18262. + }
  18263. +
  18264. + internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  18265. + {
  18266. + return new CSharpExplicitExpressionBodySyntax(Kind, _openParen, _cSharpCode, _closeParen, GetDiagnostics(), annotations);
  18267. + }
  18268. + }
  18269. +
  18270. + internal sealed partial class CSharpImplicitExpressionSyntax : CSharpRazorBlockSyntax
  18271. + {
  18272. + private readonly CSharpTransitionSyntax _transition;
  18273. + private readonly CSharpSyntaxNode _body;
  18274. +
  18275. + internal CSharpImplicitExpressionSyntax(SyntaxKind kind, CSharpTransitionSyntax transition, CSharpSyntaxNode body, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  18276. + : base(kind, diagnostics, annotations)
  18277. + {
  18278. + SlotCount = 2;
  18279. + AdjustFlagsAndWidth(transition);
  18280. + _transition = transition;
  18281. + AdjustFlagsAndWidth(body);
  18282. + _body = body;
  18283. + }
  18284. +
  18285. +
  18286. + internal CSharpImplicitExpressionSyntax(SyntaxKind kind, CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  18287. + : base(kind)
  18288. + {
  18289. + SlotCount = 2;
  18290. + AdjustFlagsAndWidth(transition);
  18291. + _transition = transition;
  18292. + AdjustFlagsAndWidth(body);
  18293. + _body = body;
  18294. + }
  18295. +
  18296. + public override CSharpTransitionSyntax Transition { get { return _transition; } }
  18297. + public override CSharpSyntaxNode Body { get { return _body; } }
  18298. +
  18299. + internal override GreenNode GetSlot(int index)
  18300. + {
  18301. + switch (index)
  18302. + {
  18303. + case 0: return _transition;
  18304. + case 1: return _body;
  18305. + default: return null;
  18306. + }
  18307. + }
  18308. +
  18309. + internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  18310. + {
  18311. + return new Syntax.CSharpImplicitExpressionSyntax(this, parent, position);
  18312. + }
  18313. +
  18314. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  18315. + {
  18316. + return visitor.VisitCSharpImplicitExpression(this);
  18317. + }
  18318. +
  18319. + public override void Accept(SyntaxVisitor visitor)
  18320. + {
  18321. + visitor.VisitCSharpImplicitExpression(this);
  18322. + }
  18323. +
  18324. + public CSharpImplicitExpressionSyntax Update(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  18325. + {
  18326. + if (transition != Transition || body != Body)
  18327. + {
  18328. + var newNode = SyntaxFactory.CSharpImplicitExpression(transition, body);
  18329. + var diags = GetDiagnostics();
  18330. + if (diags != null && diags.Length > 0)
  18331. + newNode = newNode.WithDiagnosticsGreen(diags);
  18332. + var annotations = GetAnnotations();
  18333. + if (annotations != null && annotations.Length > 0)
  18334. + newNode = newNode.WithAnnotationsGreen(annotations);
  18335. + return newNode;
  18336. + }
  18337. +
  18338. + return this;
  18339. + }
  18340. +
  18341. + internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  18342. + {
  18343. + return new CSharpImplicitExpressionSyntax(Kind, _transition, _body, diagnostics, GetAnnotations());
  18344. + }
  18345. +
  18346. + internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  18347. + {
  18348. + return new CSharpImplicitExpressionSyntax(Kind, _transition, _body, GetDiagnostics(), annotations);
  18349. + }
  18350. + }
  18351. +
  18352. + internal sealed partial class CSharpImplicitExpressionBodySyntax : CSharpSyntaxNode
  18353. + {
  18354. + private readonly CSharpCodeBlockSyntax _cSharpCode;
  18355. +
  18356. + internal CSharpImplicitExpressionBodySyntax(SyntaxKind kind, CSharpCodeBlockSyntax cSharpCode, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  18357. + : base(kind, diagnostics, annotations)
  18358. + {
  18359. + SlotCount = 1;
  18360. + AdjustFlagsAndWidth(cSharpCode);
  18361. + _cSharpCode = cSharpCode;
  18362. + }
  18363. +
  18364. +
  18365. + internal CSharpImplicitExpressionBodySyntax(SyntaxKind kind, CSharpCodeBlockSyntax cSharpCode)
  18366. + : base(kind)
  18367. + {
  18368. + SlotCount = 1;
  18369. + AdjustFlagsAndWidth(cSharpCode);
  18370. + _cSharpCode = cSharpCode;
  18371. + }
  18372. +
  18373. + public CSharpCodeBlockSyntax CSharpCode { get { return _cSharpCode; } }
  18374. +
  18375. + internal override GreenNode GetSlot(int index)
  18376. + {
  18377. + switch (index)
  18378. + {
  18379. + case 0: return _cSharpCode;
  18380. + default: return null;
  18381. + }
  18382. + }
  18383. +
  18384. + internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  18385. + {
  18386. + return new Syntax.CSharpImplicitExpressionBodySyntax(this, parent, position);
  18387. + }
  18388. +
  18389. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  18390. + {
  18391. + return visitor.VisitCSharpImplicitExpressionBody(this);
  18392. + }
  18393. +
  18394. + public override void Accept(SyntaxVisitor visitor)
  18395. + {
  18396. + visitor.VisitCSharpImplicitExpressionBody(this);
  18397. + }
  18398. +
  18399. + public CSharpImplicitExpressionBodySyntax Update(CSharpCodeBlockSyntax cSharpCode)
  18400. + {
  18401. + if (cSharpCode != CSharpCode)
  18402. + {
  18403. + var newNode = SyntaxFactory.CSharpImplicitExpressionBody(cSharpCode);
  18404. + var diags = GetDiagnostics();
  18405. + if (diags != null && diags.Length > 0)
  18406. + newNode = newNode.WithDiagnosticsGreen(diags);
  18407. + var annotations = GetAnnotations();
  18408. + if (annotations != null && annotations.Length > 0)
  18409. + newNode = newNode.WithAnnotationsGreen(annotations);
  18410. + return newNode;
  18411. + }
  18412. +
  18413. + return this;
  18414. + }
  18415. +
  18416. + internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  18417. + {
  18418. + return new CSharpImplicitExpressionBodySyntax(Kind, _cSharpCode, diagnostics, GetAnnotations());
  18419. + }
  18420. +
  18421. + internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  18422. + {
  18423. + return new CSharpImplicitExpressionBodySyntax(Kind, _cSharpCode, GetDiagnostics(), annotations);
  18424. + }
  18425. + }
  18426. +
  18427. + internal sealed partial class RazorDirectiveSyntax : CSharpRazorBlockSyntax
  18428. + {
  18429. + private readonly CSharpTransitionSyntax _transition;
  18430. + private readonly CSharpSyntaxNode _body;
  18431. +
  18432. + internal RazorDirectiveSyntax(SyntaxKind kind, CSharpTransitionSyntax transition, CSharpSyntaxNode body, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  18433. + : base(kind, diagnostics, annotations)
  18434. + {
  18435. + SlotCount = 2;
  18436. + AdjustFlagsAndWidth(transition);
  18437. + _transition = transition;
  18438. + AdjustFlagsAndWidth(body);
  18439. + _body = body;
  18440. + }
  18441. +
  18442. +
  18443. + internal RazorDirectiveSyntax(SyntaxKind kind, CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  18444. + : base(kind)
  18445. + {
  18446. + SlotCount = 2;
  18447. + AdjustFlagsAndWidth(transition);
  18448. + _transition = transition;
  18449. + AdjustFlagsAndWidth(body);
  18450. + _body = body;
  18451. + }
  18452. +
  18453. + public override CSharpTransitionSyntax Transition { get { return _transition; } }
  18454. + public override CSharpSyntaxNode Body { get { return _body; } }
  18455. +
  18456. + internal override GreenNode GetSlot(int index)
  18457. + {
  18458. + switch (index)
  18459. + {
  18460. + case 0: return _transition;
  18461. + case 1: return _body;
  18462. + default: return null;
  18463. + }
  18464. + }
  18465. +
  18466. + internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  18467. + {
  18468. + return new Syntax.RazorDirectiveSyntax(this, parent, position);
  18469. + }
  18470. +
  18471. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  18472. + {
  18473. + return visitor.VisitRazorDirective(this);
  18474. + }
  18475. +
  18476. + public override void Accept(SyntaxVisitor visitor)
  18477. + {
  18478. + visitor.VisitRazorDirective(this);
  18479. + }
  18480. +
  18481. + public RazorDirectiveSyntax Update(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  18482. + {
  18483. + if (transition != Transition || body != Body)
  18484. + {
  18485. + var newNode = SyntaxFactory.RazorDirective(transition, body);
  18486. + var diags = GetDiagnostics();
  18487. + if (diags != null && diags.Length > 0)
  18488. + newNode = newNode.WithDiagnosticsGreen(diags);
  18489. + var annotations = GetAnnotations();
  18490. + if (annotations != null && annotations.Length > 0)
  18491. + newNode = newNode.WithAnnotationsGreen(annotations);
  18492. + return newNode;
  18493. + }
  18494. +
  18495. + return this;
  18496. + }
  18497. +
  18498. + internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  18499. + {
  18500. + return new RazorDirectiveSyntax(Kind, _transition, _body, diagnostics, GetAnnotations());
  18501. + }
  18502. +
  18503. + internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  18504. + {
  18505. + return new RazorDirectiveSyntax(Kind, _transition, _body, GetDiagnostics(), annotations);
  18506. + }
  18507. + }
  18508. +
  18509. + internal sealed partial class RazorDirectiveBodySyntax : CSharpSyntaxNode
  18510. + {
  18511. + private readonly RazorSyntaxNode _keyword;
  18512. + private readonly CSharpCodeBlockSyntax _cSharpCode;
  18513. +
  18514. + internal RazorDirectiveBodySyntax(SyntaxKind kind, RazorSyntaxNode keyword, CSharpCodeBlockSyntax cSharpCode, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  18515. + : base(kind, diagnostics, annotations)
  18516. + {
  18517. + SlotCount = 2;
  18518. + AdjustFlagsAndWidth(keyword);
  18519. + _keyword = keyword;
  18520. + if (cSharpCode != null)
  18521. + {
  18522. + AdjustFlagsAndWidth(cSharpCode);
  18523. + _cSharpCode = cSharpCode;
  18524. + }
  18525. + }
  18526. +
  18527. +
  18528. + internal RazorDirectiveBodySyntax(SyntaxKind kind, RazorSyntaxNode keyword, CSharpCodeBlockSyntax cSharpCode)
  18529. + : base(kind)
  18530. + {
  18531. + SlotCount = 2;
  18532. + AdjustFlagsAndWidth(keyword);
  18533. + _keyword = keyword;
  18534. + if (cSharpCode != null)
  18535. + {
  18536. + AdjustFlagsAndWidth(cSharpCode);
  18537. + _cSharpCode = cSharpCode;
  18538. + }
  18539. + }
  18540. +
  18541. + public RazorSyntaxNode Keyword { get { return _keyword; } }
  18542. + public CSharpCodeBlockSyntax CSharpCode { get { return _cSharpCode; } }
  18543. +
  18544. + internal override GreenNode GetSlot(int index)
  18545. + {
  18546. + switch (index)
  18547. + {
  18548. + case 0: return _keyword;
  18549. + case 1: return _cSharpCode;
  18550. + default: return null;
  18551. + }
  18552. + }
  18553. +
  18554. + internal override SyntaxNode CreateRed(SyntaxNode parent, int position)
  18555. + {
  18556. + return new Syntax.RazorDirectiveBodySyntax(this, parent, position);
  18557. + }
  18558. +
  18559. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  18560. + {
  18561. + return visitor.VisitRazorDirectiveBody(this);
  18562. + }
  18563. +
  18564. + public override void Accept(SyntaxVisitor visitor)
  18565. + {
  18566. + visitor.VisitRazorDirectiveBody(this);
  18567. + }
  18568. +
  18569. + public RazorDirectiveBodySyntax Update(RazorSyntaxNode keyword, CSharpCodeBlockSyntax cSharpCode)
  18570. + {
  18571. + if (keyword != Keyword || cSharpCode != CSharpCode)
  18572. + {
  18573. + var newNode = SyntaxFactory.RazorDirectiveBody(keyword, cSharpCode);
  18574. + var diags = GetDiagnostics();
  18575. + if (diags != null && diags.Length > 0)
  18576. + newNode = newNode.WithDiagnosticsGreen(diags);
  18577. + var annotations = GetAnnotations();
  18578. + if (annotations != null && annotations.Length > 0)
  18579. + newNode = newNode.WithAnnotationsGreen(annotations);
  18580. + return newNode;
  18581. + }
  18582. +
  18583. + return this;
  18584. + }
  18585. +
  18586. + internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  18587. + {
  18588. + return new RazorDirectiveBodySyntax(Kind, _keyword, _cSharpCode, diagnostics, GetAnnotations());
  18589. + }
  18590. +
  18591. + internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  18592. + {
  18593. + return new RazorDirectiveBodySyntax(Kind, _keyword, _cSharpCode, GetDiagnostics(), annotations);
  18594. + }
  18595. + }
  18596. +
  18597. + internal partial class SyntaxVisitor<TResult>
  18598. + {
  18599. + public virtual TResult VisitRazorDocument(RazorDocumentSyntax node)
  18600. + {
  18601. + return DefaultVisit(node);
  18602. + }
  18603. +
  18604. + public virtual TResult VisitRazorCommentBlock(RazorCommentBlockSyntax node)
  18605. + {
  18606. + return DefaultVisit(node);
  18607. + }
  18608. +
  18609. + public virtual TResult VisitRazorMetaCode(RazorMetaCodeSyntax node)
  18610. + {
  18611. + return DefaultVisit(node);
  18612. + }
  18613. +
  18614. + public virtual TResult VisitGenericBlock(GenericBlockSyntax node)
  18615. + {
  18616. + return DefaultVisit(node);
  18617. + }
  18618. +
  18619. + public virtual TResult VisitUnclassifiedTextLiteral(UnclassifiedTextLiteralSyntax node)
  18620. + {
  18621. + return DefaultVisit(node);
  18622. + }
  18623. +
  18624. + public virtual TResult VisitMarkupBlock(MarkupBlockSyntax node)
  18625. + {
  18626. + return DefaultVisit(node);
  18627. + }
  18628. +
  18629. + public virtual TResult VisitMarkupTransition(MarkupTransitionSyntax node)
  18630. + {
  18631. + return DefaultVisit(node);
  18632. + }
  18633. +
  18634. + public virtual TResult VisitMarkupTextLiteral(MarkupTextLiteralSyntax node)
  18635. + {
  18636. + return DefaultVisit(node);
  18637. + }
  18638. +
  18639. + public virtual TResult VisitMarkupEphemeralTextLiteral(MarkupEphemeralTextLiteralSyntax node)
  18640. + {
  18641. + return DefaultVisit(node);
  18642. + }
  18643. +
  18644. + public virtual TResult VisitMarkupCommentBlock(MarkupCommentBlockSyntax node)
  18645. + {
  18646. + return DefaultVisit(node);
  18647. + }
  18648. +
  18649. + public virtual TResult VisitMarkupTagBlock(MarkupTagBlockSyntax node)
  18650. + {
  18651. + return DefaultVisit(node);
  18652. + }
  18653. +
  18654. + public virtual TResult VisitMarkupMinimizedAttributeBlock(MarkupMinimizedAttributeBlockSyntax node)
  18655. + {
  18656. + return DefaultVisit(node);
  18657. + }
  18658. +
  18659. + public virtual TResult VisitMarkupAttributeBlock(MarkupAttributeBlockSyntax node)
  18660. + {
  18661. + return DefaultVisit(node);
  18662. + }
  18663. +
  18664. + public virtual TResult VisitMarkupLiteralAttributeValue(MarkupLiteralAttributeValueSyntax node)
  18665. + {
  18666. + return DefaultVisit(node);
  18667. + }
  18668. +
  18669. + public virtual TResult VisitMarkupDynamicAttributeValue(MarkupDynamicAttributeValueSyntax node)
  18670. + {
  18671. + return DefaultVisit(node);
  18672. + }
  18673. +
  18674. + public virtual TResult VisitMarkupElement(MarkupElementSyntax node)
  18675. + {
  18676. + return DefaultVisit(node);
  18677. + }
  18678. +
  18679. + public virtual TResult VisitMarkupTagHelperElement(MarkupTagHelperElementSyntax node)
  18680. + {
  18681. + return DefaultVisit(node);
  18682. + }
  18683. +
  18684. + public virtual TResult VisitMarkupTagHelperStartTag(MarkupTagHelperStartTagSyntax node)
  18685. + {
  18686. + return DefaultVisit(node);
  18687. + }
  18688. +
  18689. + public virtual TResult VisitMarkupTagHelperEndTag(MarkupTagHelperEndTagSyntax node)
  18690. + {
  18691. + return DefaultVisit(node);
  18692. + }
  18693. +
  18694. + public virtual TResult VisitMarkupTagHelperAttribute(MarkupTagHelperAttributeSyntax node)
  18695. + {
  18696. + return DefaultVisit(node);
  18697. + }
  18698. +
  18699. + public virtual TResult VisitMarkupMinimizedTagHelperAttribute(MarkupMinimizedTagHelperAttributeSyntax node)
  18700. + {
  18701. + return DefaultVisit(node);
  18702. + }
  18703. +
  18704. + public virtual TResult VisitMarkupTagHelperAttributeValue(MarkupTagHelperAttributeValueSyntax node)
  18705. + {
  18706. + return DefaultVisit(node);
  18707. + }
  18708. +
  18709. + public virtual TResult VisitCSharpCodeBlock(CSharpCodeBlockSyntax node)
  18710. + {
  18711. + return DefaultVisit(node);
  18712. + }
  18713. +
  18714. + public virtual TResult VisitCSharpTransition(CSharpTransitionSyntax node)
  18715. + {
  18716. + return DefaultVisit(node);
  18717. + }
  18718. +
  18719. + public virtual TResult VisitCSharpStatementLiteral(CSharpStatementLiteralSyntax node)
  18720. + {
  18721. + return DefaultVisit(node);
  18722. + }
  18723. +
  18724. + public virtual TResult VisitCSharpExpressionLiteral(CSharpExpressionLiteralSyntax node)
  18725. + {
  18726. + return DefaultVisit(node);
  18727. + }
  18728. +
  18729. + public virtual TResult VisitCSharpEphemeralTextLiteral(CSharpEphemeralTextLiteralSyntax node)
  18730. + {
  18731. + return DefaultVisit(node);
  18732. + }
  18733. +
  18734. + public virtual TResult VisitCSharpTemplateBlock(CSharpTemplateBlockSyntax node)
  18735. + {
  18736. + return DefaultVisit(node);
  18737. + }
  18738. +
  18739. + public virtual TResult VisitCSharpStatement(CSharpStatementSyntax node)
  18740. + {
  18741. + return DefaultVisit(node);
  18742. + }
  18743. +
  18744. + public virtual TResult VisitCSharpStatementBody(CSharpStatementBodySyntax node)
  18745. + {
  18746. + return DefaultVisit(node);
  18747. + }
  18748. +
  18749. + public virtual TResult VisitCSharpExplicitExpression(CSharpExplicitExpressionSyntax node)
  18750. + {
  18751. + return DefaultVisit(node);
  18752. + }
  18753. +
  18754. + public virtual TResult VisitCSharpExplicitExpressionBody(CSharpExplicitExpressionBodySyntax node)
  18755. + {
  18756. + return DefaultVisit(node);
  18757. + }
  18758. +
  18759. + public virtual TResult VisitCSharpImplicitExpression(CSharpImplicitExpressionSyntax node)
  18760. + {
  18761. + return DefaultVisit(node);
  18762. + }
  18763. +
  18764. + public virtual TResult VisitCSharpImplicitExpressionBody(CSharpImplicitExpressionBodySyntax node)
  18765. + {
  18766. + return DefaultVisit(node);
  18767. + }
  18768. +
  18769. + public virtual TResult VisitRazorDirective(RazorDirectiveSyntax node)
  18770. + {
  18771. + return DefaultVisit(node);
  18772. + }
  18773. +
  18774. + public virtual TResult VisitRazorDirectiveBody(RazorDirectiveBodySyntax node)
  18775. + {
  18776. + return DefaultVisit(node);
  18777. + }
  18778. + }
  18779. +
  18780. +
  18781. + internal partial class SyntaxVisitor
  18782. + {
  18783. + public virtual void VisitRazorDocument(RazorDocumentSyntax node)
  18784. + {
  18785. + DefaultVisit(node);
  18786. + }
  18787. +
  18788. + public virtual void VisitRazorCommentBlock(RazorCommentBlockSyntax node)
  18789. + {
  18790. + DefaultVisit(node);
  18791. + }
  18792. +
  18793. + public virtual void VisitRazorMetaCode(RazorMetaCodeSyntax node)
  18794. + {
  18795. + DefaultVisit(node);
  18796. + }
  18797. +
  18798. + public virtual void VisitGenericBlock(GenericBlockSyntax node)
  18799. + {
  18800. + DefaultVisit(node);
  18801. + }
  18802. +
  18803. + public virtual void VisitUnclassifiedTextLiteral(UnclassifiedTextLiteralSyntax node)
  18804. + {
  18805. + DefaultVisit(node);
  18806. + }
  18807. +
  18808. + public virtual void VisitMarkupBlock(MarkupBlockSyntax node)
  18809. + {
  18810. + DefaultVisit(node);
  18811. + }
  18812. +
  18813. + public virtual void VisitMarkupTransition(MarkupTransitionSyntax node)
  18814. + {
  18815. + DefaultVisit(node);
  18816. + }
  18817. +
  18818. + public virtual void VisitMarkupTextLiteral(MarkupTextLiteralSyntax node)
  18819. + {
  18820. + DefaultVisit(node);
  18821. + }
  18822. +
  18823. + public virtual void VisitMarkupEphemeralTextLiteral(MarkupEphemeralTextLiteralSyntax node)
  18824. + {
  18825. + DefaultVisit(node);
  18826. + }
  18827. +
  18828. + public virtual void VisitMarkupCommentBlock(MarkupCommentBlockSyntax node)
  18829. + {
  18830. + DefaultVisit(node);
  18831. + }
  18832. +
  18833. + public virtual void VisitMarkupTagBlock(MarkupTagBlockSyntax node)
  18834. + {
  18835. + DefaultVisit(node);
  18836. + }
  18837. +
  18838. + public virtual void VisitMarkupMinimizedAttributeBlock(MarkupMinimizedAttributeBlockSyntax node)
  18839. + {
  18840. + DefaultVisit(node);
  18841. + }
  18842. +
  18843. + public virtual void VisitMarkupAttributeBlock(MarkupAttributeBlockSyntax node)
  18844. + {
  18845. + DefaultVisit(node);
  18846. + }
  18847. +
  18848. + public virtual void VisitMarkupLiteralAttributeValue(MarkupLiteralAttributeValueSyntax node)
  18849. + {
  18850. + DefaultVisit(node);
  18851. + }
  18852. +
  18853. + public virtual void VisitMarkupDynamicAttributeValue(MarkupDynamicAttributeValueSyntax node)
  18854. + {
  18855. + DefaultVisit(node);
  18856. + }
  18857. +
  18858. + public virtual void VisitMarkupElement(MarkupElementSyntax node)
  18859. + {
  18860. + DefaultVisit(node);
  18861. + }
  18862. +
  18863. + public virtual void VisitMarkupTagHelperElement(MarkupTagHelperElementSyntax node)
  18864. + {
  18865. + DefaultVisit(node);
  18866. + }
  18867. +
  18868. + public virtual void VisitMarkupTagHelperStartTag(MarkupTagHelperStartTagSyntax node)
  18869. + {
  18870. + DefaultVisit(node);
  18871. + }
  18872. +
  18873. + public virtual void VisitMarkupTagHelperEndTag(MarkupTagHelperEndTagSyntax node)
  18874. + {
  18875. + DefaultVisit(node);
  18876. + }
  18877. +
  18878. + public virtual void VisitMarkupTagHelperAttribute(MarkupTagHelperAttributeSyntax node)
  18879. + {
  18880. + DefaultVisit(node);
  18881. + }
  18882. +
  18883. + public virtual void VisitMarkupMinimizedTagHelperAttribute(MarkupMinimizedTagHelperAttributeSyntax node)
  18884. + {
  18885. + DefaultVisit(node);
  18886. + }
  18887. +
  18888. + public virtual void VisitMarkupTagHelperAttributeValue(MarkupTagHelperAttributeValueSyntax node)
  18889. + {
  18890. + DefaultVisit(node);
  18891. + }
  18892. +
  18893. + public virtual void VisitCSharpCodeBlock(CSharpCodeBlockSyntax node)
  18894. + {
  18895. + DefaultVisit(node);
  18896. + }
  18897. +
  18898. + public virtual void VisitCSharpTransition(CSharpTransitionSyntax node)
  18899. + {
  18900. + DefaultVisit(node);
  18901. + }
  18902. +
  18903. + public virtual void VisitCSharpStatementLiteral(CSharpStatementLiteralSyntax node)
  18904. + {
  18905. + DefaultVisit(node);
  18906. + }
  18907. +
  18908. + public virtual void VisitCSharpExpressionLiteral(CSharpExpressionLiteralSyntax node)
  18909. + {
  18910. + DefaultVisit(node);
  18911. + }
  18912. +
  18913. + public virtual void VisitCSharpEphemeralTextLiteral(CSharpEphemeralTextLiteralSyntax node)
  18914. + {
  18915. + DefaultVisit(node);
  18916. + }
  18917. +
  18918. + public virtual void VisitCSharpTemplateBlock(CSharpTemplateBlockSyntax node)
  18919. + {
  18920. + DefaultVisit(node);
  18921. + }
  18922. +
  18923. + public virtual void VisitCSharpStatement(CSharpStatementSyntax node)
  18924. + {
  18925. + DefaultVisit(node);
  18926. + }
  18927. +
  18928. + public virtual void VisitCSharpStatementBody(CSharpStatementBodySyntax node)
  18929. + {
  18930. + DefaultVisit(node);
  18931. + }
  18932. +
  18933. + public virtual void VisitCSharpExplicitExpression(CSharpExplicitExpressionSyntax node)
  18934. + {
  18935. + DefaultVisit(node);
  18936. + }
  18937. +
  18938. + public virtual void VisitCSharpExplicitExpressionBody(CSharpExplicitExpressionBodySyntax node)
  18939. + {
  18940. + DefaultVisit(node);
  18941. + }
  18942. +
  18943. + public virtual void VisitCSharpImplicitExpression(CSharpImplicitExpressionSyntax node)
  18944. + {
  18945. + DefaultVisit(node);
  18946. + }
  18947. +
  18948. + public virtual void VisitCSharpImplicitExpressionBody(CSharpImplicitExpressionBodySyntax node)
  18949. + {
  18950. + DefaultVisit(node);
  18951. + }
  18952. +
  18953. + public virtual void VisitRazorDirective(RazorDirectiveSyntax node)
  18954. + {
  18955. + DefaultVisit(node);
  18956. + }
  18957. +
  18958. + public virtual void VisitRazorDirectiveBody(RazorDirectiveBodySyntax node)
  18959. + {
  18960. + DefaultVisit(node);
  18961. + }
  18962. + }
  18963. +
  18964. + internal partial class SyntaxRewriter : SyntaxVisitor<GreenNode>
  18965. + {
  18966. + public override GreenNode VisitRazorDocument(RazorDocumentSyntax node)
  18967. + {
  18968. + var document = (RazorBlockSyntax)Visit(node.Document);
  18969. + return node.Update(document);
  18970. + }
  18971. +
  18972. + public override GreenNode VisitRazorCommentBlock(RazorCommentBlockSyntax node)
  18973. + {
  18974. + var startCommentTransition = (SyntaxToken)Visit(node.StartCommentTransition);
  18975. + var startCommentStar = (SyntaxToken)Visit(node.StartCommentStar);
  18976. + var comment = (SyntaxToken)Visit(node.Comment);
  18977. + var endCommentStar = (SyntaxToken)Visit(node.EndCommentStar);
  18978. + var endCommentTransition = (SyntaxToken)Visit(node.EndCommentTransition);
  18979. + return node.Update(startCommentTransition, startCommentStar, comment, endCommentStar, endCommentTransition);
  18980. + }
  18981. +
  18982. + public override GreenNode VisitRazorMetaCode(RazorMetaCodeSyntax node)
  18983. + {
  18984. + var metaCode = VisitList(node.MetaCode);
  18985. + return node.Update(metaCode);
  18986. + }
  18987. +
  18988. + public override GreenNode VisitGenericBlock(GenericBlockSyntax node)
  18989. + {
  18990. + var children = VisitList(node.Children);
  18991. + return node.Update(children);
  18992. + }
  18993. +
  18994. + public override GreenNode VisitUnclassifiedTextLiteral(UnclassifiedTextLiteralSyntax node)
  18995. + {
  18996. + var literalTokens = VisitList(node.LiteralTokens);
  18997. + return node.Update(literalTokens);
  18998. + }
  18999. +
  19000. + public override GreenNode VisitMarkupBlock(MarkupBlockSyntax node)
  19001. + {
  19002. + var children = VisitList(node.Children);
  19003. + return node.Update(children);
  19004. + }
  19005. +
  19006. + public override GreenNode VisitMarkupTransition(MarkupTransitionSyntax node)
  19007. + {
  19008. + var transitionTokens = VisitList(node.TransitionTokens);
  19009. + return node.Update(transitionTokens);
  19010. + }
  19011. +
  19012. + public override GreenNode VisitMarkupTextLiteral(MarkupTextLiteralSyntax node)
  19013. + {
  19014. + var literalTokens = VisitList(node.LiteralTokens);
  19015. + return node.Update(literalTokens);
  19016. + }
  19017. +
  19018. + public override GreenNode VisitMarkupEphemeralTextLiteral(MarkupEphemeralTextLiteralSyntax node)
  19019. + {
  19020. + var literalTokens = VisitList(node.LiteralTokens);
  19021. + return node.Update(literalTokens);
  19022. + }
  19023. +
  19024. + public override GreenNode VisitMarkupCommentBlock(MarkupCommentBlockSyntax node)
  19025. + {
  19026. + var children = VisitList(node.Children);
  19027. + return node.Update(children);
  19028. + }
  19029. +
  19030. + public override GreenNode VisitMarkupTagBlock(MarkupTagBlockSyntax node)
  19031. + {
  19032. + var children = VisitList(node.Children);
  19033. + return node.Update(children);
  19034. + }
  19035. +
  19036. + public override GreenNode VisitMarkupMinimizedAttributeBlock(MarkupMinimizedAttributeBlockSyntax node)
  19037. + {
  19038. + var namePrefix = (MarkupTextLiteralSyntax)Visit(node.NamePrefix);
  19039. + var name = (MarkupTextLiteralSyntax)Visit(node.Name);
  19040. + return node.Update(namePrefix, name);
  19041. + }
  19042. +
  19043. + public override GreenNode VisitMarkupAttributeBlock(MarkupAttributeBlockSyntax node)
  19044. + {
  19045. + var namePrefix = (MarkupTextLiteralSyntax)Visit(node.NamePrefix);
  19046. + var name = (MarkupTextLiteralSyntax)Visit(node.Name);
  19047. + var nameSuffix = (MarkupTextLiteralSyntax)Visit(node.NameSuffix);
  19048. + var equalsToken = (SyntaxToken)Visit(node.EqualsToken);
  19049. + var valuePrefix = (MarkupTextLiteralSyntax)Visit(node.ValuePrefix);
  19050. + var value = (RazorBlockSyntax)Visit(node.Value);
  19051. + var valueSuffix = (MarkupTextLiteralSyntax)Visit(node.ValueSuffix);
  19052. + return node.Update(namePrefix, name, nameSuffix, equalsToken, valuePrefix, value, valueSuffix);
  19053. + }
  19054. +
  19055. + public override GreenNode VisitMarkupLiteralAttributeValue(MarkupLiteralAttributeValueSyntax node)
  19056. + {
  19057. + var prefix = (MarkupTextLiteralSyntax)Visit(node.Prefix);
  19058. + var value = (MarkupTextLiteralSyntax)Visit(node.Value);
  19059. + return node.Update(prefix, value);
  19060. + }
  19061. +
  19062. + public override GreenNode VisitMarkupDynamicAttributeValue(MarkupDynamicAttributeValueSyntax node)
  19063. + {
  19064. + var prefix = (MarkupTextLiteralSyntax)Visit(node.Prefix);
  19065. + var value = (RazorBlockSyntax)Visit(node.Value);
  19066. + return node.Update(prefix, value);
  19067. + }
  19068. +
  19069. + public override GreenNode VisitMarkupElement(MarkupElementSyntax node)
  19070. + {
  19071. + var startTag = (MarkupTagBlockSyntax)Visit(node.StartTag);
  19072. + var body = VisitList(node.Body);
  19073. + var endTag = (MarkupTagBlockSyntax)Visit(node.EndTag);
  19074. + return node.Update(startTag, body, endTag);
  19075. + }
  19076. +
  19077. + public override GreenNode VisitMarkupTagHelperElement(MarkupTagHelperElementSyntax node)
  19078. + {
  19079. + var startTag = (MarkupTagHelperStartTagSyntax)Visit(node.StartTag);
  19080. + var body = VisitList(node.Body);
  19081. + var endTag = (MarkupTagHelperEndTagSyntax)Visit(node.EndTag);
  19082. + return node.Update(startTag, body, endTag);
  19083. + }
  19084. +
  19085. + public override GreenNode VisitMarkupTagHelperStartTag(MarkupTagHelperStartTagSyntax node)
  19086. + {
  19087. + var children = VisitList(node.Children);
  19088. + return node.Update(children);
  19089. + }
  19090. +
  19091. + public override GreenNode VisitMarkupTagHelperEndTag(MarkupTagHelperEndTagSyntax node)
  19092. + {
  19093. + var children = VisitList(node.Children);
  19094. + return node.Update(children);
  19095. + }
  19096. +
  19097. + public override GreenNode VisitMarkupTagHelperAttribute(MarkupTagHelperAttributeSyntax node)
  19098. + {
  19099. + var namePrefix = (MarkupTextLiteralSyntax)Visit(node.NamePrefix);
  19100. + var name = (MarkupTextLiteralSyntax)Visit(node.Name);
  19101. + var nameSuffix = (MarkupTextLiteralSyntax)Visit(node.NameSuffix);
  19102. + var equalsToken = (SyntaxToken)Visit(node.EqualsToken);
  19103. + var valuePrefix = (MarkupTextLiteralSyntax)Visit(node.ValuePrefix);
  19104. + var value = (MarkupTagHelperAttributeValueSyntax)Visit(node.Value);
  19105. + var valueSuffix = (MarkupTextLiteralSyntax)Visit(node.ValueSuffix);
  19106. + return node.Update(namePrefix, name, nameSuffix, equalsToken, valuePrefix, value, valueSuffix);
  19107. + }
  19108. +
  19109. + public override GreenNode VisitMarkupMinimizedTagHelperAttribute(MarkupMinimizedTagHelperAttributeSyntax node)
  19110. + {
  19111. + var namePrefix = (MarkupTextLiteralSyntax)Visit(node.NamePrefix);
  19112. + var name = (MarkupTextLiteralSyntax)Visit(node.Name);
  19113. + return node.Update(namePrefix, name);
  19114. + }
  19115. +
  19116. + public override GreenNode VisitMarkupTagHelperAttributeValue(MarkupTagHelperAttributeValueSyntax node)
  19117. + {
  19118. + var children = VisitList(node.Children);
  19119. + return node.Update(children);
  19120. + }
  19121. +
  19122. + public override GreenNode VisitCSharpCodeBlock(CSharpCodeBlockSyntax node)
  19123. + {
  19124. + var children = VisitList(node.Children);
  19125. + return node.Update(children);
  19126. + }
  19127. +
  19128. + public override GreenNode VisitCSharpTransition(CSharpTransitionSyntax node)
  19129. + {
  19130. + var transition = (SyntaxToken)Visit(node.Transition);
  19131. + return node.Update(transition);
  19132. + }
  19133. +
  19134. + public override GreenNode VisitCSharpStatementLiteral(CSharpStatementLiteralSyntax node)
  19135. + {
  19136. + var literalTokens = VisitList(node.LiteralTokens);
  19137. + return node.Update(literalTokens);
  19138. + }
  19139. +
  19140. + public override GreenNode VisitCSharpExpressionLiteral(CSharpExpressionLiteralSyntax node)
  19141. + {
  19142. + var literalTokens = VisitList(node.LiteralTokens);
  19143. + return node.Update(literalTokens);
  19144. + }
  19145. +
  19146. + public override GreenNode VisitCSharpEphemeralTextLiteral(CSharpEphemeralTextLiteralSyntax node)
  19147. + {
  19148. + var literalTokens = VisitList(node.LiteralTokens);
  19149. + return node.Update(literalTokens);
  19150. + }
  19151. +
  19152. + public override GreenNode VisitCSharpTemplateBlock(CSharpTemplateBlockSyntax node)
  19153. + {
  19154. + var children = VisitList(node.Children);
  19155. + return node.Update(children);
  19156. + }
  19157. +
  19158. + public override GreenNode VisitCSharpStatement(CSharpStatementSyntax node)
  19159. + {
  19160. + var transition = (CSharpTransitionSyntax)Visit(node.Transition);
  19161. + var body = (CSharpSyntaxNode)Visit(node.Body);
  19162. + return node.Update(transition, body);
  19163. + }
  19164. +
  19165. + public override GreenNode VisitCSharpStatementBody(CSharpStatementBodySyntax node)
  19166. + {
  19167. + var openBrace = (RazorMetaCodeSyntax)Visit(node.OpenBrace);
  19168. + var cSharpCode = (CSharpCodeBlockSyntax)Visit(node.CSharpCode);
  19169. + var closeBrace = (RazorMetaCodeSyntax)Visit(node.CloseBrace);
  19170. + return node.Update(openBrace, cSharpCode, closeBrace);
  19171. + }
  19172. +
  19173. + public override GreenNode VisitCSharpExplicitExpression(CSharpExplicitExpressionSyntax node)
  19174. + {
  19175. + var transition = (CSharpTransitionSyntax)Visit(node.Transition);
  19176. + var body = (CSharpSyntaxNode)Visit(node.Body);
  19177. + return node.Update(transition, body);
  19178. + }
  19179. +
  19180. + public override GreenNode VisitCSharpExplicitExpressionBody(CSharpExplicitExpressionBodySyntax node)
  19181. + {
  19182. + var openParen = (RazorMetaCodeSyntax)Visit(node.OpenParen);
  19183. + var cSharpCode = (CSharpCodeBlockSyntax)Visit(node.CSharpCode);
  19184. + var closeParen = (RazorMetaCodeSyntax)Visit(node.CloseParen);
  19185. + return node.Update(openParen, cSharpCode, closeParen);
  19186. + }
  19187. +
  19188. + public override GreenNode VisitCSharpImplicitExpression(CSharpImplicitExpressionSyntax node)
  19189. + {
  19190. + var transition = (CSharpTransitionSyntax)Visit(node.Transition);
  19191. + var body = (CSharpSyntaxNode)Visit(node.Body);
  19192. + return node.Update(transition, body);
  19193. + }
  19194. +
  19195. + public override GreenNode VisitCSharpImplicitExpressionBody(CSharpImplicitExpressionBodySyntax node)
  19196. + {
  19197. + var cSharpCode = (CSharpCodeBlockSyntax)Visit(node.CSharpCode);
  19198. + return node.Update(cSharpCode);
  19199. + }
  19200. +
  19201. + public override GreenNode VisitRazorDirective(RazorDirectiveSyntax node)
  19202. + {
  19203. + var transition = (CSharpTransitionSyntax)Visit(node.Transition);
  19204. + var body = (CSharpSyntaxNode)Visit(node.Body);
  19205. + return node.Update(transition, body);
  19206. + }
  19207. +
  19208. + public override GreenNode VisitRazorDirectiveBody(RazorDirectiveBodySyntax node)
  19209. + {
  19210. + var keyword = (RazorSyntaxNode)Visit(node.Keyword);
  19211. + var cSharpCode = (CSharpCodeBlockSyntax)Visit(node.CSharpCode);
  19212. + return node.Update(keyword, cSharpCode);
  19213. + }
  19214. + }
  19215. +
  19216. + internal static partial class SyntaxFactory
  19217. + {
  19218. + public static RazorDocumentSyntax RazorDocument(RazorBlockSyntax document)
  19219. + {
  19220. + if (document == null)
  19221. + throw new ArgumentNullException(nameof(document));
  19222. +
  19223. + var result = new RazorDocumentSyntax(SyntaxKind.RazorDocument, document);
  19224. +
  19225. + return result;
  19226. + }
  19227. +
  19228. + public static RazorCommentBlockSyntax RazorCommentBlock(SyntaxToken startCommentTransition, SyntaxToken startCommentStar, SyntaxToken comment, SyntaxToken endCommentStar, SyntaxToken endCommentTransition)
  19229. + {
  19230. + if (startCommentTransition == null)
  19231. + throw new ArgumentNullException(nameof(startCommentTransition));
  19232. switch (startCommentTransition.Kind)
  19233. {
  19234. case SyntaxKind.RazorCommentTransition:
  19235. @@ -1235,17 +3866,15 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  19236. default:
  19237. throw new ArgumentException("startCommentStar");
  19238. }
  19239. - if (comment != null)
  19240. - {
  19241. + if (comment == null)
  19242. + throw new ArgumentNullException(nameof(comment));
  19243. switch (comment.Kind)
  19244. {
  19245. - case SyntaxKind.RazorComment:
  19246. - case SyntaxKind.Unknown:
  19247. + case SyntaxKind.RazorCommentLiteral:
  19248. break;
  19249. default:
  19250. throw new ArgumentException("comment");
  19251. }
  19252. - }
  19253. if (endCommentStar == null)
  19254. throw new ArgumentNullException(nameof(endCommentStar));
  19255. switch (endCommentStar.Kind)
  19256. @@ -1268,9 +3897,183 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  19257. return new RazorCommentBlockSyntax(SyntaxKind.RazorComment, startCommentTransition, startCommentStar, comment, endCommentStar, endCommentTransition);
  19258. }
  19259. - public static HtmlTextLiteralSyntax HtmlTextLiteral(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<SyntaxToken> textTokens)
  19260. + public static RazorMetaCodeSyntax RazorMetaCode(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<SyntaxToken> metaCode)
  19261. + {
  19262. + var result = new RazorMetaCodeSyntax(SyntaxKind.RazorMetaCode, metaCode.Node);
  19263. +
  19264. + return result;
  19265. + }
  19266. +
  19267. + public static GenericBlockSyntax GenericBlock(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<RazorSyntaxNode> children)
  19268. + {
  19269. + var result = new GenericBlockSyntax(SyntaxKind.GenericBlock, children.Node);
  19270. +
  19271. + return result;
  19272. + }
  19273. +
  19274. + public static UnclassifiedTextLiteralSyntax UnclassifiedTextLiteral(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<SyntaxToken> literalTokens)
  19275. + {
  19276. + var result = new UnclassifiedTextLiteralSyntax(SyntaxKind.UnclassifiedTextLiteral, literalTokens.Node);
  19277. +
  19278. + return result;
  19279. + }
  19280. +
  19281. + public static MarkupBlockSyntax MarkupBlock(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<RazorSyntaxNode> children)
  19282. + {
  19283. + var result = new MarkupBlockSyntax(SyntaxKind.MarkupBlock, children.Node);
  19284. +
  19285. + return result;
  19286. + }
  19287. +
  19288. + public static MarkupTransitionSyntax MarkupTransition(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<SyntaxToken> transitionTokens)
  19289. + {
  19290. + var result = new MarkupTransitionSyntax(SyntaxKind.MarkupTransition, transitionTokens.Node);
  19291. +
  19292. + return result;
  19293. + }
  19294. +
  19295. + public static MarkupTextLiteralSyntax MarkupTextLiteral(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<SyntaxToken> literalTokens)
  19296. + {
  19297. + var result = new MarkupTextLiteralSyntax(SyntaxKind.MarkupTextLiteral, literalTokens.Node);
  19298. +
  19299. + return result;
  19300. + }
  19301. +
  19302. + public static MarkupEphemeralTextLiteralSyntax MarkupEphemeralTextLiteral(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<SyntaxToken> literalTokens)
  19303. + {
  19304. + var result = new MarkupEphemeralTextLiteralSyntax(SyntaxKind.MarkupEphemeralTextLiteral, literalTokens.Node);
  19305. +
  19306. + return result;
  19307. + }
  19308. +
  19309. + public static MarkupCommentBlockSyntax MarkupCommentBlock(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<RazorSyntaxNode> children)
  19310. + {
  19311. + var result = new MarkupCommentBlockSyntax(SyntaxKind.MarkupCommentBlock, children.Node);
  19312. +
  19313. + return result;
  19314. + }
  19315. +
  19316. + public static MarkupTagBlockSyntax MarkupTagBlock(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<RazorSyntaxNode> children)
  19317. + {
  19318. + var result = new MarkupTagBlockSyntax(SyntaxKind.MarkupTagBlock, children.Node);
  19319. +
  19320. + return result;
  19321. + }
  19322. +
  19323. + public static MarkupMinimizedAttributeBlockSyntax MarkupMinimizedAttributeBlock(MarkupTextLiteralSyntax namePrefix, MarkupTextLiteralSyntax name)
  19324. + {
  19325. + if (name == null)
  19326. + throw new ArgumentNullException(nameof(name));
  19327. +
  19328. + var result = new MarkupMinimizedAttributeBlockSyntax(SyntaxKind.MarkupMinimizedAttributeBlock, namePrefix, name);
  19329. +
  19330. + return result;
  19331. + }
  19332. +
  19333. + public static MarkupAttributeBlockSyntax MarkupAttributeBlock(MarkupTextLiteralSyntax namePrefix, MarkupTextLiteralSyntax name, MarkupTextLiteralSyntax nameSuffix, SyntaxToken equalsToken, MarkupTextLiteralSyntax valuePrefix, RazorBlockSyntax value, MarkupTextLiteralSyntax valueSuffix)
  19334. + {
  19335. + if (name == null)
  19336. + throw new ArgumentNullException(nameof(name));
  19337. + if (equalsToken == null)
  19338. + throw new ArgumentNullException(nameof(equalsToken));
  19339. + switch (equalsToken.Kind)
  19340. + {
  19341. + case SyntaxKind.Equals:
  19342. + break;
  19343. + default:
  19344. + throw new ArgumentException("equalsToken");
  19345. + }
  19346. +
  19347. + return new MarkupAttributeBlockSyntax(SyntaxKind.MarkupAttributeBlock, namePrefix, name, nameSuffix, equalsToken, valuePrefix, value, valueSuffix);
  19348. + }
  19349. +
  19350. + public static MarkupLiteralAttributeValueSyntax MarkupLiteralAttributeValue(MarkupTextLiteralSyntax prefix, MarkupTextLiteralSyntax value)
  19351. + {
  19352. + var result = new MarkupLiteralAttributeValueSyntax(SyntaxKind.MarkupLiteralAttributeValue, prefix, value);
  19353. +
  19354. + return result;
  19355. + }
  19356. +
  19357. + public static MarkupDynamicAttributeValueSyntax MarkupDynamicAttributeValue(MarkupTextLiteralSyntax prefix, RazorBlockSyntax value)
  19358. + {
  19359. + if (value == null)
  19360. + throw new ArgumentNullException(nameof(value));
  19361. +
  19362. + var result = new MarkupDynamicAttributeValueSyntax(SyntaxKind.MarkupDynamicAttributeValue, prefix, value);
  19363. +
  19364. + return result;
  19365. + }
  19366. +
  19367. + public static MarkupElementSyntax MarkupElement(MarkupTagBlockSyntax startTag, Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<RazorSyntaxNode> body, MarkupTagBlockSyntax endTag)
  19368. + {
  19369. + var result = new MarkupElementSyntax(SyntaxKind.MarkupElement, startTag, body.Node, endTag);
  19370. +
  19371. + return result;
  19372. + }
  19373. +
  19374. + public static MarkupTagHelperElementSyntax MarkupTagHelperElement(MarkupTagHelperStartTagSyntax startTag, Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<RazorSyntaxNode> body, MarkupTagHelperEndTagSyntax endTag)
  19375. + {
  19376. + if (startTag == null)
  19377. + throw new ArgumentNullException(nameof(startTag));
  19378. +
  19379. + var result = new MarkupTagHelperElementSyntax(SyntaxKind.MarkupTagHelperElement, startTag, body.Node, endTag);
  19380. +
  19381. + return result;
  19382. + }
  19383. +
  19384. + public static MarkupTagHelperStartTagSyntax MarkupTagHelperStartTag(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<RazorSyntaxNode> children)
  19385. + {
  19386. + var result = new MarkupTagHelperStartTagSyntax(SyntaxKind.MarkupTagHelperStartTag, children.Node);
  19387. +
  19388. + return result;
  19389. + }
  19390. +
  19391. + public static MarkupTagHelperEndTagSyntax MarkupTagHelperEndTag(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<RazorSyntaxNode> children)
  19392. + {
  19393. + var result = new MarkupTagHelperEndTagSyntax(SyntaxKind.MarkupTagHelperEndTag, children.Node);
  19394. +
  19395. + return result;
  19396. + }
  19397. +
  19398. + public static MarkupTagHelperAttributeSyntax MarkupTagHelperAttribute(MarkupTextLiteralSyntax namePrefix, MarkupTextLiteralSyntax name, MarkupTextLiteralSyntax nameSuffix, SyntaxToken equalsToken, MarkupTextLiteralSyntax valuePrefix, MarkupTagHelperAttributeValueSyntax value, MarkupTextLiteralSyntax valueSuffix)
  19399. + {
  19400. + if (name == null)
  19401. + throw new ArgumentNullException(nameof(name));
  19402. + if (equalsToken == null)
  19403. + throw new ArgumentNullException(nameof(equalsToken));
  19404. + switch (equalsToken.Kind)
  19405. + {
  19406. + case SyntaxKind.Equals:
  19407. + break;
  19408. + default:
  19409. + throw new ArgumentException("equalsToken");
  19410. + }
  19411. + if (value == null)
  19412. + throw new ArgumentNullException(nameof(value));
  19413. +
  19414. + return new MarkupTagHelperAttributeSyntax(SyntaxKind.MarkupTagHelperAttribute, namePrefix, name, nameSuffix, equalsToken, valuePrefix, value, valueSuffix);
  19415. + }
  19416. +
  19417. + public static MarkupMinimizedTagHelperAttributeSyntax MarkupMinimizedTagHelperAttribute(MarkupTextLiteralSyntax namePrefix, MarkupTextLiteralSyntax name)
  19418. + {
  19419. + if (name == null)
  19420. + throw new ArgumentNullException(nameof(name));
  19421. +
  19422. + var result = new MarkupMinimizedTagHelperAttributeSyntax(SyntaxKind.MarkupMinimizedTagHelperAttribute, namePrefix, name);
  19423. +
  19424. + return result;
  19425. + }
  19426. +
  19427. + public static MarkupTagHelperAttributeValueSyntax MarkupTagHelperAttributeValue(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<RazorSyntaxNode> children)
  19428. + {
  19429. + var result = new MarkupTagHelperAttributeValueSyntax(SyntaxKind.MarkupTagHelperAttributeValue, children.Node);
  19430. +
  19431. + return result;
  19432. + }
  19433. +
  19434. + public static CSharpCodeBlockSyntax CSharpCodeBlock(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<RazorSyntaxNode> children)
  19435. {
  19436. - var result = new HtmlTextLiteralSyntax(SyntaxKind.HtmlTextLiteral, textTokens.Node);
  19437. + var result = new CSharpCodeBlockSyntax(SyntaxKind.CSharpCodeBlock, children.Node);
  19438. return result;
  19439. }
  19440. @@ -1292,40 +4095,47 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  19441. return result;
  19442. }
  19443. - public static CSharpMetaCodeSyntax CSharpMetaCode(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<SyntaxToken> metaCode)
  19444. + public static CSharpStatementLiteralSyntax CSharpStatementLiteral(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<SyntaxToken> literalTokens)
  19445. {
  19446. - var result = new CSharpMetaCodeSyntax(SyntaxKind.CSharpMetaCode, metaCode.Node);
  19447. + var result = new CSharpStatementLiteralSyntax(SyntaxKind.CSharpStatementLiteral, literalTokens.Node);
  19448. return result;
  19449. }
  19450. - public static CSharpCodeLiteralSyntax CSharpCodeLiteral(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<SyntaxToken> cSharpTokens)
  19451. + public static CSharpExpressionLiteralSyntax CSharpExpressionLiteral(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<SyntaxToken> literalTokens)
  19452. {
  19453. - var result = new CSharpCodeLiteralSyntax(SyntaxKind.CSharpCodeLiteral, cSharpTokens.Node);
  19454. + var result = new CSharpExpressionLiteralSyntax(SyntaxKind.CSharpExpressionLiteral, literalTokens.Node);
  19455. return result;
  19456. }
  19457. - public static CSharpCodeBlockSyntax CSharpCodeBlock(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<RazorSyntaxNode> children)
  19458. + public static CSharpEphemeralTextLiteralSyntax CSharpEphemeralTextLiteral(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<SyntaxToken> literalTokens)
  19459. {
  19460. - var result = new CSharpCodeBlockSyntax(SyntaxKind.CSharpCodeBlock, children.Node);
  19461. + var result = new CSharpEphemeralTextLiteralSyntax(SyntaxKind.CSharpEphemeralTextLiteral, literalTokens.Node);
  19462. +
  19463. + return result;
  19464. + }
  19465. +
  19466. + public static CSharpTemplateBlockSyntax CSharpTemplateBlock(Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax.SyntaxList<RazorSyntaxNode> children)
  19467. + {
  19468. + var result = new CSharpTemplateBlockSyntax(SyntaxKind.CSharpTemplateBlock, children.Node);
  19469. return result;
  19470. }
  19471. - public static CSharpStatement CSharpStatement(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  19472. + public static CSharpStatementSyntax CSharpStatement(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  19473. {
  19474. if (transition == null)
  19475. throw new ArgumentNullException(nameof(transition));
  19476. if (body == null)
  19477. throw new ArgumentNullException(nameof(body));
  19478. - var result = new CSharpStatement(SyntaxKind.CSharpStatement, transition, body);
  19479. + var result = new CSharpStatementSyntax(SyntaxKind.CSharpStatement, transition, body);
  19480. return result;
  19481. }
  19482. - public static CSharpStatementBodySyntax CSharpStatementBody(CSharpMetaCodeSyntax openBrace, CSharpCodeBlockSyntax cSharpCode, CSharpMetaCodeSyntax closeBrace)
  19483. + public static CSharpStatementBodySyntax CSharpStatementBody(RazorMetaCodeSyntax openBrace, CSharpCodeBlockSyntax cSharpCode, RazorMetaCodeSyntax closeBrace)
  19484. {
  19485. if (openBrace == null)
  19486. throw new ArgumentNullException(nameof(openBrace));
  19487. @@ -1339,48 +4149,72 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  19488. return result;
  19489. }
  19490. - public static CSharpExpression CSharpExpression(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  19491. + public static CSharpExplicitExpressionSyntax CSharpExplicitExpression(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  19492. {
  19493. if (transition == null)
  19494. throw new ArgumentNullException(nameof(transition));
  19495. if (body == null)
  19496. throw new ArgumentNullException(nameof(body));
  19497. - var result = new CSharpExpression(SyntaxKind.CSharpExpression, transition, body);
  19498. + var result = new CSharpExplicitExpressionSyntax(SyntaxKind.CSharpExplicitExpression, transition, body);
  19499. return result;
  19500. }
  19501. - public static CSharpExpressionBodySyntax CSharpExpressionBody(CSharpMetaCodeSyntax openParen, CSharpCodeBlockSyntax cSharpCode, CSharpMetaCodeSyntax closeParen)
  19502. + public static CSharpExplicitExpressionBodySyntax CSharpExplicitExpressionBody(RazorMetaCodeSyntax openParen, CSharpCodeBlockSyntax cSharpCode, RazorMetaCodeSyntax closeParen)
  19503. {
  19504. + if (openParen == null)
  19505. + throw new ArgumentNullException(nameof(openParen));
  19506. if (cSharpCode == null)
  19507. throw new ArgumentNullException(nameof(cSharpCode));
  19508. + if (closeParen == null)
  19509. + throw new ArgumentNullException(nameof(closeParen));
  19510. - var result = new CSharpExpressionBodySyntax(SyntaxKind.CSharpExpressionBody, openParen, cSharpCode, closeParen);
  19511. + var result = new CSharpExplicitExpressionBodySyntax(SyntaxKind.CSharpExplicitExpressionBody, openParen, cSharpCode, closeParen);
  19512. return result;
  19513. }
  19514. - public static CSharpDirectiveSyntax CSharpDirective(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  19515. + public static CSharpImplicitExpressionSyntax CSharpImplicitExpression(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  19516. {
  19517. if (transition == null)
  19518. throw new ArgumentNullException(nameof(transition));
  19519. if (body == null)
  19520. throw new ArgumentNullException(nameof(body));
  19521. - var result = new CSharpDirectiveSyntax(SyntaxKind.CSharpDirective, transition, body);
  19522. + var result = new CSharpImplicitExpressionSyntax(SyntaxKind.CSharpImplicitExpression, transition, body);
  19523. return result;
  19524. }
  19525. - public static CSharpDirectiveBodySyntax CSharpDirectiveBody(CSharpMetaCodeSyntax keyword, CSharpCodeBlockSyntax cSharpCode)
  19526. + public static CSharpImplicitExpressionBodySyntax CSharpImplicitExpressionBody(CSharpCodeBlockSyntax cSharpCode)
  19527. {
  19528. - if (keyword == null)
  19529. - throw new ArgumentNullException(nameof(keyword));
  19530. if (cSharpCode == null)
  19531. throw new ArgumentNullException(nameof(cSharpCode));
  19532. - var result = new CSharpDirectiveBodySyntax(SyntaxKind.CSharpDirectiveBody, keyword, cSharpCode);
  19533. + var result = new CSharpImplicitExpressionBodySyntax(SyntaxKind.CSharpImplicitExpressionBody, cSharpCode);
  19534. +
  19535. + return result;
  19536. + }
  19537. +
  19538. + public static RazorDirectiveSyntax RazorDirective(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  19539. + {
  19540. + if (transition == null)
  19541. + throw new ArgumentNullException(nameof(transition));
  19542. + if (body == null)
  19543. + throw new ArgumentNullException(nameof(body));
  19544. +
  19545. + var result = new RazorDirectiveSyntax(SyntaxKind.RazorDirective, transition, body);
  19546. +
  19547. + return result;
  19548. + }
  19549. +
  19550. + public static RazorDirectiveBodySyntax RazorDirectiveBody(RazorSyntaxNode keyword, CSharpCodeBlockSyntax cSharpCode)
  19551. + {
  19552. + if (keyword == null)
  19553. + throw new ArgumentNullException(nameof(keyword));
  19554. +
  19555. + var result = new RazorDirectiveBodySyntax(SyntaxKind.RazorDirectiveBody, keyword, cSharpCode);
  19556. return result;
  19557. }
  19558. @@ -1388,18 +4222,42 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  19559. internal static IEnumerable<Type> GetNodeTypes()
  19560. {
  19561. return new Type[] {
  19562. + typeof(RazorDocumentSyntax),
  19563. typeof(RazorCommentBlockSyntax),
  19564. - typeof(HtmlTextLiteralSyntax),
  19565. - typeof(CSharpTransitionSyntax),
  19566. - typeof(CSharpMetaCodeSyntax),
  19567. - typeof(CSharpCodeLiteralSyntax),
  19568. + typeof(RazorMetaCodeSyntax),
  19569. + typeof(GenericBlockSyntax),
  19570. + typeof(UnclassifiedTextLiteralSyntax),
  19571. + typeof(MarkupBlockSyntax),
  19572. + typeof(MarkupTransitionSyntax),
  19573. + typeof(MarkupTextLiteralSyntax),
  19574. + typeof(MarkupEphemeralTextLiteralSyntax),
  19575. + typeof(MarkupCommentBlockSyntax),
  19576. + typeof(MarkupTagBlockSyntax),
  19577. + typeof(MarkupMinimizedAttributeBlockSyntax),
  19578. + typeof(MarkupAttributeBlockSyntax),
  19579. + typeof(MarkupLiteralAttributeValueSyntax),
  19580. + typeof(MarkupDynamicAttributeValueSyntax),
  19581. + typeof(MarkupElementSyntax),
  19582. + typeof(MarkupTagHelperElementSyntax),
  19583. + typeof(MarkupTagHelperStartTagSyntax),
  19584. + typeof(MarkupTagHelperEndTagSyntax),
  19585. + typeof(MarkupTagHelperAttributeSyntax),
  19586. + typeof(MarkupMinimizedTagHelperAttributeSyntax),
  19587. + typeof(MarkupTagHelperAttributeValueSyntax),
  19588. typeof(CSharpCodeBlockSyntax),
  19589. - typeof(CSharpStatement),
  19590. + typeof(CSharpTransitionSyntax),
  19591. + typeof(CSharpStatementLiteralSyntax),
  19592. + typeof(CSharpExpressionLiteralSyntax),
  19593. + typeof(CSharpEphemeralTextLiteralSyntax),
  19594. + typeof(CSharpTemplateBlockSyntax),
  19595. + typeof(CSharpStatementSyntax),
  19596. typeof(CSharpStatementBodySyntax),
  19597. - typeof(CSharpExpression),
  19598. - typeof(CSharpExpressionBodySyntax),
  19599. - typeof(CSharpDirectiveSyntax),
  19600. - typeof(CSharpDirectiveBodySyntax)
  19601. + typeof(CSharpExplicitExpressionSyntax),
  19602. + typeof(CSharpExplicitExpressionBodySyntax),
  19603. + typeof(CSharpImplicitExpressionSyntax),
  19604. + typeof(CSharpImplicitExpressionBodySyntax),
  19605. + typeof(RazorDirectiveSyntax),
  19606. + typeof(RazorDirectiveBodySyntax)
  19607. };
  19608. }
  19609. }
  19610. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/Generated/Syntax.xml.Main.Generated.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/Generated/Syntax.xml.Main.Generated.cs
  19611. index d22da664db0..b3c122bb05a 100644
  19612. --- a/src/Microsoft.AspNetCore.Razor.Language/Syntax/Generated/Syntax.xml.Main.Generated.cs
  19613. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/Generated/Syntax.xml.Main.Generated.cs
  19614. @@ -11,32 +11,134 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  19615. {
  19616. internal partial class SyntaxVisitor<TResult>
  19617. {
  19618. + /// <summary>Called when the visitor visits a RazorDocumentSyntax node.</summary>
  19619. + public virtual TResult VisitRazorDocument(RazorDocumentSyntax node)
  19620. + {
  19621. + return DefaultVisit(node);
  19622. + }
  19623. +
  19624. /// <summary>Called when the visitor visits a RazorCommentBlockSyntax node.</summary>
  19625. public virtual TResult VisitRazorCommentBlock(RazorCommentBlockSyntax node)
  19626. {
  19627. return DefaultVisit(node);
  19628. }
  19629. - /// <summary>Called when the visitor visits a HtmlTextLiteralSyntax node.</summary>
  19630. - public virtual TResult VisitHtmlTextLiteral(HtmlTextLiteralSyntax node)
  19631. + /// <summary>Called when the visitor visits a RazorMetaCodeSyntax node.</summary>
  19632. + public virtual TResult VisitRazorMetaCode(RazorMetaCodeSyntax node)
  19633. {
  19634. return DefaultVisit(node);
  19635. }
  19636. - /// <summary>Called when the visitor visits a CSharpTransitionSyntax node.</summary>
  19637. - public virtual TResult VisitCSharpTransition(CSharpTransitionSyntax node)
  19638. + /// <summary>Called when the visitor visits a GenericBlockSyntax node.</summary>
  19639. + public virtual TResult VisitGenericBlock(GenericBlockSyntax node)
  19640. + {
  19641. + return DefaultVisit(node);
  19642. + }
  19643. +
  19644. + /// <summary>Called when the visitor visits a UnclassifiedTextLiteralSyntax node.</summary>
  19645. + public virtual TResult VisitUnclassifiedTextLiteral(UnclassifiedTextLiteralSyntax node)
  19646. + {
  19647. + return DefaultVisit(node);
  19648. + }
  19649. +
  19650. + /// <summary>Called when the visitor visits a MarkupBlockSyntax node.</summary>
  19651. + public virtual TResult VisitMarkupBlock(MarkupBlockSyntax node)
  19652. + {
  19653. + return DefaultVisit(node);
  19654. + }
  19655. +
  19656. + /// <summary>Called when the visitor visits a MarkupTransitionSyntax node.</summary>
  19657. + public virtual TResult VisitMarkupTransition(MarkupTransitionSyntax node)
  19658. + {
  19659. + return DefaultVisit(node);
  19660. + }
  19661. +
  19662. + /// <summary>Called when the visitor visits a MarkupTextLiteralSyntax node.</summary>
  19663. + public virtual TResult VisitMarkupTextLiteral(MarkupTextLiteralSyntax node)
  19664. + {
  19665. + return DefaultVisit(node);
  19666. + }
  19667. +
  19668. + /// <summary>Called when the visitor visits a MarkupEphemeralTextLiteralSyntax node.</summary>
  19669. + public virtual TResult VisitMarkupEphemeralTextLiteral(MarkupEphemeralTextLiteralSyntax node)
  19670. + {
  19671. + return DefaultVisit(node);
  19672. + }
  19673. +
  19674. + /// <summary>Called when the visitor visits a MarkupCommentBlockSyntax node.</summary>
  19675. + public virtual TResult VisitMarkupCommentBlock(MarkupCommentBlockSyntax node)
  19676. + {
  19677. + return DefaultVisit(node);
  19678. + }
  19679. +
  19680. + /// <summary>Called when the visitor visits a MarkupTagBlockSyntax node.</summary>
  19681. + public virtual TResult VisitMarkupTagBlock(MarkupTagBlockSyntax node)
  19682. + {
  19683. + return DefaultVisit(node);
  19684. + }
  19685. +
  19686. + /// <summary>Called when the visitor visits a MarkupMinimizedAttributeBlockSyntax node.</summary>
  19687. + public virtual TResult VisitMarkupMinimizedAttributeBlock(MarkupMinimizedAttributeBlockSyntax node)
  19688. + {
  19689. + return DefaultVisit(node);
  19690. + }
  19691. +
  19692. + /// <summary>Called when the visitor visits a MarkupAttributeBlockSyntax node.</summary>
  19693. + public virtual TResult VisitMarkupAttributeBlock(MarkupAttributeBlockSyntax node)
  19694. + {
  19695. + return DefaultVisit(node);
  19696. + }
  19697. +
  19698. + /// <summary>Called when the visitor visits a MarkupLiteralAttributeValueSyntax node.</summary>
  19699. + public virtual TResult VisitMarkupLiteralAttributeValue(MarkupLiteralAttributeValueSyntax node)
  19700. + {
  19701. + return DefaultVisit(node);
  19702. + }
  19703. +
  19704. + /// <summary>Called when the visitor visits a MarkupDynamicAttributeValueSyntax node.</summary>
  19705. + public virtual TResult VisitMarkupDynamicAttributeValue(MarkupDynamicAttributeValueSyntax node)
  19706. + {
  19707. + return DefaultVisit(node);
  19708. + }
  19709. +
  19710. + /// <summary>Called when the visitor visits a MarkupElementSyntax node.</summary>
  19711. + public virtual TResult VisitMarkupElement(MarkupElementSyntax node)
  19712. + {
  19713. + return DefaultVisit(node);
  19714. + }
  19715. +
  19716. + /// <summary>Called when the visitor visits a MarkupTagHelperElementSyntax node.</summary>
  19717. + public virtual TResult VisitMarkupTagHelperElement(MarkupTagHelperElementSyntax node)
  19718. + {
  19719. + return DefaultVisit(node);
  19720. + }
  19721. +
  19722. + /// <summary>Called when the visitor visits a MarkupTagHelperStartTagSyntax node.</summary>
  19723. + public virtual TResult VisitMarkupTagHelperStartTag(MarkupTagHelperStartTagSyntax node)
  19724. + {
  19725. + return DefaultVisit(node);
  19726. + }
  19727. +
  19728. + /// <summary>Called when the visitor visits a MarkupTagHelperEndTagSyntax node.</summary>
  19729. + public virtual TResult VisitMarkupTagHelperEndTag(MarkupTagHelperEndTagSyntax node)
  19730. + {
  19731. + return DefaultVisit(node);
  19732. + }
  19733. +
  19734. + /// <summary>Called when the visitor visits a MarkupTagHelperAttributeSyntax node.</summary>
  19735. + public virtual TResult VisitMarkupTagHelperAttribute(MarkupTagHelperAttributeSyntax node)
  19736. {
  19737. return DefaultVisit(node);
  19738. }
  19739. - /// <summary>Called when the visitor visits a CSharpMetaCodeSyntax node.</summary>
  19740. - public virtual TResult VisitCSharpMetaCode(CSharpMetaCodeSyntax node)
  19741. + /// <summary>Called when the visitor visits a MarkupMinimizedTagHelperAttributeSyntax node.</summary>
  19742. + public virtual TResult VisitMarkupMinimizedTagHelperAttribute(MarkupMinimizedTagHelperAttributeSyntax node)
  19743. {
  19744. return DefaultVisit(node);
  19745. }
  19746. - /// <summary>Called when the visitor visits a CSharpCodeLiteralSyntax node.</summary>
  19747. - public virtual TResult VisitCSharpCodeLiteral(CSharpCodeLiteralSyntax node)
  19748. + /// <summary>Called when the visitor visits a MarkupTagHelperAttributeValueSyntax node.</summary>
  19749. + public virtual TResult VisitMarkupTagHelperAttributeValue(MarkupTagHelperAttributeValueSyntax node)
  19750. {
  19751. return DefaultVisit(node);
  19752. }
  19753. @@ -47,8 +149,38 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  19754. return DefaultVisit(node);
  19755. }
  19756. - /// <summary>Called when the visitor visits a CSharpStatement node.</summary>
  19757. - public virtual TResult VisitCSharpStatement(CSharpStatement node)
  19758. + /// <summary>Called when the visitor visits a CSharpTransitionSyntax node.</summary>
  19759. + public virtual TResult VisitCSharpTransition(CSharpTransitionSyntax node)
  19760. + {
  19761. + return DefaultVisit(node);
  19762. + }
  19763. +
  19764. + /// <summary>Called when the visitor visits a CSharpStatementLiteralSyntax node.</summary>
  19765. + public virtual TResult VisitCSharpStatementLiteral(CSharpStatementLiteralSyntax node)
  19766. + {
  19767. + return DefaultVisit(node);
  19768. + }
  19769. +
  19770. + /// <summary>Called when the visitor visits a CSharpExpressionLiteralSyntax node.</summary>
  19771. + public virtual TResult VisitCSharpExpressionLiteral(CSharpExpressionLiteralSyntax node)
  19772. + {
  19773. + return DefaultVisit(node);
  19774. + }
  19775. +
  19776. + /// <summary>Called when the visitor visits a CSharpEphemeralTextLiteralSyntax node.</summary>
  19777. + public virtual TResult VisitCSharpEphemeralTextLiteral(CSharpEphemeralTextLiteralSyntax node)
  19778. + {
  19779. + return DefaultVisit(node);
  19780. + }
  19781. +
  19782. + /// <summary>Called when the visitor visits a CSharpTemplateBlockSyntax node.</summary>
  19783. + public virtual TResult VisitCSharpTemplateBlock(CSharpTemplateBlockSyntax node)
  19784. + {
  19785. + return DefaultVisit(node);
  19786. + }
  19787. +
  19788. + /// <summary>Called when the visitor visits a CSharpStatementSyntax node.</summary>
  19789. + public virtual TResult VisitCSharpStatement(CSharpStatementSyntax node)
  19790. {
  19791. return DefaultVisit(node);
  19792. }
  19793. @@ -59,26 +191,38 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  19794. return DefaultVisit(node);
  19795. }
  19796. - /// <summary>Called when the visitor visits a CSharpExpression node.</summary>
  19797. - public virtual TResult VisitCSharpExpression(CSharpExpression node)
  19798. + /// <summary>Called when the visitor visits a CSharpExplicitExpressionSyntax node.</summary>
  19799. + public virtual TResult VisitCSharpExplicitExpression(CSharpExplicitExpressionSyntax node)
  19800. {
  19801. return DefaultVisit(node);
  19802. }
  19803. - /// <summary>Called when the visitor visits a CSharpExpressionBodySyntax node.</summary>
  19804. - public virtual TResult VisitCSharpExpressionBody(CSharpExpressionBodySyntax node)
  19805. + /// <summary>Called when the visitor visits a CSharpExplicitExpressionBodySyntax node.</summary>
  19806. + public virtual TResult VisitCSharpExplicitExpressionBody(CSharpExplicitExpressionBodySyntax node)
  19807. {
  19808. return DefaultVisit(node);
  19809. }
  19810. - /// <summary>Called when the visitor visits a CSharpDirectiveSyntax node.</summary>
  19811. - public virtual TResult VisitCSharpDirective(CSharpDirectiveSyntax node)
  19812. + /// <summary>Called when the visitor visits a CSharpImplicitExpressionSyntax node.</summary>
  19813. + public virtual TResult VisitCSharpImplicitExpression(CSharpImplicitExpressionSyntax node)
  19814. {
  19815. return DefaultVisit(node);
  19816. }
  19817. - /// <summary>Called when the visitor visits a CSharpDirectiveBodySyntax node.</summary>
  19818. - public virtual TResult VisitCSharpDirectiveBody(CSharpDirectiveBodySyntax node)
  19819. + /// <summary>Called when the visitor visits a CSharpImplicitExpressionBodySyntax node.</summary>
  19820. + public virtual TResult VisitCSharpImplicitExpressionBody(CSharpImplicitExpressionBodySyntax node)
  19821. + {
  19822. + return DefaultVisit(node);
  19823. + }
  19824. +
  19825. + /// <summary>Called when the visitor visits a RazorDirectiveSyntax node.</summary>
  19826. + public virtual TResult VisitRazorDirective(RazorDirectiveSyntax node)
  19827. + {
  19828. + return DefaultVisit(node);
  19829. + }
  19830. +
  19831. + /// <summary>Called when the visitor visits a RazorDirectiveBodySyntax node.</summary>
  19832. + public virtual TResult VisitRazorDirectiveBody(RazorDirectiveBodySyntax node)
  19833. {
  19834. return DefaultVisit(node);
  19835. }
  19836. @@ -86,32 +230,134 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  19837. internal partial class SyntaxVisitor
  19838. {
  19839. + /// <summary>Called when the visitor visits a RazorDocumentSyntax node.</summary>
  19840. + public virtual void VisitRazorDocument(RazorDocumentSyntax node)
  19841. + {
  19842. + DefaultVisit(node);
  19843. + }
  19844. +
  19845. /// <summary>Called when the visitor visits a RazorCommentBlockSyntax node.</summary>
  19846. public virtual void VisitRazorCommentBlock(RazorCommentBlockSyntax node)
  19847. {
  19848. DefaultVisit(node);
  19849. }
  19850. - /// <summary>Called when the visitor visits a HtmlTextLiteralSyntax node.</summary>
  19851. - public virtual void VisitHtmlTextLiteral(HtmlTextLiteralSyntax node)
  19852. + /// <summary>Called when the visitor visits a RazorMetaCodeSyntax node.</summary>
  19853. + public virtual void VisitRazorMetaCode(RazorMetaCodeSyntax node)
  19854. {
  19855. DefaultVisit(node);
  19856. }
  19857. - /// <summary>Called when the visitor visits a CSharpTransitionSyntax node.</summary>
  19858. - public virtual void VisitCSharpTransition(CSharpTransitionSyntax node)
  19859. + /// <summary>Called when the visitor visits a GenericBlockSyntax node.</summary>
  19860. + public virtual void VisitGenericBlock(GenericBlockSyntax node)
  19861. + {
  19862. + DefaultVisit(node);
  19863. + }
  19864. +
  19865. + /// <summary>Called when the visitor visits a UnclassifiedTextLiteralSyntax node.</summary>
  19866. + public virtual void VisitUnclassifiedTextLiteral(UnclassifiedTextLiteralSyntax node)
  19867. + {
  19868. + DefaultVisit(node);
  19869. + }
  19870. +
  19871. + /// <summary>Called when the visitor visits a MarkupBlockSyntax node.</summary>
  19872. + public virtual void VisitMarkupBlock(MarkupBlockSyntax node)
  19873. + {
  19874. + DefaultVisit(node);
  19875. + }
  19876. +
  19877. + /// <summary>Called when the visitor visits a MarkupTransitionSyntax node.</summary>
  19878. + public virtual void VisitMarkupTransition(MarkupTransitionSyntax node)
  19879. + {
  19880. + DefaultVisit(node);
  19881. + }
  19882. +
  19883. + /// <summary>Called when the visitor visits a MarkupTextLiteralSyntax node.</summary>
  19884. + public virtual void VisitMarkupTextLiteral(MarkupTextLiteralSyntax node)
  19885. {
  19886. DefaultVisit(node);
  19887. }
  19888. - /// <summary>Called when the visitor visits a CSharpMetaCodeSyntax node.</summary>
  19889. - public virtual void VisitCSharpMetaCode(CSharpMetaCodeSyntax node)
  19890. + /// <summary>Called when the visitor visits a MarkupEphemeralTextLiteralSyntax node.</summary>
  19891. + public virtual void VisitMarkupEphemeralTextLiteral(MarkupEphemeralTextLiteralSyntax node)
  19892. {
  19893. DefaultVisit(node);
  19894. }
  19895. - /// <summary>Called when the visitor visits a CSharpCodeLiteralSyntax node.</summary>
  19896. - public virtual void VisitCSharpCodeLiteral(CSharpCodeLiteralSyntax node)
  19897. + /// <summary>Called when the visitor visits a MarkupCommentBlockSyntax node.</summary>
  19898. + public virtual void VisitMarkupCommentBlock(MarkupCommentBlockSyntax node)
  19899. + {
  19900. + DefaultVisit(node);
  19901. + }
  19902. +
  19903. + /// <summary>Called when the visitor visits a MarkupTagBlockSyntax node.</summary>
  19904. + public virtual void VisitMarkupTagBlock(MarkupTagBlockSyntax node)
  19905. + {
  19906. + DefaultVisit(node);
  19907. + }
  19908. +
  19909. + /// <summary>Called when the visitor visits a MarkupMinimizedAttributeBlockSyntax node.</summary>
  19910. + public virtual void VisitMarkupMinimizedAttributeBlock(MarkupMinimizedAttributeBlockSyntax node)
  19911. + {
  19912. + DefaultVisit(node);
  19913. + }
  19914. +
  19915. + /// <summary>Called when the visitor visits a MarkupAttributeBlockSyntax node.</summary>
  19916. + public virtual void VisitMarkupAttributeBlock(MarkupAttributeBlockSyntax node)
  19917. + {
  19918. + DefaultVisit(node);
  19919. + }
  19920. +
  19921. + /// <summary>Called when the visitor visits a MarkupLiteralAttributeValueSyntax node.</summary>
  19922. + public virtual void VisitMarkupLiteralAttributeValue(MarkupLiteralAttributeValueSyntax node)
  19923. + {
  19924. + DefaultVisit(node);
  19925. + }
  19926. +
  19927. + /// <summary>Called when the visitor visits a MarkupDynamicAttributeValueSyntax node.</summary>
  19928. + public virtual void VisitMarkupDynamicAttributeValue(MarkupDynamicAttributeValueSyntax node)
  19929. + {
  19930. + DefaultVisit(node);
  19931. + }
  19932. +
  19933. + /// <summary>Called when the visitor visits a MarkupElementSyntax node.</summary>
  19934. + public virtual void VisitMarkupElement(MarkupElementSyntax node)
  19935. + {
  19936. + DefaultVisit(node);
  19937. + }
  19938. +
  19939. + /// <summary>Called when the visitor visits a MarkupTagHelperElementSyntax node.</summary>
  19940. + public virtual void VisitMarkupTagHelperElement(MarkupTagHelperElementSyntax node)
  19941. + {
  19942. + DefaultVisit(node);
  19943. + }
  19944. +
  19945. + /// <summary>Called when the visitor visits a MarkupTagHelperStartTagSyntax node.</summary>
  19946. + public virtual void VisitMarkupTagHelperStartTag(MarkupTagHelperStartTagSyntax node)
  19947. + {
  19948. + DefaultVisit(node);
  19949. + }
  19950. +
  19951. + /// <summary>Called when the visitor visits a MarkupTagHelperEndTagSyntax node.</summary>
  19952. + public virtual void VisitMarkupTagHelperEndTag(MarkupTagHelperEndTagSyntax node)
  19953. + {
  19954. + DefaultVisit(node);
  19955. + }
  19956. +
  19957. + /// <summary>Called when the visitor visits a MarkupTagHelperAttributeSyntax node.</summary>
  19958. + public virtual void VisitMarkupTagHelperAttribute(MarkupTagHelperAttributeSyntax node)
  19959. + {
  19960. + DefaultVisit(node);
  19961. + }
  19962. +
  19963. + /// <summary>Called when the visitor visits a MarkupMinimizedTagHelperAttributeSyntax node.</summary>
  19964. + public virtual void VisitMarkupMinimizedTagHelperAttribute(MarkupMinimizedTagHelperAttributeSyntax node)
  19965. + {
  19966. + DefaultVisit(node);
  19967. + }
  19968. +
  19969. + /// <summary>Called when the visitor visits a MarkupTagHelperAttributeValueSyntax node.</summary>
  19970. + public virtual void VisitMarkupTagHelperAttributeValue(MarkupTagHelperAttributeValueSyntax node)
  19971. {
  19972. DefaultVisit(node);
  19973. }
  19974. @@ -122,8 +368,38 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  19975. DefaultVisit(node);
  19976. }
  19977. - /// <summary>Called when the visitor visits a CSharpStatement node.</summary>
  19978. - public virtual void VisitCSharpStatement(CSharpStatement node)
  19979. + /// <summary>Called when the visitor visits a CSharpTransitionSyntax node.</summary>
  19980. + public virtual void VisitCSharpTransition(CSharpTransitionSyntax node)
  19981. + {
  19982. + DefaultVisit(node);
  19983. + }
  19984. +
  19985. + /// <summary>Called when the visitor visits a CSharpStatementLiteralSyntax node.</summary>
  19986. + public virtual void VisitCSharpStatementLiteral(CSharpStatementLiteralSyntax node)
  19987. + {
  19988. + DefaultVisit(node);
  19989. + }
  19990. +
  19991. + /// <summary>Called when the visitor visits a CSharpExpressionLiteralSyntax node.</summary>
  19992. + public virtual void VisitCSharpExpressionLiteral(CSharpExpressionLiteralSyntax node)
  19993. + {
  19994. + DefaultVisit(node);
  19995. + }
  19996. +
  19997. + /// <summary>Called when the visitor visits a CSharpEphemeralTextLiteralSyntax node.</summary>
  19998. + public virtual void VisitCSharpEphemeralTextLiteral(CSharpEphemeralTextLiteralSyntax node)
  19999. + {
  20000. + DefaultVisit(node);
  20001. + }
  20002. +
  20003. + /// <summary>Called when the visitor visits a CSharpTemplateBlockSyntax node.</summary>
  20004. + public virtual void VisitCSharpTemplateBlock(CSharpTemplateBlockSyntax node)
  20005. + {
  20006. + DefaultVisit(node);
  20007. + }
  20008. +
  20009. + /// <summary>Called when the visitor visits a CSharpStatementSyntax node.</summary>
  20010. + public virtual void VisitCSharpStatement(CSharpStatementSyntax node)
  20011. {
  20012. DefaultVisit(node);
  20013. }
  20014. @@ -134,33 +410,305 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  20015. DefaultVisit(node);
  20016. }
  20017. - /// <summary>Called when the visitor visits a CSharpExpression node.</summary>
  20018. - public virtual void VisitCSharpExpression(CSharpExpression node)
  20019. + /// <summary>Called when the visitor visits a CSharpExplicitExpressionSyntax node.</summary>
  20020. + public virtual void VisitCSharpExplicitExpression(CSharpExplicitExpressionSyntax node)
  20021. + {
  20022. + DefaultVisit(node);
  20023. + }
  20024. +
  20025. + /// <summary>Called when the visitor visits a CSharpExplicitExpressionBodySyntax node.</summary>
  20026. + public virtual void VisitCSharpExplicitExpressionBody(CSharpExplicitExpressionBodySyntax node)
  20027. + {
  20028. + DefaultVisit(node);
  20029. + }
  20030. +
  20031. + /// <summary>Called when the visitor visits a CSharpImplicitExpressionSyntax node.</summary>
  20032. + public virtual void VisitCSharpImplicitExpression(CSharpImplicitExpressionSyntax node)
  20033. {
  20034. DefaultVisit(node);
  20035. }
  20036. - /// <summary>Called when the visitor visits a CSharpExpressionBodySyntax node.</summary>
  20037. - public virtual void VisitCSharpExpressionBody(CSharpExpressionBodySyntax node)
  20038. + /// <summary>Called when the visitor visits a CSharpImplicitExpressionBodySyntax node.</summary>
  20039. + public virtual void VisitCSharpImplicitExpressionBody(CSharpImplicitExpressionBodySyntax node)
  20040. {
  20041. DefaultVisit(node);
  20042. }
  20043. - /// <summary>Called when the visitor visits a CSharpDirectiveSyntax node.</summary>
  20044. - public virtual void VisitCSharpDirective(CSharpDirectiveSyntax node)
  20045. + /// <summary>Called when the visitor visits a RazorDirectiveSyntax node.</summary>
  20046. + public virtual void VisitRazorDirective(RazorDirectiveSyntax node)
  20047. {
  20048. DefaultVisit(node);
  20049. }
  20050. - /// <summary>Called when the visitor visits a CSharpDirectiveBodySyntax node.</summary>
  20051. - public virtual void VisitCSharpDirectiveBody(CSharpDirectiveBodySyntax node)
  20052. + /// <summary>Called when the visitor visits a RazorDirectiveBodySyntax node.</summary>
  20053. + public virtual void VisitRazorDirectiveBody(RazorDirectiveBodySyntax node)
  20054. {
  20055. DefaultVisit(node);
  20056. }
  20057. }
  20058. + internal partial class SyntaxRewriter : SyntaxVisitor<SyntaxNode>
  20059. + {
  20060. + public override SyntaxNode VisitRazorDocument(RazorDocumentSyntax node)
  20061. + {
  20062. + var document = (RazorBlockSyntax)Visit(node.Document);
  20063. + return node.Update(document);
  20064. + }
  20065. +
  20066. + public override SyntaxNode VisitRazorCommentBlock(RazorCommentBlockSyntax node)
  20067. + {
  20068. + var startCommentTransition = (SyntaxToken)VisitToken(node.StartCommentTransition);
  20069. + var startCommentStar = (SyntaxToken)VisitToken(node.StartCommentStar);
  20070. + var comment = (SyntaxToken)VisitToken(node.Comment);
  20071. + var endCommentStar = (SyntaxToken)VisitToken(node.EndCommentStar);
  20072. + var endCommentTransition = (SyntaxToken)VisitToken(node.EndCommentTransition);
  20073. + return node.Update(startCommentTransition, startCommentStar, comment, endCommentStar, endCommentTransition);
  20074. + }
  20075. +
  20076. + public override SyntaxNode VisitRazorMetaCode(RazorMetaCodeSyntax node)
  20077. + {
  20078. + var metaCode = VisitList(node.MetaCode);
  20079. + return node.Update(metaCode);
  20080. + }
  20081. +
  20082. + public override SyntaxNode VisitGenericBlock(GenericBlockSyntax node)
  20083. + {
  20084. + var children = VisitList(node.Children);
  20085. + return node.Update(children);
  20086. + }
  20087. +
  20088. + public override SyntaxNode VisitUnclassifiedTextLiteral(UnclassifiedTextLiteralSyntax node)
  20089. + {
  20090. + var literalTokens = VisitList(node.LiteralTokens);
  20091. + return node.Update(literalTokens);
  20092. + }
  20093. +
  20094. + public override SyntaxNode VisitMarkupBlock(MarkupBlockSyntax node)
  20095. + {
  20096. + var children = VisitList(node.Children);
  20097. + return node.Update(children);
  20098. + }
  20099. +
  20100. + public override SyntaxNode VisitMarkupTransition(MarkupTransitionSyntax node)
  20101. + {
  20102. + var transitionTokens = VisitList(node.TransitionTokens);
  20103. + return node.Update(transitionTokens);
  20104. + }
  20105. +
  20106. + public override SyntaxNode VisitMarkupTextLiteral(MarkupTextLiteralSyntax node)
  20107. + {
  20108. + var literalTokens = VisitList(node.LiteralTokens);
  20109. + return node.Update(literalTokens);
  20110. + }
  20111. +
  20112. + public override SyntaxNode VisitMarkupEphemeralTextLiteral(MarkupEphemeralTextLiteralSyntax node)
  20113. + {
  20114. + var literalTokens = VisitList(node.LiteralTokens);
  20115. + return node.Update(literalTokens);
  20116. + }
  20117. +
  20118. + public override SyntaxNode VisitMarkupCommentBlock(MarkupCommentBlockSyntax node)
  20119. + {
  20120. + var children = VisitList(node.Children);
  20121. + return node.Update(children);
  20122. + }
  20123. +
  20124. + public override SyntaxNode VisitMarkupTagBlock(MarkupTagBlockSyntax node)
  20125. + {
  20126. + var children = VisitList(node.Children);
  20127. + return node.Update(children);
  20128. + }
  20129. +
  20130. + public override SyntaxNode VisitMarkupMinimizedAttributeBlock(MarkupMinimizedAttributeBlockSyntax node)
  20131. + {
  20132. + var namePrefix = (MarkupTextLiteralSyntax)Visit(node.NamePrefix);
  20133. + var name = (MarkupTextLiteralSyntax)Visit(node.Name);
  20134. + return node.Update(namePrefix, name);
  20135. + }
  20136. +
  20137. + public override SyntaxNode VisitMarkupAttributeBlock(MarkupAttributeBlockSyntax node)
  20138. + {
  20139. + var namePrefix = (MarkupTextLiteralSyntax)Visit(node.NamePrefix);
  20140. + var name = (MarkupTextLiteralSyntax)Visit(node.Name);
  20141. + var nameSuffix = (MarkupTextLiteralSyntax)Visit(node.NameSuffix);
  20142. + var equalsToken = (SyntaxToken)VisitToken(node.EqualsToken);
  20143. + var valuePrefix = (MarkupTextLiteralSyntax)Visit(node.ValuePrefix);
  20144. + var value = (RazorBlockSyntax)Visit(node.Value);
  20145. + var valueSuffix = (MarkupTextLiteralSyntax)Visit(node.ValueSuffix);
  20146. + return node.Update(namePrefix, name, nameSuffix, equalsToken, valuePrefix, value, valueSuffix);
  20147. + }
  20148. +
  20149. + public override SyntaxNode VisitMarkupLiteralAttributeValue(MarkupLiteralAttributeValueSyntax node)
  20150. + {
  20151. + var prefix = (MarkupTextLiteralSyntax)Visit(node.Prefix);
  20152. + var value = (MarkupTextLiteralSyntax)Visit(node.Value);
  20153. + return node.Update(prefix, value);
  20154. + }
  20155. +
  20156. + public override SyntaxNode VisitMarkupDynamicAttributeValue(MarkupDynamicAttributeValueSyntax node)
  20157. + {
  20158. + var prefix = (MarkupTextLiteralSyntax)Visit(node.Prefix);
  20159. + var value = (RazorBlockSyntax)Visit(node.Value);
  20160. + return node.Update(prefix, value);
  20161. + }
  20162. +
  20163. + public override SyntaxNode VisitMarkupElement(MarkupElementSyntax node)
  20164. + {
  20165. + var startTag = (MarkupTagBlockSyntax)Visit(node.StartTag);
  20166. + var body = VisitList(node.Body);
  20167. + var endTag = (MarkupTagBlockSyntax)Visit(node.EndTag);
  20168. + return node.Update(startTag, body, endTag);
  20169. + }
  20170. +
  20171. + public override SyntaxNode VisitMarkupTagHelperElement(MarkupTagHelperElementSyntax node)
  20172. + {
  20173. + var startTag = (MarkupTagHelperStartTagSyntax)Visit(node.StartTag);
  20174. + var body = VisitList(node.Body);
  20175. + var endTag = (MarkupTagHelperEndTagSyntax)Visit(node.EndTag);
  20176. + return node.Update(startTag, body, endTag);
  20177. + }
  20178. +
  20179. + public override SyntaxNode VisitMarkupTagHelperStartTag(MarkupTagHelperStartTagSyntax node)
  20180. + {
  20181. + var children = VisitList(node.Children);
  20182. + return node.Update(children);
  20183. + }
  20184. +
  20185. + public override SyntaxNode VisitMarkupTagHelperEndTag(MarkupTagHelperEndTagSyntax node)
  20186. + {
  20187. + var children = VisitList(node.Children);
  20188. + return node.Update(children);
  20189. + }
  20190. +
  20191. + public override SyntaxNode VisitMarkupTagHelperAttribute(MarkupTagHelperAttributeSyntax node)
  20192. + {
  20193. + var namePrefix = (MarkupTextLiteralSyntax)Visit(node.NamePrefix);
  20194. + var name = (MarkupTextLiteralSyntax)Visit(node.Name);
  20195. + var nameSuffix = (MarkupTextLiteralSyntax)Visit(node.NameSuffix);
  20196. + var equalsToken = (SyntaxToken)VisitToken(node.EqualsToken);
  20197. + var valuePrefix = (MarkupTextLiteralSyntax)Visit(node.ValuePrefix);
  20198. + var value = (MarkupTagHelperAttributeValueSyntax)Visit(node.Value);
  20199. + var valueSuffix = (MarkupTextLiteralSyntax)Visit(node.ValueSuffix);
  20200. + return node.Update(namePrefix, name, nameSuffix, equalsToken, valuePrefix, value, valueSuffix);
  20201. + }
  20202. +
  20203. + public override SyntaxNode VisitMarkupMinimizedTagHelperAttribute(MarkupMinimizedTagHelperAttributeSyntax node)
  20204. + {
  20205. + var namePrefix = (MarkupTextLiteralSyntax)Visit(node.NamePrefix);
  20206. + var name = (MarkupTextLiteralSyntax)Visit(node.Name);
  20207. + return node.Update(namePrefix, name);
  20208. + }
  20209. +
  20210. + public override SyntaxNode VisitMarkupTagHelperAttributeValue(MarkupTagHelperAttributeValueSyntax node)
  20211. + {
  20212. + var children = VisitList(node.Children);
  20213. + return node.Update(children);
  20214. + }
  20215. +
  20216. + public override SyntaxNode VisitCSharpCodeBlock(CSharpCodeBlockSyntax node)
  20217. + {
  20218. + var children = VisitList(node.Children);
  20219. + return node.Update(children);
  20220. + }
  20221. +
  20222. + public override SyntaxNode VisitCSharpTransition(CSharpTransitionSyntax node)
  20223. + {
  20224. + var transition = (SyntaxToken)VisitToken(node.Transition);
  20225. + return node.Update(transition);
  20226. + }
  20227. +
  20228. + public override SyntaxNode VisitCSharpStatementLiteral(CSharpStatementLiteralSyntax node)
  20229. + {
  20230. + var literalTokens = VisitList(node.LiteralTokens);
  20231. + return node.Update(literalTokens);
  20232. + }
  20233. +
  20234. + public override SyntaxNode VisitCSharpExpressionLiteral(CSharpExpressionLiteralSyntax node)
  20235. + {
  20236. + var literalTokens = VisitList(node.LiteralTokens);
  20237. + return node.Update(literalTokens);
  20238. + }
  20239. +
  20240. + public override SyntaxNode VisitCSharpEphemeralTextLiteral(CSharpEphemeralTextLiteralSyntax node)
  20241. + {
  20242. + var literalTokens = VisitList(node.LiteralTokens);
  20243. + return node.Update(literalTokens);
  20244. + }
  20245. +
  20246. + public override SyntaxNode VisitCSharpTemplateBlock(CSharpTemplateBlockSyntax node)
  20247. + {
  20248. + var children = VisitList(node.Children);
  20249. + return node.Update(children);
  20250. + }
  20251. +
  20252. + public override SyntaxNode VisitCSharpStatement(CSharpStatementSyntax node)
  20253. + {
  20254. + var transition = (CSharpTransitionSyntax)Visit(node.Transition);
  20255. + var body = (CSharpSyntaxNode)Visit(node.Body);
  20256. + return node.Update(transition, body);
  20257. + }
  20258. +
  20259. + public override SyntaxNode VisitCSharpStatementBody(CSharpStatementBodySyntax node)
  20260. + {
  20261. + var openBrace = (RazorMetaCodeSyntax)Visit(node.OpenBrace);
  20262. + var cSharpCode = (CSharpCodeBlockSyntax)Visit(node.CSharpCode);
  20263. + var closeBrace = (RazorMetaCodeSyntax)Visit(node.CloseBrace);
  20264. + return node.Update(openBrace, cSharpCode, closeBrace);
  20265. + }
  20266. +
  20267. + public override SyntaxNode VisitCSharpExplicitExpression(CSharpExplicitExpressionSyntax node)
  20268. + {
  20269. + var transition = (CSharpTransitionSyntax)Visit(node.Transition);
  20270. + var body = (CSharpSyntaxNode)Visit(node.Body);
  20271. + return node.Update(transition, body);
  20272. + }
  20273. +
  20274. + public override SyntaxNode VisitCSharpExplicitExpressionBody(CSharpExplicitExpressionBodySyntax node)
  20275. + {
  20276. + var openParen = (RazorMetaCodeSyntax)Visit(node.OpenParen);
  20277. + var cSharpCode = (CSharpCodeBlockSyntax)Visit(node.CSharpCode);
  20278. + var closeParen = (RazorMetaCodeSyntax)Visit(node.CloseParen);
  20279. + return node.Update(openParen, cSharpCode, closeParen);
  20280. + }
  20281. +
  20282. + public override SyntaxNode VisitCSharpImplicitExpression(CSharpImplicitExpressionSyntax node)
  20283. + {
  20284. + var transition = (CSharpTransitionSyntax)Visit(node.Transition);
  20285. + var body = (CSharpSyntaxNode)Visit(node.Body);
  20286. + return node.Update(transition, body);
  20287. + }
  20288. +
  20289. + public override SyntaxNode VisitCSharpImplicitExpressionBody(CSharpImplicitExpressionBodySyntax node)
  20290. + {
  20291. + var cSharpCode = (CSharpCodeBlockSyntax)Visit(node.CSharpCode);
  20292. + return node.Update(cSharpCode);
  20293. + }
  20294. +
  20295. + public override SyntaxNode VisitRazorDirective(RazorDirectiveSyntax node)
  20296. + {
  20297. + var transition = (CSharpTransitionSyntax)Visit(node.Transition);
  20298. + var body = (CSharpSyntaxNode)Visit(node.Body);
  20299. + return node.Update(transition, body);
  20300. + }
  20301. +
  20302. + public override SyntaxNode VisitRazorDirectiveBody(RazorDirectiveBodySyntax node)
  20303. + {
  20304. + var keyword = (RazorSyntaxNode)Visit(node.Keyword);
  20305. + var cSharpCode = (CSharpCodeBlockSyntax)Visit(node.CSharpCode);
  20306. + return node.Update(keyword, cSharpCode);
  20307. + }
  20308. + }
  20309. +
  20310. internal static partial class SyntaxFactory
  20311. {
  20312. + /// <summary>Creates a new RazorDocumentSyntax instance.</summary>
  20313. + public static RazorDocumentSyntax RazorDocument(RazorBlockSyntax document)
  20314. + {
  20315. + if (document == null)
  20316. + throw new ArgumentNullException(nameof(document));
  20317. + return (RazorDocumentSyntax)InternalSyntax.SyntaxFactory.RazorDocument(document == null ? null : (InternalSyntax.RazorBlockSyntax)document.Green).CreateRed();
  20318. + }
  20319. +
  20320. /// <summary>Creates a new RazorCommentBlockSyntax instance.</summary>
  20321. public static RazorCommentBlockSyntax RazorCommentBlock(SyntaxToken startCommentTransition, SyntaxToken startCommentStar, SyntaxToken comment, SyntaxToken endCommentStar, SyntaxToken endCommentTransition)
  20322. {
  20323. @@ -180,8 +728,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  20324. }
  20325. switch (comment.Kind)
  20326. {
  20327. - case SyntaxKind.RazorComment:
  20328. - case SyntaxKind.Unknown:
  20329. + case SyntaxKind.RazorCommentLiteral:
  20330. break;
  20331. default:
  20332. throw new ArgumentException("comment");
  20333. @@ -206,19 +753,299 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  20334. /// <summary>Creates a new RazorCommentBlockSyntax instance.</summary>
  20335. public static RazorCommentBlockSyntax RazorCommentBlock()
  20336. {
  20337. - return SyntaxFactory.RazorCommentBlock(SyntaxFactory.Token(SyntaxKind.RazorCommentTransition), SyntaxFactory.Token(SyntaxKind.RazorCommentStar), default(SyntaxToken), SyntaxFactory.Token(SyntaxKind.RazorCommentStar), SyntaxFactory.Token(SyntaxKind.RazorCommentTransition));
  20338. + return SyntaxFactory.RazorCommentBlock(SyntaxFactory.Token(SyntaxKind.RazorCommentTransition), SyntaxFactory.Token(SyntaxKind.RazorCommentStar), SyntaxFactory.Token(SyntaxKind.RazorCommentLiteral), SyntaxFactory.Token(SyntaxKind.RazorCommentStar), SyntaxFactory.Token(SyntaxKind.RazorCommentTransition));
  20339. + }
  20340. +
  20341. + /// <summary>Creates a new RazorMetaCodeSyntax instance.</summary>
  20342. + public static RazorMetaCodeSyntax RazorMetaCode(SyntaxList<SyntaxToken> metaCode)
  20343. + {
  20344. + return (RazorMetaCodeSyntax)InternalSyntax.SyntaxFactory.RazorMetaCode(metaCode.Node.ToGreenList<InternalSyntax.SyntaxToken>()).CreateRed();
  20345. + }
  20346. +
  20347. + /// <summary>Creates a new RazorMetaCodeSyntax instance.</summary>
  20348. + public static RazorMetaCodeSyntax RazorMetaCode()
  20349. + {
  20350. + return SyntaxFactory.RazorMetaCode(default(SyntaxList<SyntaxToken>));
  20351. + }
  20352. +
  20353. + /// <summary>Creates a new GenericBlockSyntax instance.</summary>
  20354. + public static GenericBlockSyntax GenericBlock(SyntaxList<RazorSyntaxNode> children)
  20355. + {
  20356. + return (GenericBlockSyntax)InternalSyntax.SyntaxFactory.GenericBlock(children.Node.ToGreenList<InternalSyntax.RazorSyntaxNode>()).CreateRed();
  20357. + }
  20358. +
  20359. + /// <summary>Creates a new GenericBlockSyntax instance.</summary>
  20360. + public static GenericBlockSyntax GenericBlock()
  20361. + {
  20362. + return SyntaxFactory.GenericBlock(default(SyntaxList<RazorSyntaxNode>));
  20363. + }
  20364. +
  20365. + /// <summary>Creates a new UnclassifiedTextLiteralSyntax instance.</summary>
  20366. + public static UnclassifiedTextLiteralSyntax UnclassifiedTextLiteral(SyntaxList<SyntaxToken> literalTokens)
  20367. + {
  20368. + return (UnclassifiedTextLiteralSyntax)InternalSyntax.SyntaxFactory.UnclassifiedTextLiteral(literalTokens.Node.ToGreenList<InternalSyntax.SyntaxToken>()).CreateRed();
  20369. + }
  20370. +
  20371. + /// <summary>Creates a new UnclassifiedTextLiteralSyntax instance.</summary>
  20372. + public static UnclassifiedTextLiteralSyntax UnclassifiedTextLiteral()
  20373. + {
  20374. + return SyntaxFactory.UnclassifiedTextLiteral(default(SyntaxList<SyntaxToken>));
  20375. + }
  20376. +
  20377. + /// <summary>Creates a new MarkupBlockSyntax instance.</summary>
  20378. + public static MarkupBlockSyntax MarkupBlock(SyntaxList<RazorSyntaxNode> children)
  20379. + {
  20380. + return (MarkupBlockSyntax)InternalSyntax.SyntaxFactory.MarkupBlock(children.Node.ToGreenList<InternalSyntax.RazorSyntaxNode>()).CreateRed();
  20381. + }
  20382. +
  20383. + /// <summary>Creates a new MarkupBlockSyntax instance.</summary>
  20384. + public static MarkupBlockSyntax MarkupBlock()
  20385. + {
  20386. + return SyntaxFactory.MarkupBlock(default(SyntaxList<RazorSyntaxNode>));
  20387. + }
  20388. +
  20389. + /// <summary>Creates a new MarkupTransitionSyntax instance.</summary>
  20390. + public static MarkupTransitionSyntax MarkupTransition(SyntaxList<SyntaxToken> transitionTokens)
  20391. + {
  20392. + return (MarkupTransitionSyntax)InternalSyntax.SyntaxFactory.MarkupTransition(transitionTokens.Node.ToGreenList<InternalSyntax.SyntaxToken>()).CreateRed();
  20393. + }
  20394. +
  20395. + /// <summary>Creates a new MarkupTransitionSyntax instance.</summary>
  20396. + public static MarkupTransitionSyntax MarkupTransition()
  20397. + {
  20398. + return SyntaxFactory.MarkupTransition(default(SyntaxList<SyntaxToken>));
  20399. + }
  20400. +
  20401. + /// <summary>Creates a new MarkupTextLiteralSyntax instance.</summary>
  20402. + public static MarkupTextLiteralSyntax MarkupTextLiteral(SyntaxList<SyntaxToken> literalTokens)
  20403. + {
  20404. + return (MarkupTextLiteralSyntax)InternalSyntax.SyntaxFactory.MarkupTextLiteral(literalTokens.Node.ToGreenList<InternalSyntax.SyntaxToken>()).CreateRed();
  20405. + }
  20406. +
  20407. + /// <summary>Creates a new MarkupTextLiteralSyntax instance.</summary>
  20408. + public static MarkupTextLiteralSyntax MarkupTextLiteral()
  20409. + {
  20410. + return SyntaxFactory.MarkupTextLiteral(default(SyntaxList<SyntaxToken>));
  20411. + }
  20412. +
  20413. + /// <summary>Creates a new MarkupEphemeralTextLiteralSyntax instance.</summary>
  20414. + public static MarkupEphemeralTextLiteralSyntax MarkupEphemeralTextLiteral(SyntaxList<SyntaxToken> literalTokens)
  20415. + {
  20416. + return (MarkupEphemeralTextLiteralSyntax)InternalSyntax.SyntaxFactory.MarkupEphemeralTextLiteral(literalTokens.Node.ToGreenList<InternalSyntax.SyntaxToken>()).CreateRed();
  20417. + }
  20418. +
  20419. + /// <summary>Creates a new MarkupEphemeralTextLiteralSyntax instance.</summary>
  20420. + public static MarkupEphemeralTextLiteralSyntax MarkupEphemeralTextLiteral()
  20421. + {
  20422. + return SyntaxFactory.MarkupEphemeralTextLiteral(default(SyntaxList<SyntaxToken>));
  20423. + }
  20424. +
  20425. + /// <summary>Creates a new MarkupCommentBlockSyntax instance.</summary>
  20426. + public static MarkupCommentBlockSyntax MarkupCommentBlock(SyntaxList<RazorSyntaxNode> children)
  20427. + {
  20428. + return (MarkupCommentBlockSyntax)InternalSyntax.SyntaxFactory.MarkupCommentBlock(children.Node.ToGreenList<InternalSyntax.RazorSyntaxNode>()).CreateRed();
  20429. + }
  20430. +
  20431. + /// <summary>Creates a new MarkupCommentBlockSyntax instance.</summary>
  20432. + public static MarkupCommentBlockSyntax MarkupCommentBlock()
  20433. + {
  20434. + return SyntaxFactory.MarkupCommentBlock(default(SyntaxList<RazorSyntaxNode>));
  20435. + }
  20436. +
  20437. + /// <summary>Creates a new MarkupTagBlockSyntax instance.</summary>
  20438. + public static MarkupTagBlockSyntax MarkupTagBlock(SyntaxList<RazorSyntaxNode> children)
  20439. + {
  20440. + return (MarkupTagBlockSyntax)InternalSyntax.SyntaxFactory.MarkupTagBlock(children.Node.ToGreenList<InternalSyntax.RazorSyntaxNode>()).CreateRed();
  20441. }
  20442. - /// <summary>Creates a new HtmlTextLiteralSyntax instance.</summary>
  20443. - public static HtmlTextLiteralSyntax HtmlTextLiteral(SyntaxList<SyntaxToken> textTokens)
  20444. + /// <summary>Creates a new MarkupTagBlockSyntax instance.</summary>
  20445. + public static MarkupTagBlockSyntax MarkupTagBlock()
  20446. {
  20447. - return (HtmlTextLiteralSyntax)InternalSyntax.SyntaxFactory.HtmlTextLiteral(textTokens.Node.ToGreenList<InternalSyntax.SyntaxToken>()).CreateRed();
  20448. + return SyntaxFactory.MarkupTagBlock(default(SyntaxList<RazorSyntaxNode>));
  20449. }
  20450. - /// <summary>Creates a new HtmlTextLiteralSyntax instance.</summary>
  20451. - public static HtmlTextLiteralSyntax HtmlTextLiteral()
  20452. + /// <summary>Creates a new MarkupMinimizedAttributeBlockSyntax instance.</summary>
  20453. + public static MarkupMinimizedAttributeBlockSyntax MarkupMinimizedAttributeBlock(MarkupTextLiteralSyntax namePrefix, MarkupTextLiteralSyntax name)
  20454. {
  20455. - return SyntaxFactory.HtmlTextLiteral(default(SyntaxList<SyntaxToken>));
  20456. + if (name == null)
  20457. + throw new ArgumentNullException(nameof(name));
  20458. + return (MarkupMinimizedAttributeBlockSyntax)InternalSyntax.SyntaxFactory.MarkupMinimizedAttributeBlock(namePrefix == null ? null : (InternalSyntax.MarkupTextLiteralSyntax)namePrefix.Green, name == null ? null : (InternalSyntax.MarkupTextLiteralSyntax)name.Green).CreateRed();
  20459. + }
  20460. +
  20461. + /// <summary>Creates a new MarkupMinimizedAttributeBlockSyntax instance.</summary>
  20462. + public static MarkupMinimizedAttributeBlockSyntax MarkupMinimizedAttributeBlock()
  20463. + {
  20464. + return SyntaxFactory.MarkupMinimizedAttributeBlock(default(MarkupTextLiteralSyntax), SyntaxFactory.MarkupTextLiteral());
  20465. + }
  20466. +
  20467. + /// <summary>Creates a new MarkupAttributeBlockSyntax instance.</summary>
  20468. + public static MarkupAttributeBlockSyntax MarkupAttributeBlock(MarkupTextLiteralSyntax namePrefix, MarkupTextLiteralSyntax name, MarkupTextLiteralSyntax nameSuffix, SyntaxToken equalsToken, MarkupTextLiteralSyntax valuePrefix, RazorBlockSyntax value, MarkupTextLiteralSyntax valueSuffix)
  20469. + {
  20470. + if (name == null)
  20471. + throw new ArgumentNullException(nameof(name));
  20472. + switch (equalsToken.Kind)
  20473. + {
  20474. + case SyntaxKind.Equals:
  20475. + break;
  20476. + default:
  20477. + throw new ArgumentException("equalsToken");
  20478. + }
  20479. + return (MarkupAttributeBlockSyntax)InternalSyntax.SyntaxFactory.MarkupAttributeBlock(namePrefix == null ? null : (InternalSyntax.MarkupTextLiteralSyntax)namePrefix.Green, name == null ? null : (InternalSyntax.MarkupTextLiteralSyntax)name.Green, nameSuffix == null ? null : (InternalSyntax.MarkupTextLiteralSyntax)nameSuffix.Green, (Syntax.InternalSyntax.SyntaxToken)equalsToken.Green, valuePrefix == null ? null : (InternalSyntax.MarkupTextLiteralSyntax)valuePrefix.Green, value == null ? null : (InternalSyntax.RazorBlockSyntax)value.Green, valueSuffix == null ? null : (InternalSyntax.MarkupTextLiteralSyntax)valueSuffix.Green).CreateRed();
  20480. + }
  20481. +
  20482. + /// <summary>Creates a new MarkupAttributeBlockSyntax instance.</summary>
  20483. + public static MarkupAttributeBlockSyntax MarkupAttributeBlock(MarkupTextLiteralSyntax namePrefix, MarkupTextLiteralSyntax name, MarkupTextLiteralSyntax nameSuffix, MarkupTextLiteralSyntax valuePrefix, RazorBlockSyntax value, MarkupTextLiteralSyntax valueSuffix)
  20484. + {
  20485. + return SyntaxFactory.MarkupAttributeBlock(namePrefix, name, nameSuffix, SyntaxFactory.Token(SyntaxKind.Equals), valuePrefix, value, valueSuffix);
  20486. + }
  20487. +
  20488. + /// <summary>Creates a new MarkupAttributeBlockSyntax instance.</summary>
  20489. + public static MarkupAttributeBlockSyntax MarkupAttributeBlock()
  20490. + {
  20491. + return SyntaxFactory.MarkupAttributeBlock(default(MarkupTextLiteralSyntax), SyntaxFactory.MarkupTextLiteral(), default(MarkupTextLiteralSyntax), SyntaxFactory.Token(SyntaxKind.Equals), default(MarkupTextLiteralSyntax), default(RazorBlockSyntax), default(MarkupTextLiteralSyntax));
  20492. + }
  20493. +
  20494. + /// <summary>Creates a new MarkupLiteralAttributeValueSyntax instance.</summary>
  20495. + public static MarkupLiteralAttributeValueSyntax MarkupLiteralAttributeValue(MarkupTextLiteralSyntax prefix, MarkupTextLiteralSyntax value)
  20496. + {
  20497. + return (MarkupLiteralAttributeValueSyntax)InternalSyntax.SyntaxFactory.MarkupLiteralAttributeValue(prefix == null ? null : (InternalSyntax.MarkupTextLiteralSyntax)prefix.Green, value == null ? null : (InternalSyntax.MarkupTextLiteralSyntax)value.Green).CreateRed();
  20498. + }
  20499. +
  20500. + /// <summary>Creates a new MarkupLiteralAttributeValueSyntax instance.</summary>
  20501. + public static MarkupLiteralAttributeValueSyntax MarkupLiteralAttributeValue()
  20502. + {
  20503. + return SyntaxFactory.MarkupLiteralAttributeValue(default(MarkupTextLiteralSyntax), default(MarkupTextLiteralSyntax));
  20504. + }
  20505. +
  20506. + /// <summary>Creates a new MarkupDynamicAttributeValueSyntax instance.</summary>
  20507. + public static MarkupDynamicAttributeValueSyntax MarkupDynamicAttributeValue(MarkupTextLiteralSyntax prefix, RazorBlockSyntax value)
  20508. + {
  20509. + if (value == null)
  20510. + throw new ArgumentNullException(nameof(value));
  20511. + return (MarkupDynamicAttributeValueSyntax)InternalSyntax.SyntaxFactory.MarkupDynamicAttributeValue(prefix == null ? null : (InternalSyntax.MarkupTextLiteralSyntax)prefix.Green, value == null ? null : (InternalSyntax.RazorBlockSyntax)value.Green).CreateRed();
  20512. + }
  20513. +
  20514. + /// <summary>Creates a new MarkupDynamicAttributeValueSyntax instance.</summary>
  20515. + public static MarkupDynamicAttributeValueSyntax MarkupDynamicAttributeValue(RazorBlockSyntax value)
  20516. + {
  20517. + return SyntaxFactory.MarkupDynamicAttributeValue(default(MarkupTextLiteralSyntax), value);
  20518. + }
  20519. +
  20520. + /// <summary>Creates a new MarkupElementSyntax instance.</summary>
  20521. + public static MarkupElementSyntax MarkupElement(MarkupTagBlockSyntax startTag, SyntaxList<RazorSyntaxNode> body, MarkupTagBlockSyntax endTag)
  20522. + {
  20523. + return (MarkupElementSyntax)InternalSyntax.SyntaxFactory.MarkupElement(startTag == null ? null : (InternalSyntax.MarkupTagBlockSyntax)startTag.Green, body.Node.ToGreenList<InternalSyntax.RazorSyntaxNode>(), endTag == null ? null : (InternalSyntax.MarkupTagBlockSyntax)endTag.Green).CreateRed();
  20524. + }
  20525. +
  20526. + /// <summary>Creates a new MarkupElementSyntax instance.</summary>
  20527. + public static MarkupElementSyntax MarkupElement(SyntaxList<RazorSyntaxNode> body = default(SyntaxList<RazorSyntaxNode>))
  20528. + {
  20529. + return SyntaxFactory.MarkupElement(default(MarkupTagBlockSyntax), body, default(MarkupTagBlockSyntax));
  20530. + }
  20531. +
  20532. + /// <summary>Creates a new MarkupTagHelperElementSyntax instance.</summary>
  20533. + public static MarkupTagHelperElementSyntax MarkupTagHelperElement(MarkupTagHelperStartTagSyntax startTag, SyntaxList<RazorSyntaxNode> body, MarkupTagHelperEndTagSyntax endTag)
  20534. + {
  20535. + if (startTag == null)
  20536. + throw new ArgumentNullException(nameof(startTag));
  20537. + return (MarkupTagHelperElementSyntax)InternalSyntax.SyntaxFactory.MarkupTagHelperElement(startTag == null ? null : (InternalSyntax.MarkupTagHelperStartTagSyntax)startTag.Green, body.Node.ToGreenList<InternalSyntax.RazorSyntaxNode>(), endTag == null ? null : (InternalSyntax.MarkupTagHelperEndTagSyntax)endTag.Green).CreateRed();
  20538. + }
  20539. +
  20540. + /// <summary>Creates a new MarkupTagHelperElementSyntax instance.</summary>
  20541. + public static MarkupTagHelperElementSyntax MarkupTagHelperElement(SyntaxList<RazorSyntaxNode> body = default(SyntaxList<RazorSyntaxNode>))
  20542. + {
  20543. + return SyntaxFactory.MarkupTagHelperElement(SyntaxFactory.MarkupTagHelperStartTag(), body, default(MarkupTagHelperEndTagSyntax));
  20544. + }
  20545. +
  20546. + /// <summary>Creates a new MarkupTagHelperStartTagSyntax instance.</summary>
  20547. + public static MarkupTagHelperStartTagSyntax MarkupTagHelperStartTag(SyntaxList<RazorSyntaxNode> children)
  20548. + {
  20549. + return (MarkupTagHelperStartTagSyntax)InternalSyntax.SyntaxFactory.MarkupTagHelperStartTag(children.Node.ToGreenList<InternalSyntax.RazorSyntaxNode>()).CreateRed();
  20550. + }
  20551. +
  20552. + /// <summary>Creates a new MarkupTagHelperStartTagSyntax instance.</summary>
  20553. + public static MarkupTagHelperStartTagSyntax MarkupTagHelperStartTag()
  20554. + {
  20555. + return SyntaxFactory.MarkupTagHelperStartTag(default(SyntaxList<RazorSyntaxNode>));
  20556. + }
  20557. +
  20558. + /// <summary>Creates a new MarkupTagHelperEndTagSyntax instance.</summary>
  20559. + public static MarkupTagHelperEndTagSyntax MarkupTagHelperEndTag(SyntaxList<RazorSyntaxNode> children)
  20560. + {
  20561. + return (MarkupTagHelperEndTagSyntax)InternalSyntax.SyntaxFactory.MarkupTagHelperEndTag(children.Node.ToGreenList<InternalSyntax.RazorSyntaxNode>()).CreateRed();
  20562. + }
  20563. +
  20564. + /// <summary>Creates a new MarkupTagHelperEndTagSyntax instance.</summary>
  20565. + public static MarkupTagHelperEndTagSyntax MarkupTagHelperEndTag()
  20566. + {
  20567. + return SyntaxFactory.MarkupTagHelperEndTag(default(SyntaxList<RazorSyntaxNode>));
  20568. + }
  20569. +
  20570. + /// <summary>Creates a new MarkupTagHelperAttributeSyntax instance.</summary>
  20571. + public static MarkupTagHelperAttributeSyntax MarkupTagHelperAttribute(MarkupTextLiteralSyntax namePrefix, MarkupTextLiteralSyntax name, MarkupTextLiteralSyntax nameSuffix, SyntaxToken equalsToken, MarkupTextLiteralSyntax valuePrefix, MarkupTagHelperAttributeValueSyntax value, MarkupTextLiteralSyntax valueSuffix)
  20572. + {
  20573. + if (name == null)
  20574. + throw new ArgumentNullException(nameof(name));
  20575. + switch (equalsToken.Kind)
  20576. + {
  20577. + case SyntaxKind.Equals:
  20578. + break;
  20579. + default:
  20580. + throw new ArgumentException("equalsToken");
  20581. + }
  20582. + if (value == null)
  20583. + throw new ArgumentNullException(nameof(value));
  20584. + return (MarkupTagHelperAttributeSyntax)InternalSyntax.SyntaxFactory.MarkupTagHelperAttribute(namePrefix == null ? null : (InternalSyntax.MarkupTextLiteralSyntax)namePrefix.Green, name == null ? null : (InternalSyntax.MarkupTextLiteralSyntax)name.Green, nameSuffix == null ? null : (InternalSyntax.MarkupTextLiteralSyntax)nameSuffix.Green, (Syntax.InternalSyntax.SyntaxToken)equalsToken.Green, valuePrefix == null ? null : (InternalSyntax.MarkupTextLiteralSyntax)valuePrefix.Green, value == null ? null : (InternalSyntax.MarkupTagHelperAttributeValueSyntax)value.Green, valueSuffix == null ? null : (InternalSyntax.MarkupTextLiteralSyntax)valueSuffix.Green).CreateRed();
  20585. + }
  20586. +
  20587. + /// <summary>Creates a new MarkupTagHelperAttributeSyntax instance.</summary>
  20588. + public static MarkupTagHelperAttributeSyntax MarkupTagHelperAttribute(MarkupTextLiteralSyntax namePrefix, MarkupTextLiteralSyntax name, MarkupTextLiteralSyntax nameSuffix, MarkupTextLiteralSyntax valuePrefix, MarkupTagHelperAttributeValueSyntax value, MarkupTextLiteralSyntax valueSuffix)
  20589. + {
  20590. + return SyntaxFactory.MarkupTagHelperAttribute(namePrefix, name, nameSuffix, SyntaxFactory.Token(SyntaxKind.Equals), valuePrefix, value, valueSuffix);
  20591. + }
  20592. +
  20593. + /// <summary>Creates a new MarkupTagHelperAttributeSyntax instance.</summary>
  20594. + public static MarkupTagHelperAttributeSyntax MarkupTagHelperAttribute()
  20595. + {
  20596. + return SyntaxFactory.MarkupTagHelperAttribute(default(MarkupTextLiteralSyntax), SyntaxFactory.MarkupTextLiteral(), default(MarkupTextLiteralSyntax), SyntaxFactory.Token(SyntaxKind.Equals), default(MarkupTextLiteralSyntax), SyntaxFactory.MarkupTagHelperAttributeValue(), default(MarkupTextLiteralSyntax));
  20597. + }
  20598. +
  20599. + /// <summary>Creates a new MarkupMinimizedTagHelperAttributeSyntax instance.</summary>
  20600. + public static MarkupMinimizedTagHelperAttributeSyntax MarkupMinimizedTagHelperAttribute(MarkupTextLiteralSyntax namePrefix, MarkupTextLiteralSyntax name)
  20601. + {
  20602. + if (name == null)
  20603. + throw new ArgumentNullException(nameof(name));
  20604. + return (MarkupMinimizedTagHelperAttributeSyntax)InternalSyntax.SyntaxFactory.MarkupMinimizedTagHelperAttribute(namePrefix == null ? null : (InternalSyntax.MarkupTextLiteralSyntax)namePrefix.Green, name == null ? null : (InternalSyntax.MarkupTextLiteralSyntax)name.Green).CreateRed();
  20605. + }
  20606. +
  20607. + /// <summary>Creates a new MarkupMinimizedTagHelperAttributeSyntax instance.</summary>
  20608. + public static MarkupMinimizedTagHelperAttributeSyntax MarkupMinimizedTagHelperAttribute()
  20609. + {
  20610. + return SyntaxFactory.MarkupMinimizedTagHelperAttribute(default(MarkupTextLiteralSyntax), SyntaxFactory.MarkupTextLiteral());
  20611. + }
  20612. +
  20613. + /// <summary>Creates a new MarkupTagHelperAttributeValueSyntax instance.</summary>
  20614. + public static MarkupTagHelperAttributeValueSyntax MarkupTagHelperAttributeValue(SyntaxList<RazorSyntaxNode> children)
  20615. + {
  20616. + return (MarkupTagHelperAttributeValueSyntax)InternalSyntax.SyntaxFactory.MarkupTagHelperAttributeValue(children.Node.ToGreenList<InternalSyntax.RazorSyntaxNode>()).CreateRed();
  20617. + }
  20618. +
  20619. + /// <summary>Creates a new MarkupTagHelperAttributeValueSyntax instance.</summary>
  20620. + public static MarkupTagHelperAttributeValueSyntax MarkupTagHelperAttributeValue()
  20621. + {
  20622. + return SyntaxFactory.MarkupTagHelperAttributeValue(default(SyntaxList<RazorSyntaxNode>));
  20623. + }
  20624. +
  20625. + /// <summary>Creates a new CSharpCodeBlockSyntax instance.</summary>
  20626. + public static CSharpCodeBlockSyntax CSharpCodeBlock(SyntaxList<RazorSyntaxNode> children)
  20627. + {
  20628. + return (CSharpCodeBlockSyntax)InternalSyntax.SyntaxFactory.CSharpCodeBlock(children.Node.ToGreenList<InternalSyntax.RazorSyntaxNode>()).CreateRed();
  20629. + }
  20630. +
  20631. + /// <summary>Creates a new CSharpCodeBlockSyntax instance.</summary>
  20632. + public static CSharpCodeBlockSyntax CSharpCodeBlock()
  20633. + {
  20634. + return SyntaxFactory.CSharpCodeBlock(default(SyntaxList<RazorSyntaxNode>));
  20635. }
  20636. /// <summary>Creates a new CSharpTransitionSyntax instance.</summary>
  20637. @@ -240,60 +1067,72 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  20638. return SyntaxFactory.CSharpTransition(SyntaxFactory.Token(SyntaxKind.Transition));
  20639. }
  20640. - /// <summary>Creates a new CSharpMetaCodeSyntax instance.</summary>
  20641. - public static CSharpMetaCodeSyntax CSharpMetaCode(SyntaxList<SyntaxToken> metaCode)
  20642. + /// <summary>Creates a new CSharpStatementLiteralSyntax instance.</summary>
  20643. + public static CSharpStatementLiteralSyntax CSharpStatementLiteral(SyntaxList<SyntaxToken> literalTokens)
  20644. {
  20645. - return (CSharpMetaCodeSyntax)InternalSyntax.SyntaxFactory.CSharpMetaCode(metaCode.Node.ToGreenList<InternalSyntax.SyntaxToken>()).CreateRed();
  20646. + return (CSharpStatementLiteralSyntax)InternalSyntax.SyntaxFactory.CSharpStatementLiteral(literalTokens.Node.ToGreenList<InternalSyntax.SyntaxToken>()).CreateRed();
  20647. }
  20648. - /// <summary>Creates a new CSharpMetaCodeSyntax instance.</summary>
  20649. - public static CSharpMetaCodeSyntax CSharpMetaCode()
  20650. + /// <summary>Creates a new CSharpStatementLiteralSyntax instance.</summary>
  20651. + public static CSharpStatementLiteralSyntax CSharpStatementLiteral()
  20652. {
  20653. - return SyntaxFactory.CSharpMetaCode(default(SyntaxList<SyntaxToken>));
  20654. + return SyntaxFactory.CSharpStatementLiteral(default(SyntaxList<SyntaxToken>));
  20655. }
  20656. - /// <summary>Creates a new CSharpCodeLiteralSyntax instance.</summary>
  20657. - public static CSharpCodeLiteralSyntax CSharpCodeLiteral(SyntaxList<SyntaxToken> cSharpTokens)
  20658. + /// <summary>Creates a new CSharpExpressionLiteralSyntax instance.</summary>
  20659. + public static CSharpExpressionLiteralSyntax CSharpExpressionLiteral(SyntaxList<SyntaxToken> literalTokens)
  20660. {
  20661. - return (CSharpCodeLiteralSyntax)InternalSyntax.SyntaxFactory.CSharpCodeLiteral(cSharpTokens.Node.ToGreenList<InternalSyntax.SyntaxToken>()).CreateRed();
  20662. + return (CSharpExpressionLiteralSyntax)InternalSyntax.SyntaxFactory.CSharpExpressionLiteral(literalTokens.Node.ToGreenList<InternalSyntax.SyntaxToken>()).CreateRed();
  20663. }
  20664. - /// <summary>Creates a new CSharpCodeLiteralSyntax instance.</summary>
  20665. - public static CSharpCodeLiteralSyntax CSharpCodeLiteral()
  20666. + /// <summary>Creates a new CSharpExpressionLiteralSyntax instance.</summary>
  20667. + public static CSharpExpressionLiteralSyntax CSharpExpressionLiteral()
  20668. {
  20669. - return SyntaxFactory.CSharpCodeLiteral(default(SyntaxList<SyntaxToken>));
  20670. + return SyntaxFactory.CSharpExpressionLiteral(default(SyntaxList<SyntaxToken>));
  20671. }
  20672. - /// <summary>Creates a new CSharpCodeBlockSyntax instance.</summary>
  20673. - public static CSharpCodeBlockSyntax CSharpCodeBlock(SyntaxList<RazorSyntaxNode> children)
  20674. + /// <summary>Creates a new CSharpEphemeralTextLiteralSyntax instance.</summary>
  20675. + public static CSharpEphemeralTextLiteralSyntax CSharpEphemeralTextLiteral(SyntaxList<SyntaxToken> literalTokens)
  20676. {
  20677. - return (CSharpCodeBlockSyntax)InternalSyntax.SyntaxFactory.CSharpCodeBlock(children.Node.ToGreenList<InternalSyntax.RazorSyntaxNode>()).CreateRed();
  20678. + return (CSharpEphemeralTextLiteralSyntax)InternalSyntax.SyntaxFactory.CSharpEphemeralTextLiteral(literalTokens.Node.ToGreenList<InternalSyntax.SyntaxToken>()).CreateRed();
  20679. }
  20680. - /// <summary>Creates a new CSharpCodeBlockSyntax instance.</summary>
  20681. - public static CSharpCodeBlockSyntax CSharpCodeBlock()
  20682. + /// <summary>Creates a new CSharpEphemeralTextLiteralSyntax instance.</summary>
  20683. + public static CSharpEphemeralTextLiteralSyntax CSharpEphemeralTextLiteral()
  20684. {
  20685. - return SyntaxFactory.CSharpCodeBlock(default(SyntaxList<RazorSyntaxNode>));
  20686. + return SyntaxFactory.CSharpEphemeralTextLiteral(default(SyntaxList<SyntaxToken>));
  20687. }
  20688. - /// <summary>Creates a new CSharpStatement instance.</summary>
  20689. - public static CSharpStatement CSharpStatement(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  20690. + /// <summary>Creates a new CSharpTemplateBlockSyntax instance.</summary>
  20691. + public static CSharpTemplateBlockSyntax CSharpTemplateBlock(SyntaxList<RazorSyntaxNode> children)
  20692. + {
  20693. + return (CSharpTemplateBlockSyntax)InternalSyntax.SyntaxFactory.CSharpTemplateBlock(children.Node.ToGreenList<InternalSyntax.RazorSyntaxNode>()).CreateRed();
  20694. + }
  20695. +
  20696. + /// <summary>Creates a new CSharpTemplateBlockSyntax instance.</summary>
  20697. + public static CSharpTemplateBlockSyntax CSharpTemplateBlock()
  20698. + {
  20699. + return SyntaxFactory.CSharpTemplateBlock(default(SyntaxList<RazorSyntaxNode>));
  20700. + }
  20701. +
  20702. + /// <summary>Creates a new CSharpStatementSyntax instance.</summary>
  20703. + public static CSharpStatementSyntax CSharpStatement(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  20704. {
  20705. if (transition == null)
  20706. throw new ArgumentNullException(nameof(transition));
  20707. if (body == null)
  20708. throw new ArgumentNullException(nameof(body));
  20709. - return (CSharpStatement)InternalSyntax.SyntaxFactory.CSharpStatement(transition == null ? null : (InternalSyntax.CSharpTransitionSyntax)transition.Green, body == null ? null : (InternalSyntax.CSharpSyntaxNode)body.Green).CreateRed();
  20710. + return (CSharpStatementSyntax)InternalSyntax.SyntaxFactory.CSharpStatement(transition == null ? null : (InternalSyntax.CSharpTransitionSyntax)transition.Green, body == null ? null : (InternalSyntax.CSharpSyntaxNode)body.Green).CreateRed();
  20711. }
  20712. - /// <summary>Creates a new CSharpStatement instance.</summary>
  20713. - public static CSharpStatement CSharpStatement(CSharpSyntaxNode body)
  20714. + /// <summary>Creates a new CSharpStatementSyntax instance.</summary>
  20715. + public static CSharpStatementSyntax CSharpStatement(CSharpSyntaxNode body)
  20716. {
  20717. return SyntaxFactory.CSharpStatement(SyntaxFactory.CSharpTransition(), body);
  20718. }
  20719. /// <summary>Creates a new CSharpStatementBodySyntax instance.</summary>
  20720. - public static CSharpStatementBodySyntax CSharpStatementBody(CSharpMetaCodeSyntax openBrace, CSharpCodeBlockSyntax cSharpCode, CSharpMetaCodeSyntax closeBrace)
  20721. + public static CSharpStatementBodySyntax CSharpStatementBody(RazorMetaCodeSyntax openBrace, CSharpCodeBlockSyntax cSharpCode, RazorMetaCodeSyntax closeBrace)
  20722. {
  20723. if (openBrace == null)
  20724. throw new ArgumentNullException(nameof(openBrace));
  20725. @@ -301,75 +1140,107 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  20726. throw new ArgumentNullException(nameof(cSharpCode));
  20727. if (closeBrace == null)
  20728. throw new ArgumentNullException(nameof(closeBrace));
  20729. - return (CSharpStatementBodySyntax)InternalSyntax.SyntaxFactory.CSharpStatementBody(openBrace == null ? null : (InternalSyntax.CSharpMetaCodeSyntax)openBrace.Green, cSharpCode == null ? null : (InternalSyntax.CSharpCodeBlockSyntax)cSharpCode.Green, closeBrace == null ? null : (InternalSyntax.CSharpMetaCodeSyntax)closeBrace.Green).CreateRed();
  20730. + return (CSharpStatementBodySyntax)InternalSyntax.SyntaxFactory.CSharpStatementBody(openBrace == null ? null : (InternalSyntax.RazorMetaCodeSyntax)openBrace.Green, cSharpCode == null ? null : (InternalSyntax.CSharpCodeBlockSyntax)cSharpCode.Green, closeBrace == null ? null : (InternalSyntax.RazorMetaCodeSyntax)closeBrace.Green).CreateRed();
  20731. }
  20732. /// <summary>Creates a new CSharpStatementBodySyntax instance.</summary>
  20733. public static CSharpStatementBodySyntax CSharpStatementBody()
  20734. {
  20735. - return SyntaxFactory.CSharpStatementBody(SyntaxFactory.CSharpMetaCode(), SyntaxFactory.CSharpCodeBlock(), SyntaxFactory.CSharpMetaCode());
  20736. + return SyntaxFactory.CSharpStatementBody(SyntaxFactory.RazorMetaCode(), SyntaxFactory.CSharpCodeBlock(), SyntaxFactory.RazorMetaCode());
  20737. }
  20738. - /// <summary>Creates a new CSharpExpression instance.</summary>
  20739. - public static CSharpExpression CSharpExpression(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  20740. + /// <summary>Creates a new CSharpExplicitExpressionSyntax instance.</summary>
  20741. + public static CSharpExplicitExpressionSyntax CSharpExplicitExpression(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  20742. {
  20743. if (transition == null)
  20744. throw new ArgumentNullException(nameof(transition));
  20745. if (body == null)
  20746. throw new ArgumentNullException(nameof(body));
  20747. - return (CSharpExpression)InternalSyntax.SyntaxFactory.CSharpExpression(transition == null ? null : (InternalSyntax.CSharpTransitionSyntax)transition.Green, body == null ? null : (InternalSyntax.CSharpSyntaxNode)body.Green).CreateRed();
  20748. + return (CSharpExplicitExpressionSyntax)InternalSyntax.SyntaxFactory.CSharpExplicitExpression(transition == null ? null : (InternalSyntax.CSharpTransitionSyntax)transition.Green, body == null ? null : (InternalSyntax.CSharpSyntaxNode)body.Green).CreateRed();
  20749. }
  20750. - /// <summary>Creates a new CSharpExpression instance.</summary>
  20751. - public static CSharpExpression CSharpExpression(CSharpSyntaxNode body)
  20752. + /// <summary>Creates a new CSharpExplicitExpressionSyntax instance.</summary>
  20753. + public static CSharpExplicitExpressionSyntax CSharpExplicitExpression(CSharpSyntaxNode body)
  20754. {
  20755. - return SyntaxFactory.CSharpExpression(SyntaxFactory.CSharpTransition(), body);
  20756. + return SyntaxFactory.CSharpExplicitExpression(SyntaxFactory.CSharpTransition(), body);
  20757. }
  20758. - /// <summary>Creates a new CSharpExpressionBodySyntax instance.</summary>
  20759. - public static CSharpExpressionBodySyntax CSharpExpressionBody(CSharpMetaCodeSyntax openParen, CSharpCodeBlockSyntax cSharpCode, CSharpMetaCodeSyntax closeParen)
  20760. + /// <summary>Creates a new CSharpExplicitExpressionBodySyntax instance.</summary>
  20761. + public static CSharpExplicitExpressionBodySyntax CSharpExplicitExpressionBody(RazorMetaCodeSyntax openParen, CSharpCodeBlockSyntax cSharpCode, RazorMetaCodeSyntax closeParen)
  20762. {
  20763. + if (openParen == null)
  20764. + throw new ArgumentNullException(nameof(openParen));
  20765. if (cSharpCode == null)
  20766. throw new ArgumentNullException(nameof(cSharpCode));
  20767. - return (CSharpExpressionBodySyntax)InternalSyntax.SyntaxFactory.CSharpExpressionBody(openParen == null ? null : (InternalSyntax.CSharpMetaCodeSyntax)openParen.Green, cSharpCode == null ? null : (InternalSyntax.CSharpCodeBlockSyntax)cSharpCode.Green, closeParen == null ? null : (InternalSyntax.CSharpMetaCodeSyntax)closeParen.Green).CreateRed();
  20768. + if (closeParen == null)
  20769. + throw new ArgumentNullException(nameof(closeParen));
  20770. + return (CSharpExplicitExpressionBodySyntax)InternalSyntax.SyntaxFactory.CSharpExplicitExpressionBody(openParen == null ? null : (InternalSyntax.RazorMetaCodeSyntax)openParen.Green, cSharpCode == null ? null : (InternalSyntax.CSharpCodeBlockSyntax)cSharpCode.Green, closeParen == null ? null : (InternalSyntax.RazorMetaCodeSyntax)closeParen.Green).CreateRed();
  20771. }
  20772. - /// <summary>Creates a new CSharpExpressionBodySyntax instance.</summary>
  20773. - public static CSharpExpressionBodySyntax CSharpExpressionBody()
  20774. + /// <summary>Creates a new CSharpExplicitExpressionBodySyntax instance.</summary>
  20775. + public static CSharpExplicitExpressionBodySyntax CSharpExplicitExpressionBody()
  20776. {
  20777. - return SyntaxFactory.CSharpExpressionBody(default(CSharpMetaCodeSyntax), SyntaxFactory.CSharpCodeBlock(), default(CSharpMetaCodeSyntax));
  20778. + return SyntaxFactory.CSharpExplicitExpressionBody(SyntaxFactory.RazorMetaCode(), SyntaxFactory.CSharpCodeBlock(), SyntaxFactory.RazorMetaCode());
  20779. }
  20780. - /// <summary>Creates a new CSharpDirectiveSyntax instance.</summary>
  20781. - public static CSharpDirectiveSyntax CSharpDirective(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  20782. + /// <summary>Creates a new CSharpImplicitExpressionSyntax instance.</summary>
  20783. + public static CSharpImplicitExpressionSyntax CSharpImplicitExpression(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  20784. {
  20785. if (transition == null)
  20786. throw new ArgumentNullException(nameof(transition));
  20787. if (body == null)
  20788. throw new ArgumentNullException(nameof(body));
  20789. - return (CSharpDirectiveSyntax)InternalSyntax.SyntaxFactory.CSharpDirective(transition == null ? null : (InternalSyntax.CSharpTransitionSyntax)transition.Green, body == null ? null : (InternalSyntax.CSharpSyntaxNode)body.Green).CreateRed();
  20790. + return (CSharpImplicitExpressionSyntax)InternalSyntax.SyntaxFactory.CSharpImplicitExpression(transition == null ? null : (InternalSyntax.CSharpTransitionSyntax)transition.Green, body == null ? null : (InternalSyntax.CSharpSyntaxNode)body.Green).CreateRed();
  20791. }
  20792. - /// <summary>Creates a new CSharpDirectiveSyntax instance.</summary>
  20793. - public static CSharpDirectiveSyntax CSharpDirective(CSharpSyntaxNode body)
  20794. + /// <summary>Creates a new CSharpImplicitExpressionSyntax instance.</summary>
  20795. + public static CSharpImplicitExpressionSyntax CSharpImplicitExpression(CSharpSyntaxNode body)
  20796. {
  20797. - return SyntaxFactory.CSharpDirective(SyntaxFactory.CSharpTransition(), body);
  20798. + return SyntaxFactory.CSharpImplicitExpression(SyntaxFactory.CSharpTransition(), body);
  20799. }
  20800. - /// <summary>Creates a new CSharpDirectiveBodySyntax instance.</summary>
  20801. - public static CSharpDirectiveBodySyntax CSharpDirectiveBody(CSharpMetaCodeSyntax keyword, CSharpCodeBlockSyntax cSharpCode)
  20802. + /// <summary>Creates a new CSharpImplicitExpressionBodySyntax instance.</summary>
  20803. + public static CSharpImplicitExpressionBodySyntax CSharpImplicitExpressionBody(CSharpCodeBlockSyntax cSharpCode)
  20804. {
  20805. - if (keyword == null)
  20806. - throw new ArgumentNullException(nameof(keyword));
  20807. if (cSharpCode == null)
  20808. throw new ArgumentNullException(nameof(cSharpCode));
  20809. - return (CSharpDirectiveBodySyntax)InternalSyntax.SyntaxFactory.CSharpDirectiveBody(keyword == null ? null : (InternalSyntax.CSharpMetaCodeSyntax)keyword.Green, cSharpCode == null ? null : (InternalSyntax.CSharpCodeBlockSyntax)cSharpCode.Green).CreateRed();
  20810. + return (CSharpImplicitExpressionBodySyntax)InternalSyntax.SyntaxFactory.CSharpImplicitExpressionBody(cSharpCode == null ? null : (InternalSyntax.CSharpCodeBlockSyntax)cSharpCode.Green).CreateRed();
  20811. + }
  20812. +
  20813. + /// <summary>Creates a new CSharpImplicitExpressionBodySyntax instance.</summary>
  20814. + public static CSharpImplicitExpressionBodySyntax CSharpImplicitExpressionBody()
  20815. + {
  20816. + return SyntaxFactory.CSharpImplicitExpressionBody(SyntaxFactory.CSharpCodeBlock());
  20817. + }
  20818. +
  20819. + /// <summary>Creates a new RazorDirectiveSyntax instance.</summary>
  20820. + public static RazorDirectiveSyntax RazorDirective(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  20821. + {
  20822. + if (transition == null)
  20823. + throw new ArgumentNullException(nameof(transition));
  20824. + if (body == null)
  20825. + throw new ArgumentNullException(nameof(body));
  20826. + return (RazorDirectiveSyntax)InternalSyntax.SyntaxFactory.RazorDirective(transition == null ? null : (InternalSyntax.CSharpTransitionSyntax)transition.Green, body == null ? null : (InternalSyntax.CSharpSyntaxNode)body.Green).CreateRed();
  20827. + }
  20828. +
  20829. + /// <summary>Creates a new RazorDirectiveSyntax instance.</summary>
  20830. + public static RazorDirectiveSyntax RazorDirective(CSharpSyntaxNode body)
  20831. + {
  20832. + return SyntaxFactory.RazorDirective(SyntaxFactory.CSharpTransition(), body);
  20833. + }
  20834. +
  20835. + /// <summary>Creates a new RazorDirectiveBodySyntax instance.</summary>
  20836. + public static RazorDirectiveBodySyntax RazorDirectiveBody(RazorSyntaxNode keyword, CSharpCodeBlockSyntax cSharpCode)
  20837. + {
  20838. + if (keyword == null)
  20839. + throw new ArgumentNullException(nameof(keyword));
  20840. + return (RazorDirectiveBodySyntax)InternalSyntax.SyntaxFactory.RazorDirectiveBody(keyword == null ? null : (InternalSyntax.RazorSyntaxNode)keyword.Green, cSharpCode == null ? null : (InternalSyntax.CSharpCodeBlockSyntax)cSharpCode.Green).CreateRed();
  20841. }
  20842. - /// <summary>Creates a new CSharpDirectiveBodySyntax instance.</summary>
  20843. - public static CSharpDirectiveBodySyntax CSharpDirectiveBody()
  20844. + /// <summary>Creates a new RazorDirectiveBodySyntax instance.</summary>
  20845. + public static RazorDirectiveBodySyntax RazorDirectiveBody(RazorSyntaxNode keyword)
  20846. {
  20847. - return SyntaxFactory.CSharpDirectiveBody(SyntaxFactory.CSharpMetaCode(), SyntaxFactory.CSharpCodeBlock());
  20848. + return SyntaxFactory.RazorDirectiveBody(keyword, default(CSharpCodeBlockSyntax));
  20849. }
  20850. }
  20851. }
  20852. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/Generated/Syntax.xml.Syntax.Generated.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/Generated/Syntax.xml.Syntax.Generated.cs
  20853. index a11e4071eb1..8196bdb0ea7 100644
  20854. --- a/src/Microsoft.AspNetCore.Razor.Language/Syntax/Generated/Syntax.xml.Syntax.Generated.cs
  20855. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/Generated/Syntax.xml.Syntax.Generated.cs
  20856. @@ -9,12 +9,83 @@ using System.Threading;
  20857. namespace Microsoft.AspNetCore.Razor.Language.Syntax
  20858. {
  20859. - internal abstract partial class RazorSyntaxNode : SyntaxNode
  20860. + internal abstract partial class RazorBlockSyntax : RazorSyntaxNode
  20861. {
  20862. - internal RazorSyntaxNode(GreenNode green, SyntaxNode parent, int position)
  20863. + internal RazorBlockSyntax(GreenNode green, SyntaxNode parent, int position)
  20864. : base(green, parent, position)
  20865. {
  20866. }
  20867. +
  20868. + public abstract SyntaxList<RazorSyntaxNode> Children { get; }
  20869. + public RazorBlockSyntax WithChildren(SyntaxList<RazorSyntaxNode> children) => WithChildrenCore(children);
  20870. + internal abstract RazorBlockSyntax WithChildrenCore(SyntaxList<RazorSyntaxNode> children);
  20871. +
  20872. + public RazorBlockSyntax AddChildren(params RazorSyntaxNode[] items) => AddChildrenCore(items);
  20873. + internal abstract RazorBlockSyntax AddChildrenCore(params RazorSyntaxNode[] items);
  20874. + }
  20875. +
  20876. + internal sealed partial class RazorDocumentSyntax : RazorSyntaxNode
  20877. + {
  20878. + private RazorBlockSyntax _document;
  20879. +
  20880. + internal RazorDocumentSyntax(GreenNode green, SyntaxNode parent, int position)
  20881. + : base(green, parent, position)
  20882. + {
  20883. + }
  20884. +
  20885. + public RazorBlockSyntax Document
  20886. + {
  20887. + get
  20888. + {
  20889. + return GetRedAtZero(ref _document);
  20890. + }
  20891. + }
  20892. +
  20893. + internal override SyntaxNode GetNodeSlot(int index)
  20894. + {
  20895. + switch (index)
  20896. + {
  20897. + case 0: return GetRedAtZero(ref _document);
  20898. + default: return null;
  20899. + }
  20900. + }
  20901. + internal override SyntaxNode GetCachedSlot(int index)
  20902. + {
  20903. + switch (index)
  20904. + {
  20905. + case 0: return _document;
  20906. + default: return null;
  20907. + }
  20908. + }
  20909. +
  20910. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  20911. + {
  20912. + return visitor.VisitRazorDocument(this);
  20913. + }
  20914. +
  20915. + public override void Accept(SyntaxVisitor visitor)
  20916. + {
  20917. + visitor.VisitRazorDocument(this);
  20918. + }
  20919. +
  20920. + public RazorDocumentSyntax Update(RazorBlockSyntax document)
  20921. + {
  20922. + if (document != Document)
  20923. + {
  20924. + var newNode = SyntaxFactory.RazorDocument(document);
  20925. + var annotations = GetAnnotations();
  20926. + if (annotations != null && annotations.Length > 0)
  20927. + return newNode.WithAnnotations(annotations);
  20928. + return newNode;
  20929. + }
  20930. +
  20931. + return this;
  20932. + }
  20933. +
  20934. + public RazorDocumentSyntax WithDocument(RazorBlockSyntax document)
  20935. + {
  20936. + return Update(document);
  20937. + }
  20938. }
  20939. internal sealed partial class RazorCommentBlockSyntax : RazorSyntaxNode
  20940. @@ -62,11 +133,1850 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  20941. }
  20942. }
  20943. - public SyntaxToken EndCommentTransition
  20944. + public SyntaxToken EndCommentTransition
  20945. + {
  20946. + get
  20947. + {
  20948. + return GetRed(ref _endCommentTransition, 4);
  20949. + }
  20950. + }
  20951. +
  20952. + internal override SyntaxNode GetNodeSlot(int index)
  20953. + {
  20954. + switch (index)
  20955. + {
  20956. + case 0: return GetRedAtZero(ref _startCommentTransition);
  20957. + case 1: return GetRed(ref _startCommentStar, 1);
  20958. + case 2: return GetRed(ref _comment, 2);
  20959. + case 3: return GetRed(ref _endCommentStar, 3);
  20960. + case 4: return GetRed(ref _endCommentTransition, 4);
  20961. + default: return null;
  20962. + }
  20963. + }
  20964. + internal override SyntaxNode GetCachedSlot(int index)
  20965. + {
  20966. + switch (index)
  20967. + {
  20968. + case 0: return _startCommentTransition;
  20969. + case 1: return _startCommentStar;
  20970. + case 2: return _comment;
  20971. + case 3: return _endCommentStar;
  20972. + case 4: return _endCommentTransition;
  20973. + default: return null;
  20974. + }
  20975. + }
  20976. +
  20977. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  20978. + {
  20979. + return visitor.VisitRazorCommentBlock(this);
  20980. + }
  20981. +
  20982. + public override void Accept(SyntaxVisitor visitor)
  20983. + {
  20984. + visitor.VisitRazorCommentBlock(this);
  20985. + }
  20986. +
  20987. + public RazorCommentBlockSyntax Update(SyntaxToken startCommentTransition, SyntaxToken startCommentStar, SyntaxToken comment, SyntaxToken endCommentStar, SyntaxToken endCommentTransition)
  20988. + {
  20989. + if (startCommentTransition != StartCommentTransition || startCommentStar != StartCommentStar || comment != Comment || endCommentStar != EndCommentStar || endCommentTransition != EndCommentTransition)
  20990. + {
  20991. + var newNode = SyntaxFactory.RazorCommentBlock(startCommentTransition, startCommentStar, comment, endCommentStar, endCommentTransition);
  20992. + var annotations = GetAnnotations();
  20993. + if (annotations != null && annotations.Length > 0)
  20994. + return newNode.WithAnnotations(annotations);
  20995. + return newNode;
  20996. + }
  20997. +
  20998. + return this;
  20999. + }
  21000. +
  21001. + public RazorCommentBlockSyntax WithStartCommentTransition(SyntaxToken startCommentTransition)
  21002. + {
  21003. + return Update(startCommentTransition, StartCommentStar, Comment, EndCommentStar, EndCommentTransition);
  21004. + }
  21005. +
  21006. + public RazorCommentBlockSyntax WithStartCommentStar(SyntaxToken startCommentStar)
  21007. + {
  21008. + return Update(StartCommentTransition, startCommentStar, Comment, EndCommentStar, EndCommentTransition);
  21009. + }
  21010. +
  21011. + public RazorCommentBlockSyntax WithComment(SyntaxToken comment)
  21012. + {
  21013. + return Update(StartCommentTransition, StartCommentStar, comment, EndCommentStar, EndCommentTransition);
  21014. + }
  21015. +
  21016. + public RazorCommentBlockSyntax WithEndCommentStar(SyntaxToken endCommentStar)
  21017. + {
  21018. + return Update(StartCommentTransition, StartCommentStar, Comment, endCommentStar, EndCommentTransition);
  21019. + }
  21020. +
  21021. + public RazorCommentBlockSyntax WithEndCommentTransition(SyntaxToken endCommentTransition)
  21022. + {
  21023. + return Update(StartCommentTransition, StartCommentStar, Comment, EndCommentStar, endCommentTransition);
  21024. + }
  21025. + }
  21026. +
  21027. + internal sealed partial class RazorMetaCodeSyntax : RazorSyntaxNode
  21028. + {
  21029. + private SyntaxNode _metaCode;
  21030. +
  21031. + internal RazorMetaCodeSyntax(GreenNode green, SyntaxNode parent, int position)
  21032. + : base(green, parent, position)
  21033. + {
  21034. + }
  21035. +
  21036. + public SyntaxList<SyntaxToken> MetaCode
  21037. + {
  21038. + get
  21039. + {
  21040. + return new SyntaxList<SyntaxToken>(GetRed(ref _metaCode, 0));
  21041. + }
  21042. + }
  21043. +
  21044. + internal override SyntaxNode GetNodeSlot(int index)
  21045. + {
  21046. + switch (index)
  21047. + {
  21048. + case 0: return GetRedAtZero(ref _metaCode);
  21049. + default: return null;
  21050. + }
  21051. + }
  21052. + internal override SyntaxNode GetCachedSlot(int index)
  21053. + {
  21054. + switch (index)
  21055. + {
  21056. + case 0: return _metaCode;
  21057. + default: return null;
  21058. + }
  21059. + }
  21060. +
  21061. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  21062. + {
  21063. + return visitor.VisitRazorMetaCode(this);
  21064. + }
  21065. +
  21066. + public override void Accept(SyntaxVisitor visitor)
  21067. + {
  21068. + visitor.VisitRazorMetaCode(this);
  21069. + }
  21070. +
  21071. + public RazorMetaCodeSyntax Update(SyntaxList<SyntaxToken> metaCode)
  21072. + {
  21073. + if (metaCode != MetaCode)
  21074. + {
  21075. + var newNode = SyntaxFactory.RazorMetaCode(metaCode);
  21076. + var annotations = GetAnnotations();
  21077. + if (annotations != null && annotations.Length > 0)
  21078. + return newNode.WithAnnotations(annotations);
  21079. + return newNode;
  21080. + }
  21081. +
  21082. + return this;
  21083. + }
  21084. +
  21085. + public RazorMetaCodeSyntax WithMetaCode(SyntaxList<SyntaxToken> metaCode)
  21086. + {
  21087. + return Update(metaCode);
  21088. + }
  21089. +
  21090. + public RazorMetaCodeSyntax AddMetaCode(params SyntaxToken[] items)
  21091. + {
  21092. + return WithMetaCode(this.MetaCode.AddRange(items));
  21093. + }
  21094. + }
  21095. +
  21096. + internal sealed partial class GenericBlockSyntax : RazorBlockSyntax
  21097. + {
  21098. + private SyntaxNode _children;
  21099. +
  21100. + internal GenericBlockSyntax(GreenNode green, SyntaxNode parent, int position)
  21101. + : base(green, parent, position)
  21102. + {
  21103. + }
  21104. +
  21105. + public override SyntaxList<RazorSyntaxNode> Children
  21106. + {
  21107. + get
  21108. + {
  21109. + return new SyntaxList<RazorSyntaxNode>(GetRed(ref _children, 0));
  21110. + }
  21111. + }
  21112. +
  21113. + internal override SyntaxNode GetNodeSlot(int index)
  21114. + {
  21115. + switch (index)
  21116. + {
  21117. + case 0: return GetRedAtZero(ref _children);
  21118. + default: return null;
  21119. + }
  21120. + }
  21121. + internal override SyntaxNode GetCachedSlot(int index)
  21122. + {
  21123. + switch (index)
  21124. + {
  21125. + case 0: return _children;
  21126. + default: return null;
  21127. + }
  21128. + }
  21129. +
  21130. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  21131. + {
  21132. + return visitor.VisitGenericBlock(this);
  21133. + }
  21134. +
  21135. + public override void Accept(SyntaxVisitor visitor)
  21136. + {
  21137. + visitor.VisitGenericBlock(this);
  21138. + }
  21139. +
  21140. + public GenericBlockSyntax Update(SyntaxList<RazorSyntaxNode> children)
  21141. + {
  21142. + if (children != Children)
  21143. + {
  21144. + var newNode = SyntaxFactory.GenericBlock(children);
  21145. + var annotations = GetAnnotations();
  21146. + if (annotations != null && annotations.Length > 0)
  21147. + return newNode.WithAnnotations(annotations);
  21148. + return newNode;
  21149. + }
  21150. +
  21151. + return this;
  21152. + }
  21153. +
  21154. + internal override RazorBlockSyntax WithChildrenCore(SyntaxList<RazorSyntaxNode> children) => WithChildren(children);
  21155. + public new GenericBlockSyntax WithChildren(SyntaxList<RazorSyntaxNode> children)
  21156. + {
  21157. + return Update(children);
  21158. + }
  21159. + internal override RazorBlockSyntax AddChildrenCore(params RazorSyntaxNode[] items) => AddChildren(items);
  21160. +
  21161. + public new GenericBlockSyntax AddChildren(params RazorSyntaxNode[] items)
  21162. + {
  21163. + return WithChildren(this.Children.AddRange(items));
  21164. + }
  21165. + }
  21166. +
  21167. + internal sealed partial class UnclassifiedTextLiteralSyntax : RazorSyntaxNode
  21168. + {
  21169. + private SyntaxNode _literalTokens;
  21170. +
  21171. + internal UnclassifiedTextLiteralSyntax(GreenNode green, SyntaxNode parent, int position)
  21172. + : base(green, parent, position)
  21173. + {
  21174. + }
  21175. +
  21176. + public SyntaxList<SyntaxToken> LiteralTokens
  21177. + {
  21178. + get
  21179. + {
  21180. + return new SyntaxList<SyntaxToken>(GetRed(ref _literalTokens, 0));
  21181. + }
  21182. + }
  21183. +
  21184. + internal override SyntaxNode GetNodeSlot(int index)
  21185. + {
  21186. + switch (index)
  21187. + {
  21188. + case 0: return GetRedAtZero(ref _literalTokens);
  21189. + default: return null;
  21190. + }
  21191. + }
  21192. + internal override SyntaxNode GetCachedSlot(int index)
  21193. + {
  21194. + switch (index)
  21195. + {
  21196. + case 0: return _literalTokens;
  21197. + default: return null;
  21198. + }
  21199. + }
  21200. +
  21201. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  21202. + {
  21203. + return visitor.VisitUnclassifiedTextLiteral(this);
  21204. + }
  21205. +
  21206. + public override void Accept(SyntaxVisitor visitor)
  21207. + {
  21208. + visitor.VisitUnclassifiedTextLiteral(this);
  21209. + }
  21210. +
  21211. + public UnclassifiedTextLiteralSyntax Update(SyntaxList<SyntaxToken> literalTokens)
  21212. + {
  21213. + if (literalTokens != LiteralTokens)
  21214. + {
  21215. + var newNode = SyntaxFactory.UnclassifiedTextLiteral(literalTokens);
  21216. + var annotations = GetAnnotations();
  21217. + if (annotations != null && annotations.Length > 0)
  21218. + return newNode.WithAnnotations(annotations);
  21219. + return newNode;
  21220. + }
  21221. +
  21222. + return this;
  21223. + }
  21224. +
  21225. + public UnclassifiedTextLiteralSyntax WithLiteralTokens(SyntaxList<SyntaxToken> literalTokens)
  21226. + {
  21227. + return Update(literalTokens);
  21228. + }
  21229. +
  21230. + public UnclassifiedTextLiteralSyntax AddLiteralTokens(params SyntaxToken[] items)
  21231. + {
  21232. + return WithLiteralTokens(this.LiteralTokens.AddRange(items));
  21233. + }
  21234. + }
  21235. +
  21236. + internal abstract partial class MarkupSyntaxNode : RazorSyntaxNode
  21237. + {
  21238. + internal MarkupSyntaxNode(GreenNode green, SyntaxNode parent, int position)
  21239. + : base(green, parent, position)
  21240. + {
  21241. + }
  21242. + }
  21243. +
  21244. + internal sealed partial class MarkupBlockSyntax : RazorBlockSyntax
  21245. + {
  21246. + private SyntaxNode _children;
  21247. +
  21248. + internal MarkupBlockSyntax(GreenNode green, SyntaxNode parent, int position)
  21249. + : base(green, parent, position)
  21250. + {
  21251. + }
  21252. +
  21253. + public override SyntaxList<RazorSyntaxNode> Children
  21254. + {
  21255. + get
  21256. + {
  21257. + return new SyntaxList<RazorSyntaxNode>(GetRed(ref _children, 0));
  21258. + }
  21259. + }
  21260. +
  21261. + internal override SyntaxNode GetNodeSlot(int index)
  21262. + {
  21263. + switch (index)
  21264. + {
  21265. + case 0: return GetRedAtZero(ref _children);
  21266. + default: return null;
  21267. + }
  21268. + }
  21269. + internal override SyntaxNode GetCachedSlot(int index)
  21270. + {
  21271. + switch (index)
  21272. + {
  21273. + case 0: return _children;
  21274. + default: return null;
  21275. + }
  21276. + }
  21277. +
  21278. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  21279. + {
  21280. + return visitor.VisitMarkupBlock(this);
  21281. + }
  21282. +
  21283. + public override void Accept(SyntaxVisitor visitor)
  21284. + {
  21285. + visitor.VisitMarkupBlock(this);
  21286. + }
  21287. +
  21288. + public MarkupBlockSyntax Update(SyntaxList<RazorSyntaxNode> children)
  21289. + {
  21290. + if (children != Children)
  21291. + {
  21292. + var newNode = SyntaxFactory.MarkupBlock(children);
  21293. + var annotations = GetAnnotations();
  21294. + if (annotations != null && annotations.Length > 0)
  21295. + return newNode.WithAnnotations(annotations);
  21296. + return newNode;
  21297. + }
  21298. +
  21299. + return this;
  21300. + }
  21301. +
  21302. + internal override RazorBlockSyntax WithChildrenCore(SyntaxList<RazorSyntaxNode> children) => WithChildren(children);
  21303. + public new MarkupBlockSyntax WithChildren(SyntaxList<RazorSyntaxNode> children)
  21304. + {
  21305. + return Update(children);
  21306. + }
  21307. + internal override RazorBlockSyntax AddChildrenCore(params RazorSyntaxNode[] items) => AddChildren(items);
  21308. +
  21309. + public new MarkupBlockSyntax AddChildren(params RazorSyntaxNode[] items)
  21310. + {
  21311. + return WithChildren(this.Children.AddRange(items));
  21312. + }
  21313. + }
  21314. +
  21315. + internal sealed partial class MarkupTransitionSyntax : MarkupSyntaxNode
  21316. + {
  21317. + private SyntaxNode _transitionTokens;
  21318. +
  21319. + internal MarkupTransitionSyntax(GreenNode green, SyntaxNode parent, int position)
  21320. + : base(green, parent, position)
  21321. + {
  21322. + }
  21323. +
  21324. + public SyntaxList<SyntaxToken> TransitionTokens
  21325. + {
  21326. + get
  21327. + {
  21328. + return new SyntaxList<SyntaxToken>(GetRed(ref _transitionTokens, 0));
  21329. + }
  21330. + }
  21331. +
  21332. + internal override SyntaxNode GetNodeSlot(int index)
  21333. + {
  21334. + switch (index)
  21335. + {
  21336. + case 0: return GetRedAtZero(ref _transitionTokens);
  21337. + default: return null;
  21338. + }
  21339. + }
  21340. + internal override SyntaxNode GetCachedSlot(int index)
  21341. + {
  21342. + switch (index)
  21343. + {
  21344. + case 0: return _transitionTokens;
  21345. + default: return null;
  21346. + }
  21347. + }
  21348. +
  21349. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  21350. + {
  21351. + return visitor.VisitMarkupTransition(this);
  21352. + }
  21353. +
  21354. + public override void Accept(SyntaxVisitor visitor)
  21355. + {
  21356. + visitor.VisitMarkupTransition(this);
  21357. + }
  21358. +
  21359. + public MarkupTransitionSyntax Update(SyntaxList<SyntaxToken> transitionTokens)
  21360. + {
  21361. + if (transitionTokens != TransitionTokens)
  21362. + {
  21363. + var newNode = SyntaxFactory.MarkupTransition(transitionTokens);
  21364. + var annotations = GetAnnotations();
  21365. + if (annotations != null && annotations.Length > 0)
  21366. + return newNode.WithAnnotations(annotations);
  21367. + return newNode;
  21368. + }
  21369. +
  21370. + return this;
  21371. + }
  21372. +
  21373. + public MarkupTransitionSyntax WithTransitionTokens(SyntaxList<SyntaxToken> transitionTokens)
  21374. + {
  21375. + return Update(transitionTokens);
  21376. + }
  21377. +
  21378. + public MarkupTransitionSyntax AddTransitionTokens(params SyntaxToken[] items)
  21379. + {
  21380. + return WithTransitionTokens(this.TransitionTokens.AddRange(items));
  21381. + }
  21382. + }
  21383. +
  21384. + internal sealed partial class MarkupTextLiteralSyntax : MarkupSyntaxNode
  21385. + {
  21386. + private SyntaxNode _literalTokens;
  21387. +
  21388. + internal MarkupTextLiteralSyntax(GreenNode green, SyntaxNode parent, int position)
  21389. + : base(green, parent, position)
  21390. + {
  21391. + }
  21392. +
  21393. + public SyntaxList<SyntaxToken> LiteralTokens
  21394. + {
  21395. + get
  21396. + {
  21397. + return new SyntaxList<SyntaxToken>(GetRed(ref _literalTokens, 0));
  21398. + }
  21399. + }
  21400. +
  21401. + internal override SyntaxNode GetNodeSlot(int index)
  21402. + {
  21403. + switch (index)
  21404. + {
  21405. + case 0: return GetRedAtZero(ref _literalTokens);
  21406. + default: return null;
  21407. + }
  21408. + }
  21409. + internal override SyntaxNode GetCachedSlot(int index)
  21410. + {
  21411. + switch (index)
  21412. + {
  21413. + case 0: return _literalTokens;
  21414. + default: return null;
  21415. + }
  21416. + }
  21417. +
  21418. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  21419. + {
  21420. + return visitor.VisitMarkupTextLiteral(this);
  21421. + }
  21422. +
  21423. + public override void Accept(SyntaxVisitor visitor)
  21424. + {
  21425. + visitor.VisitMarkupTextLiteral(this);
  21426. + }
  21427. +
  21428. + public MarkupTextLiteralSyntax Update(SyntaxList<SyntaxToken> literalTokens)
  21429. + {
  21430. + if (literalTokens != LiteralTokens)
  21431. + {
  21432. + var newNode = SyntaxFactory.MarkupTextLiteral(literalTokens);
  21433. + var annotations = GetAnnotations();
  21434. + if (annotations != null && annotations.Length > 0)
  21435. + return newNode.WithAnnotations(annotations);
  21436. + return newNode;
  21437. + }
  21438. +
  21439. + return this;
  21440. + }
  21441. +
  21442. + public MarkupTextLiteralSyntax WithLiteralTokens(SyntaxList<SyntaxToken> literalTokens)
  21443. + {
  21444. + return Update(literalTokens);
  21445. + }
  21446. +
  21447. + public MarkupTextLiteralSyntax AddLiteralTokens(params SyntaxToken[] items)
  21448. + {
  21449. + return WithLiteralTokens(this.LiteralTokens.AddRange(items));
  21450. + }
  21451. + }
  21452. +
  21453. + internal sealed partial class MarkupEphemeralTextLiteralSyntax : MarkupSyntaxNode
  21454. + {
  21455. + private SyntaxNode _literalTokens;
  21456. +
  21457. + internal MarkupEphemeralTextLiteralSyntax(GreenNode green, SyntaxNode parent, int position)
  21458. + : base(green, parent, position)
  21459. + {
  21460. + }
  21461. +
  21462. + public SyntaxList<SyntaxToken> LiteralTokens
  21463. + {
  21464. + get
  21465. + {
  21466. + return new SyntaxList<SyntaxToken>(GetRed(ref _literalTokens, 0));
  21467. + }
  21468. + }
  21469. +
  21470. + internal override SyntaxNode GetNodeSlot(int index)
  21471. + {
  21472. + switch (index)
  21473. + {
  21474. + case 0: return GetRedAtZero(ref _literalTokens);
  21475. + default: return null;
  21476. + }
  21477. + }
  21478. + internal override SyntaxNode GetCachedSlot(int index)
  21479. + {
  21480. + switch (index)
  21481. + {
  21482. + case 0: return _literalTokens;
  21483. + default: return null;
  21484. + }
  21485. + }
  21486. +
  21487. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  21488. + {
  21489. + return visitor.VisitMarkupEphemeralTextLiteral(this);
  21490. + }
  21491. +
  21492. + public override void Accept(SyntaxVisitor visitor)
  21493. + {
  21494. + visitor.VisitMarkupEphemeralTextLiteral(this);
  21495. + }
  21496. +
  21497. + public MarkupEphemeralTextLiteralSyntax Update(SyntaxList<SyntaxToken> literalTokens)
  21498. + {
  21499. + if (literalTokens != LiteralTokens)
  21500. + {
  21501. + var newNode = SyntaxFactory.MarkupEphemeralTextLiteral(literalTokens);
  21502. + var annotations = GetAnnotations();
  21503. + if (annotations != null && annotations.Length > 0)
  21504. + return newNode.WithAnnotations(annotations);
  21505. + return newNode;
  21506. + }
  21507. +
  21508. + return this;
  21509. + }
  21510. +
  21511. + public MarkupEphemeralTextLiteralSyntax WithLiteralTokens(SyntaxList<SyntaxToken> literalTokens)
  21512. + {
  21513. + return Update(literalTokens);
  21514. + }
  21515. +
  21516. + public MarkupEphemeralTextLiteralSyntax AddLiteralTokens(params SyntaxToken[] items)
  21517. + {
  21518. + return WithLiteralTokens(this.LiteralTokens.AddRange(items));
  21519. + }
  21520. + }
  21521. +
  21522. + internal sealed partial class MarkupCommentBlockSyntax : RazorBlockSyntax
  21523. + {
  21524. + private SyntaxNode _children;
  21525. +
  21526. + internal MarkupCommentBlockSyntax(GreenNode green, SyntaxNode parent, int position)
  21527. + : base(green, parent, position)
  21528. + {
  21529. + }
  21530. +
  21531. + public override SyntaxList<RazorSyntaxNode> Children
  21532. + {
  21533. + get
  21534. + {
  21535. + return new SyntaxList<RazorSyntaxNode>(GetRed(ref _children, 0));
  21536. + }
  21537. + }
  21538. +
  21539. + internal override SyntaxNode GetNodeSlot(int index)
  21540. + {
  21541. + switch (index)
  21542. + {
  21543. + case 0: return GetRedAtZero(ref _children);
  21544. + default: return null;
  21545. + }
  21546. + }
  21547. + internal override SyntaxNode GetCachedSlot(int index)
  21548. + {
  21549. + switch (index)
  21550. + {
  21551. + case 0: return _children;
  21552. + default: return null;
  21553. + }
  21554. + }
  21555. +
  21556. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  21557. + {
  21558. + return visitor.VisitMarkupCommentBlock(this);
  21559. + }
  21560. +
  21561. + public override void Accept(SyntaxVisitor visitor)
  21562. + {
  21563. + visitor.VisitMarkupCommentBlock(this);
  21564. + }
  21565. +
  21566. + public MarkupCommentBlockSyntax Update(SyntaxList<RazorSyntaxNode> children)
  21567. + {
  21568. + if (children != Children)
  21569. + {
  21570. + var newNode = SyntaxFactory.MarkupCommentBlock(children);
  21571. + var annotations = GetAnnotations();
  21572. + if (annotations != null && annotations.Length > 0)
  21573. + return newNode.WithAnnotations(annotations);
  21574. + return newNode;
  21575. + }
  21576. +
  21577. + return this;
  21578. + }
  21579. +
  21580. + internal override RazorBlockSyntax WithChildrenCore(SyntaxList<RazorSyntaxNode> children) => WithChildren(children);
  21581. + public new MarkupCommentBlockSyntax WithChildren(SyntaxList<RazorSyntaxNode> children)
  21582. + {
  21583. + return Update(children);
  21584. + }
  21585. + internal override RazorBlockSyntax AddChildrenCore(params RazorSyntaxNode[] items) => AddChildren(items);
  21586. +
  21587. + public new MarkupCommentBlockSyntax AddChildren(params RazorSyntaxNode[] items)
  21588. + {
  21589. + return WithChildren(this.Children.AddRange(items));
  21590. + }
  21591. + }
  21592. +
  21593. + internal sealed partial class MarkupTagBlockSyntax : RazorBlockSyntax
  21594. + {
  21595. + private SyntaxNode _children;
  21596. +
  21597. + internal MarkupTagBlockSyntax(GreenNode green, SyntaxNode parent, int position)
  21598. + : base(green, parent, position)
  21599. + {
  21600. + }
  21601. +
  21602. + public override SyntaxList<RazorSyntaxNode> Children
  21603. + {
  21604. + get
  21605. + {
  21606. + return new SyntaxList<RazorSyntaxNode>(GetRed(ref _children, 0));
  21607. + }
  21608. + }
  21609. +
  21610. + internal override SyntaxNode GetNodeSlot(int index)
  21611. + {
  21612. + switch (index)
  21613. + {
  21614. + case 0: return GetRedAtZero(ref _children);
  21615. + default: return null;
  21616. + }
  21617. + }
  21618. + internal override SyntaxNode GetCachedSlot(int index)
  21619. + {
  21620. + switch (index)
  21621. + {
  21622. + case 0: return _children;
  21623. + default: return null;
  21624. + }
  21625. + }
  21626. +
  21627. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  21628. + {
  21629. + return visitor.VisitMarkupTagBlock(this);
  21630. + }
  21631. +
  21632. + public override void Accept(SyntaxVisitor visitor)
  21633. + {
  21634. + visitor.VisitMarkupTagBlock(this);
  21635. + }
  21636. +
  21637. + public MarkupTagBlockSyntax Update(SyntaxList<RazorSyntaxNode> children)
  21638. + {
  21639. + if (children != Children)
  21640. + {
  21641. + var newNode = SyntaxFactory.MarkupTagBlock(children);
  21642. + var annotations = GetAnnotations();
  21643. + if (annotations != null && annotations.Length > 0)
  21644. + return newNode.WithAnnotations(annotations);
  21645. + return newNode;
  21646. + }
  21647. +
  21648. + return this;
  21649. + }
  21650. +
  21651. + internal override RazorBlockSyntax WithChildrenCore(SyntaxList<RazorSyntaxNode> children) => WithChildren(children);
  21652. + public new MarkupTagBlockSyntax WithChildren(SyntaxList<RazorSyntaxNode> children)
  21653. + {
  21654. + return Update(children);
  21655. + }
  21656. + internal override RazorBlockSyntax AddChildrenCore(params RazorSyntaxNode[] items) => AddChildren(items);
  21657. +
  21658. + public new MarkupTagBlockSyntax AddChildren(params RazorSyntaxNode[] items)
  21659. + {
  21660. + return WithChildren(this.Children.AddRange(items));
  21661. + }
  21662. + }
  21663. +
  21664. + internal sealed partial class MarkupMinimizedAttributeBlockSyntax : MarkupSyntaxNode
  21665. + {
  21666. + private MarkupTextLiteralSyntax _namePrefix;
  21667. + private MarkupTextLiteralSyntax _name;
  21668. +
  21669. + internal MarkupMinimizedAttributeBlockSyntax(GreenNode green, SyntaxNode parent, int position)
  21670. + : base(green, parent, position)
  21671. + {
  21672. + }
  21673. +
  21674. + public MarkupTextLiteralSyntax NamePrefix
  21675. + {
  21676. + get
  21677. + {
  21678. + return GetRedAtZero(ref _namePrefix);
  21679. + }
  21680. + }
  21681. +
  21682. + public MarkupTextLiteralSyntax Name
  21683. + {
  21684. + get
  21685. + {
  21686. + return GetRed(ref _name, 1);
  21687. + }
  21688. + }
  21689. +
  21690. + internal override SyntaxNode GetNodeSlot(int index)
  21691. + {
  21692. + switch (index)
  21693. + {
  21694. + case 0: return GetRedAtZero(ref _namePrefix);
  21695. + case 1: return GetRed(ref _name, 1);
  21696. + default: return null;
  21697. + }
  21698. + }
  21699. + internal override SyntaxNode GetCachedSlot(int index)
  21700. + {
  21701. + switch (index)
  21702. + {
  21703. + case 0: return _namePrefix;
  21704. + case 1: return _name;
  21705. + default: return null;
  21706. + }
  21707. + }
  21708. +
  21709. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  21710. + {
  21711. + return visitor.VisitMarkupMinimizedAttributeBlock(this);
  21712. + }
  21713. +
  21714. + public override void Accept(SyntaxVisitor visitor)
  21715. + {
  21716. + visitor.VisitMarkupMinimizedAttributeBlock(this);
  21717. + }
  21718. +
  21719. + public MarkupMinimizedAttributeBlockSyntax Update(MarkupTextLiteralSyntax namePrefix, MarkupTextLiteralSyntax name)
  21720. + {
  21721. + if (namePrefix != NamePrefix || name != Name)
  21722. + {
  21723. + var newNode = SyntaxFactory.MarkupMinimizedAttributeBlock(namePrefix, name);
  21724. + var annotations = GetAnnotations();
  21725. + if (annotations != null && annotations.Length > 0)
  21726. + return newNode.WithAnnotations(annotations);
  21727. + return newNode;
  21728. + }
  21729. +
  21730. + return this;
  21731. + }
  21732. +
  21733. + public MarkupMinimizedAttributeBlockSyntax WithNamePrefix(MarkupTextLiteralSyntax namePrefix)
  21734. + {
  21735. + return Update(namePrefix, Name);
  21736. + }
  21737. +
  21738. + public MarkupMinimizedAttributeBlockSyntax WithName(MarkupTextLiteralSyntax name)
  21739. + {
  21740. + return Update(NamePrefix, name);
  21741. + }
  21742. +
  21743. + public MarkupMinimizedAttributeBlockSyntax AddNamePrefixLiteralTokens(params SyntaxToken[] items)
  21744. + {
  21745. + var _namePrefix = this.NamePrefix ?? SyntaxFactory.MarkupTextLiteral();
  21746. + return this.WithNamePrefix(_namePrefix.WithLiteralTokens(_namePrefix.LiteralTokens.AddRange(items)));
  21747. + }
  21748. +
  21749. + public MarkupMinimizedAttributeBlockSyntax AddNameLiteralTokens(params SyntaxToken[] items)
  21750. + {
  21751. + return this.WithName(this.Name.WithLiteralTokens(this.Name.LiteralTokens.AddRange(items)));
  21752. + }
  21753. + }
  21754. +
  21755. + internal sealed partial class MarkupAttributeBlockSyntax : MarkupSyntaxNode
  21756. + {
  21757. + private MarkupTextLiteralSyntax _namePrefix;
  21758. + private MarkupTextLiteralSyntax _name;
  21759. + private MarkupTextLiteralSyntax _nameSuffix;
  21760. + private SyntaxToken _equalsToken;
  21761. + private MarkupTextLiteralSyntax _valuePrefix;
  21762. + private RazorBlockSyntax _value;
  21763. + private MarkupTextLiteralSyntax _valueSuffix;
  21764. +
  21765. + internal MarkupAttributeBlockSyntax(GreenNode green, SyntaxNode parent, int position)
  21766. + : base(green, parent, position)
  21767. + {
  21768. + }
  21769. +
  21770. + public MarkupTextLiteralSyntax NamePrefix
  21771. + {
  21772. + get
  21773. + {
  21774. + return GetRedAtZero(ref _namePrefix);
  21775. + }
  21776. + }
  21777. +
  21778. + public MarkupTextLiteralSyntax Name
  21779. + {
  21780. + get
  21781. + {
  21782. + return GetRed(ref _name, 1);
  21783. + }
  21784. + }
  21785. +
  21786. + public MarkupTextLiteralSyntax NameSuffix
  21787. + {
  21788. + get
  21789. + {
  21790. + return GetRed(ref _nameSuffix, 2);
  21791. + }
  21792. + }
  21793. +
  21794. + public SyntaxToken EqualsToken
  21795. + {
  21796. + get
  21797. + {
  21798. + return GetRed(ref _equalsToken, 3);
  21799. + }
  21800. + }
  21801. +
  21802. + public MarkupTextLiteralSyntax ValuePrefix
  21803. + {
  21804. + get
  21805. + {
  21806. + return GetRed(ref _valuePrefix, 4);
  21807. + }
  21808. + }
  21809. +
  21810. + public RazorBlockSyntax Value
  21811. + {
  21812. + get
  21813. + {
  21814. + return GetRed(ref _value, 5);
  21815. + }
  21816. + }
  21817. +
  21818. + public MarkupTextLiteralSyntax ValueSuffix
  21819. + {
  21820. + get
  21821. + {
  21822. + return GetRed(ref _valueSuffix, 6);
  21823. + }
  21824. + }
  21825. +
  21826. + internal override SyntaxNode GetNodeSlot(int index)
  21827. + {
  21828. + switch (index)
  21829. + {
  21830. + case 0: return GetRedAtZero(ref _namePrefix);
  21831. + case 1: return GetRed(ref _name, 1);
  21832. + case 2: return GetRed(ref _nameSuffix, 2);
  21833. + case 3: return GetRed(ref _equalsToken, 3);
  21834. + case 4: return GetRed(ref _valuePrefix, 4);
  21835. + case 5: return GetRed(ref _value, 5);
  21836. + case 6: return GetRed(ref _valueSuffix, 6);
  21837. + default: return null;
  21838. + }
  21839. + }
  21840. + internal override SyntaxNode GetCachedSlot(int index)
  21841. + {
  21842. + switch (index)
  21843. + {
  21844. + case 0: return _namePrefix;
  21845. + case 1: return _name;
  21846. + case 2: return _nameSuffix;
  21847. + case 3: return _equalsToken;
  21848. + case 4: return _valuePrefix;
  21849. + case 5: return _value;
  21850. + case 6: return _valueSuffix;
  21851. + default: return null;
  21852. + }
  21853. + }
  21854. +
  21855. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  21856. + {
  21857. + return visitor.VisitMarkupAttributeBlock(this);
  21858. + }
  21859. +
  21860. + public override void Accept(SyntaxVisitor visitor)
  21861. + {
  21862. + visitor.VisitMarkupAttributeBlock(this);
  21863. + }
  21864. +
  21865. + public MarkupAttributeBlockSyntax Update(MarkupTextLiteralSyntax namePrefix, MarkupTextLiteralSyntax name, MarkupTextLiteralSyntax nameSuffix, SyntaxToken equalsToken, MarkupTextLiteralSyntax valuePrefix, RazorBlockSyntax value, MarkupTextLiteralSyntax valueSuffix)
  21866. + {
  21867. + if (namePrefix != NamePrefix || name != Name || nameSuffix != NameSuffix || equalsToken != EqualsToken || valuePrefix != ValuePrefix || value != Value || valueSuffix != ValueSuffix)
  21868. + {
  21869. + var newNode = SyntaxFactory.MarkupAttributeBlock(namePrefix, name, nameSuffix, equalsToken, valuePrefix, value, valueSuffix);
  21870. + var annotations = GetAnnotations();
  21871. + if (annotations != null && annotations.Length > 0)
  21872. + return newNode.WithAnnotations(annotations);
  21873. + return newNode;
  21874. + }
  21875. +
  21876. + return this;
  21877. + }
  21878. +
  21879. + public MarkupAttributeBlockSyntax WithNamePrefix(MarkupTextLiteralSyntax namePrefix)
  21880. + {
  21881. + return Update(namePrefix, Name, NameSuffix, EqualsToken, ValuePrefix, Value, ValueSuffix);
  21882. + }
  21883. +
  21884. + public MarkupAttributeBlockSyntax WithName(MarkupTextLiteralSyntax name)
  21885. + {
  21886. + return Update(NamePrefix, name, NameSuffix, EqualsToken, ValuePrefix, Value, ValueSuffix);
  21887. + }
  21888. +
  21889. + public MarkupAttributeBlockSyntax WithNameSuffix(MarkupTextLiteralSyntax nameSuffix)
  21890. + {
  21891. + return Update(NamePrefix, Name, nameSuffix, EqualsToken, ValuePrefix, Value, ValueSuffix);
  21892. + }
  21893. +
  21894. + public MarkupAttributeBlockSyntax WithEqualsToken(SyntaxToken equalsToken)
  21895. + {
  21896. + return Update(NamePrefix, Name, NameSuffix, equalsToken, ValuePrefix, Value, ValueSuffix);
  21897. + }
  21898. +
  21899. + public MarkupAttributeBlockSyntax WithValuePrefix(MarkupTextLiteralSyntax valuePrefix)
  21900. + {
  21901. + return Update(NamePrefix, Name, NameSuffix, EqualsToken, valuePrefix, Value, ValueSuffix);
  21902. + }
  21903. +
  21904. + public MarkupAttributeBlockSyntax WithValue(RazorBlockSyntax value)
  21905. + {
  21906. + return Update(NamePrefix, Name, NameSuffix, EqualsToken, ValuePrefix, value, ValueSuffix);
  21907. + }
  21908. +
  21909. + public MarkupAttributeBlockSyntax WithValueSuffix(MarkupTextLiteralSyntax valueSuffix)
  21910. + {
  21911. + return Update(NamePrefix, Name, NameSuffix, EqualsToken, ValuePrefix, Value, valueSuffix);
  21912. + }
  21913. +
  21914. + public MarkupAttributeBlockSyntax AddNamePrefixLiteralTokens(params SyntaxToken[] items)
  21915. + {
  21916. + var _namePrefix = this.NamePrefix ?? SyntaxFactory.MarkupTextLiteral();
  21917. + return this.WithNamePrefix(_namePrefix.WithLiteralTokens(_namePrefix.LiteralTokens.AddRange(items)));
  21918. + }
  21919. +
  21920. + public MarkupAttributeBlockSyntax AddNameLiteralTokens(params SyntaxToken[] items)
  21921. + {
  21922. + return this.WithName(this.Name.WithLiteralTokens(this.Name.LiteralTokens.AddRange(items)));
  21923. + }
  21924. +
  21925. + public MarkupAttributeBlockSyntax AddNameSuffixLiteralTokens(params SyntaxToken[] items)
  21926. + {
  21927. + var _nameSuffix = this.NameSuffix ?? SyntaxFactory.MarkupTextLiteral();
  21928. + return this.WithNameSuffix(_nameSuffix.WithLiteralTokens(_nameSuffix.LiteralTokens.AddRange(items)));
  21929. + }
  21930. +
  21931. + public MarkupAttributeBlockSyntax AddValuePrefixLiteralTokens(params SyntaxToken[] items)
  21932. + {
  21933. + var _valuePrefix = this.ValuePrefix ?? SyntaxFactory.MarkupTextLiteral();
  21934. + return this.WithValuePrefix(_valuePrefix.WithLiteralTokens(_valuePrefix.LiteralTokens.AddRange(items)));
  21935. + }
  21936. +
  21937. + public MarkupAttributeBlockSyntax AddValueSuffixLiteralTokens(params SyntaxToken[] items)
  21938. + {
  21939. + var _valueSuffix = this.ValueSuffix ?? SyntaxFactory.MarkupTextLiteral();
  21940. + return this.WithValueSuffix(_valueSuffix.WithLiteralTokens(_valueSuffix.LiteralTokens.AddRange(items)));
  21941. + }
  21942. + }
  21943. +
  21944. + internal sealed partial class MarkupLiteralAttributeValueSyntax : MarkupSyntaxNode
  21945. + {
  21946. + private MarkupTextLiteralSyntax _prefix;
  21947. + private MarkupTextLiteralSyntax _value;
  21948. +
  21949. + internal MarkupLiteralAttributeValueSyntax(GreenNode green, SyntaxNode parent, int position)
  21950. + : base(green, parent, position)
  21951. + {
  21952. + }
  21953. +
  21954. + public MarkupTextLiteralSyntax Prefix
  21955. + {
  21956. + get
  21957. + {
  21958. + return GetRedAtZero(ref _prefix);
  21959. + }
  21960. + }
  21961. +
  21962. + public MarkupTextLiteralSyntax Value
  21963. + {
  21964. + get
  21965. + {
  21966. + return GetRed(ref _value, 1);
  21967. + }
  21968. + }
  21969. +
  21970. + internal override SyntaxNode GetNodeSlot(int index)
  21971. + {
  21972. + switch (index)
  21973. + {
  21974. + case 0: return GetRedAtZero(ref _prefix);
  21975. + case 1: return GetRed(ref _value, 1);
  21976. + default: return null;
  21977. + }
  21978. + }
  21979. + internal override SyntaxNode GetCachedSlot(int index)
  21980. + {
  21981. + switch (index)
  21982. + {
  21983. + case 0: return _prefix;
  21984. + case 1: return _value;
  21985. + default: return null;
  21986. + }
  21987. + }
  21988. +
  21989. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  21990. + {
  21991. + return visitor.VisitMarkupLiteralAttributeValue(this);
  21992. + }
  21993. +
  21994. + public override void Accept(SyntaxVisitor visitor)
  21995. + {
  21996. + visitor.VisitMarkupLiteralAttributeValue(this);
  21997. + }
  21998. +
  21999. + public MarkupLiteralAttributeValueSyntax Update(MarkupTextLiteralSyntax prefix, MarkupTextLiteralSyntax value)
  22000. + {
  22001. + if (prefix != Prefix || value != Value)
  22002. + {
  22003. + var newNode = SyntaxFactory.MarkupLiteralAttributeValue(prefix, value);
  22004. + var annotations = GetAnnotations();
  22005. + if (annotations != null && annotations.Length > 0)
  22006. + return newNode.WithAnnotations(annotations);
  22007. + return newNode;
  22008. + }
  22009. +
  22010. + return this;
  22011. + }
  22012. +
  22013. + public MarkupLiteralAttributeValueSyntax WithPrefix(MarkupTextLiteralSyntax prefix)
  22014. + {
  22015. + return Update(prefix, Value);
  22016. + }
  22017. +
  22018. + public MarkupLiteralAttributeValueSyntax WithValue(MarkupTextLiteralSyntax value)
  22019. + {
  22020. + return Update(Prefix, value);
  22021. + }
  22022. +
  22023. + public MarkupLiteralAttributeValueSyntax AddPrefixLiteralTokens(params SyntaxToken[] items)
  22024. + {
  22025. + var _prefix = this.Prefix ?? SyntaxFactory.MarkupTextLiteral();
  22026. + return this.WithPrefix(_prefix.WithLiteralTokens(_prefix.LiteralTokens.AddRange(items)));
  22027. + }
  22028. +
  22029. + public MarkupLiteralAttributeValueSyntax AddValueLiteralTokens(params SyntaxToken[] items)
  22030. + {
  22031. + var _value = this.Value ?? SyntaxFactory.MarkupTextLiteral();
  22032. + return this.WithValue(_value.WithLiteralTokens(_value.LiteralTokens.AddRange(items)));
  22033. + }
  22034. + }
  22035. +
  22036. + internal sealed partial class MarkupDynamicAttributeValueSyntax : MarkupSyntaxNode
  22037. + {
  22038. + private MarkupTextLiteralSyntax _prefix;
  22039. + private RazorBlockSyntax _value;
  22040. +
  22041. + internal MarkupDynamicAttributeValueSyntax(GreenNode green, SyntaxNode parent, int position)
  22042. + : base(green, parent, position)
  22043. + {
  22044. + }
  22045. +
  22046. + public MarkupTextLiteralSyntax Prefix
  22047. + {
  22048. + get
  22049. + {
  22050. + return GetRedAtZero(ref _prefix);
  22051. + }
  22052. + }
  22053. +
  22054. + public RazorBlockSyntax Value
  22055. + {
  22056. + get
  22057. + {
  22058. + return GetRed(ref _value, 1);
  22059. + }
  22060. + }
  22061. +
  22062. + internal override SyntaxNode GetNodeSlot(int index)
  22063. + {
  22064. + switch (index)
  22065. + {
  22066. + case 0: return GetRedAtZero(ref _prefix);
  22067. + case 1: return GetRed(ref _value, 1);
  22068. + default: return null;
  22069. + }
  22070. + }
  22071. + internal override SyntaxNode GetCachedSlot(int index)
  22072. + {
  22073. + switch (index)
  22074. + {
  22075. + case 0: return _prefix;
  22076. + case 1: return _value;
  22077. + default: return null;
  22078. + }
  22079. + }
  22080. +
  22081. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  22082. + {
  22083. + return visitor.VisitMarkupDynamicAttributeValue(this);
  22084. + }
  22085. +
  22086. + public override void Accept(SyntaxVisitor visitor)
  22087. + {
  22088. + visitor.VisitMarkupDynamicAttributeValue(this);
  22089. + }
  22090. +
  22091. + public MarkupDynamicAttributeValueSyntax Update(MarkupTextLiteralSyntax prefix, RazorBlockSyntax value)
  22092. + {
  22093. + if (prefix != Prefix || value != Value)
  22094. + {
  22095. + var newNode = SyntaxFactory.MarkupDynamicAttributeValue(prefix, value);
  22096. + var annotations = GetAnnotations();
  22097. + if (annotations != null && annotations.Length > 0)
  22098. + return newNode.WithAnnotations(annotations);
  22099. + return newNode;
  22100. + }
  22101. +
  22102. + return this;
  22103. + }
  22104. +
  22105. + public MarkupDynamicAttributeValueSyntax WithPrefix(MarkupTextLiteralSyntax prefix)
  22106. + {
  22107. + return Update(prefix, Value);
  22108. + }
  22109. +
  22110. + public MarkupDynamicAttributeValueSyntax WithValue(RazorBlockSyntax value)
  22111. + {
  22112. + return Update(Prefix, value);
  22113. + }
  22114. +
  22115. + public MarkupDynamicAttributeValueSyntax AddPrefixLiteralTokens(params SyntaxToken[] items)
  22116. + {
  22117. + var _prefix = this.Prefix ?? SyntaxFactory.MarkupTextLiteral();
  22118. + return this.WithPrefix(_prefix.WithLiteralTokens(_prefix.LiteralTokens.AddRange(items)));
  22119. + }
  22120. + }
  22121. +
  22122. + internal sealed partial class MarkupElementSyntax : MarkupSyntaxNode
  22123. + {
  22124. + private MarkupTagBlockSyntax _startTag;
  22125. + private SyntaxNode _body;
  22126. + private MarkupTagBlockSyntax _endTag;
  22127. +
  22128. + internal MarkupElementSyntax(GreenNode green, SyntaxNode parent, int position)
  22129. + : base(green, parent, position)
  22130. + {
  22131. + }
  22132. +
  22133. + public MarkupTagBlockSyntax StartTag
  22134. + {
  22135. + get
  22136. + {
  22137. + return GetRedAtZero(ref _startTag);
  22138. + }
  22139. + }
  22140. +
  22141. + public SyntaxList<RazorSyntaxNode> Body
  22142. + {
  22143. + get
  22144. + {
  22145. + return new SyntaxList<RazorSyntaxNode>(GetRed(ref _body, 1));
  22146. + }
  22147. + }
  22148. +
  22149. + public MarkupTagBlockSyntax EndTag
  22150. + {
  22151. + get
  22152. + {
  22153. + return GetRed(ref _endTag, 2);
  22154. + }
  22155. + }
  22156. +
  22157. + internal override SyntaxNode GetNodeSlot(int index)
  22158. + {
  22159. + switch (index)
  22160. + {
  22161. + case 0: return GetRedAtZero(ref _startTag);
  22162. + case 1: return GetRed(ref _body, 1);
  22163. + case 2: return GetRed(ref _endTag, 2);
  22164. + default: return null;
  22165. + }
  22166. + }
  22167. + internal override SyntaxNode GetCachedSlot(int index)
  22168. + {
  22169. + switch (index)
  22170. + {
  22171. + case 0: return _startTag;
  22172. + case 1: return _body;
  22173. + case 2: return _endTag;
  22174. + default: return null;
  22175. + }
  22176. + }
  22177. +
  22178. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  22179. + {
  22180. + return visitor.VisitMarkupElement(this);
  22181. + }
  22182. +
  22183. + public override void Accept(SyntaxVisitor visitor)
  22184. + {
  22185. + visitor.VisitMarkupElement(this);
  22186. + }
  22187. +
  22188. + public MarkupElementSyntax Update(MarkupTagBlockSyntax startTag, SyntaxList<RazorSyntaxNode> body, MarkupTagBlockSyntax endTag)
  22189. + {
  22190. + if (startTag != StartTag || body != Body || endTag != EndTag)
  22191. + {
  22192. + var newNode = SyntaxFactory.MarkupElement(startTag, body, endTag);
  22193. + var annotations = GetAnnotations();
  22194. + if (annotations != null && annotations.Length > 0)
  22195. + return newNode.WithAnnotations(annotations);
  22196. + return newNode;
  22197. + }
  22198. +
  22199. + return this;
  22200. + }
  22201. +
  22202. + public MarkupElementSyntax WithStartTag(MarkupTagBlockSyntax startTag)
  22203. + {
  22204. + return Update(startTag, Body, EndTag);
  22205. + }
  22206. +
  22207. + public MarkupElementSyntax WithBody(SyntaxList<RazorSyntaxNode> body)
  22208. + {
  22209. + return Update(StartTag, body, EndTag);
  22210. + }
  22211. +
  22212. + public MarkupElementSyntax WithEndTag(MarkupTagBlockSyntax endTag)
  22213. + {
  22214. + return Update(StartTag, Body, endTag);
  22215. + }
  22216. +
  22217. + public MarkupElementSyntax AddStartTagChildren(params RazorSyntaxNode[] items)
  22218. + {
  22219. + var _startTag = this.StartTag ?? SyntaxFactory.MarkupTagBlock();
  22220. + return this.WithStartTag(_startTag.WithChildren(_startTag.Children.AddRange(items)));
  22221. + }
  22222. +
  22223. + public MarkupElementSyntax AddBody(params RazorSyntaxNode[] items)
  22224. + {
  22225. + return WithBody(this.Body.AddRange(items));
  22226. + }
  22227. +
  22228. + public MarkupElementSyntax AddEndTagChildren(params RazorSyntaxNode[] items)
  22229. + {
  22230. + var _endTag = this.EndTag ?? SyntaxFactory.MarkupTagBlock();
  22231. + return this.WithEndTag(_endTag.WithChildren(_endTag.Children.AddRange(items)));
  22232. + }
  22233. + }
  22234. +
  22235. + internal sealed partial class MarkupTagHelperElementSyntax : MarkupSyntaxNode
  22236. + {
  22237. + private MarkupTagHelperStartTagSyntax _startTag;
  22238. + private SyntaxNode _body;
  22239. + private MarkupTagHelperEndTagSyntax _endTag;
  22240. +
  22241. + internal MarkupTagHelperElementSyntax(GreenNode green, SyntaxNode parent, int position)
  22242. + : base(green, parent, position)
  22243. + {
  22244. + }
  22245. +
  22246. + public MarkupTagHelperStartTagSyntax StartTag
  22247. + {
  22248. + get
  22249. + {
  22250. + return GetRedAtZero(ref _startTag);
  22251. + }
  22252. + }
  22253. +
  22254. + public SyntaxList<RazorSyntaxNode> Body
  22255. + {
  22256. + get
  22257. + {
  22258. + return new SyntaxList<RazorSyntaxNode>(GetRed(ref _body, 1));
  22259. + }
  22260. + }
  22261. +
  22262. + public MarkupTagHelperEndTagSyntax EndTag
  22263. + {
  22264. + get
  22265. + {
  22266. + return GetRed(ref _endTag, 2);
  22267. + }
  22268. + }
  22269. +
  22270. + internal override SyntaxNode GetNodeSlot(int index)
  22271. + {
  22272. + switch (index)
  22273. + {
  22274. + case 0: return GetRedAtZero(ref _startTag);
  22275. + case 1: return GetRed(ref _body, 1);
  22276. + case 2: return GetRed(ref _endTag, 2);
  22277. + default: return null;
  22278. + }
  22279. + }
  22280. + internal override SyntaxNode GetCachedSlot(int index)
  22281. + {
  22282. + switch (index)
  22283. + {
  22284. + case 0: return _startTag;
  22285. + case 1: return _body;
  22286. + case 2: return _endTag;
  22287. + default: return null;
  22288. + }
  22289. + }
  22290. +
  22291. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  22292. + {
  22293. + return visitor.VisitMarkupTagHelperElement(this);
  22294. + }
  22295. +
  22296. + public override void Accept(SyntaxVisitor visitor)
  22297. + {
  22298. + visitor.VisitMarkupTagHelperElement(this);
  22299. + }
  22300. +
  22301. + public MarkupTagHelperElementSyntax Update(MarkupTagHelperStartTagSyntax startTag, SyntaxList<RazorSyntaxNode> body, MarkupTagHelperEndTagSyntax endTag)
  22302. + {
  22303. + if (startTag != StartTag || body != Body || endTag != EndTag)
  22304. + {
  22305. + var newNode = SyntaxFactory.MarkupTagHelperElement(startTag, body, endTag);
  22306. + var annotations = GetAnnotations();
  22307. + if (annotations != null && annotations.Length > 0)
  22308. + return newNode.WithAnnotations(annotations);
  22309. + return newNode;
  22310. + }
  22311. +
  22312. + return this;
  22313. + }
  22314. +
  22315. + public MarkupTagHelperElementSyntax WithStartTag(MarkupTagHelperStartTagSyntax startTag)
  22316. + {
  22317. + return Update(startTag, Body, EndTag);
  22318. + }
  22319. +
  22320. + public MarkupTagHelperElementSyntax WithBody(SyntaxList<RazorSyntaxNode> body)
  22321. + {
  22322. + return Update(StartTag, body, EndTag);
  22323. + }
  22324. +
  22325. + public MarkupTagHelperElementSyntax WithEndTag(MarkupTagHelperEndTagSyntax endTag)
  22326. + {
  22327. + return Update(StartTag, Body, endTag);
  22328. + }
  22329. +
  22330. + public MarkupTagHelperElementSyntax AddStartTagChildren(params RazorSyntaxNode[] items)
  22331. + {
  22332. + return this.WithStartTag(this.StartTag.WithChildren(this.StartTag.Children.AddRange(items)));
  22333. + }
  22334. +
  22335. + public MarkupTagHelperElementSyntax AddBody(params RazorSyntaxNode[] items)
  22336. + {
  22337. + return WithBody(this.Body.AddRange(items));
  22338. + }
  22339. +
  22340. + public MarkupTagHelperElementSyntax AddEndTagChildren(params RazorSyntaxNode[] items)
  22341. + {
  22342. + var _endTag = this.EndTag ?? SyntaxFactory.MarkupTagHelperEndTag();
  22343. + return this.WithEndTag(_endTag.WithChildren(_endTag.Children.AddRange(items)));
  22344. + }
  22345. + }
  22346. +
  22347. + internal sealed partial class MarkupTagHelperStartTagSyntax : RazorBlockSyntax
  22348. + {
  22349. + private SyntaxNode _children;
  22350. +
  22351. + internal MarkupTagHelperStartTagSyntax(GreenNode green, SyntaxNode parent, int position)
  22352. + : base(green, parent, position)
  22353. + {
  22354. + }
  22355. +
  22356. + public override SyntaxList<RazorSyntaxNode> Children
  22357. + {
  22358. + get
  22359. + {
  22360. + return new SyntaxList<RazorSyntaxNode>(GetRed(ref _children, 0));
  22361. + }
  22362. + }
  22363. +
  22364. + internal override SyntaxNode GetNodeSlot(int index)
  22365. + {
  22366. + switch (index)
  22367. + {
  22368. + case 0: return GetRedAtZero(ref _children);
  22369. + default: return null;
  22370. + }
  22371. + }
  22372. + internal override SyntaxNode GetCachedSlot(int index)
  22373. + {
  22374. + switch (index)
  22375. + {
  22376. + case 0: return _children;
  22377. + default: return null;
  22378. + }
  22379. + }
  22380. +
  22381. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  22382. + {
  22383. + return visitor.VisitMarkupTagHelperStartTag(this);
  22384. + }
  22385. +
  22386. + public override void Accept(SyntaxVisitor visitor)
  22387. + {
  22388. + visitor.VisitMarkupTagHelperStartTag(this);
  22389. + }
  22390. +
  22391. + public MarkupTagHelperStartTagSyntax Update(SyntaxList<RazorSyntaxNode> children)
  22392. + {
  22393. + if (children != Children)
  22394. + {
  22395. + var newNode = SyntaxFactory.MarkupTagHelperStartTag(children);
  22396. + var annotations = GetAnnotations();
  22397. + if (annotations != null && annotations.Length > 0)
  22398. + return newNode.WithAnnotations(annotations);
  22399. + return newNode;
  22400. + }
  22401. +
  22402. + return this;
  22403. + }
  22404. +
  22405. + internal override RazorBlockSyntax WithChildrenCore(SyntaxList<RazorSyntaxNode> children) => WithChildren(children);
  22406. + public new MarkupTagHelperStartTagSyntax WithChildren(SyntaxList<RazorSyntaxNode> children)
  22407. + {
  22408. + return Update(children);
  22409. + }
  22410. + internal override RazorBlockSyntax AddChildrenCore(params RazorSyntaxNode[] items) => AddChildren(items);
  22411. +
  22412. + public new MarkupTagHelperStartTagSyntax AddChildren(params RazorSyntaxNode[] items)
  22413. + {
  22414. + return WithChildren(this.Children.AddRange(items));
  22415. + }
  22416. + }
  22417. +
  22418. + internal sealed partial class MarkupTagHelperEndTagSyntax : RazorBlockSyntax
  22419. + {
  22420. + private SyntaxNode _children;
  22421. +
  22422. + internal MarkupTagHelperEndTagSyntax(GreenNode green, SyntaxNode parent, int position)
  22423. + : base(green, parent, position)
  22424. + {
  22425. + }
  22426. +
  22427. + public override SyntaxList<RazorSyntaxNode> Children
  22428. + {
  22429. + get
  22430. + {
  22431. + return new SyntaxList<RazorSyntaxNode>(GetRed(ref _children, 0));
  22432. + }
  22433. + }
  22434. +
  22435. + internal override SyntaxNode GetNodeSlot(int index)
  22436. + {
  22437. + switch (index)
  22438. + {
  22439. + case 0: return GetRedAtZero(ref _children);
  22440. + default: return null;
  22441. + }
  22442. + }
  22443. + internal override SyntaxNode GetCachedSlot(int index)
  22444. + {
  22445. + switch (index)
  22446. + {
  22447. + case 0: return _children;
  22448. + default: return null;
  22449. + }
  22450. + }
  22451. +
  22452. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  22453. + {
  22454. + return visitor.VisitMarkupTagHelperEndTag(this);
  22455. + }
  22456. +
  22457. + public override void Accept(SyntaxVisitor visitor)
  22458. + {
  22459. + visitor.VisitMarkupTagHelperEndTag(this);
  22460. + }
  22461. +
  22462. + public MarkupTagHelperEndTagSyntax Update(SyntaxList<RazorSyntaxNode> children)
  22463. + {
  22464. + if (children != Children)
  22465. + {
  22466. + var newNode = SyntaxFactory.MarkupTagHelperEndTag(children);
  22467. + var annotations = GetAnnotations();
  22468. + if (annotations != null && annotations.Length > 0)
  22469. + return newNode.WithAnnotations(annotations);
  22470. + return newNode;
  22471. + }
  22472. +
  22473. + return this;
  22474. + }
  22475. +
  22476. + internal override RazorBlockSyntax WithChildrenCore(SyntaxList<RazorSyntaxNode> children) => WithChildren(children);
  22477. + public new MarkupTagHelperEndTagSyntax WithChildren(SyntaxList<RazorSyntaxNode> children)
  22478. + {
  22479. + return Update(children);
  22480. + }
  22481. + internal override RazorBlockSyntax AddChildrenCore(params RazorSyntaxNode[] items) => AddChildren(items);
  22482. +
  22483. + public new MarkupTagHelperEndTagSyntax AddChildren(params RazorSyntaxNode[] items)
  22484. + {
  22485. + return WithChildren(this.Children.AddRange(items));
  22486. + }
  22487. + }
  22488. +
  22489. + internal sealed partial class MarkupTagHelperAttributeSyntax : MarkupSyntaxNode
  22490. + {
  22491. + private MarkupTextLiteralSyntax _namePrefix;
  22492. + private MarkupTextLiteralSyntax _name;
  22493. + private MarkupTextLiteralSyntax _nameSuffix;
  22494. + private SyntaxToken _equalsToken;
  22495. + private MarkupTextLiteralSyntax _valuePrefix;
  22496. + private MarkupTagHelperAttributeValueSyntax _value;
  22497. + private MarkupTextLiteralSyntax _valueSuffix;
  22498. +
  22499. + internal MarkupTagHelperAttributeSyntax(GreenNode green, SyntaxNode parent, int position)
  22500. + : base(green, parent, position)
  22501. + {
  22502. + }
  22503. +
  22504. + public MarkupTextLiteralSyntax NamePrefix
  22505. + {
  22506. + get
  22507. + {
  22508. + return GetRedAtZero(ref _namePrefix);
  22509. + }
  22510. + }
  22511. +
  22512. + public MarkupTextLiteralSyntax Name
  22513. + {
  22514. + get
  22515. + {
  22516. + return GetRed(ref _name, 1);
  22517. + }
  22518. + }
  22519. +
  22520. + public MarkupTextLiteralSyntax NameSuffix
  22521. + {
  22522. + get
  22523. + {
  22524. + return GetRed(ref _nameSuffix, 2);
  22525. + }
  22526. + }
  22527. +
  22528. + public SyntaxToken EqualsToken
  22529. + {
  22530. + get
  22531. + {
  22532. + return GetRed(ref _equalsToken, 3);
  22533. + }
  22534. + }
  22535. +
  22536. + public MarkupTextLiteralSyntax ValuePrefix
  22537. + {
  22538. + get
  22539. + {
  22540. + return GetRed(ref _valuePrefix, 4);
  22541. + }
  22542. + }
  22543. +
  22544. + public MarkupTagHelperAttributeValueSyntax Value
  22545. + {
  22546. + get
  22547. + {
  22548. + return GetRed(ref _value, 5);
  22549. + }
  22550. + }
  22551. +
  22552. + public MarkupTextLiteralSyntax ValueSuffix
  22553. + {
  22554. + get
  22555. + {
  22556. + return GetRed(ref _valueSuffix, 6);
  22557. + }
  22558. + }
  22559. +
  22560. + internal override SyntaxNode GetNodeSlot(int index)
  22561. + {
  22562. + switch (index)
  22563. + {
  22564. + case 0: return GetRedAtZero(ref _namePrefix);
  22565. + case 1: return GetRed(ref _name, 1);
  22566. + case 2: return GetRed(ref _nameSuffix, 2);
  22567. + case 3: return GetRed(ref _equalsToken, 3);
  22568. + case 4: return GetRed(ref _valuePrefix, 4);
  22569. + case 5: return GetRed(ref _value, 5);
  22570. + case 6: return GetRed(ref _valueSuffix, 6);
  22571. + default: return null;
  22572. + }
  22573. + }
  22574. + internal override SyntaxNode GetCachedSlot(int index)
  22575. + {
  22576. + switch (index)
  22577. + {
  22578. + case 0: return _namePrefix;
  22579. + case 1: return _name;
  22580. + case 2: return _nameSuffix;
  22581. + case 3: return _equalsToken;
  22582. + case 4: return _valuePrefix;
  22583. + case 5: return _value;
  22584. + case 6: return _valueSuffix;
  22585. + default: return null;
  22586. + }
  22587. + }
  22588. +
  22589. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  22590. + {
  22591. + return visitor.VisitMarkupTagHelperAttribute(this);
  22592. + }
  22593. +
  22594. + public override void Accept(SyntaxVisitor visitor)
  22595. + {
  22596. + visitor.VisitMarkupTagHelperAttribute(this);
  22597. + }
  22598. +
  22599. + public MarkupTagHelperAttributeSyntax Update(MarkupTextLiteralSyntax namePrefix, MarkupTextLiteralSyntax name, MarkupTextLiteralSyntax nameSuffix, SyntaxToken equalsToken, MarkupTextLiteralSyntax valuePrefix, MarkupTagHelperAttributeValueSyntax value, MarkupTextLiteralSyntax valueSuffix)
  22600. + {
  22601. + if (namePrefix != NamePrefix || name != Name || nameSuffix != NameSuffix || equalsToken != EqualsToken || valuePrefix != ValuePrefix || value != Value || valueSuffix != ValueSuffix)
  22602. + {
  22603. + var newNode = SyntaxFactory.MarkupTagHelperAttribute(namePrefix, name, nameSuffix, equalsToken, valuePrefix, value, valueSuffix);
  22604. + var annotations = GetAnnotations();
  22605. + if (annotations != null && annotations.Length > 0)
  22606. + return newNode.WithAnnotations(annotations);
  22607. + return newNode;
  22608. + }
  22609. +
  22610. + return this;
  22611. + }
  22612. +
  22613. + public MarkupTagHelperAttributeSyntax WithNamePrefix(MarkupTextLiteralSyntax namePrefix)
  22614. + {
  22615. + return Update(namePrefix, Name, NameSuffix, EqualsToken, ValuePrefix, Value, ValueSuffix);
  22616. + }
  22617. +
  22618. + public MarkupTagHelperAttributeSyntax WithName(MarkupTextLiteralSyntax name)
  22619. + {
  22620. + return Update(NamePrefix, name, NameSuffix, EqualsToken, ValuePrefix, Value, ValueSuffix);
  22621. + }
  22622. +
  22623. + public MarkupTagHelperAttributeSyntax WithNameSuffix(MarkupTextLiteralSyntax nameSuffix)
  22624. + {
  22625. + return Update(NamePrefix, Name, nameSuffix, EqualsToken, ValuePrefix, Value, ValueSuffix);
  22626. + }
  22627. +
  22628. + public MarkupTagHelperAttributeSyntax WithEqualsToken(SyntaxToken equalsToken)
  22629. + {
  22630. + return Update(NamePrefix, Name, NameSuffix, equalsToken, ValuePrefix, Value, ValueSuffix);
  22631. + }
  22632. +
  22633. + public MarkupTagHelperAttributeSyntax WithValuePrefix(MarkupTextLiteralSyntax valuePrefix)
  22634. + {
  22635. + return Update(NamePrefix, Name, NameSuffix, EqualsToken, valuePrefix, Value, ValueSuffix);
  22636. + }
  22637. +
  22638. + public MarkupTagHelperAttributeSyntax WithValue(MarkupTagHelperAttributeValueSyntax value)
  22639. + {
  22640. + return Update(NamePrefix, Name, NameSuffix, EqualsToken, ValuePrefix, value, ValueSuffix);
  22641. + }
  22642. +
  22643. + public MarkupTagHelperAttributeSyntax WithValueSuffix(MarkupTextLiteralSyntax valueSuffix)
  22644. + {
  22645. + return Update(NamePrefix, Name, NameSuffix, EqualsToken, ValuePrefix, Value, valueSuffix);
  22646. + }
  22647. +
  22648. + public MarkupTagHelperAttributeSyntax AddNamePrefixLiteralTokens(params SyntaxToken[] items)
  22649. + {
  22650. + var _namePrefix = this.NamePrefix ?? SyntaxFactory.MarkupTextLiteral();
  22651. + return this.WithNamePrefix(_namePrefix.WithLiteralTokens(_namePrefix.LiteralTokens.AddRange(items)));
  22652. + }
  22653. +
  22654. + public MarkupTagHelperAttributeSyntax AddNameLiteralTokens(params SyntaxToken[] items)
  22655. + {
  22656. + return this.WithName(this.Name.WithLiteralTokens(this.Name.LiteralTokens.AddRange(items)));
  22657. + }
  22658. +
  22659. + public MarkupTagHelperAttributeSyntax AddNameSuffixLiteralTokens(params SyntaxToken[] items)
  22660. + {
  22661. + var _nameSuffix = this.NameSuffix ?? SyntaxFactory.MarkupTextLiteral();
  22662. + return this.WithNameSuffix(_nameSuffix.WithLiteralTokens(_nameSuffix.LiteralTokens.AddRange(items)));
  22663. + }
  22664. +
  22665. + public MarkupTagHelperAttributeSyntax AddValuePrefixLiteralTokens(params SyntaxToken[] items)
  22666. + {
  22667. + var _valuePrefix = this.ValuePrefix ?? SyntaxFactory.MarkupTextLiteral();
  22668. + return this.WithValuePrefix(_valuePrefix.WithLiteralTokens(_valuePrefix.LiteralTokens.AddRange(items)));
  22669. + }
  22670. +
  22671. + public MarkupTagHelperAttributeSyntax AddValueChildren(params RazorSyntaxNode[] items)
  22672. + {
  22673. + return this.WithValue(this.Value.WithChildren(this.Value.Children.AddRange(items)));
  22674. + }
  22675. +
  22676. + public MarkupTagHelperAttributeSyntax AddValueSuffixLiteralTokens(params SyntaxToken[] items)
  22677. + {
  22678. + var _valueSuffix = this.ValueSuffix ?? SyntaxFactory.MarkupTextLiteral();
  22679. + return this.WithValueSuffix(_valueSuffix.WithLiteralTokens(_valueSuffix.LiteralTokens.AddRange(items)));
  22680. + }
  22681. + }
  22682. +
  22683. + internal sealed partial class MarkupMinimizedTagHelperAttributeSyntax : MarkupSyntaxNode
  22684. + {
  22685. + private MarkupTextLiteralSyntax _namePrefix;
  22686. + private MarkupTextLiteralSyntax _name;
  22687. +
  22688. + internal MarkupMinimizedTagHelperAttributeSyntax(GreenNode green, SyntaxNode parent, int position)
  22689. + : base(green, parent, position)
  22690. + {
  22691. + }
  22692. +
  22693. + public MarkupTextLiteralSyntax NamePrefix
  22694. + {
  22695. + get
  22696. + {
  22697. + return GetRedAtZero(ref _namePrefix);
  22698. + }
  22699. + }
  22700. +
  22701. + public MarkupTextLiteralSyntax Name
  22702. + {
  22703. + get
  22704. + {
  22705. + return GetRed(ref _name, 1);
  22706. + }
  22707. + }
  22708. +
  22709. + internal override SyntaxNode GetNodeSlot(int index)
  22710. + {
  22711. + switch (index)
  22712. + {
  22713. + case 0: return GetRedAtZero(ref _namePrefix);
  22714. + case 1: return GetRed(ref _name, 1);
  22715. + default: return null;
  22716. + }
  22717. + }
  22718. + internal override SyntaxNode GetCachedSlot(int index)
  22719. + {
  22720. + switch (index)
  22721. + {
  22722. + case 0: return _namePrefix;
  22723. + case 1: return _name;
  22724. + default: return null;
  22725. + }
  22726. + }
  22727. +
  22728. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  22729. + {
  22730. + return visitor.VisitMarkupMinimizedTagHelperAttribute(this);
  22731. + }
  22732. +
  22733. + public override void Accept(SyntaxVisitor visitor)
  22734. + {
  22735. + visitor.VisitMarkupMinimizedTagHelperAttribute(this);
  22736. + }
  22737. +
  22738. + public MarkupMinimizedTagHelperAttributeSyntax Update(MarkupTextLiteralSyntax namePrefix, MarkupTextLiteralSyntax name)
  22739. + {
  22740. + if (namePrefix != NamePrefix || name != Name)
  22741. + {
  22742. + var newNode = SyntaxFactory.MarkupMinimizedTagHelperAttribute(namePrefix, name);
  22743. + var annotations = GetAnnotations();
  22744. + if (annotations != null && annotations.Length > 0)
  22745. + return newNode.WithAnnotations(annotations);
  22746. + return newNode;
  22747. + }
  22748. +
  22749. + return this;
  22750. + }
  22751. +
  22752. + public MarkupMinimizedTagHelperAttributeSyntax WithNamePrefix(MarkupTextLiteralSyntax namePrefix)
  22753. + {
  22754. + return Update(namePrefix, Name);
  22755. + }
  22756. +
  22757. + public MarkupMinimizedTagHelperAttributeSyntax WithName(MarkupTextLiteralSyntax name)
  22758. + {
  22759. + return Update(NamePrefix, name);
  22760. + }
  22761. +
  22762. + public MarkupMinimizedTagHelperAttributeSyntax AddNamePrefixLiteralTokens(params SyntaxToken[] items)
  22763. + {
  22764. + var _namePrefix = this.NamePrefix ?? SyntaxFactory.MarkupTextLiteral();
  22765. + return this.WithNamePrefix(_namePrefix.WithLiteralTokens(_namePrefix.LiteralTokens.AddRange(items)));
  22766. + }
  22767. +
  22768. + public MarkupMinimizedTagHelperAttributeSyntax AddNameLiteralTokens(params SyntaxToken[] items)
  22769. + {
  22770. + return this.WithName(this.Name.WithLiteralTokens(this.Name.LiteralTokens.AddRange(items)));
  22771. + }
  22772. + }
  22773. +
  22774. + internal sealed partial class MarkupTagHelperAttributeValueSyntax : RazorBlockSyntax
  22775. + {
  22776. + private SyntaxNode _children;
  22777. +
  22778. + internal MarkupTagHelperAttributeValueSyntax(GreenNode green, SyntaxNode parent, int position)
  22779. + : base(green, parent, position)
  22780. + {
  22781. + }
  22782. +
  22783. + public override SyntaxList<RazorSyntaxNode> Children
  22784. {
  22785. get
  22786. {
  22787. - return GetRed(ref _endCommentTransition, 4);
  22788. + return new SyntaxList<RazorSyntaxNode>(GetRed(ref _children, 0));
  22789. }
  22790. }
  22791. @@ -74,11 +1984,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  22792. {
  22793. switch (index)
  22794. {
  22795. - case 0: return GetRedAtZero(ref _startCommentTransition);
  22796. - case 1: return GetRed(ref _startCommentStar, 1);
  22797. - case 2: return GetRed(ref _comment, 2);
  22798. - case 3: return GetRed(ref _endCommentStar, 3);
  22799. - case 4: return GetRed(ref _endCommentTransition, 4);
  22800. + case 0: return GetRedAtZero(ref _children);
  22801. default: return null;
  22802. }
  22803. }
  22804. @@ -86,30 +1992,26 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  22805. {
  22806. switch (index)
  22807. {
  22808. - case 0: return _startCommentTransition;
  22809. - case 1: return _startCommentStar;
  22810. - case 2: return _comment;
  22811. - case 3: return _endCommentStar;
  22812. - case 4: return _endCommentTransition;
  22813. + case 0: return _children;
  22814. default: return null;
  22815. }
  22816. }
  22817. public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  22818. {
  22819. - return visitor.VisitRazorCommentBlock(this);
  22820. + return visitor.VisitMarkupTagHelperAttributeValue(this);
  22821. }
  22822. public override void Accept(SyntaxVisitor visitor)
  22823. {
  22824. - visitor.VisitRazorCommentBlock(this);
  22825. + visitor.VisitMarkupTagHelperAttributeValue(this);
  22826. }
  22827. - public RazorCommentBlockSyntax Update(SyntaxToken startCommentTransition, SyntaxToken startCommentStar, SyntaxToken comment, SyntaxToken endCommentStar, SyntaxToken endCommentTransition)
  22828. + public MarkupTagHelperAttributeValueSyntax Update(SyntaxList<RazorSyntaxNode> children)
  22829. {
  22830. - if (startCommentTransition != StartCommentTransition || startCommentStar != StartCommentStar || comment != Comment || endCommentStar != EndCommentStar || endCommentTransition != EndCommentTransition)
  22831. + if (children != Children)
  22832. {
  22833. - var newNode = SyntaxFactory.RazorCommentBlock(startCommentTransition, startCommentStar, comment, endCommentStar, endCommentTransition);
  22834. + var newNode = SyntaxFactory.MarkupTagHelperAttributeValue(children);
  22835. var annotations = GetAnnotations();
  22836. if (annotations != null && annotations.Length > 0)
  22837. return newNode.WithAnnotations(annotations);
  22838. @@ -119,54 +2021,41 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  22839. return this;
  22840. }
  22841. - public RazorCommentBlockSyntax WithStartCommentTransition(SyntaxToken startCommentTransition)
  22842. - {
  22843. - return Update(startCommentTransition, _startCommentStar, _comment, _endCommentStar, _endCommentTransition);
  22844. - }
  22845. -
  22846. - public RazorCommentBlockSyntax WithStartCommentStar(SyntaxToken startCommentStar)
  22847. - {
  22848. - return Update(_startCommentTransition, startCommentStar, _comment, _endCommentStar, _endCommentTransition);
  22849. - }
  22850. -
  22851. - public RazorCommentBlockSyntax WithComment(SyntaxToken comment)
  22852. - {
  22853. - return Update(_startCommentTransition, _startCommentStar, comment, _endCommentStar, _endCommentTransition);
  22854. - }
  22855. -
  22856. - public RazorCommentBlockSyntax WithEndCommentStar(SyntaxToken endCommentStar)
  22857. + internal override RazorBlockSyntax WithChildrenCore(SyntaxList<RazorSyntaxNode> children) => WithChildren(children);
  22858. + public new MarkupTagHelperAttributeValueSyntax WithChildren(SyntaxList<RazorSyntaxNode> children)
  22859. {
  22860. - return Update(_startCommentTransition, _startCommentStar, _comment, endCommentStar, _endCommentTransition);
  22861. + return Update(children);
  22862. }
  22863. + internal override RazorBlockSyntax AddChildrenCore(params RazorSyntaxNode[] items) => AddChildren(items);
  22864. - public RazorCommentBlockSyntax WithEndCommentTransition(SyntaxToken endCommentTransition)
  22865. + public new MarkupTagHelperAttributeValueSyntax AddChildren(params RazorSyntaxNode[] items)
  22866. {
  22867. - return Update(_startCommentTransition, _startCommentStar, _comment, _endCommentStar, endCommentTransition);
  22868. + return WithChildren(this.Children.AddRange(items));
  22869. }
  22870. }
  22871. - internal abstract partial class HtmlSyntaxNode : RazorSyntaxNode
  22872. + internal abstract partial class CSharpSyntaxNode : RazorSyntaxNode
  22873. {
  22874. - internal HtmlSyntaxNode(GreenNode green, SyntaxNode parent, int position)
  22875. + internal CSharpSyntaxNode(GreenNode green, SyntaxNode parent, int position)
  22876. : base(green, parent, position)
  22877. {
  22878. }
  22879. }
  22880. - internal sealed partial class HtmlTextLiteralSyntax : HtmlSyntaxNode
  22881. + internal sealed partial class CSharpCodeBlockSyntax : RazorBlockSyntax
  22882. {
  22883. - private SyntaxNode _textTokens;
  22884. + private SyntaxNode _children;
  22885. - internal HtmlTextLiteralSyntax(GreenNode green, SyntaxNode parent, int position)
  22886. + internal CSharpCodeBlockSyntax(GreenNode green, SyntaxNode parent, int position)
  22887. : base(green, parent, position)
  22888. {
  22889. }
  22890. - public SyntaxList<SyntaxToken> TextTokens
  22891. + public override SyntaxList<RazorSyntaxNode> Children
  22892. {
  22893. get
  22894. {
  22895. - return new SyntaxList<SyntaxToken>(GetRed(ref _textTokens, 0));
  22896. + return new SyntaxList<RazorSyntaxNode>(GetRed(ref _children, 0));
  22897. }
  22898. }
  22899. @@ -174,7 +2063,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  22900. {
  22901. switch (index)
  22902. {
  22903. - case 0: return GetRedAtZero(ref _textTokens);
  22904. + case 0: return GetRedAtZero(ref _children);
  22905. default: return null;
  22906. }
  22907. }
  22908. @@ -182,26 +2071,26 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  22909. {
  22910. switch (index)
  22911. {
  22912. - case 0: return _textTokens;
  22913. + case 0: return _children;
  22914. default: return null;
  22915. }
  22916. }
  22917. public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  22918. {
  22919. - return visitor.VisitHtmlTextLiteral(this);
  22920. + return visitor.VisitCSharpCodeBlock(this);
  22921. }
  22922. public override void Accept(SyntaxVisitor visitor)
  22923. {
  22924. - visitor.VisitHtmlTextLiteral(this);
  22925. + visitor.VisitCSharpCodeBlock(this);
  22926. }
  22927. - public HtmlTextLiteralSyntax Update(SyntaxList<SyntaxToken> textTokens)
  22928. + public CSharpCodeBlockSyntax Update(SyntaxList<RazorSyntaxNode> children)
  22929. {
  22930. - if (textTokens != TextTokens)
  22931. + if (children != Children)
  22932. {
  22933. - var newNode = SyntaxFactory.HtmlTextLiteral(textTokens);
  22934. + var newNode = SyntaxFactory.CSharpCodeBlock(children);
  22935. var annotations = GetAnnotations();
  22936. if (annotations != null && annotations.Length > 0)
  22937. return newNode.WithAnnotations(annotations);
  22938. @@ -211,22 +2100,16 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  22939. return this;
  22940. }
  22941. - public HtmlTextLiteralSyntax WithTextTokens(SyntaxList<SyntaxToken> textTokens)
  22942. - {
  22943. - return Update(textTokens);
  22944. - }
  22945. -
  22946. - public HtmlTextLiteralSyntax AddTextTokens(params SyntaxToken[] items)
  22947. + internal override RazorBlockSyntax WithChildrenCore(SyntaxList<RazorSyntaxNode> children) => WithChildren(children);
  22948. + public new CSharpCodeBlockSyntax WithChildren(SyntaxList<RazorSyntaxNode> children)
  22949. {
  22950. - return WithTextTokens(this.TextTokens.AddRange(items));
  22951. + return Update(children);
  22952. }
  22953. - }
  22954. + internal override RazorBlockSyntax AddChildrenCore(params RazorSyntaxNode[] items) => AddChildren(items);
  22955. - internal abstract partial class CSharpSyntaxNode : RazorSyntaxNode
  22956. - {
  22957. - internal CSharpSyntaxNode(GreenNode green, SyntaxNode parent, int position)
  22958. - : base(green, parent, position)
  22959. + public new CSharpCodeBlockSyntax AddChildren(params RazorSyntaxNode[] items)
  22960. {
  22961. + return WithChildren(this.Children.AddRange(items));
  22962. }
  22963. }
  22964. @@ -294,20 +2177,20 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  22965. }
  22966. }
  22967. - internal sealed partial class CSharpMetaCodeSyntax : CSharpSyntaxNode
  22968. + internal sealed partial class CSharpStatementLiteralSyntax : CSharpSyntaxNode
  22969. {
  22970. - private SyntaxNode _metaCode;
  22971. + private SyntaxNode _literalTokens;
  22972. - internal CSharpMetaCodeSyntax(GreenNode green, SyntaxNode parent, int position)
  22973. + internal CSharpStatementLiteralSyntax(GreenNode green, SyntaxNode parent, int position)
  22974. : base(green, parent, position)
  22975. {
  22976. }
  22977. - public SyntaxList<SyntaxToken> MetaCode
  22978. + public SyntaxList<SyntaxToken> LiteralTokens
  22979. {
  22980. get
  22981. {
  22982. - return new SyntaxList<SyntaxToken>(GetRed(ref _metaCode, 0));
  22983. + return new SyntaxList<SyntaxToken>(GetRed(ref _literalTokens, 0));
  22984. }
  22985. }
  22986. @@ -315,7 +2198,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  22987. {
  22988. switch (index)
  22989. {
  22990. - case 0: return GetRedAtZero(ref _metaCode);
  22991. + case 0: return GetRedAtZero(ref _literalTokens);
  22992. default: return null;
  22993. }
  22994. }
  22995. @@ -323,26 +2206,26 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  22996. {
  22997. switch (index)
  22998. {
  22999. - case 0: return _metaCode;
  23000. + case 0: return _literalTokens;
  23001. default: return null;
  23002. }
  23003. }
  23004. public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  23005. {
  23006. - return visitor.VisitCSharpMetaCode(this);
  23007. + return visitor.VisitCSharpStatementLiteral(this);
  23008. }
  23009. public override void Accept(SyntaxVisitor visitor)
  23010. {
  23011. - visitor.VisitCSharpMetaCode(this);
  23012. + visitor.VisitCSharpStatementLiteral(this);
  23013. }
  23014. - public CSharpMetaCodeSyntax Update(SyntaxList<SyntaxToken> metaCode)
  23015. + public CSharpStatementLiteralSyntax Update(SyntaxList<SyntaxToken> literalTokens)
  23016. {
  23017. - if (metaCode != MetaCode)
  23018. + if (literalTokens != LiteralTokens)
  23019. {
  23020. - var newNode = SyntaxFactory.CSharpMetaCode(metaCode);
  23021. + var newNode = SyntaxFactory.CSharpStatementLiteral(literalTokens);
  23022. var annotations = GetAnnotations();
  23023. if (annotations != null && annotations.Length > 0)
  23024. return newNode.WithAnnotations(annotations);
  23025. @@ -352,31 +2235,100 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23026. return this;
  23027. }
  23028. - public CSharpMetaCodeSyntax WithMetaCode(SyntaxList<SyntaxToken> metaCode)
  23029. + public CSharpStatementLiteralSyntax WithLiteralTokens(SyntaxList<SyntaxToken> literalTokens)
  23030. {
  23031. - return Update(metaCode);
  23032. + return Update(literalTokens);
  23033. }
  23034. - public CSharpMetaCodeSyntax AddMetaCode(params SyntaxToken[] items)
  23035. + public CSharpStatementLiteralSyntax AddLiteralTokens(params SyntaxToken[] items)
  23036. {
  23037. - return WithMetaCode(this.MetaCode.AddRange(items));
  23038. + return WithLiteralTokens(this.LiteralTokens.AddRange(items));
  23039. + }
  23040. + }
  23041. +
  23042. + internal sealed partial class CSharpExpressionLiteralSyntax : CSharpSyntaxNode
  23043. + {
  23044. + private SyntaxNode _literalTokens;
  23045. +
  23046. + internal CSharpExpressionLiteralSyntax(GreenNode green, SyntaxNode parent, int position)
  23047. + : base(green, parent, position)
  23048. + {
  23049. + }
  23050. +
  23051. + public SyntaxList<SyntaxToken> LiteralTokens
  23052. + {
  23053. + get
  23054. + {
  23055. + return new SyntaxList<SyntaxToken>(GetRed(ref _literalTokens, 0));
  23056. + }
  23057. + }
  23058. +
  23059. + internal override SyntaxNode GetNodeSlot(int index)
  23060. + {
  23061. + switch (index)
  23062. + {
  23063. + case 0: return GetRedAtZero(ref _literalTokens);
  23064. + default: return null;
  23065. + }
  23066. + }
  23067. + internal override SyntaxNode GetCachedSlot(int index)
  23068. + {
  23069. + switch (index)
  23070. + {
  23071. + case 0: return _literalTokens;
  23072. + default: return null;
  23073. + }
  23074. + }
  23075. +
  23076. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  23077. + {
  23078. + return visitor.VisitCSharpExpressionLiteral(this);
  23079. + }
  23080. +
  23081. + public override void Accept(SyntaxVisitor visitor)
  23082. + {
  23083. + visitor.VisitCSharpExpressionLiteral(this);
  23084. + }
  23085. +
  23086. + public CSharpExpressionLiteralSyntax Update(SyntaxList<SyntaxToken> literalTokens)
  23087. + {
  23088. + if (literalTokens != LiteralTokens)
  23089. + {
  23090. + var newNode = SyntaxFactory.CSharpExpressionLiteral(literalTokens);
  23091. + var annotations = GetAnnotations();
  23092. + if (annotations != null && annotations.Length > 0)
  23093. + return newNode.WithAnnotations(annotations);
  23094. + return newNode;
  23095. + }
  23096. +
  23097. + return this;
  23098. + }
  23099. +
  23100. + public CSharpExpressionLiteralSyntax WithLiteralTokens(SyntaxList<SyntaxToken> literalTokens)
  23101. + {
  23102. + return Update(literalTokens);
  23103. + }
  23104. +
  23105. + public CSharpExpressionLiteralSyntax AddLiteralTokens(params SyntaxToken[] items)
  23106. + {
  23107. + return WithLiteralTokens(this.LiteralTokens.AddRange(items));
  23108. }
  23109. }
  23110. - internal sealed partial class CSharpCodeLiteralSyntax : CSharpSyntaxNode
  23111. + internal sealed partial class CSharpEphemeralTextLiteralSyntax : CSharpSyntaxNode
  23112. {
  23113. - private SyntaxNode _cSharpTokens;
  23114. + private SyntaxNode _literalTokens;
  23115. - internal CSharpCodeLiteralSyntax(GreenNode green, SyntaxNode parent, int position)
  23116. + internal CSharpEphemeralTextLiteralSyntax(GreenNode green, SyntaxNode parent, int position)
  23117. : base(green, parent, position)
  23118. {
  23119. }
  23120. - public SyntaxList<SyntaxToken> CSharpTokens
  23121. + public SyntaxList<SyntaxToken> LiteralTokens
  23122. {
  23123. get
  23124. {
  23125. - return new SyntaxList<SyntaxToken>(GetRed(ref _cSharpTokens, 0));
  23126. + return new SyntaxList<SyntaxToken>(GetRed(ref _literalTokens, 0));
  23127. }
  23128. }
  23129. @@ -384,7 +2336,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23130. {
  23131. switch (index)
  23132. {
  23133. - case 0: return GetRedAtZero(ref _cSharpTokens);
  23134. + case 0: return GetRedAtZero(ref _literalTokens);
  23135. default: return null;
  23136. }
  23137. }
  23138. @@ -392,26 +2344,26 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23139. {
  23140. switch (index)
  23141. {
  23142. - case 0: return _cSharpTokens;
  23143. + case 0: return _literalTokens;
  23144. default: return null;
  23145. }
  23146. }
  23147. public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  23148. {
  23149. - return visitor.VisitCSharpCodeLiteral(this);
  23150. + return visitor.VisitCSharpEphemeralTextLiteral(this);
  23151. }
  23152. public override void Accept(SyntaxVisitor visitor)
  23153. {
  23154. - visitor.VisitCSharpCodeLiteral(this);
  23155. + visitor.VisitCSharpEphemeralTextLiteral(this);
  23156. }
  23157. - public CSharpCodeLiteralSyntax Update(SyntaxList<SyntaxToken> cSharpTokens)
  23158. + public CSharpEphemeralTextLiteralSyntax Update(SyntaxList<SyntaxToken> literalTokens)
  23159. {
  23160. - if (cSharpTokens != CSharpTokens)
  23161. + if (literalTokens != LiteralTokens)
  23162. {
  23163. - var newNode = SyntaxFactory.CSharpCodeLiteral(cSharpTokens);
  23164. + var newNode = SyntaxFactory.CSharpEphemeralTextLiteral(literalTokens);
  23165. var annotations = GetAnnotations();
  23166. if (annotations != null && annotations.Length > 0)
  23167. return newNode.WithAnnotations(annotations);
  23168. @@ -421,27 +2373,27 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23169. return this;
  23170. }
  23171. - public CSharpCodeLiteralSyntax WithCSharpTokens(SyntaxList<SyntaxToken> cSharpTokens)
  23172. + public CSharpEphemeralTextLiteralSyntax WithLiteralTokens(SyntaxList<SyntaxToken> literalTokens)
  23173. {
  23174. - return Update(cSharpTokens);
  23175. + return Update(literalTokens);
  23176. }
  23177. - public CSharpCodeLiteralSyntax AddCSharpTokens(params SyntaxToken[] items)
  23178. + public CSharpEphemeralTextLiteralSyntax AddLiteralTokens(params SyntaxToken[] items)
  23179. {
  23180. - return WithCSharpTokens(this.CSharpTokens.AddRange(items));
  23181. + return WithLiteralTokens(this.LiteralTokens.AddRange(items));
  23182. }
  23183. }
  23184. - internal sealed partial class CSharpCodeBlockSyntax : CSharpSyntaxNode
  23185. + internal sealed partial class CSharpTemplateBlockSyntax : RazorBlockSyntax
  23186. {
  23187. private SyntaxNode _children;
  23188. - internal CSharpCodeBlockSyntax(GreenNode green, SyntaxNode parent, int position)
  23189. + internal CSharpTemplateBlockSyntax(GreenNode green, SyntaxNode parent, int position)
  23190. : base(green, parent, position)
  23191. {
  23192. }
  23193. - public SyntaxList<RazorSyntaxNode> Children
  23194. + public override SyntaxList<RazorSyntaxNode> Children
  23195. {
  23196. get
  23197. {
  23198. @@ -468,19 +2420,19 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23199. public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  23200. {
  23201. - return visitor.VisitCSharpCodeBlock(this);
  23202. + return visitor.VisitCSharpTemplateBlock(this);
  23203. }
  23204. public override void Accept(SyntaxVisitor visitor)
  23205. {
  23206. - visitor.VisitCSharpCodeBlock(this);
  23207. + visitor.VisitCSharpTemplateBlock(this);
  23208. }
  23209. - public CSharpCodeBlockSyntax Update(SyntaxList<RazorSyntaxNode> children)
  23210. + public CSharpTemplateBlockSyntax Update(SyntaxList<RazorSyntaxNode> children)
  23211. {
  23212. if (children != Children)
  23213. {
  23214. - var newNode = SyntaxFactory.CSharpCodeBlock(children);
  23215. + var newNode = SyntaxFactory.CSharpTemplateBlock(children);
  23216. var annotations = GetAnnotations();
  23217. if (annotations != null && annotations.Length > 0)
  23218. return newNode.WithAnnotations(annotations);
  23219. @@ -490,39 +2442,41 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23220. return this;
  23221. }
  23222. - public CSharpCodeBlockSyntax WithChildren(SyntaxList<RazorSyntaxNode> children)
  23223. + internal override RazorBlockSyntax WithChildrenCore(SyntaxList<RazorSyntaxNode> children) => WithChildren(children);
  23224. + public new CSharpTemplateBlockSyntax WithChildren(SyntaxList<RazorSyntaxNode> children)
  23225. {
  23226. return Update(children);
  23227. }
  23228. + internal override RazorBlockSyntax AddChildrenCore(params RazorSyntaxNode[] items) => AddChildren(items);
  23229. - public CSharpCodeBlockSyntax AddChildren(params RazorSyntaxNode[] items)
  23230. + public new CSharpTemplateBlockSyntax AddChildren(params RazorSyntaxNode[] items)
  23231. {
  23232. return WithChildren(this.Children.AddRange(items));
  23233. }
  23234. }
  23235. - internal abstract partial class CSharpBlockSyntax : CSharpSyntaxNode
  23236. + internal abstract partial class CSharpRazorBlockSyntax : CSharpSyntaxNode
  23237. {
  23238. - internal CSharpBlockSyntax(GreenNode green, SyntaxNode parent, int position)
  23239. + internal CSharpRazorBlockSyntax(GreenNode green, SyntaxNode parent, int position)
  23240. : base(green, parent, position)
  23241. {
  23242. }
  23243. public abstract CSharpTransitionSyntax Transition { get; }
  23244. - public CSharpBlockSyntax WithTransition(CSharpTransitionSyntax _transition) => WithTransitionCore(_transition);
  23245. - internal abstract CSharpBlockSyntax WithTransitionCore(CSharpTransitionSyntax _transition);
  23246. + public CSharpRazorBlockSyntax WithTransition(CSharpTransitionSyntax transition) => WithTransitionCore(transition);
  23247. + internal abstract CSharpRazorBlockSyntax WithTransitionCore(CSharpTransitionSyntax transition);
  23248. public abstract CSharpSyntaxNode Body { get; }
  23249. - public CSharpBlockSyntax WithBody(CSharpSyntaxNode _body) => WithBodyCore(_body);
  23250. - internal abstract CSharpBlockSyntax WithBodyCore(CSharpSyntaxNode _body);
  23251. + public CSharpRazorBlockSyntax WithBody(CSharpSyntaxNode body) => WithBodyCore(body);
  23252. + internal abstract CSharpRazorBlockSyntax WithBodyCore(CSharpSyntaxNode body);
  23253. }
  23254. - internal sealed partial class CSharpStatement : CSharpBlockSyntax
  23255. + internal sealed partial class CSharpStatementSyntax : CSharpRazorBlockSyntax
  23256. {
  23257. private CSharpTransitionSyntax _transition;
  23258. private CSharpSyntaxNode _body;
  23259. - internal CSharpStatement(GreenNode green, SyntaxNode parent, int position)
  23260. + internal CSharpStatementSyntax(GreenNode green, SyntaxNode parent, int position)
  23261. : base(green, parent, position)
  23262. {
  23263. }
  23264. @@ -572,7 +2526,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23265. visitor.VisitCSharpStatement(this);
  23266. }
  23267. - public CSharpStatement Update(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  23268. + public CSharpStatementSyntax Update(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  23269. {
  23270. if (transition != Transition || body != Body)
  23271. {
  23272. @@ -586,31 +2540,31 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23273. return this;
  23274. }
  23275. - internal override CSharpBlockSyntax WithTransitionCore(CSharpTransitionSyntax transition) => WithTransition(transition);
  23276. - public new CSharpStatement WithTransition(CSharpTransitionSyntax transition)
  23277. + internal override CSharpRazorBlockSyntax WithTransitionCore(CSharpTransitionSyntax transition) => WithTransition(transition);
  23278. + public new CSharpStatementSyntax WithTransition(CSharpTransitionSyntax transition)
  23279. {
  23280. - return Update(transition, _body);
  23281. + return Update(transition, Body);
  23282. }
  23283. - internal override CSharpBlockSyntax WithBodyCore(CSharpSyntaxNode body) => WithBody(body);
  23284. - public new CSharpStatement WithBody(CSharpSyntaxNode body)
  23285. + internal override CSharpRazorBlockSyntax WithBodyCore(CSharpSyntaxNode body) => WithBody(body);
  23286. + public new CSharpStatementSyntax WithBody(CSharpSyntaxNode body)
  23287. {
  23288. - return Update(_transition, body);
  23289. + return Update(Transition, body);
  23290. }
  23291. }
  23292. internal sealed partial class CSharpStatementBodySyntax : CSharpSyntaxNode
  23293. {
  23294. - private CSharpMetaCodeSyntax _openBrace;
  23295. + private RazorMetaCodeSyntax _openBrace;
  23296. private CSharpCodeBlockSyntax _cSharpCode;
  23297. - private CSharpMetaCodeSyntax _closeBrace;
  23298. + private RazorMetaCodeSyntax _closeBrace;
  23299. internal CSharpStatementBodySyntax(GreenNode green, SyntaxNode parent, int position)
  23300. : base(green, parent, position)
  23301. {
  23302. }
  23303. - public CSharpMetaCodeSyntax OpenBrace
  23304. + public RazorMetaCodeSyntax OpenBrace
  23305. {
  23306. get
  23307. {
  23308. @@ -626,7 +2580,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23309. }
  23310. }
  23311. - public CSharpMetaCodeSyntax CloseBrace
  23312. + public RazorMetaCodeSyntax CloseBrace
  23313. {
  23314. get
  23315. {
  23316. @@ -665,7 +2619,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23317. visitor.VisitCSharpStatementBody(this);
  23318. }
  23319. - public CSharpStatementBodySyntax Update(CSharpMetaCodeSyntax openBrace, CSharpCodeBlockSyntax cSharpCode, CSharpMetaCodeSyntax closeBrace)
  23320. + public CSharpStatementBodySyntax Update(RazorMetaCodeSyntax openBrace, CSharpCodeBlockSyntax cSharpCode, RazorMetaCodeSyntax closeBrace)
  23321. {
  23322. if (openBrace != OpenBrace || cSharpCode != CSharpCode || closeBrace != CloseBrace)
  23323. {
  23324. @@ -679,19 +2633,19 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23325. return this;
  23326. }
  23327. - public CSharpStatementBodySyntax WithOpenBrace(CSharpMetaCodeSyntax openBrace)
  23328. + public CSharpStatementBodySyntax WithOpenBrace(RazorMetaCodeSyntax openBrace)
  23329. {
  23330. - return Update(openBrace, _cSharpCode, _closeBrace);
  23331. + return Update(openBrace, CSharpCode, CloseBrace);
  23332. }
  23333. public CSharpStatementBodySyntax WithCSharpCode(CSharpCodeBlockSyntax cSharpCode)
  23334. {
  23335. - return Update(_openBrace, cSharpCode, _closeBrace);
  23336. + return Update(OpenBrace, cSharpCode, CloseBrace);
  23337. }
  23338. - public CSharpStatementBodySyntax WithCloseBrace(CSharpMetaCodeSyntax closeBrace)
  23339. + public CSharpStatementBodySyntax WithCloseBrace(RazorMetaCodeSyntax closeBrace)
  23340. {
  23341. - return Update(_openBrace, _cSharpCode, closeBrace);
  23342. + return Update(OpenBrace, CSharpCode, closeBrace);
  23343. }
  23344. public CSharpStatementBodySyntax AddOpenBraceMetaCode(params SyntaxToken[] items)
  23345. @@ -710,12 +2664,12 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23346. }
  23347. }
  23348. - internal sealed partial class CSharpExpression : CSharpBlockSyntax
  23349. + internal sealed partial class CSharpExplicitExpressionSyntax : CSharpRazorBlockSyntax
  23350. {
  23351. private CSharpTransitionSyntax _transition;
  23352. private CSharpSyntaxNode _body;
  23353. - internal CSharpExpression(GreenNode green, SyntaxNode parent, int position)
  23354. + internal CSharpExplicitExpressionSyntax(GreenNode green, SyntaxNode parent, int position)
  23355. : base(green, parent, position)
  23356. {
  23357. }
  23358. @@ -757,19 +2711,19 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23359. public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  23360. {
  23361. - return visitor.VisitCSharpExpression(this);
  23362. + return visitor.VisitCSharpExplicitExpression(this);
  23363. }
  23364. public override void Accept(SyntaxVisitor visitor)
  23365. {
  23366. - visitor.VisitCSharpExpression(this);
  23367. + visitor.VisitCSharpExplicitExpression(this);
  23368. }
  23369. - public CSharpExpression Update(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  23370. + public CSharpExplicitExpressionSyntax Update(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  23371. {
  23372. if (transition != Transition || body != Body)
  23373. {
  23374. - var newNode = SyntaxFactory.CSharpExpression(transition, body);
  23375. + var newNode = SyntaxFactory.CSharpExplicitExpression(transition, body);
  23376. var annotations = GetAnnotations();
  23377. if (annotations != null && annotations.Length > 0)
  23378. return newNode.WithAnnotations(annotations);
  23379. @@ -779,31 +2733,31 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23380. return this;
  23381. }
  23382. - internal override CSharpBlockSyntax WithTransitionCore(CSharpTransitionSyntax transition) => WithTransition(transition);
  23383. - public new CSharpExpression WithTransition(CSharpTransitionSyntax transition)
  23384. + internal override CSharpRazorBlockSyntax WithTransitionCore(CSharpTransitionSyntax transition) => WithTransition(transition);
  23385. + public new CSharpExplicitExpressionSyntax WithTransition(CSharpTransitionSyntax transition)
  23386. {
  23387. - return Update(transition, _body);
  23388. + return Update(transition, Body);
  23389. }
  23390. - internal override CSharpBlockSyntax WithBodyCore(CSharpSyntaxNode body) => WithBody(body);
  23391. - public new CSharpExpression WithBody(CSharpSyntaxNode body)
  23392. + internal override CSharpRazorBlockSyntax WithBodyCore(CSharpSyntaxNode body) => WithBody(body);
  23393. + public new CSharpExplicitExpressionSyntax WithBody(CSharpSyntaxNode body)
  23394. {
  23395. - return Update(_transition, body);
  23396. + return Update(Transition, body);
  23397. }
  23398. }
  23399. - internal sealed partial class CSharpExpressionBodySyntax : CSharpSyntaxNode
  23400. + internal sealed partial class CSharpExplicitExpressionBodySyntax : CSharpSyntaxNode
  23401. {
  23402. - private CSharpMetaCodeSyntax _openParen;
  23403. + private RazorMetaCodeSyntax _openParen;
  23404. private CSharpCodeBlockSyntax _cSharpCode;
  23405. - private CSharpMetaCodeSyntax _closeParen;
  23406. + private RazorMetaCodeSyntax _closeParen;
  23407. - internal CSharpExpressionBodySyntax(GreenNode green, SyntaxNode parent, int position)
  23408. + internal CSharpExplicitExpressionBodySyntax(GreenNode green, SyntaxNode parent, int position)
  23409. : base(green, parent, position)
  23410. {
  23411. }
  23412. - public CSharpMetaCodeSyntax OpenParen
  23413. + public RazorMetaCodeSyntax OpenParen
  23414. {
  23415. get
  23416. {
  23417. @@ -819,7 +2773,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23418. }
  23419. }
  23420. - public CSharpMetaCodeSyntax CloseParen
  23421. + public RazorMetaCodeSyntax CloseParen
  23422. {
  23423. get
  23424. {
  23425. @@ -850,19 +2804,19 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23426. public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  23427. {
  23428. - return visitor.VisitCSharpExpressionBody(this);
  23429. + return visitor.VisitCSharpExplicitExpressionBody(this);
  23430. }
  23431. public override void Accept(SyntaxVisitor visitor)
  23432. {
  23433. - visitor.VisitCSharpExpressionBody(this);
  23434. + visitor.VisitCSharpExplicitExpressionBody(this);
  23435. }
  23436. - public CSharpExpressionBodySyntax Update(CSharpMetaCodeSyntax openParen, CSharpCodeBlockSyntax cSharpCode, CSharpMetaCodeSyntax closeParen)
  23437. + public CSharpExplicitExpressionBodySyntax Update(RazorMetaCodeSyntax openParen, CSharpCodeBlockSyntax cSharpCode, RazorMetaCodeSyntax closeParen)
  23438. {
  23439. if (openParen != OpenParen || cSharpCode != CSharpCode || closeParen != CloseParen)
  23440. {
  23441. - var newNode = SyntaxFactory.CSharpExpressionBody(openParen, cSharpCode, closeParen);
  23442. + var newNode = SyntaxFactory.CSharpExplicitExpressionBody(openParen, cSharpCode, closeParen);
  23443. var annotations = GetAnnotations();
  23444. if (annotations != null && annotations.Length > 0)
  23445. return newNode.WithAnnotations(annotations);
  23446. @@ -872,45 +2826,194 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23447. return this;
  23448. }
  23449. - public CSharpExpressionBodySyntax WithOpenParen(CSharpMetaCodeSyntax openParen)
  23450. + public CSharpExplicitExpressionBodySyntax WithOpenParen(RazorMetaCodeSyntax openParen)
  23451. {
  23452. - return Update(openParen, _cSharpCode, _closeParen);
  23453. + return Update(openParen, CSharpCode, CloseParen);
  23454. }
  23455. - public CSharpExpressionBodySyntax WithCSharpCode(CSharpCodeBlockSyntax cSharpCode)
  23456. + public CSharpExplicitExpressionBodySyntax WithCSharpCode(CSharpCodeBlockSyntax cSharpCode)
  23457. {
  23458. - return Update(_openParen, cSharpCode, _closeParen);
  23459. + return Update(OpenParen, cSharpCode, CloseParen);
  23460. }
  23461. - public CSharpExpressionBodySyntax WithCloseParen(CSharpMetaCodeSyntax closeParen)
  23462. + public CSharpExplicitExpressionBodySyntax WithCloseParen(RazorMetaCodeSyntax closeParen)
  23463. {
  23464. - return Update(_openParen, _cSharpCode, closeParen);
  23465. + return Update(OpenParen, CSharpCode, closeParen);
  23466. }
  23467. - public CSharpExpressionBodySyntax AddOpenParenMetaCode(params SyntaxToken[] items)
  23468. + public CSharpExplicitExpressionBodySyntax AddOpenParenMetaCode(params SyntaxToken[] items)
  23469. {
  23470. - var _openParen = this.OpenParen ?? SyntaxFactory.CSharpMetaCode();
  23471. - return this.WithOpenParen(_openParen.WithMetaCode(_openParen.MetaCode.AddRange(items)));
  23472. + return this.WithOpenParen(this.OpenParen.WithMetaCode(this.OpenParen.MetaCode.AddRange(items)));
  23473. }
  23474. - public CSharpExpressionBodySyntax AddCSharpCodeChildren(params RazorSyntaxNode[] items)
  23475. + public CSharpExplicitExpressionBodySyntax AddCSharpCodeChildren(params RazorSyntaxNode[] items)
  23476. {
  23477. return this.WithCSharpCode(this.CSharpCode.WithChildren(this.CSharpCode.Children.AddRange(items)));
  23478. }
  23479. - public CSharpExpressionBodySyntax AddCloseParenMetaCode(params SyntaxToken[] items)
  23480. + public CSharpExplicitExpressionBodySyntax AddCloseParenMetaCode(params SyntaxToken[] items)
  23481. + {
  23482. + return this.WithCloseParen(this.CloseParen.WithMetaCode(this.CloseParen.MetaCode.AddRange(items)));
  23483. + }
  23484. + }
  23485. +
  23486. + internal sealed partial class CSharpImplicitExpressionSyntax : CSharpRazorBlockSyntax
  23487. + {
  23488. + private CSharpTransitionSyntax _transition;
  23489. + private CSharpSyntaxNode _body;
  23490. +
  23491. + internal CSharpImplicitExpressionSyntax(GreenNode green, SyntaxNode parent, int position)
  23492. + : base(green, parent, position)
  23493. + {
  23494. + }
  23495. +
  23496. + public override CSharpTransitionSyntax Transition
  23497. + {
  23498. + get
  23499. + {
  23500. + return GetRedAtZero(ref _transition);
  23501. + }
  23502. + }
  23503. +
  23504. + public override CSharpSyntaxNode Body
  23505. + {
  23506. + get
  23507. + {
  23508. + return GetRed(ref _body, 1);
  23509. + }
  23510. + }
  23511. +
  23512. + internal override SyntaxNode GetNodeSlot(int index)
  23513. + {
  23514. + switch (index)
  23515. + {
  23516. + case 0: return GetRedAtZero(ref _transition);
  23517. + case 1: return GetRed(ref _body, 1);
  23518. + default: return null;
  23519. + }
  23520. + }
  23521. + internal override SyntaxNode GetCachedSlot(int index)
  23522. + {
  23523. + switch (index)
  23524. + {
  23525. + case 0: return _transition;
  23526. + case 1: return _body;
  23527. + default: return null;
  23528. + }
  23529. + }
  23530. +
  23531. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  23532. + {
  23533. + return visitor.VisitCSharpImplicitExpression(this);
  23534. + }
  23535. +
  23536. + public override void Accept(SyntaxVisitor visitor)
  23537. + {
  23538. + visitor.VisitCSharpImplicitExpression(this);
  23539. + }
  23540. +
  23541. + public CSharpImplicitExpressionSyntax Update(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  23542. + {
  23543. + if (transition != Transition || body != Body)
  23544. + {
  23545. + var newNode = SyntaxFactory.CSharpImplicitExpression(transition, body);
  23546. + var annotations = GetAnnotations();
  23547. + if (annotations != null && annotations.Length > 0)
  23548. + return newNode.WithAnnotations(annotations);
  23549. + return newNode;
  23550. + }
  23551. +
  23552. + return this;
  23553. + }
  23554. +
  23555. + internal override CSharpRazorBlockSyntax WithTransitionCore(CSharpTransitionSyntax transition) => WithTransition(transition);
  23556. + public new CSharpImplicitExpressionSyntax WithTransition(CSharpTransitionSyntax transition)
  23557. + {
  23558. + return Update(transition, Body);
  23559. + }
  23560. +
  23561. + internal override CSharpRazorBlockSyntax WithBodyCore(CSharpSyntaxNode body) => WithBody(body);
  23562. + public new CSharpImplicitExpressionSyntax WithBody(CSharpSyntaxNode body)
  23563. + {
  23564. + return Update(Transition, body);
  23565. + }
  23566. + }
  23567. +
  23568. + internal sealed partial class CSharpImplicitExpressionBodySyntax : CSharpSyntaxNode
  23569. + {
  23570. + private CSharpCodeBlockSyntax _cSharpCode;
  23571. +
  23572. + internal CSharpImplicitExpressionBodySyntax(GreenNode green, SyntaxNode parent, int position)
  23573. + : base(green, parent, position)
  23574. + {
  23575. + }
  23576. +
  23577. + public CSharpCodeBlockSyntax CSharpCode
  23578. + {
  23579. + get
  23580. + {
  23581. + return GetRedAtZero(ref _cSharpCode);
  23582. + }
  23583. + }
  23584. +
  23585. + internal override SyntaxNode GetNodeSlot(int index)
  23586. + {
  23587. + switch (index)
  23588. + {
  23589. + case 0: return GetRedAtZero(ref _cSharpCode);
  23590. + default: return null;
  23591. + }
  23592. + }
  23593. + internal override SyntaxNode GetCachedSlot(int index)
  23594. + {
  23595. + switch (index)
  23596. + {
  23597. + case 0: return _cSharpCode;
  23598. + default: return null;
  23599. + }
  23600. + }
  23601. +
  23602. + public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  23603. + {
  23604. + return visitor.VisitCSharpImplicitExpressionBody(this);
  23605. + }
  23606. +
  23607. + public override void Accept(SyntaxVisitor visitor)
  23608. + {
  23609. + visitor.VisitCSharpImplicitExpressionBody(this);
  23610. + }
  23611. +
  23612. + public CSharpImplicitExpressionBodySyntax Update(CSharpCodeBlockSyntax cSharpCode)
  23613. + {
  23614. + if (cSharpCode != CSharpCode)
  23615. + {
  23616. + var newNode = SyntaxFactory.CSharpImplicitExpressionBody(cSharpCode);
  23617. + var annotations = GetAnnotations();
  23618. + if (annotations != null && annotations.Length > 0)
  23619. + return newNode.WithAnnotations(annotations);
  23620. + return newNode;
  23621. + }
  23622. +
  23623. + return this;
  23624. + }
  23625. +
  23626. + public CSharpImplicitExpressionBodySyntax WithCSharpCode(CSharpCodeBlockSyntax cSharpCode)
  23627. {
  23628. - var _closeParen = this.CloseParen ?? SyntaxFactory.CSharpMetaCode();
  23629. - return this.WithCloseParen(_closeParen.WithMetaCode(_closeParen.MetaCode.AddRange(items)));
  23630. + return Update(cSharpCode);
  23631. + }
  23632. +
  23633. + public CSharpImplicitExpressionBodySyntax AddCSharpCodeChildren(params RazorSyntaxNode[] items)
  23634. + {
  23635. + return this.WithCSharpCode(this.CSharpCode.WithChildren(this.CSharpCode.Children.AddRange(items)));
  23636. }
  23637. }
  23638. - internal sealed partial class CSharpDirectiveSyntax : CSharpBlockSyntax
  23639. + internal sealed partial class RazorDirectiveSyntax : CSharpRazorBlockSyntax
  23640. {
  23641. private CSharpTransitionSyntax _transition;
  23642. private CSharpSyntaxNode _body;
  23643. - internal CSharpDirectiveSyntax(GreenNode green, SyntaxNode parent, int position)
  23644. + internal RazorDirectiveSyntax(GreenNode green, SyntaxNode parent, int position)
  23645. : base(green, parent, position)
  23646. {
  23647. }
  23648. @@ -952,19 +3055,19 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23649. public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  23650. {
  23651. - return visitor.VisitCSharpDirective(this);
  23652. + return visitor.VisitRazorDirective(this);
  23653. }
  23654. public override void Accept(SyntaxVisitor visitor)
  23655. {
  23656. - visitor.VisitCSharpDirective(this);
  23657. + visitor.VisitRazorDirective(this);
  23658. }
  23659. - public CSharpDirectiveSyntax Update(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  23660. + public RazorDirectiveSyntax Update(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
  23661. {
  23662. if (transition != Transition || body != Body)
  23663. {
  23664. - var newNode = SyntaxFactory.CSharpDirective(transition, body);
  23665. + var newNode = SyntaxFactory.RazorDirective(transition, body);
  23666. var annotations = GetAnnotations();
  23667. if (annotations != null && annotations.Length > 0)
  23668. return newNode.WithAnnotations(annotations);
  23669. @@ -974,30 +3077,30 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23670. return this;
  23671. }
  23672. - internal override CSharpBlockSyntax WithTransitionCore(CSharpTransitionSyntax transition) => WithTransition(transition);
  23673. - public new CSharpDirectiveSyntax WithTransition(CSharpTransitionSyntax transition)
  23674. + internal override CSharpRazorBlockSyntax WithTransitionCore(CSharpTransitionSyntax transition) => WithTransition(transition);
  23675. + public new RazorDirectiveSyntax WithTransition(CSharpTransitionSyntax transition)
  23676. {
  23677. - return Update(transition, _body);
  23678. + return Update(transition, Body);
  23679. }
  23680. - internal override CSharpBlockSyntax WithBodyCore(CSharpSyntaxNode body) => WithBody(body);
  23681. - public new CSharpDirectiveSyntax WithBody(CSharpSyntaxNode body)
  23682. + internal override CSharpRazorBlockSyntax WithBodyCore(CSharpSyntaxNode body) => WithBody(body);
  23683. + public new RazorDirectiveSyntax WithBody(CSharpSyntaxNode body)
  23684. {
  23685. - return Update(_transition, body);
  23686. + return Update(Transition, body);
  23687. }
  23688. }
  23689. - internal sealed partial class CSharpDirectiveBodySyntax : CSharpSyntaxNode
  23690. + internal sealed partial class RazorDirectiveBodySyntax : CSharpSyntaxNode
  23691. {
  23692. - private CSharpMetaCodeSyntax _keyword;
  23693. + private RazorSyntaxNode _keyword;
  23694. private CSharpCodeBlockSyntax _cSharpCode;
  23695. - internal CSharpDirectiveBodySyntax(GreenNode green, SyntaxNode parent, int position)
  23696. + internal RazorDirectiveBodySyntax(GreenNode green, SyntaxNode parent, int position)
  23697. : base(green, parent, position)
  23698. {
  23699. }
  23700. - public CSharpMetaCodeSyntax Keyword
  23701. + public RazorSyntaxNode Keyword
  23702. {
  23703. get
  23704. {
  23705. @@ -1034,19 +3137,19 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23706. public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
  23707. {
  23708. - return visitor.VisitCSharpDirectiveBody(this);
  23709. + return visitor.VisitRazorDirectiveBody(this);
  23710. }
  23711. public override void Accept(SyntaxVisitor visitor)
  23712. {
  23713. - visitor.VisitCSharpDirectiveBody(this);
  23714. + visitor.VisitRazorDirectiveBody(this);
  23715. }
  23716. - public CSharpDirectiveBodySyntax Update(CSharpMetaCodeSyntax keyword, CSharpCodeBlockSyntax cSharpCode)
  23717. + public RazorDirectiveBodySyntax Update(RazorSyntaxNode keyword, CSharpCodeBlockSyntax cSharpCode)
  23718. {
  23719. if (keyword != Keyword || cSharpCode != CSharpCode)
  23720. {
  23721. - var newNode = SyntaxFactory.CSharpDirectiveBody(keyword, cSharpCode);
  23722. + var newNode = SyntaxFactory.RazorDirectiveBody(keyword, cSharpCode);
  23723. var annotations = GetAnnotations();
  23724. if (annotations != null && annotations.Length > 0)
  23725. return newNode.WithAnnotations(annotations);
  23726. @@ -1056,24 +3159,20 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23727. return this;
  23728. }
  23729. - public CSharpDirectiveBodySyntax WithKeyword(CSharpMetaCodeSyntax keyword)
  23730. + public RazorDirectiveBodySyntax WithKeyword(RazorSyntaxNode keyword)
  23731. {
  23732. - return Update(keyword, _cSharpCode);
  23733. + return Update(keyword, CSharpCode);
  23734. }
  23735. - public CSharpDirectiveBodySyntax WithCSharpCode(CSharpCodeBlockSyntax cSharpCode)
  23736. + public RazorDirectiveBodySyntax WithCSharpCode(CSharpCodeBlockSyntax cSharpCode)
  23737. {
  23738. - return Update(_keyword, cSharpCode);
  23739. + return Update(Keyword, cSharpCode);
  23740. }
  23741. - public CSharpDirectiveBodySyntax AddKeywordMetaCode(params SyntaxToken[] items)
  23742. + public RazorDirectiveBodySyntax AddCSharpCodeChildren(params RazorSyntaxNode[] items)
  23743. {
  23744. - return this.WithKeyword(this.Keyword.WithMetaCode(this.Keyword.MetaCode.AddRange(items)));
  23745. - }
  23746. -
  23747. - public CSharpDirectiveBodySyntax AddCSharpCodeChildren(params RazorSyntaxNode[] items)
  23748. - {
  23749. - return this.WithCSharpCode(this.CSharpCode.WithChildren(this.CSharpCode.Children.AddRange(items)));
  23750. + var _cSharpCode = this.CSharpCode ?? SyntaxFactory.CSharpCodeBlock();
  23751. + return this.WithCSharpCode(_cSharpCode.WithChildren(_cSharpCode.Children.AddRange(items)));
  23752. }
  23753. }
  23754. }
  23755. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/GreenNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/GreenNode.cs
  23756. index 7e05d7ab39e..3f03464510e 100644
  23757. --- a/src/Microsoft.AspNetCore.Razor.Language/Syntax/GreenNode.cs
  23758. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/GreenNode.cs
  23759. @@ -19,8 +19,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23760. new ConditionalWeakTable<GreenNode, RazorDiagnostic[]>();
  23761. private static readonly ConditionalWeakTable<GreenNode, SyntaxAnnotation[]> AnnotationsTable =
  23762. new ConditionalWeakTable<GreenNode, SyntaxAnnotation[]>();
  23763. -
  23764. - private NodeFlags _flags;
  23765. private byte _slotCount;
  23766. protected GreenNode(SyntaxKind kind)
  23767. @@ -44,7 +42,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23768. {
  23769. if (diagnostics?.Length > 0)
  23770. {
  23771. - _flags |= NodeFlags.ContainsDiagnostics;
  23772. + Flags |= NodeFlags.ContainsDiagnostics;
  23773. DiagnosticsTable.Add(this, diagnostics);
  23774. }
  23775. @@ -58,7 +56,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23776. }
  23777. }
  23778. - _flags |= NodeFlags.ContainsAnnotations;
  23779. + Flags |= NodeFlags.ContainsAnnotations;
  23780. AnnotationsTable.Add(this, annotations);
  23781. }
  23782. }
  23783. @@ -70,7 +68,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23784. return;
  23785. }
  23786. - _flags |= (node.Flags & NodeFlags.InheritMask);
  23787. + Flags |= (node.Flags & NodeFlags.InheritMask);
  23788. FullWidth += node.FullWidth;
  23789. }
  23790. @@ -150,25 +148,25 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23791. #endregion
  23792. #region Flags
  23793. - internal NodeFlags Flags => _flags;
  23794. + public NodeFlags Flags { get; protected set; }
  23795. internal void SetFlags(NodeFlags flags)
  23796. {
  23797. - _flags |= flags;
  23798. + Flags |= flags;
  23799. }
  23800. internal void ClearFlags(NodeFlags flags)
  23801. {
  23802. - _flags &= ~flags;
  23803. + Flags &= ~flags;
  23804. }
  23805. - internal virtual bool IsMissing => (_flags & NodeFlags.IsMissing) != 0;
  23806. + internal virtual bool IsMissing => (Flags & NodeFlags.IsMissing) != 0;
  23807. public bool ContainsDiagnostics
  23808. {
  23809. get
  23810. {
  23811. - return (_flags & NodeFlags.ContainsDiagnostics) != 0;
  23812. + return (Flags & NodeFlags.ContainsDiagnostics) != 0;
  23813. }
  23814. }
  23815. @@ -176,7 +174,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23816. {
  23817. get
  23818. {
  23819. - return (_flags & NodeFlags.ContainsAnnotations) != 0;
  23820. + return (Flags & NodeFlags.ContainsAnnotations) != 0;
  23821. }
  23822. }
  23823. #endregion
  23824. @@ -255,6 +253,14 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23825. #endregion
  23826. #region Text
  23827. + public override string ToString()
  23828. + {
  23829. + var builder = new StringBuilder();
  23830. + builder.AppendFormat("{0}<{1}>", GetType().Name, Kind);
  23831. +
  23832. + return builder.ToString();
  23833. + }
  23834. +
  23835. public virtual string ToFullString()
  23836. {
  23837. var builder = new StringBuilder();
  23838. @@ -342,7 +348,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23839. for (int i = 0, n = node.SlotCount; i < n; i++)
  23840. {
  23841. var child = node.GetSlot(i);
  23842. - if (child != null)
  23843. + if (child != null && child.FullWidth > 0)
  23844. {
  23845. firstChild = child;
  23846. break;
  23847. @@ -364,7 +370,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23848. for (var i = node.SlotCount - 1; i >= 0; i--)
  23849. {
  23850. var child = node.GetSlot(i);
  23851. - if (child != null)
  23852. + if (child != null && child.FullWidth > 0)
  23853. {
  23854. lastChild = child;
  23855. break;
  23856. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/GreenNodeExtensions.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/GreenNodeExtensions.cs
  23857. index 6895dfdd02c..03cb22a20b4 100644
  23858. --- a/src/Microsoft.AspNetCore.Razor.Language/Syntax/GreenNodeExtensions.cs
  23859. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/GreenNodeExtensions.cs
  23860. @@ -1,7 +1,9 @@
  23861. // Copyright (c) .NET Foundation. All rights reserved.
  23862. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  23863. +using System;
  23864. using System.Collections.Generic;
  23865. +using System.Linq;
  23866. namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23867. {
  23868. @@ -19,7 +21,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23869. return new InternalSyntax.SyntaxList<T>(node);
  23870. }
  23871. - public static TNode WithAnnotationsGreen<TNode>(this TNode node, IEnumerable<SyntaxAnnotation> annotations) where TNode : GreenNode
  23872. + public static TNode WithAnnotationsGreen<TNode>(this TNode node, params SyntaxAnnotation[] annotations) where TNode : GreenNode
  23873. {
  23874. var newAnnotations = new List<SyntaxAnnotation>();
  23875. foreach (var candidate in annotations)
  23876. @@ -48,7 +50,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  23877. }
  23878. }
  23879. - public static TNode WithDiagnosticsGreen<TNode>(this TNode node, RazorDiagnostic[] diagnostics) where TNode : GreenNode
  23880. + public static TNode WithDiagnosticsGreen<TNode>(this TNode node, params RazorDiagnostic[] diagnostics) where TNode : GreenNode
  23881. {
  23882. return (TNode)node.SetDiagnostics(diagnostics);
  23883. }
  23884. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/InternalSyntax/RazorDirectiveSyntax.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/InternalSyntax/RazorDirectiveSyntax.cs
  23885. new file mode 100644
  23886. index 00000000000..ef27d176002
  23887. --- /dev/null
  23888. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/InternalSyntax/RazorDirectiveSyntax.cs
  23889. @@ -0,0 +1,34 @@
  23890. +// Copyright (c) .NET Foundation. All rights reserved.
  23891. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  23892. +
  23893. +using System.Collections.Generic;
  23894. +using System.Linq;
  23895. +
  23896. +namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  23897. +{
  23898. + internal sealed partial class RazorDirectiveSyntax
  23899. + {
  23900. + private static readonly string DirectiveDescriptorKey = typeof(DirectiveDescriptor).Name;
  23901. +
  23902. + public DirectiveDescriptor DirectiveDescriptor
  23903. + {
  23904. + get
  23905. + {
  23906. + var annotation = GetAnnotations().FirstOrDefault(n => n.Kind == DirectiveDescriptorKey);
  23907. + return annotation?.Data as DirectiveDescriptor;
  23908. + }
  23909. + }
  23910. +
  23911. + public RazorDirectiveSyntax WithDirectiveDescriptor(DirectiveDescriptor descriptor)
  23912. + {
  23913. + var annotations = new List<SyntaxAnnotation>(GetAnnotations())
  23914. + {
  23915. + new SyntaxAnnotation(DirectiveDescriptorKey, descriptor)
  23916. + };
  23917. +
  23918. + var newGreen = this.WithAnnotationsGreen(annotations.ToArray());
  23919. +
  23920. + return newGreen;
  23921. + }
  23922. + }
  23923. +}
  23924. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/InternalSyntax/RazorSyntaxNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/InternalSyntax/RazorSyntaxNode.cs
  23925. new file mode 100644
  23926. index 00000000000..a353a13dd7f
  23927. --- /dev/null
  23928. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/InternalSyntax/RazorSyntaxNode.cs
  23929. @@ -0,0 +1,27 @@
  23930. +// Copyright (c) .NET Foundation. All rights reserved.
  23931. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  23932. +
  23933. +namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  23934. +{
  23935. + internal abstract partial class RazorSyntaxNode : GreenNode
  23936. + {
  23937. + protected RazorSyntaxNode(SyntaxKind kind) : base(kind)
  23938. + {
  23939. + }
  23940. +
  23941. + protected RazorSyntaxNode(SyntaxKind kind, int fullWidth)
  23942. + : base(kind, fullWidth)
  23943. + {
  23944. + }
  23945. +
  23946. + protected RazorSyntaxNode(SyntaxKind kind, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  23947. + : base(kind, diagnostics, annotations)
  23948. + {
  23949. + }
  23950. +
  23951. + protected RazorSyntaxNode(SyntaxKind kind, int fullWidth, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  23952. + : base(kind, fullWidth, diagnostics, annotations)
  23953. + {
  23954. + }
  23955. + }
  23956. +}
  23957. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/InternalSyntax/SyntaxFactory.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/InternalSyntax/SyntaxFactory.cs
  23958. index 79562ded0d3..b8dba7bdf75 100644
  23959. --- a/src/Microsoft.AspNetCore.Razor.Language/Syntax/InternalSyntax/SyntaxFactory.cs
  23960. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/InternalSyntax/SyntaxFactory.cs
  23961. @@ -17,5 +17,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  23962. {
  23963. return new SyntaxToken(kind, content, diagnostics);
  23964. }
  23965. +
  23966. + internal static SyntaxToken MissingToken(SyntaxKind kind, params RazorDiagnostic[] diagnostics)
  23967. + {
  23968. + return SyntaxToken.CreateMissing(kind, diagnostics);
  23969. + }
  23970. }
  23971. }
  23972. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/InternalSyntax/SyntaxListOfT.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/InternalSyntax/SyntaxListOfT.cs
  23973. index 945781978d9..abb34c628c2 100644
  23974. --- a/src/Microsoft.AspNetCore.Razor.Language/Syntax/InternalSyntax/SyntaxListOfT.cs
  23975. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/InternalSyntax/SyntaxListOfT.cs
  23976. @@ -1,11 +1,12 @@
  23977. // Copyright (c) .NET Foundation. All rights reserved.
  23978. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  23979. +using System;
  23980. using System.Diagnostics;
  23981. namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  23982. {
  23983. - internal readonly struct SyntaxList<TNode>
  23984. + internal struct SyntaxList<TNode> : IEquatable<SyntaxList<TNode>>
  23985. where TNode : GreenNode
  23986. {
  23987. private readonly GreenNode _node;
  23988. @@ -15,13 +16,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  23989. _node = node;
  23990. }
  23991. - public GreenNode Node
  23992. - {
  23993. - get
  23994. - {
  23995. - return ((GreenNode)_node);
  23996. - }
  23997. - }
  23998. + internal GreenNode Node => _node;
  23999. public int Count
  24000. {
  24001. @@ -31,33 +26,30 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  24002. }
  24003. }
  24004. - public TNode Last
  24005. + public TNode this[int index]
  24006. {
  24007. get
  24008. {
  24009. - var node = _node;
  24010. - if (node.IsList)
  24011. + if (_node == null)
  24012. {
  24013. - return ((TNode)node.GetSlot(node.SlotCount - 1));
  24014. + return null;
  24015. }
  24016. + else if (_node.IsList)
  24017. + {
  24018. + Debug.Assert(index >= 0);
  24019. + Debug.Assert(index <= _node.SlotCount);
  24020. - return ((TNode)node);
  24021. - }
  24022. - }
  24023. -
  24024. - /* Not Implemented: Default */
  24025. - public TNode this[int index]
  24026. - {
  24027. - get
  24028. - {
  24029. - var node = _node;
  24030. - if (node.IsList)
  24031. + return ((TNode)_node.GetSlot(index));
  24032. + }
  24033. + else if (index == 0)
  24034. {
  24035. - return ((TNode)node.GetSlot(index));
  24036. + Debug.Assert(index == 0);
  24037. + return ((TNode)_node);
  24038. + }
  24039. + else
  24040. + {
  24041. + throw new InvalidOperationException("This program location is thought to be unreachable.");
  24042. }
  24043. -
  24044. - Debug.Assert(index == 0);
  24045. - return ((TNode)node);
  24046. }
  24047. }
  24048. @@ -106,6 +98,25 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  24049. }
  24050. }
  24051. + public TNode Last
  24052. + {
  24053. + get
  24054. + {
  24055. + var node = _node;
  24056. + if (node.IsList)
  24057. + {
  24058. + return ((TNode)node.GetSlot(node.SlotCount - 1));
  24059. + }
  24060. +
  24061. + return ((TNode)node);
  24062. + }
  24063. + }
  24064. +
  24065. + public Enumerator GetEnumerator()
  24066. + {
  24067. + return new Enumerator(this);
  24068. + }
  24069. +
  24070. public static bool operator ==(SyntaxList<TNode> left, SyntaxList<TNode> right)
  24071. {
  24072. return (left._node == right._node);
  24073. @@ -116,6 +127,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  24074. return !(left._node == right._node);
  24075. }
  24076. + public bool Equals(SyntaxList<TNode> other)
  24077. + {
  24078. + return _node == other._node;
  24079. + }
  24080. +
  24081. public override bool Equals(object obj)
  24082. {
  24083. return (obj is SyntaxList<TNode> && (_node == ((SyntaxList<TNode>)obj)._node));
  24084. @@ -135,5 +151,37 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  24085. {
  24086. return new SyntaxList<GreenNode>(nodes._node);
  24087. }
  24088. +
  24089. + internal struct Enumerator
  24090. + {
  24091. + private SyntaxList<TNode> _list;
  24092. + private int _index;
  24093. +
  24094. + internal Enumerator(SyntaxList<TNode> list)
  24095. + {
  24096. + _list = list;
  24097. + _index = -1;
  24098. + }
  24099. +
  24100. + public bool MoveNext()
  24101. + {
  24102. + var newIndex = _index + 1;
  24103. + if (newIndex < _list.Count)
  24104. + {
  24105. + _index = newIndex;
  24106. + return true;
  24107. + }
  24108. +
  24109. + return false;
  24110. + }
  24111. +
  24112. + public TNode Current
  24113. + {
  24114. + get
  24115. + {
  24116. + return _list[_index];
  24117. + }
  24118. + }
  24119. + }
  24120. }
  24121. }
  24122. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/InternalSyntax/SyntaxListPool.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/InternalSyntax/SyntaxListPool.cs
  24123. new file mode 100644
  24124. index 00000000000..3f9e88608cb
  24125. --- /dev/null
  24126. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/InternalSyntax/SyntaxListPool.cs
  24127. @@ -0,0 +1,100 @@
  24128. +// Copyright (c) .NET Foundation. All rights reserved.
  24129. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  24130. +
  24131. +using System;
  24132. +using System.Collections.Generic;
  24133. +using System.Diagnostics;
  24134. +
  24135. +namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  24136. +{
  24137. + internal class SyntaxListPool
  24138. + {
  24139. + private ArrayElement<SyntaxListBuilder>[] _freeList = new ArrayElement<SyntaxListBuilder>[10];
  24140. + private int _freeIndex;
  24141. +
  24142. +#if DEBUG
  24143. + private readonly List<SyntaxListBuilder> _allocated = new List<SyntaxListBuilder>();
  24144. +#endif
  24145. +
  24146. + internal SyntaxListPool()
  24147. + {
  24148. + }
  24149. +
  24150. + internal SyntaxListBuilder Allocate()
  24151. + {
  24152. + SyntaxListBuilder item;
  24153. + if (_freeIndex > 0)
  24154. + {
  24155. + _freeIndex--;
  24156. + item = _freeList[_freeIndex].Value;
  24157. + _freeList[_freeIndex].Value = null;
  24158. + }
  24159. + else
  24160. + {
  24161. + item = new SyntaxListBuilder(10);
  24162. + }
  24163. +
  24164. +#if DEBUG
  24165. + Debug.Assert(!_allocated.Contains(item));
  24166. + _allocated.Add(item);
  24167. +#endif
  24168. + return item;
  24169. + }
  24170. +
  24171. + internal PooledResult<TNode> Allocate<TNode>() where TNode : GreenNode
  24172. + {
  24173. + var builder = new SyntaxListBuilder<TNode>(this.Allocate());
  24174. + return new PooledResult<TNode>(this, builder);
  24175. + }
  24176. +
  24177. + internal void Free(SyntaxListBuilder item)
  24178. + {
  24179. + item.Clear();
  24180. + if (_freeIndex >= _freeList.Length)
  24181. + {
  24182. + this.Grow();
  24183. + }
  24184. +#if DEBUG
  24185. + Debug.Assert(_allocated.Contains(item));
  24186. +
  24187. + _allocated.Remove(item);
  24188. +#endif
  24189. + _freeList[_freeIndex].Value = item;
  24190. + _freeIndex++;
  24191. + }
  24192. +
  24193. + private void Grow()
  24194. + {
  24195. + var tmp = new ArrayElement<SyntaxListBuilder>[_freeList.Length * 2];
  24196. + Array.Copy(_freeList, tmp, _freeList.Length);
  24197. + _freeList = tmp;
  24198. + }
  24199. +
  24200. + public SyntaxList<TNode> ToListAndFree<TNode>(SyntaxListBuilder<TNode> item)
  24201. + where TNode : GreenNode
  24202. + {
  24203. + var list = item.ToList();
  24204. + Free(item);
  24205. + return list;
  24206. + }
  24207. +
  24208. + public readonly struct PooledResult<TNode> : IDisposable where TNode : GreenNode
  24209. + {
  24210. + private readonly SyntaxListBuilder<TNode> _builder;
  24211. + private readonly SyntaxListPool _pool;
  24212. +
  24213. + public PooledResult(SyntaxListPool pool, in SyntaxListBuilder<TNode> builder)
  24214. + {
  24215. + _pool = pool;
  24216. + _builder = builder;
  24217. + }
  24218. +
  24219. + public SyntaxListBuilder<TNode> Builder => _builder;
  24220. +
  24221. + public void Dispose()
  24222. + {
  24223. + _pool.Free(_builder);
  24224. + }
  24225. + }
  24226. + }
  24227. +}
  24228. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/InternalSyntax/SyntaxRewriter.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/InternalSyntax/SyntaxRewriter.cs
  24229. new file mode 100644
  24230. index 00000000000..fcf0e04ef55
  24231. --- /dev/null
  24232. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/InternalSyntax/SyntaxRewriter.cs
  24233. @@ -0,0 +1,56 @@
  24234. +// Copyright (c) .NET Foundation. All rights reserved.
  24235. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  24236. +
  24237. +namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  24238. +{
  24239. + internal abstract partial class SyntaxRewriter : SyntaxVisitor<GreenNode>
  24240. + {
  24241. + public override GreenNode VisitToken(SyntaxToken token)
  24242. + {
  24243. + var leading = VisitList(token.LeadingTrivia);
  24244. + var trailing = VisitList(token.TrailingTrivia);
  24245. +
  24246. + if (leading != token.LeadingTrivia || trailing != token.TrailingTrivia)
  24247. + {
  24248. + if (leading != token.LeadingTrivia)
  24249. + {
  24250. + token = token.TokenWithLeadingTrivia(leading.Node);
  24251. + }
  24252. +
  24253. + if (trailing != token.TrailingTrivia)
  24254. + {
  24255. + token = token.TokenWithTrailingTrivia(trailing.Node);
  24256. + }
  24257. + }
  24258. +
  24259. + return token;
  24260. + }
  24261. +
  24262. + public SyntaxList<TNode> VisitList<TNode>(SyntaxList<TNode> list) where TNode : GreenNode
  24263. + {
  24264. + SyntaxListBuilder alternate = null;
  24265. + for (int i = 0, n = list.Count; i < n; i++)
  24266. + {
  24267. + var item = list[i];
  24268. + var visited = Visit(item);
  24269. + if (item != visited && alternate == null)
  24270. + {
  24271. + alternate = new SyntaxListBuilder(n);
  24272. + alternate.AddRange(list, 0, i);
  24273. + }
  24274. +
  24275. + if (alternate != null)
  24276. + {
  24277. + alternate.Add(visited);
  24278. + }
  24279. + }
  24280. +
  24281. + if (alternate != null)
  24282. + {
  24283. + return alternate.ToList<TNode>();
  24284. + }
  24285. +
  24286. + return list;
  24287. + }
  24288. + }
  24289. +}
  24290. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/InternalSyntax/SyntaxToken.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/InternalSyntax/SyntaxToken.cs
  24291. index 3b11afa5e4f..2b958788ee1 100644
  24292. --- a/src/Microsoft.AspNetCore.Razor.Language/Syntax/InternalSyntax/SyntaxToken.cs
  24293. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/InternalSyntax/SyntaxToken.cs
  24294. @@ -2,14 +2,15 @@
  24295. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  24296. using System;
  24297. -using System.Collections.Generic;
  24298. using System.IO;
  24299. -using Microsoft.AspNetCore.Razor.Language.Legacy;
  24300. namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  24301. {
  24302. - internal class SyntaxToken : GreenNode
  24303. + internal class SyntaxToken : RazorSyntaxNode
  24304. {
  24305. + private readonly GreenNode _leadingTrivia;
  24306. + private readonly GreenNode _trailingTrivia;
  24307. +
  24308. internal SyntaxToken(SyntaxKind kind, string content, RazorDiagnostic[] diagnostics)
  24309. : base(kind, content.Length, diagnostics, annotations: null)
  24310. {
  24311. @@ -20,9 +21,9 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  24312. : base(kind, content.Length)
  24313. {
  24314. Content = content;
  24315. - LeadingTrivia = leadingTrivia;
  24316. + _leadingTrivia = leadingTrivia;
  24317. AdjustFlagsAndWidth(leadingTrivia);
  24318. - TrailingTrivia = trailingTrivia;
  24319. + _trailingTrivia = trailingTrivia;
  24320. AdjustFlagsAndWidth(trailingTrivia);
  24321. }
  24322. @@ -30,17 +31,23 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  24323. : base(kind, content.Length, diagnostics, annotations)
  24324. {
  24325. Content = content;
  24326. - LeadingTrivia = leadingTrivia;
  24327. + _leadingTrivia = leadingTrivia;
  24328. AdjustFlagsAndWidth(leadingTrivia);
  24329. - TrailingTrivia = trailingTrivia;
  24330. + _trailingTrivia = trailingTrivia;
  24331. AdjustFlagsAndWidth(trailingTrivia);
  24332. }
  24333. public string Content { get; }
  24334. - public GreenNode LeadingTrivia { get; }
  24335. + public SyntaxList<GreenNode> LeadingTrivia
  24336. + {
  24337. + get { return new SyntaxList<GreenNode>(GetLeadingTrivia()); }
  24338. + }
  24339. - public GreenNode TrailingTrivia { get; }
  24340. + public SyntaxList<GreenNode> TrailingTrivia
  24341. + {
  24342. + get { return new SyntaxList<GreenNode>(GetTrailingTrivia()); }
  24343. + }
  24344. internal override bool IsToken => true;
  24345. @@ -76,22 +83,22 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  24346. public override sealed GreenNode GetLeadingTrivia()
  24347. {
  24348. - return LeadingTrivia;
  24349. + return _leadingTrivia;
  24350. }
  24351. public override int GetLeadingTriviaWidth()
  24352. {
  24353. - return LeadingTrivia == null ? 0 : LeadingTrivia.FullWidth;
  24354. + return _leadingTrivia == null ? 0 : _leadingTrivia.FullWidth;
  24355. }
  24356. public override sealed GreenNode GetTrailingTrivia()
  24357. {
  24358. - return TrailingTrivia;
  24359. + return _trailingTrivia;
  24360. }
  24361. public override int GetTrailingTriviaWidth()
  24362. {
  24363. - return TrailingTrivia == null ? 0 : TrailingTrivia.FullWidth;
  24364. + return _trailingTrivia == null ? 0 : _trailingTrivia.FullWidth;
  24365. }
  24366. public sealed override GreenNode WithLeadingTrivia(GreenNode trivia)
  24367. @@ -101,7 +108,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  24368. public virtual SyntaxToken TokenWithLeadingTrivia(GreenNode trivia)
  24369. {
  24370. - return new SyntaxToken(Kind, Content, trivia, TrailingTrivia, GetDiagnostics(), GetAnnotations());
  24371. + return new SyntaxToken(Kind, Content, trivia, _trailingTrivia, GetDiagnostics(), GetAnnotations());
  24372. }
  24373. public sealed override GreenNode WithTrailingTrivia(GreenNode trivia)
  24374. @@ -111,17 +118,17 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  24375. public virtual SyntaxToken TokenWithTrailingTrivia(GreenNode trivia)
  24376. {
  24377. - return new SyntaxToken(Kind, Content, LeadingTrivia, trivia, GetDiagnostics(), GetAnnotations());
  24378. + return new SyntaxToken(Kind, Content, _leadingTrivia, trivia, GetDiagnostics(), GetAnnotations());
  24379. }
  24380. internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
  24381. {
  24382. - return new SyntaxToken(Kind, Content, LeadingTrivia, TrailingTrivia, diagnostics, GetAnnotations());
  24383. + return new SyntaxToken(Kind, Content, _leadingTrivia, _trailingTrivia, diagnostics, GetAnnotations());
  24384. }
  24385. internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
  24386. {
  24387. - return new SyntaxToken(Kind, Content, LeadingTrivia, TrailingTrivia, GetDiagnostics(), annotations);
  24388. + return new SyntaxToken(Kind, Content, _leadingTrivia, _trailingTrivia, GetDiagnostics(), annotations);
  24389. }
  24390. protected override sealed int GetSlotCount()
  24391. @@ -195,5 +202,25 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax
  24392. {
  24393. return Content;
  24394. }
  24395. +
  24396. + internal static SyntaxToken CreateMissing(SyntaxKind kind, params RazorDiagnostic[] diagnostics)
  24397. + {
  24398. + return new MissingToken(kind, diagnostics);
  24399. + }
  24400. +
  24401. + private class MissingToken : SyntaxToken
  24402. + {
  24403. + internal MissingToken(SyntaxKind kind, RazorDiagnostic[] diagnostics)
  24404. + : base(kind, string.Empty, diagnostics)
  24405. + {
  24406. + Flags |= NodeFlags.IsMissing;
  24407. + }
  24408. +
  24409. + internal MissingToken(SyntaxKind kind, GreenNode leading, GreenNode trailing, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
  24410. + : base(kind, string.Empty, leading, trailing, diagnostics, annotations)
  24411. + {
  24412. + Flags |= NodeFlags.IsMissing;
  24413. + }
  24414. + }
  24415. }
  24416. }
  24417. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/MarkupElementRewriter.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/MarkupElementRewriter.cs
  24418. new file mode 100644
  24419. index 00000000000..7aeda1c349c
  24420. --- /dev/null
  24421. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/MarkupElementRewriter.cs
  24422. @@ -0,0 +1,290 @@
  24423. +// Copyright (c) .NET Foundation. All rights reserved.
  24424. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  24425. +
  24426. +using System;
  24427. +using System.Collections.Generic;
  24428. +using System.Diagnostics;
  24429. +using System.Linq;
  24430. +
  24431. +namespace Microsoft.AspNetCore.Razor.Language.Syntax
  24432. +{
  24433. + internal static class MarkupElementRewriter
  24434. + {
  24435. + public static RazorSyntaxTree AddMarkupElements(RazorSyntaxTree syntaxTree)
  24436. + {
  24437. + var rewriter = new AddMarkupElementRewriter();
  24438. + var rewrittenRoot = rewriter.Visit(syntaxTree.Root);
  24439. +
  24440. + var newSyntaxTree = RazorSyntaxTree.Create(rewrittenRoot, syntaxTree.Source, syntaxTree.Diagnostics, syntaxTree.Options);
  24441. + return newSyntaxTree;
  24442. + }
  24443. +
  24444. + public static RazorSyntaxTree RemoveMarkupElements(RazorSyntaxTree syntaxTree)
  24445. + {
  24446. + var rewriter = new RemoveMarkupElementRewriter();
  24447. + var rewrittenRoot = rewriter.Visit(syntaxTree.Root);
  24448. +
  24449. + var newSyntaxTree = RazorSyntaxTree.Create(rewrittenRoot, syntaxTree.Source, syntaxTree.Diagnostics, syntaxTree.Options);
  24450. + return newSyntaxTree;
  24451. + }
  24452. +
  24453. + private class AddMarkupElementRewriter : SyntaxRewriter
  24454. + {
  24455. + private readonly Stack<TagBlockTracker> _startTagTracker = new Stack<TagBlockTracker>();
  24456. +
  24457. + private TagBlockTracker CurrentTracker => _startTagTracker.Count > 0 ? _startTagTracker.Peek() : null;
  24458. +
  24459. + private string CurrentStartTagName => CurrentTracker?.TagName;
  24460. +
  24461. + public override SyntaxNode Visit(SyntaxNode node)
  24462. + {
  24463. + node = base.Visit(node);
  24464. +
  24465. + if (node != null)
  24466. + {
  24467. + node = RewriteNode(node);
  24468. + }
  24469. +
  24470. + return node;
  24471. + }
  24472. +
  24473. + private SyntaxNode RewriteNode(SyntaxNode node)
  24474. + {
  24475. + if (node.IsToken)
  24476. + {
  24477. + // Tokens don't have children.
  24478. + return node;
  24479. + }
  24480. +
  24481. + _startTagTracker.Clear();
  24482. + var children = node.ChildNodes().ToList();
  24483. + var rewrittenChildren = new List<SyntaxNode>(children.Count);
  24484. + for (var i = 0; i < children.Count; i++)
  24485. + {
  24486. + var child = children[i];
  24487. + if (!(child is MarkupTagBlockSyntax tagBlock))
  24488. + {
  24489. + TrackChild(child, rewrittenChildren);
  24490. + continue;
  24491. + }
  24492. +
  24493. + var tagName = tagBlock.GetTagName();
  24494. + if (string.IsNullOrWhiteSpace(tagName) || tagBlock.IsSelfClosing())
  24495. + {
  24496. + // Don't want to track incomplete, invalid (Eg. </>, < >), void or self-closing tags.
  24497. + // Simply wrap it in a block with no body or start/end tag.
  24498. + if (IsEndTag(tagBlock))
  24499. + {
  24500. + // This is an error case.
  24501. + BuildMarkupElement(rewrittenChildren, startTag: null, tagChildren: new List<RazorSyntaxNode>(), endTag: tagBlock);
  24502. + }
  24503. + else
  24504. + {
  24505. + BuildMarkupElement(rewrittenChildren, startTag: tagBlock, tagChildren: new List<RazorSyntaxNode>(), endTag: null);
  24506. + }
  24507. + }
  24508. + else if (IsEndTag(tagBlock))
  24509. + {
  24510. + if (string.Equals(CurrentStartTagName, tagName, StringComparison.OrdinalIgnoreCase))
  24511. + {
  24512. + var startTagTracker = _startTagTracker.Pop();
  24513. + var startTag = startTagTracker.TagBlock;
  24514. +
  24515. + // Get the nodes between the start and the end tag.
  24516. + var tagChildren = startTagTracker.Children;
  24517. +
  24518. + BuildMarkupElement(rewrittenChildren, startTag, tagChildren, endTag: tagBlock);
  24519. + }
  24520. + else
  24521. + {
  24522. + // Current tag scope does not match the end tag. Attempt to recover the start tag
  24523. + // by looking up the previous tag scopes for a matching start tag.
  24524. + if (!TryRecoverStartTag(rewrittenChildren, tagName, tagBlock))
  24525. + {
  24526. + // Could not recover. The end tag doesn't have a corresponding start tag. Wrap it in a block and move on.
  24527. + var rewritten = SyntaxFactory.MarkupElement(startTag: null, body: new SyntaxList<RazorSyntaxNode>(), endTag: tagBlock);
  24528. + TrackChild(rewritten, rewrittenChildren);
  24529. + }
  24530. + }
  24531. + }
  24532. + else
  24533. + {
  24534. + // This is a start tag. Keep track of it.
  24535. + _startTagTracker.Push(new TagBlockTracker(tagBlock));
  24536. + }
  24537. + }
  24538. +
  24539. + while (_startTagTracker.Count > 0)
  24540. + {
  24541. + // We reached the end of the list and still have unmatched start tags
  24542. + var startTagTracker = _startTagTracker.Pop();
  24543. + var startTag = startTagTracker.TagBlock;
  24544. + var tagChildren = startTagTracker.Children;
  24545. + BuildMarkupElement(rewrittenChildren, startTag, tagChildren, endTag: null);
  24546. + }
  24547. +
  24548. + // We now have finished building our list of rewritten Children.
  24549. + // At this point, We should have a one to one replacement for every child. The replacement can be null.
  24550. + Debug.Assert(children.Count == rewrittenChildren.Count);
  24551. + node = node.ReplaceNodes(children, (original, rewritten) =>
  24552. + {
  24553. + var originalIndex = children.IndexOf(original);
  24554. + if (originalIndex != -1)
  24555. + {
  24556. + // If this returns null, that node will be removed.
  24557. + return rewrittenChildren[originalIndex];
  24558. + }
  24559. +
  24560. + return original;
  24561. + });
  24562. +
  24563. + return node;
  24564. + }
  24565. +
  24566. + private void BuildMarkupElement(List<SyntaxNode> rewrittenChildren, MarkupTagBlockSyntax startTag, List<RazorSyntaxNode> tagChildren, MarkupTagBlockSyntax endTag)
  24567. + {
  24568. + // We are trying to replace multiple nodes (including the start/end tag) with one rewritten node.
  24569. + // Since we need to have each child node accounted for in our rewritten list,
  24570. + // we'll add "null" in place of them.
  24571. + // The call to SyntaxNode.ReplaceNodes() later will take care removing the nodes whose replacement is null.
  24572. +
  24573. + var body = tagChildren.Where(t => t != null).ToList();
  24574. + var rewritten = SyntaxFactory.MarkupElement(startTag, new SyntaxList<RazorSyntaxNode>(body), endTag);
  24575. + if (startTag != null)
  24576. + {
  24577. + // If there was a start tag, that is where we want to put our new element.
  24578. + TrackChild(rewritten, rewrittenChildren);
  24579. + }
  24580. +
  24581. + foreach (var child in tagChildren)
  24582. + {
  24583. + TrackChild(null, rewrittenChildren);
  24584. + }
  24585. + if (endTag != null)
  24586. + {
  24587. + TrackChild(startTag == null ? rewritten : null, rewrittenChildren);
  24588. + }
  24589. + }
  24590. +
  24591. + private void TrackChild(SyntaxNode child, List<SyntaxNode> rewrittenChildren)
  24592. + {
  24593. + if (CurrentTracker != null)
  24594. + {
  24595. + CurrentTracker.Children.Add((RazorSyntaxNode)child);
  24596. + return;
  24597. + }
  24598. +
  24599. + rewrittenChildren.Add(child);
  24600. + }
  24601. +
  24602. + private bool TryRecoverStartTag(List<SyntaxNode> rewrittenChildren, string tagName, MarkupTagBlockSyntax endTag)
  24603. + {
  24604. + var malformedTagCount = 0;
  24605. + foreach (var tracker in _startTagTracker)
  24606. + {
  24607. + if (tracker.TagName.Equals(tagName, StringComparison.OrdinalIgnoreCase))
  24608. + {
  24609. + break;
  24610. + }
  24611. +
  24612. + malformedTagCount++;
  24613. + }
  24614. +
  24615. + if (_startTagTracker.Count > malformedTagCount)
  24616. + {
  24617. + RewriteMalformedTags(rewrittenChildren, malformedTagCount);
  24618. +
  24619. + // One final rewrite, this is the rewrite that completes our target tag which is not malformed.
  24620. + var startTagTracker = _startTagTracker.Pop();
  24621. + var startTag = startTagTracker.TagBlock;
  24622. + var tagChildren = startTagTracker.Children;
  24623. +
  24624. + BuildMarkupElement(rewrittenChildren, startTag, tagChildren, endTag);
  24625. +
  24626. + // We were able to recover
  24627. + return true;
  24628. + }
  24629. +
  24630. + // Could not recover tag. Aka we found an end tag without a corresponding start tag.
  24631. + return false;
  24632. + }
  24633. +
  24634. + private void RewriteMalformedTags(List<SyntaxNode> rewrittenChildren, int malformedTagCount)
  24635. + {
  24636. + for (var i = 0; i < malformedTagCount; i++)
  24637. + {
  24638. + var startTagTracker = _startTagTracker.Pop();
  24639. + var startTag = startTagTracker.TagBlock;
  24640. +
  24641. + BuildMarkupElement(rewrittenChildren, startTag, startTagTracker.Children, endTag: null);
  24642. + }
  24643. + }
  24644. +
  24645. + private bool IsEndTag(MarkupTagBlockSyntax tagBlock)
  24646. + {
  24647. + var childContent = tagBlock.Children.First().GetContent();
  24648. + if (string.IsNullOrEmpty(childContent))
  24649. + {
  24650. + return false;
  24651. + }
  24652. +
  24653. + // We grab the token that could be forward slash
  24654. + return childContent.StartsWith("</") || childContent.StartsWith("/");
  24655. + }
  24656. +
  24657. + private class TagBlockTracker
  24658. + {
  24659. + public TagBlockTracker(MarkupTagBlockSyntax tagBlock)
  24660. + {
  24661. + TagBlock = tagBlock;
  24662. + TagName = tagBlock.GetTagName();
  24663. + Children = new List<RazorSyntaxNode>();
  24664. + }
  24665. +
  24666. + public MarkupTagBlockSyntax TagBlock { get; }
  24667. +
  24668. + public List<RazorSyntaxNode> Children { get; }
  24669. +
  24670. + public string TagName { get; }
  24671. + }
  24672. + }
  24673. +
  24674. + private class RemoveMarkupElementRewriter : SyntaxRewriter
  24675. + {
  24676. + public override SyntaxNode Visit(SyntaxNode node)
  24677. + {
  24678. + if (node != null)
  24679. + {
  24680. + node = RewriteNode(node);
  24681. + }
  24682. +
  24683. + return base.Visit(node);
  24684. + }
  24685. +
  24686. + private SyntaxNode RewriteNode(SyntaxNode node)
  24687. + {
  24688. + if (node.IsToken)
  24689. + {
  24690. + return node;
  24691. + }
  24692. +
  24693. + var children = node.ChildNodes();
  24694. + for (var i = 0; i < children.Count; i++)
  24695. + {
  24696. + var child = children[i];
  24697. + if (!(child is MarkupElementSyntax tagElement))
  24698. + {
  24699. + continue;
  24700. + }
  24701. +
  24702. + node = node.ReplaceNode(tagElement, tagElement.ChildNodes());
  24703. +
  24704. + // Since we rewrote 'node', it's children are different. Update our collection.
  24705. + children = node.ChildNodes();
  24706. + }
  24707. +
  24708. + return node;
  24709. + }
  24710. + }
  24711. + }
  24712. +}
  24713. \ No newline at end of file
  24714. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/MarkupMinimizedTagHelperAttributeSyntax.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/MarkupMinimizedTagHelperAttributeSyntax.cs
  24715. new file mode 100644
  24716. index 00000000000..980616d9c3a
  24717. --- /dev/null
  24718. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/MarkupMinimizedTagHelperAttributeSyntax.cs
  24719. @@ -0,0 +1,33 @@
  24720. +// Copyright (c) .NET Foundation. All rights reserved.
  24721. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  24722. +
  24723. +using System.Collections.Generic;
  24724. +
  24725. +namespace Microsoft.AspNetCore.Razor.Language.Syntax
  24726. +{
  24727. + internal sealed partial class MarkupMinimizedTagHelperAttributeSyntax
  24728. + {
  24729. + private static readonly string TagHelperAttributeInfoKey = typeof(TagHelperAttributeInfo).Name;
  24730. +
  24731. + public TagHelperAttributeInfo TagHelperAttributeInfo
  24732. + {
  24733. + get
  24734. + {
  24735. + var tagHelperAttributeInfo = this.GetAnnotationValue(TagHelperAttributeInfoKey) as TagHelperAttributeInfo;
  24736. + return tagHelperAttributeInfo;
  24737. + }
  24738. + }
  24739. +
  24740. + public MarkupMinimizedTagHelperAttributeSyntax WithTagHelperAttributeInfo(TagHelperAttributeInfo info)
  24741. + {
  24742. + var annotations = new List<SyntaxAnnotation>(GetAnnotations())
  24743. + {
  24744. + new SyntaxAnnotation(TagHelperAttributeInfoKey, info)
  24745. + };
  24746. +
  24747. + var newGreen = Green.WithAnnotationsGreen(annotations.ToArray());
  24748. +
  24749. + return (MarkupMinimizedTagHelperAttributeSyntax)newGreen.CreateRed(Parent, Position);
  24750. + }
  24751. + }
  24752. +}
  24753. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/MarkupTagHelperAttributeSyntax.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/MarkupTagHelperAttributeSyntax.cs
  24754. new file mode 100644
  24755. index 00000000000..4b7aea1e696
  24756. --- /dev/null
  24757. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/MarkupTagHelperAttributeSyntax.cs
  24758. @@ -0,0 +1,33 @@
  24759. +// Copyright (c) .NET Foundation. All rights reserved.
  24760. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  24761. +
  24762. +using System.Collections.Generic;
  24763. +
  24764. +namespace Microsoft.AspNetCore.Razor.Language.Syntax
  24765. +{
  24766. + internal sealed partial class MarkupTagHelperAttributeSyntax
  24767. + {
  24768. + private static readonly string TagHelperAttributeInfoKey = typeof(TagHelperAttributeInfo).Name;
  24769. +
  24770. + public TagHelperAttributeInfo TagHelperAttributeInfo
  24771. + {
  24772. + get
  24773. + {
  24774. + var tagHelperAttributeInfo = this.GetAnnotationValue(TagHelperAttributeInfoKey) as TagHelperAttributeInfo;
  24775. + return tagHelperAttributeInfo;
  24776. + }
  24777. + }
  24778. +
  24779. + public MarkupTagHelperAttributeSyntax WithTagHelperAttributeInfo(TagHelperAttributeInfo info)
  24780. + {
  24781. + var annotations = new List<SyntaxAnnotation>(GetAnnotations())
  24782. + {
  24783. + new SyntaxAnnotation(TagHelperAttributeInfoKey, info)
  24784. + };
  24785. +
  24786. + var newGreen = Green.WithAnnotationsGreen(annotations.ToArray());
  24787. +
  24788. + return (MarkupTagHelperAttributeSyntax)newGreen.CreateRed(Parent, Position);
  24789. + }
  24790. + }
  24791. +}
  24792. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/MarkupTagHelperElementSyntax.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/MarkupTagHelperElementSyntax.cs
  24793. new file mode 100644
  24794. index 00000000000..eaca56474a8
  24795. --- /dev/null
  24796. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/MarkupTagHelperElementSyntax.cs
  24797. @@ -0,0 +1,33 @@
  24798. +// Copyright (c) .NET Foundation. All rights reserved.
  24799. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  24800. +
  24801. +using System.Collections.Generic;
  24802. +
  24803. +namespace Microsoft.AspNetCore.Razor.Language.Syntax
  24804. +{
  24805. + internal sealed partial class MarkupTagHelperElementSyntax
  24806. + {
  24807. + private static readonly string TagHelperInfoKey = typeof(TagHelperInfo).Name;
  24808. +
  24809. + public TagHelperInfo TagHelperInfo
  24810. + {
  24811. + get
  24812. + {
  24813. + var tagHelperInfo = this.GetAnnotationValue(TagHelperInfoKey) as TagHelperInfo;
  24814. + return tagHelperInfo;
  24815. + }
  24816. + }
  24817. +
  24818. + public MarkupTagHelperElementSyntax WithTagHelperInfo(TagHelperInfo info)
  24819. + {
  24820. + var annotations = new List<SyntaxAnnotation>(GetAnnotations())
  24821. + {
  24822. + new SyntaxAnnotation(TagHelperInfoKey, info)
  24823. + };
  24824. +
  24825. + var newGreen = Green.WithAnnotationsGreen(annotations.ToArray());
  24826. +
  24827. + return (MarkupTagHelperElementSyntax)newGreen.CreateRed(Parent, Position);
  24828. + }
  24829. + }
  24830. +}
  24831. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/ParserState.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/ParserState.cs
  24832. deleted file mode 100644
  24833. index adb81967dd8..00000000000
  24834. --- a/src/Microsoft.AspNetCore.Razor.Language/Syntax/ParserState.cs
  24835. +++ /dev/null
  24836. @@ -1,14 +0,0 @@
  24837. -// Copyright (c) .NET Foundation. All rights reserved.
  24838. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  24839. -
  24840. -namespace Microsoft.AspNetCore.Razor.Language
  24841. -{
  24842. - internal enum ParserState
  24843. - {
  24844. - Unknown,
  24845. - Misc,
  24846. - Content,
  24847. - StartTag,
  24848. - EndTag,
  24849. - }
  24850. -}
  24851. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/RazorDirectiveSyntax.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/RazorDirectiveSyntax.cs
  24852. new file mode 100644
  24853. index 00000000000..cd23fda5020
  24854. --- /dev/null
  24855. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/RazorDirectiveSyntax.cs
  24856. @@ -0,0 +1,33 @@
  24857. +// Copyright (c) .NET Foundation. All rights reserved.
  24858. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  24859. +
  24860. +using System.Collections.Generic;
  24861. +
  24862. +namespace Microsoft.AspNetCore.Razor.Language.Syntax
  24863. +{
  24864. + internal sealed partial class RazorDirectiveSyntax
  24865. + {
  24866. + private static readonly string DirectiveDescriptorKey = typeof(DirectiveDescriptor).Name;
  24867. +
  24868. + public DirectiveDescriptor DirectiveDescriptor
  24869. + {
  24870. + get
  24871. + {
  24872. + var descriptor = this.GetAnnotationValue(DirectiveDescriptorKey) as DirectiveDescriptor;
  24873. + return descriptor;
  24874. + }
  24875. + }
  24876. +
  24877. + public RazorDirectiveSyntax WithDirectiveDescriptor(DirectiveDescriptor descriptor)
  24878. + {
  24879. + var annotations = new List<SyntaxAnnotation>(GetAnnotations())
  24880. + {
  24881. + new SyntaxAnnotation(DirectiveDescriptorKey, descriptor)
  24882. + };
  24883. +
  24884. + var newGreen = Green.WithAnnotationsGreen(annotations.ToArray());
  24885. +
  24886. + return (RazorDirectiveSyntax)newGreen.CreateRed(Parent, Position);
  24887. + }
  24888. + }
  24889. +}
  24890. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/RazorSyntaxNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/RazorSyntaxNode.cs
  24891. new file mode 100644
  24892. index 00000000000..6ed220f3d10
  24893. --- /dev/null
  24894. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/RazorSyntaxNode.cs
  24895. @@ -0,0 +1,13 @@
  24896. +// Copyright (c) .NET Foundation. All rights reserved.
  24897. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  24898. +
  24899. +namespace Microsoft.AspNetCore.Razor.Language.Syntax
  24900. +{
  24901. + internal abstract partial class RazorSyntaxNode : SyntaxNode
  24902. + {
  24903. + public RazorSyntaxNode(GreenNode green, SyntaxNode parent, int position)
  24904. + : base(green, parent, position)
  24905. + {
  24906. + }
  24907. + }
  24908. +}
  24909. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/Syntax.xml b/src/Microsoft.AspNetCore.Razor.Language/Syntax/Syntax.xml
  24910. index 2fdd25db04b..7880c496229 100644
  24911. --- a/src/Microsoft.AspNetCore.Razor.Language/Syntax/Syntax.xml
  24912. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/Syntax.xml
  24913. @@ -1,10 +1,17 @@
  24914. <?xml version="1.0" encoding="utf-8" ?>
  24915. <Tree Root="SyntaxNode">
  24916. - <PredefinedNode Name="SyntaxToken" Base="SyntaxNode" />
  24917. + <PredefinedNode Name="RazorSyntaxNode" Base="SyntaxNode" />
  24918. + <PredefinedNode Name="SyntaxToken" Base="RazorSyntaxNode" />
  24919. <!-- Common -->
  24920. - <AbstractNode Name="RazorSyntaxNode" Base="SyntaxNode" />
  24921. + <AbstractNode Name="RazorBlockSyntax" Base="RazorSyntaxNode">
  24922. + <Field Name="Children" Type="SyntaxList&lt;RazorSyntaxNode&gt;" />
  24923. + </AbstractNode>
  24924. + <Node Name="RazorDocumentSyntax" Base="RazorSyntaxNode">
  24925. + <Kind Name="RazorDocument" />
  24926. + <Field Name="Document" Type="RazorBlockSyntax" />
  24927. + </Node>
  24928. <Node Name="RazorCommentBlockSyntax" Base="RazorSyntaxNode">
  24929. <Kind Name="RazorComment" />
  24930. <Field Name="StartCommentTransition" Type="SyntaxToken">
  24931. @@ -13,8 +20,8 @@
  24932. <Field Name="StartCommentStar" Type="SyntaxToken">
  24933. <Kind Name="RazorCommentStar" />
  24934. </Field>
  24935. - <Field Name="Comment" Type="SyntaxToken" Optional="true">
  24936. - <Kind Name="RazorComment" />
  24937. + <Field Name="Comment" Type="SyntaxToken">
  24938. + <Kind Name="RazorCommentLiteral" />
  24939. </Field>
  24940. <Field Name="EndCommentStar" Type="SyntaxToken">
  24941. <Kind Name="RazorCommentStar" />
  24942. @@ -23,39 +30,147 @@
  24943. <Kind Name="RazorCommentTransition" />
  24944. </Field>
  24945. </Node>
  24946. + <Node Name="RazorMetaCodeSyntax" Base="RazorSyntaxNode">
  24947. + <Kind Name="RazorMetaCode" />
  24948. + <Field Name="MetaCode" Type="SyntaxList&lt;SyntaxToken&gt;" />
  24949. + </Node>
  24950. + <Node Name="GenericBlockSyntax" Base="RazorBlockSyntax">
  24951. + <Kind Name="GenericBlock" />
  24952. + <Field Name="Children" Type="SyntaxList&lt;RazorSyntaxNode&gt;" Override="true" />
  24953. + </Node>
  24954. + <Node Name="UnclassifiedTextLiteralSyntax" Base="RazorSyntaxNode">
  24955. + <Kind Name="UnclassifiedTextLiteral" />
  24956. + <Field Name="LiteralTokens" Type="SyntaxList&lt;SyntaxToken&gt;" />
  24957. + </Node>
  24958. - <!-- HTML -->
  24959. - <AbstractNode Name="HtmlSyntaxNode" Base="RazorSyntaxNode" />
  24960. - <Node Name="HtmlTextLiteralSyntax" Base="HtmlSyntaxNode">
  24961. - <Kind Name="HtmlTextLiteral" />
  24962. - <Field Name="TextTokens" Type="SyntaxList&lt;SyntaxToken&gt;" />
  24963. + <!-- Markup -->
  24964. + <AbstractNode Name="MarkupSyntaxNode" Base="RazorSyntaxNode" />
  24965. + <Node Name="MarkupBlockSyntax" Base="RazorBlockSyntax">
  24966. + <Kind Name="MarkupBlock" />
  24967. + <Field Name="Children" Type="SyntaxList&lt;RazorSyntaxNode&gt;" Override="true" />
  24968. + </Node>
  24969. + <Node Name="MarkupTransitionSyntax" Base="MarkupSyntaxNode">
  24970. + <Kind Name="MarkupTransition" />
  24971. + <Field Name="TransitionTokens" Type="SyntaxList&lt;SyntaxToken&gt;" />
  24972. + </Node>
  24973. + <Node Name="MarkupTextLiteralSyntax" Base="MarkupSyntaxNode">
  24974. + <Kind Name="MarkupTextLiteral" />
  24975. + <Field Name="LiteralTokens" Type="SyntaxList&lt;SyntaxToken&gt;" />
  24976. + </Node>
  24977. + <Node Name="MarkupEphemeralTextLiteralSyntax" Base="MarkupSyntaxNode">
  24978. + <Kind Name="MarkupEphemeralTextLiteral" />
  24979. + <Field Name="LiteralTokens" Type="SyntaxList&lt;SyntaxToken&gt;" />
  24980. + </Node>
  24981. + <Node Name="MarkupCommentBlockSyntax" Base="RazorBlockSyntax">
  24982. + <Kind Name="MarkupCommentBlock" />
  24983. + <Field Name="Children" Type="SyntaxList&lt;RazorSyntaxNode&gt;" Override="true" />
  24984. + </Node>
  24985. + <Node Name="MarkupTagBlockSyntax" Base="RazorBlockSyntax">
  24986. + <Kind Name="MarkupTagBlock" />
  24987. + <Field Name="Children" Type="SyntaxList&lt;RazorSyntaxNode&gt;" Override="true" />
  24988. + </Node>
  24989. + <Node Name="MarkupMinimizedAttributeBlockSyntax" Base="MarkupSyntaxNode">
  24990. + <Kind Name="MarkupMinimizedAttributeBlock" />
  24991. + <Field Name="NamePrefix" Type="MarkupTextLiteralSyntax" Optional="true" />
  24992. + <Field Name="Name" Type="MarkupTextLiteralSyntax" />
  24993. + </Node>
  24994. + <Node Name="MarkupAttributeBlockSyntax" Base="MarkupSyntaxNode">
  24995. + <Kind Name="MarkupAttributeBlock" />
  24996. + <Field Name="NamePrefix" Type="MarkupTextLiteralSyntax" Optional="true" />
  24997. + <Field Name="Name" Type="MarkupTextLiteralSyntax" />
  24998. + <Field Name="NameSuffix" Type="MarkupTextLiteralSyntax" Optional="true" />
  24999. + <Field Name="EqualsToken" Type="SyntaxToken">
  25000. + <Kind Name="Equals" />
  25001. + </Field>
  25002. + <Field Name="ValuePrefix" Type="MarkupTextLiteralSyntax" Optional="true" />
  25003. + <Field Name="Value" Type="RazorBlockSyntax" Optional="true" />
  25004. + <Field Name="ValueSuffix" Type="MarkupTextLiteralSyntax" Optional="true" />
  25005. + </Node>
  25006. + <Node Name="MarkupLiteralAttributeValueSyntax" Base="MarkupSyntaxNode">
  25007. + <Kind Name="MarkupLiteralAttributeValue" />
  25008. + <Field Name="Prefix" Type="MarkupTextLiteralSyntax" Optional="true" />
  25009. + <Field Name="Value" Type="MarkupTextLiteralSyntax" Optional="true" />
  25010. + </Node>
  25011. + <Node Name="MarkupDynamicAttributeValueSyntax" Base="MarkupSyntaxNode">
  25012. + <Kind Name="MarkupDynamicAttributeValue" />
  25013. + <Field Name="Prefix" Type="MarkupTextLiteralSyntax" Optional="true" />
  25014. + <Field Name="Value" Type="RazorBlockSyntax" />
  25015. + </Node>
  25016. + <Node Name="MarkupElementSyntax" Base="MarkupSyntaxNode">
  25017. + <Kind Name="MarkupElement" />
  25018. + <Field Name="StartTag" Type="MarkupTagBlockSyntax" Optional="true" />
  25019. + <Field Name="Body" Type="SyntaxList&lt;RazorSyntaxNode&gt;" Optional="true" />
  25020. + <Field Name="EndTag" Type="MarkupTagBlockSyntax" Optional="true" />
  25021. + </Node>
  25022. + <Node Name="MarkupTagHelperElementSyntax" Base="MarkupSyntaxNode">
  25023. + <Kind Name="MarkupTagHelperElement" />
  25024. + <Field Name="StartTag" Type="MarkupTagHelperStartTagSyntax" />
  25025. + <Field Name="Body" Type="SyntaxList&lt;RazorSyntaxNode&gt;" Optional="true" />
  25026. + <Field Name="EndTag" Type="MarkupTagHelperEndTagSyntax" Optional="true" />
  25027. + </Node>
  25028. + <Node Name="MarkupTagHelperStartTagSyntax" Base="RazorBlockSyntax">
  25029. + <Kind Name="MarkupTagHelperStartTag" />
  25030. + <Field Name="Children" Type="SyntaxList&lt;RazorSyntaxNode&gt;" Override="true" />
  25031. + </Node>
  25032. + <Node Name="MarkupTagHelperEndTagSyntax" Base="RazorBlockSyntax">
  25033. + <Kind Name="MarkupTagHelperEndTag" />
  25034. + <Field Name="Children" Type="SyntaxList&lt;RazorSyntaxNode&gt;" Override="true" />
  25035. + </Node>
  25036. + <Node Name="MarkupTagHelperAttributeSyntax" Base="MarkupSyntaxNode">
  25037. + <Kind Name="MarkupTagHelperAttribute" />
  25038. + <Field Name="NamePrefix" Type="MarkupTextLiteralSyntax" Optional="true" />
  25039. + <Field Name="Name" Type="MarkupTextLiteralSyntax" />
  25040. + <Field Name="NameSuffix" Type="MarkupTextLiteralSyntax" Optional="true" />
  25041. + <Field Name="EqualsToken" Type="SyntaxToken">
  25042. + <Kind Name="Equals" />
  25043. + </Field>
  25044. + <Field Name="ValuePrefix" Type="MarkupTextLiteralSyntax" Optional="true" />
  25045. + <Field Name="Value" Type="MarkupTagHelperAttributeValueSyntax" />
  25046. + <Field Name="ValueSuffix" Type="MarkupTextLiteralSyntax" Optional="true" />
  25047. + </Node>
  25048. + <Node Name="MarkupMinimizedTagHelperAttributeSyntax" Base="MarkupSyntaxNode">
  25049. + <Kind Name="MarkupMinimizedTagHelperAttribute" />
  25050. + <Field Name="NamePrefix" Type="MarkupTextLiteralSyntax" Optional="true" />
  25051. + <Field Name="Name" Type="MarkupTextLiteralSyntax" />
  25052. + </Node>
  25053. + <Node Name="MarkupTagHelperAttributeValueSyntax" Base="RazorBlockSyntax">
  25054. + <Kind Name="MarkupTagHelperAttributeValue" />
  25055. + <Field Name="Children" Type="SyntaxList&lt;RazorSyntaxNode&gt;" Override="true" />
  25056. </Node>
  25057. <!-- CSharp -->
  25058. <AbstractNode Name="CSharpSyntaxNode" Base="RazorSyntaxNode" />
  25059. + <Node Name="CSharpCodeBlockSyntax" Base="RazorBlockSyntax">
  25060. + <Kind Name="CSharpCodeBlock" />
  25061. + <Field Name="Children" Type="SyntaxList&lt;RazorSyntaxNode&gt;" Override="true" />
  25062. + </Node>
  25063. <Node Name="CSharpTransitionSyntax" Base="CSharpSyntaxNode">
  25064. <Kind Name="CSharpTransition" />
  25065. <Field Name="Transition" Type="SyntaxToken">
  25066. <Kind Name="Transition" />
  25067. </Field>
  25068. </Node>
  25069. - <Node Name="CSharpMetaCodeSyntax" Base="CSharpSyntaxNode">
  25070. - <Kind Name="CSharpMetaCode" />
  25071. - <Field Name="MetaCode" Type="SyntaxList&lt;SyntaxToken&gt;" />
  25072. + <Node Name="CSharpStatementLiteralSyntax" Base="CSharpSyntaxNode">
  25073. + <Kind Name="CSharpStatementLiteral" />
  25074. + <Field Name="LiteralTokens" Type="SyntaxList&lt;SyntaxToken&gt;" />
  25075. </Node>
  25076. - <Node Name="CSharpCodeLiteralSyntax" Base="CSharpSyntaxNode">
  25077. - <Kind Name="CSharpCodeLiteral" />
  25078. - <Field Name="CSharpTokens" Type="SyntaxList&lt;SyntaxToken&gt;" />
  25079. + <Node Name="CSharpExpressionLiteralSyntax" Base="CSharpSyntaxNode">
  25080. + <Kind Name="CSharpExpressionLiteral" />
  25081. + <Field Name="LiteralTokens" Type="SyntaxList&lt;SyntaxToken&gt;" />
  25082. </Node>
  25083. - <Node Name="CSharpCodeBlockSyntax" Base="CSharpSyntaxNode">
  25084. - <Kind Name="CSharpCodeBlock" />
  25085. - <Field Name="Children" Type="SyntaxList&lt;RazorSyntaxNode&gt;" />
  25086. + <Node Name="CSharpEphemeralTextLiteralSyntax" Base="CSharpSyntaxNode">
  25087. + <Kind Name="CSharpEphemeralTextLiteral" />
  25088. + <Field Name="LiteralTokens" Type="SyntaxList&lt;SyntaxToken&gt;" />
  25089. + </Node>
  25090. + <Node Name="CSharpTemplateBlockSyntax" Base="RazorBlockSyntax">
  25091. + <Kind Name="CSharpTemplateBlock" />
  25092. + <Field Name="Children" Type="SyntaxList&lt;RazorSyntaxNode&gt;" Override="true" />
  25093. </Node>
  25094. - <AbstractNode Name="CSharpBlockSyntax" Base="CSharpSyntaxNode">
  25095. + <AbstractNode Name="CSharpRazorBlockSyntax" Base="CSharpSyntaxNode">
  25096. <Field Name="Transition" Type="CSharpTransitionSyntax" />
  25097. <Field Name="Body" Type="CSharpSyntaxNode" />
  25098. </AbstractNode>
  25099. - <Node Name="CSharpStatement" Base="CSharpBlockSyntax">
  25100. + <Node Name="CSharpStatementSyntax" Base="CSharpRazorBlockSyntax">
  25101. <Kind Name="CSharpStatement" />
  25102. <Field Name="Transition" Type="CSharpTransitionSyntax" Override="true">
  25103. <Kind Name="CSharpTransition" />
  25104. @@ -66,37 +181,50 @@
  25105. </Node>
  25106. <Node Name="CSharpStatementBodySyntax" Base="CSharpSyntaxNode">
  25107. <Kind Name="CSharpStatementBody" />
  25108. - <Field Name="OpenBrace" Type="CSharpMetaCodeSyntax" />
  25109. + <Field Name="OpenBrace" Type="RazorMetaCodeSyntax" />
  25110. <Field Name="CSharpCode" Type="CSharpCodeBlockSyntax" />
  25111. - <Field Name="CloseBrace" Type="CSharpMetaCodeSyntax" />
  25112. + <Field Name="CloseBrace" Type="RazorMetaCodeSyntax" />
  25113. </Node>
  25114. - <Node Name="CSharpExpression" Base="CSharpBlockSyntax">
  25115. - <Kind Name="CSharpExpression" />
  25116. + <Node Name="CSharpExplicitExpressionSyntax" Base="CSharpRazorBlockSyntax">
  25117. + <Kind Name="CSharpExplicitExpression" />
  25118. <Field Name="Transition" Type="CSharpTransitionSyntax" Override="true">
  25119. <Kind Name="CSharpTransition" />
  25120. </Field>
  25121. <Field Name="Body" Type="CSharpSyntaxNode" Override="true">
  25122. - <Kind Name="CSharpExpressionBody" />
  25123. + <Kind Name="CSharpExplicitExpressionBody" />
  25124. </Field>
  25125. </Node>
  25126. - <Node Name="CSharpExpressionBodySyntax" Base="CSharpSyntaxNode">
  25127. - <Kind Name="CSharpExpressionBody" />
  25128. - <Field Name="OpenParen" Type="CSharpMetaCodeSyntax" Optional="true" />
  25129. + <Node Name="CSharpExplicitExpressionBodySyntax" Base="CSharpSyntaxNode">
  25130. + <Kind Name="CSharpExplicitExpressionBody" />
  25131. + <Field Name="OpenParen" Type="RazorMetaCodeSyntax" />
  25132. <Field Name="CSharpCode" Type="CSharpCodeBlockSyntax" />
  25133. - <Field Name="CloseParen" Type="CSharpMetaCodeSyntax" Optional="true" />
  25134. + <Field Name="CloseParen" Type="RazorMetaCodeSyntax" />
  25135. </Node>
  25136. - <Node Name="CSharpDirectiveSyntax" Base="CSharpBlockSyntax">
  25137. - <Kind Name="CSharpDirective" />
  25138. + <Node Name="CSharpImplicitExpressionSyntax" Base="CSharpRazorBlockSyntax">
  25139. + <Kind Name="CSharpImplicitExpression" />
  25140. <Field Name="Transition" Type="CSharpTransitionSyntax" Override="true">
  25141. <Kind Name="CSharpTransition" />
  25142. </Field>
  25143. <Field Name="Body" Type="CSharpSyntaxNode" Override="true">
  25144. - <Kind Name="CSharpDirectiveBody" />
  25145. + <Kind Name="CSharpImplicitExpressionBody" />
  25146. </Field>
  25147. </Node>
  25148. - <Node Name="CSharpDirectiveBodySyntax" Base="CSharpSyntaxNode">
  25149. - <Kind Name="CSharpDirectiveBody" />
  25150. - <Field Name="Keyword" Type="CSharpMetaCodeSyntax" />
  25151. + <Node Name="CSharpImplicitExpressionBodySyntax" Base="CSharpSyntaxNode">
  25152. + <Kind Name="CSharpImplicitExpressionBody" />
  25153. <Field Name="CSharpCode" Type="CSharpCodeBlockSyntax" />
  25154. </Node>
  25155. + <Node Name="RazorDirectiveSyntax" Base="CSharpRazorBlockSyntax">
  25156. + <Kind Name="RazorDirective" />
  25157. + <Field Name="Transition" Type="CSharpTransitionSyntax" Override="true">
  25158. + <Kind Name="CSharpTransition" />
  25159. + </Field>
  25160. + <Field Name="Body" Type="CSharpSyntaxNode" Override="true">
  25161. + <Kind Name="RazorDirectiveBody" />
  25162. + </Field>
  25163. + </Node>
  25164. + <Node Name="RazorDirectiveBodySyntax" Base="CSharpSyntaxNode">
  25165. + <Kind Name="RazorDirectiveBody" />
  25166. + <Field Name="Keyword" Type="RazorSyntaxNode" />
  25167. + <Field Name="CSharpCode" Type="CSharpCodeBlockSyntax" Optional="true" />
  25168. + </Node>
  25169. </Tree>
  25170. \ No newline at end of file
  25171. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxAnnotation.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxAnnotation.cs
  25172. index dbb72fb1ae7..e6393354757 100644
  25173. --- a/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxAnnotation.cs
  25174. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxAnnotation.cs
  25175. @@ -21,7 +21,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  25176. // use a value identity instead of object identity so a deserialized instance matches the original instance.
  25177. public string Kind { get; }
  25178. - public string Data { get; }
  25179. + public object Data { get; }
  25180. public SyntaxAnnotation()
  25181. {
  25182. @@ -34,7 +34,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  25183. Kind = kind;
  25184. }
  25185. - public SyntaxAnnotation(string kind, string data)
  25186. + public SyntaxAnnotation(string kind, object data)
  25187. : this(kind)
  25188. {
  25189. Data = data;
  25190. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxExtensions.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxExtensions.cs
  25191. new file mode 100644
  25192. index 00000000000..055180ca97d
  25193. --- /dev/null
  25194. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxExtensions.cs
  25195. @@ -0,0 +1,53 @@
  25196. +// Copyright (c) .NET Foundation. All rights reserved.
  25197. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  25198. +
  25199. +namespace Microsoft.AspNetCore.Razor.Language.Syntax
  25200. +{
  25201. + internal partial class MarkupTextLiteralSyntax
  25202. + {
  25203. + protected override string GetDebuggerDisplay()
  25204. + {
  25205. + return string.Format("{0} [{1}]", base.GetDebuggerDisplay(), this.GetContent());
  25206. + }
  25207. + }
  25208. +
  25209. + internal partial class MarkupEphemeralTextLiteralSyntax
  25210. + {
  25211. + protected override string GetDebuggerDisplay()
  25212. + {
  25213. + return string.Format("{0} [{1}]", base.GetDebuggerDisplay(), this.GetContent());
  25214. + }
  25215. + }
  25216. +
  25217. + internal partial class CSharpStatementLiteralSyntax
  25218. + {
  25219. + protected override string GetDebuggerDisplay()
  25220. + {
  25221. + return string.Format("{0} [{1}]", base.GetDebuggerDisplay(), this.GetContent());
  25222. + }
  25223. + }
  25224. +
  25225. + internal partial class CSharpExpressionLiteralSyntax
  25226. + {
  25227. + protected override string GetDebuggerDisplay()
  25228. + {
  25229. + return string.Format("{0} [{1}]", base.GetDebuggerDisplay(), this.GetContent());
  25230. + }
  25231. + }
  25232. +
  25233. + internal partial class CSharpEphemeralTextLiteralSyntax
  25234. + {
  25235. + protected override string GetDebuggerDisplay()
  25236. + {
  25237. + return string.Format("{0} [{1}]", base.GetDebuggerDisplay(), this.GetContent());
  25238. + }
  25239. + }
  25240. +
  25241. + internal partial class UnclassifiedTextLiteralSyntax
  25242. + {
  25243. + protected override string GetDebuggerDisplay()
  25244. + {
  25245. + return string.Format("{0} [{1}]", base.GetDebuggerDisplay(), this.GetContent());
  25246. + }
  25247. + }
  25248. +}
  25249. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxFactory.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxFactory.cs
  25250. index 98568d21d2a..4e619799db6 100644
  25251. --- a/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxFactory.cs
  25252. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxFactory.cs
  25253. @@ -14,5 +14,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  25254. {
  25255. return new SyntaxToken(InternalSyntax.SyntaxFactory.Token(kind, content), parent: null, position: 0);
  25256. }
  25257. +
  25258. + internal static SyntaxToken MissingToken(SyntaxKind kind, params RazorDiagnostic[] diagnostics)
  25259. + {
  25260. + return new SyntaxToken(InternalSyntax.SyntaxFactory.MissingToken(kind, diagnostics), parent: null, position: 0);
  25261. + }
  25262. }
  25263. }
  25264. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxKind.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxKind.cs
  25265. index 59cddf71160..75dd554ab61 100644
  25266. --- a/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxKind.cs
  25267. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxKind.cs
  25268. @@ -6,31 +6,53 @@ namespace Microsoft.AspNetCore.Razor.Language
  25269. internal enum SyntaxKind : byte
  25270. {
  25271. #region Nodes
  25272. - // HTML
  25273. - HtmlTextLiteral,
  25274. - HtmlDocument,
  25275. - HtmlDeclaration,
  25276. + // Common
  25277. + RazorDocument,
  25278. + GenericBlock,
  25279. + RazorComment,
  25280. + RazorMetaCode,
  25281. + RazorDirective,
  25282. + RazorDirectiveBody,
  25283. + UnclassifiedTextLiteral,
  25284. +
  25285. + // Markup
  25286. + MarkupBlock,
  25287. + MarkupTransition,
  25288. + MarkupElement,
  25289. + MarkupTagBlock,
  25290. + MarkupTextLiteral,
  25291. + MarkupEphemeralTextLiteral,
  25292. + MarkupCommentBlock,
  25293. + MarkupAttributeBlock,
  25294. + MarkupMinimizedAttributeBlock,
  25295. + MarkupLiteralAttributeValue,
  25296. + MarkupDynamicAttributeValue,
  25297. + MarkupTagHelperElement,
  25298. + MarkupTagHelperStartTag,
  25299. + MarkupTagHelperEndTag,
  25300. + MarkupTagHelperAttribute,
  25301. + MarkupMinimizedTagHelperAttribute,
  25302. + MarkupTagHelperAttributeValue,
  25303. // CSharp
  25304. - CSharpBlock,
  25305. CSharpStatement,
  25306. CSharpStatementBody,
  25307. - CSharpExpression,
  25308. - CSharpExpressionBody,
  25309. - CSharpDirective,
  25310. - CSharpDirectiveBody,
  25311. + CSharpExplicitExpression,
  25312. + CSharpExplicitExpressionBody,
  25313. + CSharpImplicitExpression,
  25314. + CSharpImplicitExpressionBody,
  25315. CSharpCodeBlock,
  25316. - CSharpCodeLiteral,
  25317. - CSharpMetaCode,
  25318. + CSharpTemplateBlock,
  25319. + CSharpStatementLiteral,
  25320. + CSharpExpressionLiteral,
  25321. + CSharpEphemeralTextLiteral,
  25322. CSharpTransition,
  25323. -
  25324. - // Common
  25325. - RazorComment,
  25326. #endregion
  25327. #region Tokens
  25328. // Common
  25329. - Unknown,
  25330. + None,
  25331. + Marker,
  25332. List,
  25333. Whitespace,
  25334. NewLine,
  25335. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxNode.Iterators.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxNode.Iterators.cs
  25336. new file mode 100644
  25337. index 00000000000..e619a75b2c2
  25338. --- /dev/null
  25339. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxNode.Iterators.cs
  25340. @@ -0,0 +1,126 @@
  25341. +// Copyright (c) .NET Foundation. All rights reserved.
  25342. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  25343. +
  25344. +using System;
  25345. +using System.Collections.Generic;
  25346. +
  25347. +namespace Microsoft.AspNetCore.Razor.Language.Syntax
  25348. +{
  25349. + internal abstract partial class SyntaxNode
  25350. + {
  25351. + private IEnumerable<SyntaxNode> DescendantNodesImpl(TextSpan span, Func<SyntaxNode, bool> descendIntoChildren, bool includeSelf)
  25352. + {
  25353. + if (includeSelf && IsInSpan(in span, FullSpan))
  25354. + {
  25355. + yield return this;
  25356. + }
  25357. +
  25358. + using (var stack = new ChildSyntaxListEnumeratorStack(this, descendIntoChildren))
  25359. + {
  25360. + while (stack.IsNotEmpty)
  25361. + {
  25362. + var nodeValue = stack.TryGetNextAsNodeInSpan(in span);
  25363. + if (nodeValue != null)
  25364. + {
  25365. + // PERF: Push before yield return so that "nodeValue" is 'dead' after the yield
  25366. + // and therefore doesn't need to be stored in the iterator state machine. This
  25367. + // saves a field.
  25368. + stack.PushChildren(nodeValue, descendIntoChildren);
  25369. +
  25370. + yield return nodeValue;
  25371. + }
  25372. + }
  25373. + }
  25374. + }
  25375. +
  25376. + private static bool IsInSpan(in TextSpan span, TextSpan childSpan)
  25377. + {
  25378. + return span.OverlapsWith(childSpan)
  25379. + // special case for zero-width tokens (OverlapsWith never returns true for these)
  25380. + || (childSpan.Length == 0 && span.IntersectsWith(childSpan));
  25381. + }
  25382. +
  25383. + private struct ChildSyntaxListEnumeratorStack : IDisposable
  25384. + {
  25385. + private static readonly ObjectPool<ChildSyntaxList.Enumerator[]> StackPool = new ObjectPool<ChildSyntaxList.Enumerator[]>(() => new ChildSyntaxList.Enumerator[16]);
  25386. +
  25387. + private ChildSyntaxList.Enumerator[] _stack;
  25388. + private int _stackPtr;
  25389. +
  25390. + public ChildSyntaxListEnumeratorStack(SyntaxNode startingNode, Func<SyntaxNode, bool> descendIntoChildren)
  25391. + {
  25392. + if (descendIntoChildren == null || descendIntoChildren(startingNode))
  25393. + {
  25394. + _stack = StackPool.Allocate();
  25395. + _stackPtr = 0;
  25396. + _stack[0].InitializeFrom(startingNode);
  25397. + }
  25398. + else
  25399. + {
  25400. + _stack = null;
  25401. + _stackPtr = -1;
  25402. + }
  25403. + }
  25404. +
  25405. + public bool IsNotEmpty { get { return _stackPtr >= 0; } }
  25406. +
  25407. + public bool TryGetNextInSpan(in TextSpan span, out SyntaxNode value)
  25408. + {
  25409. + while (_stack[_stackPtr].TryMoveNextAndGetCurrent(out value))
  25410. + {
  25411. + if (IsInSpan(in span, value.FullSpan))
  25412. + {
  25413. + return true;
  25414. + }
  25415. + }
  25416. +
  25417. + _stackPtr--;
  25418. + return false;
  25419. + }
  25420. +
  25421. + public SyntaxNode TryGetNextAsNodeInSpan(in TextSpan span)
  25422. + {
  25423. + SyntaxNode nodeValue;
  25424. + while ((nodeValue = _stack[_stackPtr].TryMoveNextAndGetCurrentAsNode()) != null)
  25425. + {
  25426. + if (IsInSpan(in span, nodeValue.FullSpan))
  25427. + {
  25428. + return nodeValue;
  25429. + }
  25430. + }
  25431. +
  25432. + _stackPtr--;
  25433. + return null;
  25434. + }
  25435. +
  25436. + public void PushChildren(SyntaxNode node)
  25437. + {
  25438. + if (++_stackPtr >= _stack.Length)
  25439. + {
  25440. + // Geometric growth
  25441. + Array.Resize(ref _stack, checked(_stackPtr * 2));
  25442. + }
  25443. +
  25444. + _stack[_stackPtr].InitializeFrom(node);
  25445. + }
  25446. +
  25447. + public void PushChildren(SyntaxNode node, Func<SyntaxNode, bool> descendIntoChildren)
  25448. + {
  25449. + if (descendIntoChildren == null || descendIntoChildren(node))
  25450. + {
  25451. + PushChildren(node);
  25452. + }
  25453. + }
  25454. +
  25455. + public void Dispose()
  25456. + {
  25457. + // Return only reasonably-sized stacks to the pool.
  25458. + if (_stack?.Length < 256)
  25459. + {
  25460. + Array.Clear(_stack, 0, _stack.Length);
  25461. + StackPool.Free(_stack);
  25462. + }
  25463. + }
  25464. + }
  25465. + }
  25466. +}
  25467. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxNode.cs
  25468. index 1c63ed9663b..2f58f13fe3d 100644
  25469. --- a/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxNode.cs
  25470. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxNode.cs
  25471. @@ -1,12 +1,16 @@
  25472. // Copyright (c) .NET Foundation. All rights reserved.
  25473. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  25474. +using System;
  25475. +using System.Collections.Generic;
  25476. using System.Diagnostics;
  25477. +using System.Text;
  25478. using System.Threading;
  25479. namespace Microsoft.AspNetCore.Razor.Language.Syntax
  25480. {
  25481. - internal abstract class SyntaxNode
  25482. + [DebuggerDisplay("{GetDebuggerDisplay(), nq}")]
  25483. + internal abstract partial class SyntaxNode
  25484. {
  25485. public SyntaxNode(GreenNode green, SyntaxNode parent, int position)
  25486. {
  25487. @@ -60,6 +64,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  25488. public bool IsMissing => Green.IsMissing;
  25489. + public bool IsToken => Green.IsToken;
  25490. +
  25491. + public bool IsTrivia => Green.IsTrivia;
  25492. +
  25493. public bool HasLeadingTrivia
  25494. {
  25495. get
  25496. @@ -80,6 +88,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  25497. public bool ContainsAnnotations => Green.ContainsAnnotations;
  25498. + internal string SerializedValue => SyntaxSerializer.Serialize(this);
  25499. +
  25500. public abstract TResult Accept<TResult>(SyntaxVisitor<TResult> visitor);
  25501. public abstract void Accept(SyntaxVisitor visitor);
  25502. @@ -253,18 +263,102 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  25503. do
  25504. {
  25505. + SyntaxNode lastChild = null;
  25506. for (var i = node.SlotCount - 1; i >= 0; i--)
  25507. {
  25508. var child = node.GetNodeSlot(i);
  25509. - if (child != null)
  25510. + if (child != null && child.FullWidth > 0)
  25511. {
  25512. - node = child;
  25513. + lastChild = child;
  25514. break;
  25515. }
  25516. }
  25517. - } while (node.SlotCount != 0);
  25518. + node = lastChild;
  25519. + } while (node?.SlotCount > 0);
  25520. - return node == this ? this : node;
  25521. + return node;
  25522. + }
  25523. +
  25524. + /// <summary>
  25525. + /// The list of child nodes of this node, where each element is a SyntaxNode instance.
  25526. + /// </summary>
  25527. + public ChildSyntaxList ChildNodes()
  25528. + {
  25529. + return new ChildSyntaxList(this);
  25530. + }
  25531. +
  25532. + /// <summary>
  25533. + /// Gets a list of ancestor nodes
  25534. + /// </summary>
  25535. + public IEnumerable<SyntaxNode> Ancestors()
  25536. + {
  25537. + return Parent?
  25538. + .AncestorsAndSelf() ??
  25539. + Array.Empty<SyntaxNode>();
  25540. + }
  25541. +
  25542. + /// <summary>
  25543. + /// Gets a list of ancestor nodes (including this node)
  25544. + /// </summary>
  25545. + public IEnumerable<SyntaxNode> AncestorsAndSelf()
  25546. + {
  25547. + for (var node = this; node != null; node = node.Parent)
  25548. + {
  25549. + yield return node;
  25550. + }
  25551. + }
  25552. +
  25553. + /// <summary>
  25554. + /// Gets the first node of type TNode that matches the predicate.
  25555. + /// </summary>
  25556. + public TNode FirstAncestorOrSelf<TNode>(Func<TNode, bool> predicate = null)
  25557. + where TNode : SyntaxNode
  25558. + {
  25559. + for (var node = this; node != null; node = node.Parent)
  25560. + {
  25561. + if (node is TNode tnode && (predicate == null || predicate(tnode)))
  25562. + {
  25563. + return tnode;
  25564. + }
  25565. + }
  25566. +
  25567. + return default;
  25568. + }
  25569. +
  25570. + /// <summary>
  25571. + /// Gets a list of descendant nodes in prefix document order.
  25572. + /// </summary>
  25573. + /// <param name="descendIntoChildren">An optional function that determines if the search descends into the argument node's children.</param>
  25574. + public IEnumerable<SyntaxNode> DescendantNodes(Func<SyntaxNode, bool> descendIntoChildren = null)
  25575. + {
  25576. + return DescendantNodesImpl(FullSpan, descendIntoChildren, includeSelf: false);
  25577. + }
  25578. +
  25579. + /// <summary>
  25580. + /// Gets a list of descendant nodes (including this node) in prefix document order.
  25581. + /// </summary>
  25582. + /// <param name="descendIntoChildren">An optional function that determines if the search descends into the argument node's children.</param>
  25583. + public IEnumerable<SyntaxNode> DescendantNodesAndSelf(Func<SyntaxNode, bool> descendIntoChildren = null)
  25584. + {
  25585. + return DescendantNodesImpl(FullSpan, descendIntoChildren, includeSelf: true);
  25586. + }
  25587. +
  25588. + protected internal SyntaxNode ReplaceCore<TNode>(
  25589. + IEnumerable<TNode> nodes = null,
  25590. + Func<TNode, TNode, SyntaxNode> computeReplacementNode = null)
  25591. + where TNode : SyntaxNode
  25592. + {
  25593. + return SyntaxReplacer.Replace(this, nodes, computeReplacementNode);
  25594. + }
  25595. +
  25596. + protected internal SyntaxNode ReplaceNodeInListCore(SyntaxNode originalNode, IEnumerable<SyntaxNode> replacementNodes)
  25597. + {
  25598. + return SyntaxReplacer.ReplaceNodeInList(this, originalNode, replacementNodes);
  25599. + }
  25600. +
  25601. + protected internal SyntaxNode InsertNodesInListCore(SyntaxNode nodeInList, IEnumerable<SyntaxNode> nodesToInsert, bool insertBefore)
  25602. + {
  25603. + return SyntaxReplacer.InsertNodeInList(this, nodeInList, nodesToInsert, insertBefore);
  25604. }
  25605. public RazorDiagnostic[] GetDiagnostics()
  25606. @@ -294,12 +388,26 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  25607. public override string ToString()
  25608. {
  25609. - return Green.ToString();
  25610. + var builder = new StringBuilder();
  25611. + builder.Append(Green.ToString());
  25612. + builder.AppendFormat(" at {0}::{1}", Position, FullWidth);
  25613. +
  25614. + return builder.ToString();
  25615. }
  25616. public virtual string ToFullString()
  25617. {
  25618. return Green.ToFullString();
  25619. }
  25620. +
  25621. + protected virtual string GetDebuggerDisplay()
  25622. + {
  25623. + if (IsToken)
  25624. + {
  25625. + return string.Format("{0};[{1}]", Kind, ToFullString());
  25626. + }
  25627. +
  25628. + return string.Format("{0} [{1}..{2})", Kind, Position, EndPosition);
  25629. + }
  25630. }
  25631. }
  25632. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxNodeExtensions.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxNodeExtensions.cs
  25633. index 21ae1260efa..86b8cf4a19e 100644
  25634. --- a/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxNodeExtensions.cs
  25635. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxNodeExtensions.cs
  25636. @@ -1,13 +1,339 @@
  25637. // Copyright (c) .NET Foundation. All rights reserved.
  25638. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  25639. +using System;
  25640. +using System.Collections.Generic;
  25641. +using System.Diagnostics;
  25642. +using System.Linq;
  25643. +using Microsoft.AspNetCore.Razor.Language.Legacy;
  25644. +
  25645. namespace Microsoft.AspNetCore.Razor.Language.Syntax
  25646. {
  25647. internal static class SyntaxNodeExtensions
  25648. {
  25649. + // From http://dev.w3.org/html5/spec/Overview.html#elements-0
  25650. + private static readonly HashSet<string> VoidElements = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
  25651. + {
  25652. + "area",
  25653. + "base",
  25654. + "br",
  25655. + "col",
  25656. + "command",
  25657. + "embed",
  25658. + "hr",
  25659. + "img",
  25660. + "input",
  25661. + "keygen",
  25662. + "link",
  25663. + "meta",
  25664. + "param",
  25665. + "source",
  25666. + "track",
  25667. + "wbr"
  25668. + };
  25669. +
  25670. public static TNode WithAnnotations<TNode>(this TNode node, params SyntaxAnnotation[] annotations) where TNode : SyntaxNode
  25671. {
  25672. - return (TNode)node.Green.SetAnnotations(annotations).CreateRed();
  25673. + if (node == null)
  25674. + {
  25675. + throw new ArgumentNullException(nameof(node));
  25676. + }
  25677. +
  25678. + return (TNode)node.Green.SetAnnotations(annotations).CreateRed(node.Parent, node.Position);
  25679. + }
  25680. +
  25681. + public static object GetAnnotationValue<TNode>(this TNode node, string key) where TNode : SyntaxNode
  25682. + {
  25683. + if (node == null)
  25684. + {
  25685. + throw new ArgumentNullException(nameof(node));
  25686. + }
  25687. +
  25688. + var annotation = node.GetAnnotations().FirstOrDefault(n => n.Kind == key);
  25689. + return annotation?.Data;
  25690. + }
  25691. +
  25692. + public static TNode WithDiagnostics<TNode>(this TNode node, params RazorDiagnostic[] diagnostics) where TNode : SyntaxNode
  25693. + {
  25694. + if (node == null)
  25695. + {
  25696. + throw new ArgumentNullException(nameof(node));
  25697. + }
  25698. +
  25699. + return (TNode)node.Green.SetDiagnostics(diagnostics).CreateRed(node.Parent, node.Position);
  25700. + }
  25701. +
  25702. + public static TNode AppendDiagnostic<TNode>(this TNode node, params RazorDiagnostic[] diagnostics) where TNode : SyntaxNode
  25703. + {
  25704. + if (node == null)
  25705. + {
  25706. + throw new ArgumentNullException(nameof(node));
  25707. + }
  25708. +
  25709. + var existingDiagnostics = node.GetDiagnostics();
  25710. + var allDiagnostics = existingDiagnostics.Concat(diagnostics).ToArray();
  25711. +
  25712. + return (TNode)node.WithDiagnostics(allDiagnostics);
  25713. + }
  25714. +
  25715. + public static SourceLocation GetSourceLocation(this SyntaxNode node, RazorSourceDocument source)
  25716. + {
  25717. + if (node == null)
  25718. + {
  25719. + throw new ArgumentNullException(nameof(node));
  25720. + }
  25721. + if (source == null)
  25722. + {
  25723. + throw new ArgumentNullException(nameof(source));
  25724. + }
  25725. +
  25726. + try
  25727. + {
  25728. + if (source.Length == 0)
  25729. + {
  25730. + // Just a marker symbol
  25731. + return new SourceLocation(source.FilePath, 0, 0, 0);
  25732. + }
  25733. + if (node.Position == source.Length)
  25734. + {
  25735. + // E.g. Marker symbol at the end of the document
  25736. + var lastPosition = source.Length - 1;
  25737. + var endsWithLineBreak = ParserHelpers.IsNewLine(source[lastPosition]);
  25738. + var lastLocation = source.Lines.GetLocation(lastPosition);
  25739. + return new SourceLocation(
  25740. + source.FilePath, // GetLocation prefers RelativePath but we want FilePath.
  25741. + lastLocation.AbsoluteIndex + 1,
  25742. + lastLocation.LineIndex + (endsWithLineBreak ? 1 : 0),
  25743. + endsWithLineBreak ? 0 : lastLocation.CharacterIndex + 1);
  25744. + }
  25745. +
  25746. + var location = source.Lines.GetLocation(node.Position);
  25747. + return new SourceLocation(
  25748. + source.FilePath, // GetLocation prefers RelativePath but we want FilePath.
  25749. + location.AbsoluteIndex,
  25750. + location.LineIndex,
  25751. + location.CharacterIndex);
  25752. + }
  25753. + catch (IndexOutOfRangeException)
  25754. + {
  25755. + Debug.Assert(false, "Node position should stay within document length.");
  25756. + return new SourceLocation(source.FilePath, node.Position, 0, 0);
  25757. + }
  25758. + }
  25759. +
  25760. + public static SourceSpan GetSourceSpan(this SyntaxNode node, RazorSourceDocument source)
  25761. + {
  25762. + if (node == null)
  25763. + {
  25764. + throw new ArgumentNullException(nameof(node));
  25765. + }
  25766. + if (source == null)
  25767. + {
  25768. + throw new ArgumentNullException(nameof(source));
  25769. + }
  25770. +
  25771. + var location = node.GetSourceLocation(source);
  25772. +
  25773. + return new SourceSpan(location, node.FullWidth);
  25774. + }
  25775. +
  25776. + /// <summary>
  25777. + /// Creates a new tree of nodes with the specified nodes, tokens and trivia replaced.
  25778. + /// </summary>
  25779. + /// <typeparam name="TRoot">The type of the root node.</typeparam>
  25780. + /// <param name="root">The root node of the tree of nodes.</param>
  25781. + /// <param name="nodes">The nodes to be replaced.</param>
  25782. + /// <param name="computeReplacementNode">A function that computes a replacement node for the
  25783. + /// argument nodes. The first argument is the original node. The second argument is the same
  25784. + /// node potentially rewritten with replaced descendants.</param>
  25785. + public static TRoot ReplaceSyntax<TRoot>(
  25786. + this TRoot root,
  25787. + IEnumerable<SyntaxNode> nodes,
  25788. + Func<SyntaxNode, SyntaxNode, SyntaxNode> computeReplacementNode)
  25789. + where TRoot : SyntaxNode
  25790. + {
  25791. + return (TRoot)root.ReplaceCore(
  25792. + nodes: nodes, computeReplacementNode: computeReplacementNode);
  25793. + }
  25794. +
  25795. + /// <summary>
  25796. + /// Creates a new tree of nodes with the specified old node replaced with a new node.
  25797. + /// </summary>
  25798. + /// <typeparam name="TRoot">The type of the root node.</typeparam>
  25799. + /// <typeparam name="TNode">The type of the nodes being replaced.</typeparam>
  25800. + /// <param name="root">The root node of the tree of nodes.</param>
  25801. + /// <param name="nodes">The nodes to be replaced; descendants of the root node.</param>
  25802. + /// <param name="computeReplacementNode">A function that computes a replacement node for the
  25803. + /// argument nodes. The first argument is the original node. The second argument is the same
  25804. + /// node potentially rewritten with replaced descendants.</param>
  25805. + public static TRoot ReplaceNodes<TRoot, TNode>(this TRoot root, IEnumerable<TNode> nodes, Func<TNode, TNode, SyntaxNode> computeReplacementNode)
  25806. + where TRoot : SyntaxNode
  25807. + where TNode : SyntaxNode
  25808. + {
  25809. + return (TRoot)root.ReplaceCore(nodes: nodes, computeReplacementNode: computeReplacementNode);
  25810. + }
  25811. +
  25812. + /// <summary>
  25813. + /// Creates a new tree of nodes with the specified old node replaced with a new node.
  25814. + /// </summary>
  25815. + /// <typeparam name="TRoot">The type of the root node.</typeparam>
  25816. + /// <param name="root">The root node of the tree of nodes.</param>
  25817. + /// <param name="oldNode">The node to be replaced; a descendant of the root node.</param>
  25818. + /// <param name="newNode">The new node to use in the new tree in place of the old node.</param>
  25819. + public static TRoot ReplaceNode<TRoot>(this TRoot root, SyntaxNode oldNode, SyntaxNode newNode)
  25820. + where TRoot : SyntaxNode
  25821. + {
  25822. + if (oldNode == newNode)
  25823. + {
  25824. + return root;
  25825. + }
  25826. +
  25827. + return (TRoot)root.ReplaceCore(nodes: new[] { oldNode }, computeReplacementNode: (o, r) => newNode);
  25828. + }
  25829. +
  25830. + /// <summary>
  25831. + /// Creates a new tree of nodes with specified old node replaced with a new nodes.
  25832. + /// </summary>
  25833. + /// <typeparam name="TRoot">The type of the root node.</typeparam>
  25834. + /// <param name="root">The root of the tree of nodes.</param>
  25835. + /// <param name="oldNode">The node to be replaced; a descendant of the root node and an element of a list member.</param>
  25836. + /// <param name="newNodes">A sequence of nodes to use in the tree in place of the old node.</param>
  25837. + public static TRoot ReplaceNode<TRoot>(this TRoot root, SyntaxNode oldNode, IEnumerable<SyntaxNode> newNodes)
  25838. + where TRoot : SyntaxNode
  25839. + {
  25840. + return (TRoot)root.ReplaceNodeInListCore(oldNode, newNodes);
  25841. + }
  25842. +
  25843. + /// <summary>
  25844. + /// Creates a new tree of nodes with new nodes inserted before the specified node.
  25845. + /// </summary>
  25846. + /// <typeparam name="TRoot">The type of the root node.</typeparam>
  25847. + /// <param name="root">The root of the tree of nodes.</param>
  25848. + /// <param name="nodeInList">The node to insert before; a descendant of the root node an element of a list member.</param>
  25849. + /// <param name="newNodes">A sequence of nodes to insert into the tree immediately before the specified node.</param>
  25850. + public static TRoot InsertNodesBefore<TRoot>(this TRoot root, SyntaxNode nodeInList, IEnumerable<SyntaxNode> newNodes)
  25851. + where TRoot : SyntaxNode
  25852. + {
  25853. + return (TRoot)root.InsertNodesInListCore(nodeInList, newNodes, insertBefore: true);
  25854. + }
  25855. +
  25856. + /// <summary>
  25857. + /// Creates a new tree of nodes with new nodes inserted after the specified node.
  25858. + /// </summary>
  25859. + /// <typeparam name="TRoot">The type of the root node.</typeparam>
  25860. + /// <param name="root">The root of the tree of nodes.</param>
  25861. + /// <param name="nodeInList">The node to insert after; a descendant of the root node an element of a list member.</param>
  25862. + /// <param name="newNodes">A sequence of nodes to insert into the tree immediately after the specified node.</param>
  25863. + public static TRoot InsertNodesAfter<TRoot>(this TRoot root, SyntaxNode nodeInList, IEnumerable<SyntaxNode> newNodes)
  25864. + where TRoot : SyntaxNode
  25865. + {
  25866. + return (TRoot)root.InsertNodesInListCore(nodeInList, newNodes, insertBefore: false);
  25867. + }
  25868. +
  25869. + public static string GetContent<TNode>(this TNode node) where TNode : SyntaxNode
  25870. + {
  25871. + if (node == null)
  25872. + {
  25873. + throw new ArgumentNullException(nameof(node));
  25874. + }
  25875. +
  25876. + var tokens = node.DescendantNodes().Where(n => n.IsToken).Cast<SyntaxToken>();
  25877. + var content = string.Concat(tokens.Select(t => t.Content));
  25878. + return content;
  25879. + }
  25880. +
  25881. + public static string GetTagName(this MarkupTagBlockSyntax tagBlock)
  25882. + {
  25883. + if (tagBlock == null)
  25884. + {
  25885. + throw new ArgumentNullException(nameof(tagBlock));
  25886. + }
  25887. +
  25888. + var child = tagBlock.Children[0];
  25889. +
  25890. + if (tagBlock.Children.Count == 0 || !(child is MarkupTextLiteralSyntax))
  25891. + {
  25892. + return null;
  25893. + }
  25894. +
  25895. + var childLiteral = (MarkupTextLiteralSyntax)child;
  25896. + SyntaxToken textToken = null;
  25897. + for (var i = 0; i < childLiteral.LiteralTokens.Count; i++)
  25898. + {
  25899. + var token = childLiteral.LiteralTokens[i];
  25900. +
  25901. + if (token != null &&
  25902. + (token.Kind == SyntaxKind.Whitespace || token.Kind == SyntaxKind.Text))
  25903. + {
  25904. + textToken = token;
  25905. + break;
  25906. + }
  25907. + }
  25908. +
  25909. + if (textToken == null)
  25910. + {
  25911. + return null;
  25912. + }
  25913. +
  25914. + return textToken.Kind == SyntaxKind.Whitespace ? null : textToken.Content;
  25915. + }
  25916. +
  25917. + public static string GetTagName(this MarkupTagHelperStartTagSyntax tagBlock)
  25918. + {
  25919. + if (tagBlock == null)
  25920. + {
  25921. + throw new ArgumentNullException(nameof(tagBlock));
  25922. + }
  25923. +
  25924. + var child = tagBlock.Children[0];
  25925. +
  25926. + if (tagBlock.Children.Count == 0 || !(child is MarkupTextLiteralSyntax))
  25927. + {
  25928. + return null;
  25929. + }
  25930. +
  25931. + var childLiteral = (MarkupTextLiteralSyntax)child;
  25932. + SyntaxToken textToken = null;
  25933. + for (var i = 0; i < childLiteral.LiteralTokens.Count; i++)
  25934. + {
  25935. + var token = childLiteral.LiteralTokens[i];
  25936. +
  25937. + if (token != null &&
  25938. + (token.Kind == SyntaxKind.Whitespace || token.Kind == SyntaxKind.Text))
  25939. + {
  25940. + textToken = token;
  25941. + break;
  25942. + }
  25943. + }
  25944. +
  25945. + if (textToken == null)
  25946. + {
  25947. + return null;
  25948. + }
  25949. +
  25950. + return textToken.Kind == SyntaxKind.Whitespace ? null : textToken.Content;
  25951. + }
  25952. +
  25953. + public static bool IsSelfClosing(this MarkupTagBlockSyntax tagBlock)
  25954. + {
  25955. + if (tagBlock == null)
  25956. + {
  25957. + throw new ArgumentNullException(nameof(tagBlock));
  25958. + }
  25959. +
  25960. + var lastChild = tagBlock.ChildNodes().LastOrDefault();
  25961. +
  25962. + return lastChild?.GetContent().EndsWith("/>", StringComparison.Ordinal) ?? false;
  25963. + }
  25964. +
  25965. + public static bool IsVoidElement(this MarkupTagBlockSyntax tagBlock)
  25966. + {
  25967. + if (tagBlock == null)
  25968. + {
  25969. + throw new ArgumentNullException(nameof(tagBlock));
  25970. + }
  25971. +
  25972. + return VoidElements.Contains(tagBlock.GetTagName());
  25973. }
  25974. }
  25975. }
  25976. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxReplacer.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxReplacer.cs
  25977. new file mode 100644
  25978. index 00000000000..2d192958e49
  25979. --- /dev/null
  25980. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxReplacer.cs
  25981. @@ -0,0 +1,207 @@
  25982. +// Copyright (c) .NET Foundation. All rights reserved.
  25983. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  25984. +
  25985. +using System;
  25986. +using System.Collections.Generic;
  25987. +using System.Linq;
  25988. +
  25989. +namespace Microsoft.AspNetCore.Razor.Language.Syntax
  25990. +{
  25991. + internal static class SyntaxReplacer
  25992. + {
  25993. + internal static SyntaxNode Replace<TNode>(
  25994. + SyntaxNode root,
  25995. + IEnumerable<TNode> nodes = null,
  25996. + Func<TNode, TNode, SyntaxNode> computeReplacementNode = null)
  25997. + where TNode : SyntaxNode
  25998. + {
  25999. + var replacer = new Replacer<TNode>(nodes, computeReplacementNode);
  26000. +
  26001. + if (replacer.HasWork)
  26002. + {
  26003. + return replacer.Visit(root);
  26004. + }
  26005. + else
  26006. + {
  26007. + return root;
  26008. + }
  26009. + }
  26010. +
  26011. + internal static SyntaxNode ReplaceNodeInList(SyntaxNode root, SyntaxNode originalNode, IEnumerable<SyntaxNode> newNodes)
  26012. + {
  26013. + return new NodeListEditor(originalNode, newNodes, ListEditKind.Replace).Visit(root);
  26014. + }
  26015. +
  26016. + internal static SyntaxNode InsertNodeInList(SyntaxNode root, SyntaxNode nodeInList, IEnumerable<SyntaxNode> nodesToInsert, bool insertBefore)
  26017. + {
  26018. + return new NodeListEditor(nodeInList, nodesToInsert, insertBefore ? ListEditKind.InsertBefore : ListEditKind.InsertAfter).Visit(root);
  26019. + }
  26020. +
  26021. + private class Replacer<TNode> : SyntaxRewriter where TNode : SyntaxNode
  26022. + {
  26023. + private readonly Func<TNode, TNode, SyntaxNode> _computeReplacementNode;
  26024. + private readonly HashSet<SyntaxNode> _nodeSet;
  26025. + private readonly HashSet<TextSpan> _spanSet;
  26026. + private readonly TextSpan _totalSpan;
  26027. +
  26028. + public Replacer(IEnumerable<TNode> nodes, Func<TNode, TNode, SyntaxNode> computeReplacementNode)
  26029. + {
  26030. + _computeReplacementNode = computeReplacementNode;
  26031. + _nodeSet = nodes != null ? new HashSet<SyntaxNode>(nodes) : new HashSet<SyntaxNode>();
  26032. + _spanSet = new HashSet<TextSpan>(_nodeSet.Select(n => n.FullSpan));
  26033. + _totalSpan = ComputeTotalSpan(_spanSet);
  26034. + }
  26035. +
  26036. + public bool HasWork => _nodeSet.Count > 0;
  26037. +
  26038. + public override SyntaxNode Visit(SyntaxNode node)
  26039. + {
  26040. + var rewritten = node;
  26041. +
  26042. + if (node != null)
  26043. + {
  26044. + if (ShouldVisit(node.FullSpan))
  26045. + {
  26046. + rewritten = base.Visit(node);
  26047. + }
  26048. +
  26049. + if (_nodeSet.Contains(node) && _computeReplacementNode != null)
  26050. + {
  26051. + rewritten = _computeReplacementNode((TNode)node, (TNode)rewritten);
  26052. + }
  26053. + }
  26054. +
  26055. + return rewritten;
  26056. + }
  26057. +
  26058. + private static TextSpan ComputeTotalSpan(IEnumerable<TextSpan> spans)
  26059. + {
  26060. + var first = true;
  26061. + var start = 0;
  26062. + var end = 0;
  26063. +
  26064. + foreach (var span in spans)
  26065. + {
  26066. + if (first)
  26067. + {
  26068. + start = span.Start;
  26069. + end = span.End;
  26070. + first = false;
  26071. + }
  26072. + else
  26073. + {
  26074. + start = Math.Min(start, span.Start);
  26075. + end = Math.Max(end, span.End);
  26076. + }
  26077. + }
  26078. +
  26079. + return new TextSpan(start, end - start);
  26080. + }
  26081. +
  26082. + private bool ShouldVisit(TextSpan span)
  26083. + {
  26084. + // first do quick check against total span
  26085. + if (!span.IntersectsWith(_totalSpan))
  26086. + {
  26087. + // if the node is outside the total span of the nodes to be replaced
  26088. + // then we won't find any nodes to replace below it.
  26089. + return false;
  26090. + }
  26091. +
  26092. + foreach (var s in _spanSet)
  26093. + {
  26094. + if (span.IntersectsWith(s))
  26095. + {
  26096. + // node's full span intersects with at least one node to be replaced
  26097. + // so we need to visit node's children to find it.
  26098. + return true;
  26099. + }
  26100. + }
  26101. +
  26102. + return false;
  26103. + }
  26104. + }
  26105. +
  26106. + private class NodeListEditor : SyntaxRewriter
  26107. + {
  26108. + private readonly TextSpan _elementSpan;
  26109. + private readonly SyntaxNode _originalNode;
  26110. + private readonly IEnumerable<SyntaxNode> _newNodes;
  26111. + private readonly ListEditKind _editKind;
  26112. +
  26113. + public NodeListEditor(
  26114. + SyntaxNode originalNode,
  26115. + IEnumerable<SyntaxNode> replacementNodes,
  26116. + ListEditKind editKind)
  26117. + {
  26118. + _elementSpan = originalNode.Span;
  26119. + _originalNode = originalNode;
  26120. + _newNodes = replacementNodes;
  26121. + _editKind = editKind;
  26122. + }
  26123. +
  26124. + private bool ShouldVisit(TextSpan span)
  26125. + {
  26126. + if (span.IntersectsWith(_elementSpan))
  26127. + {
  26128. + // node's full span intersects with at least one node to be replaced
  26129. + // so we need to visit node's children to find it.
  26130. + return true;
  26131. + }
  26132. +
  26133. + return false;
  26134. + }
  26135. +
  26136. + public override SyntaxNode Visit(SyntaxNode node)
  26137. + {
  26138. + if (node == _originalNode)
  26139. + {
  26140. + throw new InvalidOperationException("Expecting a list");
  26141. + }
  26142. +
  26143. + var rewritten = node;
  26144. +
  26145. + if (node != null)
  26146. + {
  26147. + if (ShouldVisit(node.FullSpan))
  26148. + {
  26149. + rewritten = base.Visit(node);
  26150. + }
  26151. + }
  26152. +
  26153. + return rewritten;
  26154. + }
  26155. +
  26156. + public override SyntaxList<TNode> VisitList<TNode>(SyntaxList<TNode> list)
  26157. + {
  26158. + if (_originalNode is TNode)
  26159. + {
  26160. + var index = list.IndexOf((TNode)_originalNode);
  26161. + if (index >= 0 && index < list.Count)
  26162. + {
  26163. + switch (_editKind)
  26164. + {
  26165. + case ListEditKind.Replace:
  26166. + return list.ReplaceRange((TNode)_originalNode, _newNodes.Cast<TNode>());
  26167. +
  26168. + case ListEditKind.InsertAfter:
  26169. + return list.InsertRange(index + 1, _newNodes.Cast<TNode>());
  26170. +
  26171. + case ListEditKind.InsertBefore:
  26172. + return list.InsertRange(index, _newNodes.Cast<TNode>());
  26173. + }
  26174. + }
  26175. + }
  26176. +
  26177. + return base.VisitList<TNode>(list);
  26178. + }
  26179. + }
  26180. +
  26181. + private enum ListEditKind
  26182. + {
  26183. + InsertBefore,
  26184. + InsertAfter,
  26185. + Replace
  26186. + }
  26187. + }
  26188. +}
  26189. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxRewriter.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxRewriter.cs
  26190. new file mode 100644
  26191. index 00000000000..d491bd0e88f
  26192. --- /dev/null
  26193. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxRewriter.cs
  26194. @@ -0,0 +1,148 @@
  26195. +// Copyright (c) .NET Foundation. All rights reserved.
  26196. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  26197. +
  26198. +using System.Diagnostics;
  26199. +
  26200. +namespace Microsoft.AspNetCore.Razor.Language.Syntax
  26201. +{
  26202. + internal abstract partial class SyntaxRewriter : SyntaxVisitor<SyntaxNode>
  26203. + {
  26204. + public override SyntaxNode VisitToken(SyntaxToken token)
  26205. + {
  26206. + // PERF: This is a hot method, so it has been written to minimize the following:
  26207. + // 1. Virtual method calls
  26208. + // 2. Copying of structs
  26209. + // 3. Repeated null checks
  26210. +
  26211. + // PERF: Avoid testing node for null more than once
  26212. + var node = token?.Green;
  26213. + if (node == null)
  26214. + {
  26215. + return token;
  26216. + }
  26217. +
  26218. + // PERF: Make one virtual method call each to get the leading and trailing trivia
  26219. + var leadingTrivia = node.GetLeadingTrivia();
  26220. + var trailingTrivia = node.GetTrailingTrivia();
  26221. +
  26222. + // Trivia is either null or a non-empty list (there's no such thing as an empty green list)
  26223. + Debug.Assert(leadingTrivia == null || !leadingTrivia.IsList || leadingTrivia.SlotCount > 0);
  26224. + Debug.Assert(trailingTrivia == null || !trailingTrivia.IsList || trailingTrivia.SlotCount > 0);
  26225. +
  26226. + if (leadingTrivia != null)
  26227. + {
  26228. + // PERF: Expand token.LeadingTrivia when node is not null.
  26229. + var leading = VisitList(new SyntaxTriviaList(leadingTrivia.CreateRed(token, token.Position)));
  26230. +
  26231. + if (trailingTrivia != null)
  26232. + {
  26233. + // Both leading and trailing trivia
  26234. +
  26235. + // PERF: Expand token.TrailingTrivia when node is not null and leadingTrivia is not null.
  26236. + // Also avoid node.Width because it makes a virtual call to GetText. Instead use node.FullWidth - trailingTrivia.FullWidth.
  26237. + var index = leadingTrivia.IsList ? leadingTrivia.SlotCount : 1;
  26238. + var position = token.Position + node.FullWidth - trailingTrivia.FullWidth;
  26239. + var trailing = VisitList(new SyntaxTriviaList(trailingTrivia.CreateRed(token, position), position, index));
  26240. +
  26241. + if (leading.Node.Green != leadingTrivia)
  26242. + {
  26243. + token = token.WithLeadingTrivia(leading);
  26244. + }
  26245. +
  26246. + return trailing.Node.Green != trailingTrivia ? token.WithTrailingTrivia(trailing) : token;
  26247. + }
  26248. + else
  26249. + {
  26250. + // Leading trivia only
  26251. + return leading.Node.Green != leadingTrivia ? token.WithLeadingTrivia(leading) : token;
  26252. + }
  26253. + }
  26254. + else if (trailingTrivia != null)
  26255. + {
  26256. + // Trailing trivia only
  26257. + // PERF: Expand token.TrailingTrivia when node is not null and leading is null.
  26258. + // Also avoid node.Width because it makes a virtual call to GetText. Instead use node.FullWidth - trailingTrivia.FullWidth.
  26259. + var position = token.Position + node.FullWidth - trailingTrivia.FullWidth;
  26260. + var trailing = VisitList(new SyntaxTriviaList(trailingTrivia.CreateRed(token, position), position, index: 0));
  26261. + return trailing.Node.Green != trailingTrivia ? token.WithTrailingTrivia(trailing) : token;
  26262. + }
  26263. + else
  26264. + {
  26265. + // No trivia
  26266. + return token;
  26267. + }
  26268. + }
  26269. +
  26270. + public virtual SyntaxList<TNode> VisitList<TNode>(SyntaxList<TNode> list) where TNode : SyntaxNode
  26271. + {
  26272. + SyntaxListBuilder alternate = null;
  26273. + for (int i = 0, n = list.Count; i < n; i++)
  26274. + {
  26275. + var item = list[i];
  26276. + var visited = VisitListElement(item);
  26277. + if (item != visited && alternate == null)
  26278. + {
  26279. + alternate = new SyntaxListBuilder(n);
  26280. + alternate.AddRange(list, 0, i);
  26281. + }
  26282. +
  26283. + if (alternate != null && visited != null)
  26284. + {
  26285. + alternate.Add(visited);
  26286. + }
  26287. + }
  26288. +
  26289. + if (alternate != null)
  26290. + {
  26291. + return alternate.ToList();
  26292. + }
  26293. +
  26294. + return list;
  26295. + }
  26296. +
  26297. + public override SyntaxNode VisitTrivia(SyntaxTrivia trivia)
  26298. + {
  26299. + return trivia;
  26300. + }
  26301. +
  26302. + public virtual SyntaxTriviaList VisitList(SyntaxTriviaList list)
  26303. + {
  26304. + var count = list.Count;
  26305. + if (count != 0)
  26306. + {
  26307. + SyntaxTriviaListBuilder alternate = null;
  26308. + var index = -1;
  26309. +
  26310. + foreach (var item in list)
  26311. + {
  26312. + index++;
  26313. + var visited = VisitListElement(item);
  26314. +
  26315. + //skip the null check since SyntaxTrivia is a value type
  26316. + if (visited != item && alternate == null)
  26317. + {
  26318. + alternate = new SyntaxTriviaListBuilder(count);
  26319. + alternate.Add(list, 0, index);
  26320. + }
  26321. +
  26322. + if (alternate != null && visited != null)
  26323. + {
  26324. + alternate.Add(visited);
  26325. + }
  26326. + }
  26327. +
  26328. + if (alternate != null)
  26329. + {
  26330. + return alternate.ToList();
  26331. + }
  26332. + }
  26333. +
  26334. + return list;
  26335. + }
  26336. +
  26337. + public virtual TNode VisitListElement<TNode>(TNode node) where TNode : SyntaxNode
  26338. + {
  26339. + return (TNode)(SyntaxNode)Visit(node);
  26340. + }
  26341. + }
  26342. +}
  26343. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxSerializer.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxSerializer.cs
  26344. new file mode 100644
  26345. index 00000000000..5b167b510fa
  26346. --- /dev/null
  26347. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxSerializer.cs
  26348. @@ -0,0 +1,304 @@
  26349. +// Copyright (c) .NET Foundation. All rights reserved.
  26350. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  26351. +
  26352. +using System;
  26353. +using System.Collections.Generic;
  26354. +using System.IO;
  26355. +using System.Linq;
  26356. +using System.Text;
  26357. +using Microsoft.AspNetCore.Razor.Language.Legacy;
  26358. +
  26359. +namespace Microsoft.AspNetCore.Razor.Language.Syntax
  26360. +{
  26361. + internal class SyntaxSerializer
  26362. + {
  26363. + internal static string Serialize(SyntaxNode node)
  26364. + {
  26365. + using (var writer = new StringWriter())
  26366. + {
  26367. + var walker = new Walker(writer);
  26368. + walker.Visit(node);
  26369. +
  26370. + return writer.ToString();
  26371. + }
  26372. + }
  26373. +
  26374. + private class Walker : SyntaxWalker
  26375. + {
  26376. + private readonly SyntaxWriter _visitor;
  26377. + private readonly TextWriter _writer;
  26378. +
  26379. + public Walker(TextWriter writer)
  26380. + {
  26381. + _visitor = new SyntaxWriter(writer);
  26382. + _writer = writer;
  26383. + }
  26384. +
  26385. + public TextWriter Writer { get; }
  26386. +
  26387. + public override SyntaxNode Visit(SyntaxNode node)
  26388. + {
  26389. + if (node == null)
  26390. + {
  26391. + return node;
  26392. + }
  26393. +
  26394. + if (node.IsList)
  26395. + {
  26396. + return base.DefaultVisit(node);
  26397. + }
  26398. +
  26399. + _visitor.Visit(node);
  26400. + _writer.WriteLine();
  26401. +
  26402. + if (!node.IsToken && !node.IsTrivia)
  26403. + {
  26404. + _visitor.Depth++;
  26405. + node = base.DefaultVisit(node);
  26406. + _visitor.Depth--;
  26407. + }
  26408. +
  26409. + return node;
  26410. + }
  26411. + }
  26412. +
  26413. + private class SyntaxWalker : SyntaxRewriter
  26414. + {
  26415. + private readonly List<SyntaxNode> _ancestors = new List<SyntaxNode>();
  26416. +
  26417. + protected IReadOnlyList<SyntaxNode> Ancestors => _ancestors;
  26418. +
  26419. + protected SyntaxNode Parent => _ancestors.Count > 0 ? _ancestors[0] : null;
  26420. +
  26421. + protected override SyntaxNode DefaultVisit(SyntaxNode node)
  26422. + {
  26423. + _ancestors.Insert(0, node);
  26424. +
  26425. + try
  26426. + {
  26427. + for (var i = 0; i < node.SlotCount; i++)
  26428. + {
  26429. + var child = node.GetNodeSlot(i);
  26430. + Visit(child);
  26431. + }
  26432. + }
  26433. + finally
  26434. + {
  26435. + _ancestors.RemoveAt(0);
  26436. + }
  26437. +
  26438. + return node;
  26439. + }
  26440. + }
  26441. +
  26442. + private class SyntaxWriter : SyntaxRewriter
  26443. + {
  26444. + private readonly TextWriter _writer;
  26445. + private bool _visitedRoot;
  26446. +
  26447. + public SyntaxWriter(TextWriter writer)
  26448. + {
  26449. + _writer = writer;
  26450. + }
  26451. +
  26452. + public int Depth { get; set; }
  26453. +
  26454. + public override SyntaxNode Visit(SyntaxNode node)
  26455. + {
  26456. + if (node is SyntaxToken token)
  26457. + {
  26458. + return VisitToken(token);
  26459. + }
  26460. +
  26461. + WriteNode(node);
  26462. + return node;
  26463. + }
  26464. +
  26465. + public override SyntaxNode VisitToken(SyntaxToken token)
  26466. + {
  26467. + WriteToken(token);
  26468. + return base.VisitToken(token);
  26469. + }
  26470. +
  26471. + public override SyntaxNode VisitTrivia(SyntaxTrivia trivia)
  26472. + {
  26473. + WriteTrivia(trivia);
  26474. + return base.VisitTrivia(trivia);
  26475. + }
  26476. +
  26477. + private void WriteNode(SyntaxNode node)
  26478. + {
  26479. + WriteIndent();
  26480. + Write(node.Kind);
  26481. + WriteSeparator();
  26482. + Write($"[{node.Position}..{node.EndPosition})");
  26483. + WriteSeparator();
  26484. + Write($"FullWidth: {node.FullWidth}");
  26485. +
  26486. + if (node is RazorDirectiveSyntax razorDirective)
  26487. + {
  26488. + WriteRazorDirective(razorDirective);
  26489. + }
  26490. + else if (node is MarkupTagHelperElementSyntax tagHelperElement)
  26491. + {
  26492. + WriteTagHelperElement(tagHelperElement);
  26493. + }
  26494. + else if (node is MarkupTagHelperAttributeSyntax tagHelperAttribute)
  26495. + {
  26496. + WriteTagHelperAttributeInfo(tagHelperAttribute.TagHelperAttributeInfo);
  26497. + }
  26498. + else if (node is MarkupMinimizedTagHelperAttributeSyntax minimizedTagHelperAttribute)
  26499. + {
  26500. + WriteTagHelperAttributeInfo(minimizedTagHelperAttribute.TagHelperAttributeInfo);
  26501. + }
  26502. +
  26503. + if (ShouldDisplayNodeContent(node))
  26504. + {
  26505. + WriteSeparator();
  26506. + Write($"[{node.GetContent()}]");
  26507. + }
  26508. +
  26509. + var annotation = node.GetAnnotations().FirstOrDefault(a => a.Kind == SyntaxConstants.SpanContextKind);
  26510. + if (annotation != null && annotation.Data is SpanContext context)
  26511. + {
  26512. + WriteSpanContext(context);
  26513. + }
  26514. +
  26515. + if (!_visitedRoot)
  26516. + {
  26517. + WriteSeparator();
  26518. + Write($"[{node.ToFullString()}]");
  26519. + _visitedRoot = true;
  26520. + }
  26521. + }
  26522. +
  26523. + private void WriteRazorDirective(RazorDirectiveSyntax node)
  26524. + {
  26525. + if (node.DirectiveDescriptor == null)
  26526. + {
  26527. + return;
  26528. + }
  26529. +
  26530. + var builder = new StringBuilder("Directive:{");
  26531. + builder.Append(node.DirectiveDescriptor.Directive);
  26532. + builder.Append(";");
  26533. + builder.Append(node.DirectiveDescriptor.Kind);
  26534. + builder.Append(";");
  26535. + builder.Append(node.DirectiveDescriptor.Usage);
  26536. + builder.Append("}");
  26537. +
  26538. + var diagnostics = node.GetDiagnostics();
  26539. + if (diagnostics.Length > 0)
  26540. + {
  26541. + builder.Append(" [");
  26542. + var ids = string.Join(", ", diagnostics.Select(diagnostic => $"{diagnostic.Id}{diagnostic.Span}"));
  26543. + builder.Append(ids);
  26544. + builder.Append("]");
  26545. + }
  26546. +
  26547. + WriteSeparator();
  26548. + Write(builder.ToString());
  26549. + }
  26550. +
  26551. + private void WriteTagHelperElement(MarkupTagHelperElementSyntax node)
  26552. + {
  26553. + // Write tag name
  26554. + WriteSeparator();
  26555. + Write($"{node.TagHelperInfo.TagName}[{node.TagHelperInfo.TagMode}]");
  26556. +
  26557. + // Write descriptors
  26558. + foreach (var descriptor in node.TagHelperInfo.BindingResult.Descriptors)
  26559. + {
  26560. + WriteSeparator();
  26561. +
  26562. + // Get the type name without the namespace.
  26563. + var typeName = descriptor.Name.Substring(descriptor.Name.LastIndexOf('.') + 1);
  26564. + Write(typeName);
  26565. + }
  26566. + }
  26567. +
  26568. + private void WriteTagHelperAttributeInfo(TagHelperAttributeInfo info)
  26569. + {
  26570. + // Write attributes
  26571. + WriteSeparator();
  26572. + Write(info.Name);
  26573. + WriteSeparator();
  26574. + Write(info.AttributeStructure);
  26575. + WriteSeparator();
  26576. + Write(info.Bound ? "Bound" : "Unbound");
  26577. + }
  26578. +
  26579. + private void WriteToken(SyntaxToken token)
  26580. + {
  26581. + WriteIndent();
  26582. + var content = token.IsMissing ? "<Missing>" : token.Content;
  26583. + var diagnostics = token.GetDiagnostics();
  26584. + var tokenString = $"{token.Kind};[{content}];{string.Join(", ", diagnostics.Select(diagnostic => diagnostic.Id + diagnostic.Span))}";
  26585. + Write(tokenString);
  26586. + }
  26587. +
  26588. + private void WriteTrivia(SyntaxTrivia trivia)
  26589. + {
  26590. + throw new NotImplementedException();
  26591. + }
  26592. +
  26593. + private void WriteSpanContext(SpanContext context)
  26594. + {
  26595. + WriteSeparator();
  26596. + Write($"Gen<{context.ChunkGenerator}>");
  26597. + WriteSeparator();
  26598. + Write(context.EditHandler);
  26599. + }
  26600. +
  26601. + protected void WriteIndent()
  26602. + {
  26603. + for (var i = 0; i < Depth; i++)
  26604. + {
  26605. + for (var j = 0; j < 4; j++)
  26606. + {
  26607. + Write(' ');
  26608. + }
  26609. + }
  26610. + }
  26611. +
  26612. + protected void WriteSeparator()
  26613. + {
  26614. + Write(" - ");
  26615. + }
  26616. +
  26617. + protected void WriteNewLine()
  26618. + {
  26619. + _writer.WriteLine();
  26620. + }
  26621. +
  26622. + protected void Write(object value)
  26623. + {
  26624. + if (value is string stringValue)
  26625. + {
  26626. + stringValue = stringValue.Replace(Environment.NewLine, "LF");
  26627. + _writer.Write(stringValue);
  26628. + return;
  26629. + }
  26630. +
  26631. + _writer.Write(value);
  26632. + }
  26633. +
  26634. + private static bool ShouldDisplayNodeContent(SyntaxNode node)
  26635. + {
  26636. + return node.Kind == SyntaxKind.MarkupTextLiteral ||
  26637. + node.Kind == SyntaxKind.MarkupEphemeralTextLiteral ||
  26638. + node.Kind == SyntaxKind.MarkupTagBlock ||
  26639. + node.Kind == SyntaxKind.MarkupAttributeBlock ||
  26640. + node.Kind == SyntaxKind.MarkupMinimizedAttributeBlock ||
  26641. + node.Kind == SyntaxKind.MarkupTagHelperAttribute ||
  26642. + node.Kind == SyntaxKind.MarkupMinimizedTagHelperAttribute ||
  26643. + node.Kind == SyntaxKind.MarkupLiteralAttributeValue ||
  26644. + node.Kind == SyntaxKind.MarkupDynamicAttributeValue ||
  26645. + node.Kind == SyntaxKind.CSharpStatementLiteral ||
  26646. + node.Kind == SyntaxKind.CSharpExpressionLiteral ||
  26647. + node.Kind == SyntaxKind.CSharpEphemeralTextLiteral ||
  26648. + node.Kind == SyntaxKind.UnclassifiedTextLiteral;
  26649. + }
  26650. + }
  26651. + }
  26652. +}
  26653. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxToken.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxToken.cs
  26654. index b87562f8f28..e3ecd35bf66 100644
  26655. --- a/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxToken.cs
  26656. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxToken.cs
  26657. @@ -9,50 +9,11 @@ using Microsoft.AspNetCore.Razor.Language.Legacy;
  26658. namespace Microsoft.AspNetCore.Razor.Language.Syntax
  26659. {
  26660. - internal class SyntaxToken : SyntaxNode
  26661. + internal class SyntaxToken : RazorSyntaxNode
  26662. {
  26663. internal SyntaxToken(GreenNode green, SyntaxNode parent, int position)
  26664. - : this(green, parent, null, position)
  26665. - {
  26666. - }
  26667. -
  26668. - // Temporary plumbing
  26669. - internal SyntaxToken(GreenNode green, SyntaxNode parent, Span parentSpan, int position)
  26670. : base(green, parent, position)
  26671. {
  26672. - Debug.Assert(parent == null || !parent.Green.IsList, "list cannot be a parent");
  26673. - Debug.Assert(green == null || green.IsToken, "green must be a token");
  26674. -
  26675. - ParentSpan = parentSpan;
  26676. - }
  26677. -
  26678. - // Temporary plumbing
  26679. - internal Span ParentSpan { get; }
  26680. -
  26681. - // Temporary plumbing
  26682. - internal SourceLocation Start
  26683. - {
  26684. - get
  26685. - {
  26686. - if (ParentSpan == null)
  26687. - {
  26688. - return SourceLocation.Undefined;
  26689. - }
  26690. -
  26691. - var tracker = new SourceLocationTracker(ParentSpan.Start);
  26692. - for (var i = 0; i < ParentSpan.Tokens.Count; i++)
  26693. - {
  26694. - var token = ParentSpan.Tokens[i];
  26695. - if (object.ReferenceEquals(this, token))
  26696. - {
  26697. - break;
  26698. - }
  26699. -
  26700. - tracker.UpdateLocation(token.Content);
  26701. - }
  26702. -
  26703. - return tracker.CurrentLocation;
  26704. - }
  26705. }
  26706. internal new InternalSyntax.SyntaxToken Green => (InternalSyntax.SyntaxToken)base.Green;
  26707. @@ -107,32 +68,33 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  26708. public override SyntaxTriviaList GetLeadingTrivia()
  26709. {
  26710. - if (Green.LeadingTrivia == null)
  26711. + var leading = Green.GetLeadingTrivia();
  26712. + if (leading == null)
  26713. {
  26714. return default(SyntaxTriviaList);
  26715. }
  26716. - return new SyntaxTriviaList(Green.LeadingTrivia.CreateRed(this, Position), Position);
  26717. + return new SyntaxTriviaList(leading.CreateRed(this, Position), Position);
  26718. }
  26719. public override SyntaxTriviaList GetTrailingTrivia()
  26720. {
  26721. - var trailingGreen = Green.TrailingTrivia;
  26722. - if (trailingGreen == null)
  26723. + var trailing = Green.GetTrailingTrivia();
  26724. + if (trailing == null)
  26725. {
  26726. return default(SyntaxTriviaList);
  26727. }
  26728. - var leading = Green.LeadingTrivia;
  26729. - int index = 0;
  26730. + var leading = Green.GetLeadingTrivia();
  26731. + var index = 0;
  26732. if (leading != null)
  26733. {
  26734. index = leading.IsList ? leading.SlotCount : 1;
  26735. }
  26736. int trailingPosition = Position + FullWidth;
  26737. - trailingPosition -= trailingGreen.FullWidth;
  26738. + trailingPosition -= trailing.FullWidth;
  26739. - return new SyntaxTriviaList(trailingGreen.CreateRed(this, trailingPosition), trailingPosition, index);
  26740. + return new SyntaxTriviaList(trailing.CreateRed(this, trailingPosition), trailingPosition, index);
  26741. }
  26742. public override string ToString()
  26743. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxVisitor.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxVisitor.cs
  26744. index 98e1c8f2450..2ff23683f63 100644
  26745. --- a/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxVisitor.cs
  26746. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxVisitor.cs
  26747. @@ -3,6 +3,14 @@
  26748. namespace Microsoft.AspNetCore.Razor.Language.Syntax
  26749. {
  26750. + /// <summary>
  26751. + /// Represents a <see cref="SyntaxNode"/> visitor that visits only the single SyntaxNode
  26752. + /// passed into its Visit method and produces
  26753. + /// a value of the type specified by the <typeparamref name="TResult"/> parameter.
  26754. + /// </summary>
  26755. + /// <typeparam name="TResult">
  26756. + /// The type of the return value this visitor's Visit method.
  26757. + /// </typeparam>
  26758. internal abstract partial class SyntaxVisitor<TResult>
  26759. {
  26760. public virtual TResult Visit(SyntaxNode node)
  26761. @@ -31,6 +39,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax
  26762. }
  26763. }
  26764. + /// <summary>
  26765. + /// Represents a <see cref="SyntaxNode"/> visitor that visits only the single SyntaxNode
  26766. + /// passed into its Visit method.
  26767. + /// </summary>
  26768. internal abstract partial class SyntaxVisitor
  26769. {
  26770. public virtual void Visit(SyntaxNode node)
  26771. diff --git a/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxWalker.cs b/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxWalker.cs
  26772. new file mode 100644
  26773. index 00000000000..214a0039fe2
  26774. --- /dev/null
  26775. +++ b/src/Microsoft.AspNetCore.Razor.Language/Syntax/SyntaxWalker.cs
  26776. @@ -0,0 +1,55 @@
  26777. +// Copyright (c) .NET Foundation. All rights reserved.
  26778. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  26779. +
  26780. +namespace Microsoft.AspNetCore.Razor.Language.Syntax
  26781. +{
  26782. + /// <summary>
  26783. + /// Represents a <see cref="SyntaxVisitor"/> that descends an entire <see cref="SyntaxNode"/> graph
  26784. + /// visiting each SyntaxNode and its child SyntaxNodes and <see cref="SyntaxToken"/>s in depth-first order.
  26785. + /// </summary>
  26786. + internal abstract class SyntaxWalker : SyntaxVisitor
  26787. + {
  26788. + public override void Visit(SyntaxNode node)
  26789. + {
  26790. + node?.Accept(this);
  26791. + }
  26792. +
  26793. + public override void DefaultVisit(SyntaxNode node)
  26794. + {
  26795. + var children = node.ChildNodes();
  26796. + for (var i = 0; i < children.Count; i++)
  26797. + {
  26798. + var child = children[i];
  26799. + Visit(child);
  26800. + }
  26801. + }
  26802. +
  26803. + public override void VisitToken(SyntaxToken token)
  26804. + {
  26805. + VisitLeadingTrivia(token);
  26806. + VisitTrailingTrivia(token);
  26807. + }
  26808. +
  26809. + public virtual void VisitLeadingTrivia(SyntaxToken token)
  26810. + {
  26811. + if (token.HasLeadingTrivia)
  26812. + {
  26813. + foreach (var trivia in token.GetLeadingTrivia())
  26814. + {
  26815. + VisitTrivia(trivia);
  26816. + }
  26817. + }
  26818. + }
  26819. +
  26820. + public virtual void VisitTrailingTrivia(SyntaxToken token)
  26821. + {
  26822. + if (token.HasTrailingTrivia)
  26823. + {
  26824. + foreach (var trivia in token.GetTrailingTrivia())
  26825. + {
  26826. + VisitTrivia(trivia);
  26827. + }
  26828. + }
  26829. + }
  26830. + }
  26831. +}
  26832. diff --git a/src/Microsoft.AspNetCore.Razor.Language/TagHelperAttributeInfo.cs b/src/Microsoft.AspNetCore.Razor.Language/TagHelperAttributeInfo.cs
  26833. new file mode 100644
  26834. index 00000000000..a3f15f17081
  26835. --- /dev/null
  26836. +++ b/src/Microsoft.AspNetCore.Razor.Language/TagHelperAttributeInfo.cs
  26837. @@ -0,0 +1,24 @@
  26838. +// Copyright (c) .NET Foundation. All rights reserved.
  26839. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  26840. +
  26841. +namespace Microsoft.AspNetCore.Razor.Language
  26842. +{
  26843. + internal class TagHelperAttributeInfo
  26844. + {
  26845. + public TagHelperAttributeInfo(
  26846. + string name,
  26847. + AttributeStructure attributeStructure,
  26848. + bool bound)
  26849. + {
  26850. + Name = name;
  26851. + AttributeStructure = attributeStructure;
  26852. + Bound = bound;
  26853. + }
  26854. +
  26855. + public string Name { get; }
  26856. +
  26857. + public AttributeStructure AttributeStructure { get; }
  26858. +
  26859. + public bool Bound { get; }
  26860. + }
  26861. +}
  26862. diff --git a/src/Microsoft.AspNetCore.Razor.Language/TagHelperInfo.cs b/src/Microsoft.AspNetCore.Razor.Language/TagHelperInfo.cs
  26863. new file mode 100644
  26864. index 00000000000..3cc665b4fdb
  26865. --- /dev/null
  26866. +++ b/src/Microsoft.AspNetCore.Razor.Language/TagHelperInfo.cs
  26867. @@ -0,0 +1,24 @@
  26868. +// Copyright (c) .NET Foundation. All rights reserved.
  26869. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  26870. +
  26871. +namespace Microsoft.AspNetCore.Razor.Language
  26872. +{
  26873. + internal class TagHelperInfo
  26874. + {
  26875. + public TagHelperInfo(
  26876. + string tagName,
  26877. + TagMode tagMode,
  26878. + TagHelperBinding bindingResult)
  26879. + {
  26880. + TagName = tagName;
  26881. + TagMode = tagMode;
  26882. + BindingResult = bindingResult;
  26883. + }
  26884. +
  26885. + public string TagName { get; }
  26886. +
  26887. + public TagMode TagMode { get; }
  26888. +
  26889. + public TagHelperBinding BindingResult { get; }
  26890. + }
  26891. +}
  26892. diff --git a/src/Microsoft.AspNetCore.Razor.Language/TagHelperSpanVisitor.cs b/src/Microsoft.AspNetCore.Razor.Language/TagHelperSpanVisitor.cs
  26893. new file mode 100644
  26894. index 00000000000..836a45ae983
  26895. --- /dev/null
  26896. +++ b/src/Microsoft.AspNetCore.Razor.Language/TagHelperSpanVisitor.cs
  26897. @@ -0,0 +1,31 @@
  26898. +// Copyright (c) .NET Foundation. All rights reserved.
  26899. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  26900. +
  26901. +using System.Collections.Generic;
  26902. +using Microsoft.AspNetCore.Razor.Language.Legacy;
  26903. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  26904. +
  26905. +namespace Microsoft.AspNetCore.Razor.Language
  26906. +{
  26907. + internal class TagHelperSpanVisitor : SyntaxWalker
  26908. + {
  26909. + private RazorSourceDocument _source;
  26910. + private List<TagHelperSpanInternal> _spans;
  26911. +
  26912. + public TagHelperSpanVisitor(RazorSourceDocument source)
  26913. + {
  26914. + _source = source;
  26915. + _spans = new List<TagHelperSpanInternal>();
  26916. + }
  26917. +
  26918. + public IReadOnlyList<TagHelperSpanInternal> TagHelperSpans => _spans;
  26919. +
  26920. + public override void VisitMarkupTagHelperElement(MarkupTagHelperElementSyntax node)
  26921. + {
  26922. + var span = new TagHelperSpanInternal(node.GetSourceSpan(_source), node.TagHelperInfo.BindingResult);
  26923. + _spans.Add(span);
  26924. +
  26925. + base.VisitMarkupTagHelperElement(node);
  26926. + }
  26927. + }
  26928. +}
  26929. diff --git a/src/Microsoft.CodeAnalysis.Razor.Workspaces/DefaultRazorCompletionFactsService.cs b/src/Microsoft.CodeAnalysis.Razor.Workspaces/DefaultRazorCompletionFactsService.cs
  26930. index 17c0664f4a5..5d0c542e5f3 100644
  26931. --- a/src/Microsoft.CodeAnalysis.Razor.Workspaces/DefaultRazorCompletionFactsService.cs
  26932. +++ b/src/Microsoft.CodeAnalysis.Razor.Workspaces/DefaultRazorCompletionFactsService.cs
  26933. @@ -6,6 +6,7 @@ using System.Composition;
  26934. using System.Linq;
  26935. using Microsoft.AspNetCore.Razor.Language;
  26936. using Microsoft.AspNetCore.Razor.Language.Legacy;
  26937. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  26938. namespace Microsoft.CodeAnalysis.Razor
  26939. {
  26940. @@ -68,12 +69,11 @@ namespace Microsoft.CodeAnalysis.Razor
  26941. return false;
  26942. }
  26943. - if (owner.ChunkGenerator is ExpressionChunkGenerator &&
  26944. - owner.Tokens.All(IsDirectiveCompletableToken) &&
  26945. - // Do not provide IntelliSense for explicit expressions. Explicit expressions will usually look like:
  26946. - // [@] [(] [DateTime.Now] [)]
  26947. - owner.Parent?.Children.Count > 1 &&
  26948. - owner.Parent.Children[1] == owner)
  26949. + // Do not provide IntelliSense for explicit expressions. Explicit expressions will usually look like:
  26950. + // [@] [(] [DateTime.Now] [)]
  26951. + var isImplicitExpression = owner.FirstAncestorOrSelf<CSharpImplicitExpressionSyntax>() != null;
  26952. + if (isImplicitExpression &&
  26953. + owner.ChildNodes().All(n => n.IsToken && IsDirectiveCompletableToken((AspNetCore.Razor.Language.Syntax.SyntaxToken)n)))
  26954. {
  26955. return true;
  26956. }
  26957. @@ -86,7 +86,7 @@ namespace Microsoft.CodeAnalysis.Razor
  26958. {
  26959. return token.Kind == SyntaxKind.Identifier ||
  26960. // Marker symbol
  26961. - token.Kind == SyntaxKind.Unknown;
  26962. + token.Kind == SyntaxKind.Marker;
  26963. }
  26964. }
  26965. }
  26966. diff --git a/src/Microsoft.VisualStudio.Editor.Razor/BraceSmartIndenter.cs b/src/Microsoft.VisualStudio.Editor.Razor/BraceSmartIndenter.cs
  26967. index 4de857b9667..1c04b067109 100644
  26968. --- a/src/Microsoft.VisualStudio.Editor.Razor/BraceSmartIndenter.cs
  26969. +++ b/src/Microsoft.VisualStudio.Editor.Razor/BraceSmartIndenter.cs
  26970. @@ -5,12 +5,12 @@ using System;
  26971. using System.Text;
  26972. using Microsoft.AspNetCore.Razor.Language;
  26973. using Microsoft.AspNetCore.Razor.Language.Legacy;
  26974. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  26975. using Microsoft.CodeAnalysis.Razor;
  26976. using Microsoft.VisualStudio.Text;
  26977. using Microsoft.VisualStudio.Text.Editor;
  26978. using Microsoft.VisualStudio.Text.Operations;
  26979. using ITextBuffer = Microsoft.VisualStudio.Text.ITextBuffer;
  26980. -using Span = Microsoft.AspNetCore.Razor.Language.Legacy.Span;
  26981. namespace Microsoft.VisualStudio.Editor.Razor
  26982. {
  26983. @@ -274,13 +274,15 @@ namespace Microsoft.VisualStudio.Editor.Razor
  26984. }
  26985. // Internal for testing
  26986. - internal static bool ContainsInvalidContent(Span owner)
  26987. + internal static bool ContainsInvalidContent(SyntaxNode owner)
  26988. {
  26989. - // We only support whitespace based content. Any non-whitespace content is an unkonwn to us
  26990. + // We only support whitespace based content. Any non-whitespace content is an unknown to us
  26991. // in regards to indentation.
  26992. - for (var i = 0; i < owner.Tokens.Count; i++)
  26993. + var children = owner.ChildNodes();
  26994. + for (var i = 0; i < children.Count; i++)
  26995. {
  26996. - if (!string.IsNullOrWhiteSpace(owner.Tokens[i].Content))
  26997. + if (!(children[i] is SyntaxToken token) ||
  26998. + !string.IsNullOrWhiteSpace(token.Content))
  26999. {
  27000. return true;
  27001. }
  27002. @@ -290,18 +292,18 @@ namespace Microsoft.VisualStudio.Editor.Razor
  27003. }
  27004. // Internal for testing
  27005. - internal static bool IsUnlinkedSpan(Span owner)
  27006. + internal static bool IsUnlinkedSpan(SyntaxNode owner)
  27007. {
  27008. return owner == null ||
  27009. - owner.Next == null ||
  27010. - owner.Previous == null;
  27011. + owner.NextSpan() == null ||
  27012. + owner.PreviousSpan() == null;
  27013. }
  27014. // Internal for testing
  27015. - internal static bool SurroundedByInvalidContent(Span owner)
  27016. + internal static bool SurroundedByInvalidContent(SyntaxNode owner)
  27017. {
  27018. - return owner.Next.Kind != SpanKindInternal.MetaCode ||
  27019. - owner.Previous.Kind != SpanKindInternal.MetaCode;
  27020. + return !owner.NextSpan().IsMetaCodeSpanKind() ||
  27021. + !owner.PreviousSpan().IsMetaCodeSpanKind();
  27022. }
  27023. internal static bool BeforeClosingBrace(int linePosition, ITextSnapshotLine lineSnapshot)
  27024. diff --git a/src/Microsoft.VisualStudio.Editor.Razor/DefaultRazorIndentationFactsService.cs b/src/Microsoft.VisualStudio.Editor.Razor/DefaultRazorIndentationFactsService.cs
  27025. index f8776d6993b..8b460df9c06 100644
  27026. --- a/src/Microsoft.VisualStudio.Editor.Razor/DefaultRazorIndentationFactsService.cs
  27027. +++ b/src/Microsoft.VisualStudio.Editor.Razor/DefaultRazorIndentationFactsService.cs
  27028. @@ -5,8 +5,8 @@ using System;
  27029. using System.ComponentModel.Composition;
  27030. using Microsoft.AspNetCore.Razor.Language;
  27031. using Microsoft.AspNetCore.Razor.Language.Legacy;
  27032. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  27033. using Microsoft.VisualStudio.Text;
  27034. -using Span = Microsoft.AspNetCore.Razor.Language.Legacy.Span;
  27035. namespace Microsoft.VisualStudio.Editor.Razor
  27036. {
  27037. @@ -63,8 +63,8 @@ namespace Microsoft.VisualStudio.Editor.Razor
  27038. var previousLineEndIndex = GetPreviousLineEndIndex(syntaxTreeSnapshot, line);
  27039. var simulatedChange = new SourceChange(previousLineEndIndex, 0, string.Empty);
  27040. - var owningSpan = syntaxTree.Root.LocateOwner(simulatedChange);
  27041. - if (owningSpan == null || owningSpan.Kind == SpanKindInternal.Code)
  27042. + var owner = syntaxTree.Root.LocateOwner(simulatedChange);
  27043. + if (owner == null || owner.IsCodeSpanKind())
  27044. {
  27045. // Example,
  27046. // @{\n
  27047. @@ -74,20 +74,19 @@ namespace Microsoft.VisualStudio.Editor.Razor
  27048. }
  27049. int? desiredIndentation = null;
  27050. - SyntaxTreeNode owningChild = owningSpan;
  27051. - while (owningChild.Parent != null)
  27052. + while (owner.Parent != null)
  27053. {
  27054. - var owningParent = owningChild.Parent;
  27055. - for (var i = 0; i < owningParent.Children.Count; i++)
  27056. + var children = owner.Parent.ChildNodes();
  27057. + for (var i = 0; i < children.Count; i++)
  27058. {
  27059. - var currentChild = owningParent.Children[i];
  27060. + var currentChild = children[i];
  27061. if (IsCSharpOpenCurlyBrace(currentChild))
  27062. {
  27063. - var lineText = line.Snapshot.GetLineFromLineNumber(currentChild.Start.LineIndex).GetText();
  27064. + var lineText = line.Snapshot.GetLineFromLineNumber(currentChild.GetSourceLocation(syntaxTree.Source).LineIndex).GetText();
  27065. desiredIndentation = GetIndentLevelOfLine(lineText, tabSize) + indentSize;
  27066. }
  27067. - if (currentChild == owningChild)
  27068. + if (currentChild == owner)
  27069. {
  27070. break;
  27071. }
  27072. @@ -98,7 +97,7 @@ namespace Microsoft.VisualStudio.Editor.Razor
  27073. return desiredIndentation;
  27074. }
  27075. - owningChild = owningParent;
  27076. + owner = owner.Parent;
  27077. }
  27078. // Couldn't determine indentation
  27079. @@ -139,11 +138,12 @@ namespace Microsoft.VisualStudio.Editor.Razor
  27080. }
  27081. // Internal for testing
  27082. - internal static bool IsCSharpOpenCurlyBrace(SyntaxTreeNode currentChild)
  27083. + internal static bool IsCSharpOpenCurlyBrace(SyntaxNode node)
  27084. {
  27085. - return currentChild is Span currentSpan &&
  27086. - currentSpan.Tokens.Count == 1 &&
  27087. - currentSpan.Tokens[0].Kind == SyntaxKind.LeftBrace;
  27088. + var children = node.ChildNodes();
  27089. + return children.Count == 1 &&
  27090. + children[0].IsToken &&
  27091. + children[0].Kind == SyntaxKind.LeftBrace;
  27092. }
  27093. }
  27094. }
  27095. diff --git a/src/Microsoft.VisualStudio.Editor.Razor/RazorSyntaxTreePartialParser.cs b/src/Microsoft.VisualStudio.Editor.Razor/RazorSyntaxTreePartialParser.cs
  27096. index 377351c9590..36b4955e3d4 100644
  27097. --- a/src/Microsoft.VisualStudio.Editor.Razor/RazorSyntaxTreePartialParser.cs
  27098. +++ b/src/Microsoft.VisualStudio.Editor.Razor/RazorSyntaxTreePartialParser.cs
  27099. @@ -4,13 +4,13 @@
  27100. using System;
  27101. using Microsoft.AspNetCore.Razor.Language;
  27102. using Microsoft.AspNetCore.Razor.Language.Legacy;
  27103. -using Span = Microsoft.AspNetCore.Razor.Language.Legacy.Span;
  27104. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  27105. namespace Microsoft.VisualStudio.Editor.Razor
  27106. {
  27107. internal class RazorSyntaxTreePartialParser
  27108. {
  27109. - private Span _lastChangeOwner;
  27110. + private SyntaxNode _lastChangeOwner;
  27111. private bool _lastResultProvisional;
  27112. public RazorSyntaxTreePartialParser(RazorSyntaxTree syntaxTree)
  27113. @@ -20,13 +20,15 @@ namespace Microsoft.VisualStudio.Editor.Razor
  27114. throw new ArgumentNullException(nameof(syntaxTree));
  27115. }
  27116. - // We mutate the existing syntax tree so we need to clone the one passed in so our mutations don't
  27117. - // impact external state.
  27118. - SyntaxTreeRoot = (Block)syntaxTree.Root.Clone();
  27119. + OriginalSyntaxTree = syntaxTree;
  27120. + ModifiedSyntaxTreeRoot = syntaxTree.Root;
  27121. }
  27122. // Internal for testing
  27123. - internal Block SyntaxTreeRoot { get; }
  27124. + internal RazorSyntaxTree OriginalSyntaxTree { get; }
  27125. +
  27126. + // Internal for testing
  27127. + internal SyntaxNode ModifiedSyntaxTreeRoot { get; private set; }
  27128. public PartialParseResultInternal Parse(SourceChange change)
  27129. {
  27130. @@ -43,20 +45,24 @@ namespace Microsoft.VisualStudio.Editor.Razor
  27131. var result = PartialParseResultInternal.Rejected;
  27132. // Try the last change owner
  27133. - if (_lastChangeOwner != null && _lastChangeOwner.EditHandler.OwnsChange(_lastChangeOwner, change))
  27134. + if (_lastChangeOwner != null)
  27135. {
  27136. - var editResult = _lastChangeOwner.EditHandler.ApplyChange(_lastChangeOwner, change);
  27137. - result = editResult.Result;
  27138. - if ((editResult.Result & PartialParseResultInternal.Rejected) != PartialParseResultInternal.Rejected)
  27139. + var editHandler = _lastChangeOwner.GetSpanContext()?.EditHandler ?? SpanEditHandler.CreateDefault();
  27140. + if (editHandler.OwnsChange(_lastChangeOwner, change))
  27141. {
  27142. - _lastChangeOwner.ReplaceWith(editResult.EditedSpan);
  27143. + var editResult = editHandler.ApplyChange(_lastChangeOwner, change);
  27144. + result = editResult.Result;
  27145. + if ((editResult.Result & PartialParseResultInternal.Rejected) != PartialParseResultInternal.Rejected)
  27146. + {
  27147. + ReplaceLastChangeOwner(editResult.EditedNode);
  27148. + }
  27149. }
  27150. return result;
  27151. }
  27152. // Locate the span responsible for this change
  27153. - _lastChangeOwner = SyntaxTreeRoot.LocateOwner(change);
  27154. + _lastChangeOwner = ModifiedSyntaxTreeRoot.LocateOwner(change);
  27155. if (_lastResultProvisional)
  27156. {
  27157. @@ -65,15 +71,29 @@ namespace Microsoft.VisualStudio.Editor.Razor
  27158. }
  27159. else if (_lastChangeOwner != null)
  27160. {
  27161. - var editResult = _lastChangeOwner.EditHandler.ApplyChange(_lastChangeOwner, change);
  27162. + var editHandler = _lastChangeOwner.GetSpanContext()?.EditHandler ?? SpanEditHandler.CreateDefault();
  27163. + var editResult = editHandler.ApplyChange(_lastChangeOwner, change);
  27164. result = editResult.Result;
  27165. if ((editResult.Result & PartialParseResultInternal.Rejected) != PartialParseResultInternal.Rejected)
  27166. {
  27167. - _lastChangeOwner.ReplaceWith(editResult.EditedSpan);
  27168. + ReplaceLastChangeOwner(editResult.EditedNode);
  27169. }
  27170. }
  27171. return result;
  27172. }
  27173. +
  27174. + private void ReplaceLastChangeOwner(SyntaxNode editedNode)
  27175. + {
  27176. + ModifiedSyntaxTreeRoot = ModifiedSyntaxTreeRoot.ReplaceNode(_lastChangeOwner, editedNode);
  27177. + foreach (var node in ModifiedSyntaxTreeRoot.DescendantNodes())
  27178. + {
  27179. + if (node.Green == editedNode.Green)
  27180. + {
  27181. + _lastChangeOwner = node;
  27182. + break;
  27183. + }
  27184. + }
  27185. + }
  27186. }
  27187. }
  27188. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/DefaultRazorTagHelperBinderPhaseTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/DefaultRazorTagHelperBinderPhaseTest.cs
  27189. index 65b5b49fe90..43c21817a9e 100644
  27190. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/DefaultRazorTagHelperBinderPhaseTest.cs
  27191. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/DefaultRazorTagHelperBinderPhaseTest.cs
  27192. @@ -5,6 +5,7 @@ using System;
  27193. using System.Collections.Generic;
  27194. using System.Linq;
  27195. using Microsoft.AspNetCore.Razor.Language.Legacy;
  27196. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  27197. using Xunit;
  27198. namespace Microsoft.AspNetCore.Razor.Language
  27199. @@ -45,8 +46,8 @@ namespace Microsoft.AspNetCore.Razor.Language
  27200. // Assert
  27201. var rewrittenTree = codeDocument.GetSyntaxTree();
  27202. - var directiveValue = rewrittenTree.Root.Children.OfType<Block>().First().Children.Last() as Span;
  27203. - var chunkGenerator = Assert.IsType<AddTagHelperChunkGenerator>(directiveValue.ChunkGenerator);
  27204. + var erroredNode = rewrittenTree.Root.DescendantNodes().First(n => n.GetSpanContext()?.ChunkGenerator is AddTagHelperChunkGenerator);
  27205. + var chunkGenerator = Assert.IsType<AddTagHelperChunkGenerator>(erroredNode.GetSpanContext().ChunkGenerator);
  27206. Assert.Equal(expectedDiagnostics, chunkGenerator.Diagnostics);
  27207. }
  27208. @@ -84,8 +85,8 @@ namespace Microsoft.AspNetCore.Razor.Language
  27209. // Assert
  27210. var rewrittenTree = codeDocument.GetSyntaxTree();
  27211. - var directiveValue = rewrittenTree.Root.Children.OfType<Block>().First().Children.Last() as Span;
  27212. - var chunkGenerator = Assert.IsType<RemoveTagHelperChunkGenerator>(directiveValue.ChunkGenerator);
  27213. + var erroredNode = rewrittenTree.Root.DescendantNodes().First(n => n.GetSpanContext()?.ChunkGenerator is RemoveTagHelperChunkGenerator);
  27214. + var chunkGenerator = Assert.IsType<RemoveTagHelperChunkGenerator>(erroredNode.GetSpanContext().ChunkGenerator);
  27215. Assert.Equal(expectedDiagnostics, chunkGenerator.Diagnostics);
  27216. }
  27217. @@ -123,8 +124,8 @@ namespace Microsoft.AspNetCore.Razor.Language
  27218. // Assert
  27219. var rewrittenTree = codeDocument.GetSyntaxTree();
  27220. - var directiveValue = rewrittenTree.Root.Children.OfType<Block>().First().Children.Last() as Span;
  27221. - var chunkGenerator = Assert.IsType<TagHelperPrefixDirectiveChunkGenerator>(directiveValue.ChunkGenerator);
  27222. + var erroredNode = rewrittenTree.Root.DescendantNodes().First(n => n.GetSpanContext()?.ChunkGenerator is TagHelperPrefixDirectiveChunkGenerator);
  27223. + var chunkGenerator = Assert.IsType<TagHelperPrefixDirectiveChunkGenerator>(erroredNode.GetSpanContext().ChunkGenerator);
  27224. Assert.Equal(expectedDiagnostics, chunkGenerator.Diagnostics);
  27225. }
  27226. @@ -162,13 +163,11 @@ namespace Microsoft.AspNetCore.Razor.Language
  27227. // Assert
  27228. var rewrittenTree = codeDocument.GetSyntaxTree();
  27229. + var descendantNodes = rewrittenTree.Root.DescendantNodes();
  27230. Assert.Empty(rewrittenTree.Diagnostics);
  27231. - Assert.Equal(3, rewrittenTree.Root.Children.Count);
  27232. - var formTagHelper = Assert.IsType<TagHelperBlock>(rewrittenTree.Root.Children[2]);
  27233. - Assert.Equal("form", formTagHelper.TagName);
  27234. - Assert.Equal(3, formTagHelper.Children.Count);
  27235. - var inputTagHelper = Assert.IsType<TagHelperBlock>(formTagHelper.Children[1]);
  27236. - Assert.Equal("input", inputTagHelper.TagName);
  27237. + var tagHelperNodes = descendantNodes.Where(n => n is MarkupTagHelperElementSyntax tagHelper).Cast<MarkupTagHelperElementSyntax>().ToArray();
  27238. + Assert.Equal("form", tagHelperNodes[0].TagHelperInfo.TagName);
  27239. + Assert.Equal("input", tagHelperNodes[1].TagHelperInfo.TagName);
  27240. }
  27241. [Fact]
  27242. @@ -204,13 +203,11 @@ namespace Microsoft.AspNetCore.Razor.Language
  27243. // Assert
  27244. var rewrittenTree = codeDocument.GetSyntaxTree();
  27245. + var descendantNodes = rewrittenTree.Root.DescendantNodes();
  27246. Assert.Empty(rewrittenTree.Diagnostics);
  27247. - Assert.Equal(3, rewrittenTree.Root.Children.Count);
  27248. - var formTagHelper = Assert.IsType<TagHelperBlock>(rewrittenTree.Root.Children[2]);
  27249. - Assert.Equal("form", formTagHelper.TagName);
  27250. - Assert.Equal(3, formTagHelper.Children.Count);
  27251. - var inputTagHelper = Assert.IsType<TagHelperBlock>(formTagHelper.Children[1]);
  27252. - Assert.Equal("input", inputTagHelper.TagName);
  27253. + var tagHelperNodes = descendantNodes.Where(n => n is MarkupTagHelperElementSyntax tagHelper).Cast<MarkupTagHelperElementSyntax>().ToArray();
  27254. + Assert.Equal("form", tagHelperNodes[0].TagHelperInfo.TagName);
  27255. + Assert.Equal("input", tagHelperNodes[1].TagHelperInfo.TagName);
  27256. }
  27257. [Fact]
  27258. @@ -246,13 +243,11 @@ namespace Microsoft.AspNetCore.Razor.Language
  27259. // Assert
  27260. var rewrittenTree = codeDocument.GetSyntaxTree();
  27261. + var descendantNodes = rewrittenTree.Root.DescendantNodes();
  27262. Assert.Empty(rewrittenTree.Diagnostics);
  27263. - Assert.Equal(3, rewrittenTree.Root.Children.Count);
  27264. - var formTagHelper = Assert.IsType<TagHelperBlock>(rewrittenTree.Root.Children[2]);
  27265. - Assert.Equal("form", formTagHelper.TagName);
  27266. - Assert.Equal(3, formTagHelper.Children.Count);
  27267. - var inputTagHelper = Assert.IsType<TagHelperBlock>(formTagHelper.Children[1]);
  27268. - Assert.Equal("input", inputTagHelper.TagName);
  27269. + var tagHelperNodes = descendantNodes.Where(n => n is MarkupTagHelperElementSyntax tagHelper).Cast<MarkupTagHelperElementSyntax>().ToArray();
  27270. + Assert.Equal("form", tagHelperNodes[0].TagHelperInfo.TagName);
  27271. + Assert.Equal("input", tagHelperNodes[1].TagHelperInfo.TagName);
  27272. }
  27273. [Fact]
  27274. @@ -288,10 +283,10 @@ namespace Microsoft.AspNetCore.Razor.Language
  27275. // Assert
  27276. var rewrittenTree = codeDocument.GetSyntaxTree();
  27277. + var descendantNodes = rewrittenTree.Root.DescendantNodes();
  27278. Assert.Empty(rewrittenTree.Diagnostics);
  27279. - Assert.Equal(7, rewrittenTree.Root.Children.Count);
  27280. - var rewrittenNodes = rewrittenTree.Root.Children.OfType<TagHelperBlock>();
  27281. - Assert.Empty(rewrittenNodes);
  27282. + var tagHelperNodes = descendantNodes.Where(n => n is MarkupTagHelperElementSyntax tagHelper).Cast<MarkupTagHelperElementSyntax>().ToArray();
  27283. + Assert.Empty(tagHelperNodes);
  27284. }
  27285. [Fact]
  27286. @@ -339,12 +334,13 @@ namespace Microsoft.AspNetCore.Razor.Language
  27287. // Assert
  27288. var rewrittenTree = codeDocument.GetSyntaxTree();
  27289. + var descendantNodes = rewrittenTree.Root.DescendantNodes();
  27290. Assert.Empty(rewrittenTree.Diagnostics);
  27291. - Assert.Equal(3, rewrittenTree.Root.Children.Count);
  27292. + var tagHelperNodes = descendantNodes.Where(n => n is MarkupTagHelperElementSyntax tagHelper).Cast<MarkupTagHelperElementSyntax>().ToArray();
  27293. - var formTagHelper = Assert.IsType<TagHelperBlock>(rewrittenTree.Root.Children[2]);
  27294. - Assert.Equal("form", formTagHelper.TagName);
  27295. - Assert.Equal(2, formTagHelper.Binding.GetBoundRules(descriptor).Count());
  27296. + var formTagHelper = Assert.Single(tagHelperNodes);
  27297. + Assert.Equal("form", formTagHelper.TagHelperInfo.TagName);
  27298. + Assert.Equal(2, formTagHelper.TagHelperInfo.BindingResult.GetBoundRules(descriptor).Count());
  27299. }
  27300. [Fact]
  27301. @@ -392,12 +388,13 @@ namespace Microsoft.AspNetCore.Razor.Language
  27302. // Assert
  27303. var rewrittenTree = codeDocument.GetSyntaxTree();
  27304. + var descendantNodes = rewrittenTree.Root.DescendantNodes();
  27305. Assert.Empty(rewrittenTree.Diagnostics);
  27306. - Assert.Equal(3, rewrittenTree.Root.Children.Count);
  27307. + var tagHelperNodes = descendantNodes.Where(n => n is MarkupTagHelperElementSyntax tagHelper).Cast<MarkupTagHelperElementSyntax>().ToArray();
  27308. - var formTagHelper = Assert.IsType<TagHelperBlock>(rewrittenTree.Root.Children[2]);
  27309. - Assert.Equal("form", formTagHelper.TagName);
  27310. - Assert.Equal(2, formTagHelper.Binding.GetBoundRules(descriptor).Count());
  27311. + var formTagHelper = Assert.Single(tagHelperNodes);
  27312. + Assert.Equal("form", formTagHelper.TagHelperInfo.TagName);
  27313. + Assert.Equal(2, formTagHelper.TagHelperInfo.BindingResult.GetBoundRules(descriptor).Count());
  27314. }
  27315. [Fact]
  27316. @@ -437,15 +434,12 @@ namespace Microsoft.AspNetCore.Razor.Language
  27317. // Assert
  27318. var rewrittenTree = codeDocument.GetSyntaxTree();
  27319. + var descendantNodes = rewrittenTree.Root.DescendantNodes();
  27320. Assert.Empty(rewrittenTree.Diagnostics);
  27321. - Assert.Equal(3, rewrittenTree.Root.Children.Count);
  27322. - var formTagHelper = Assert.IsType<TagHelperBlock>(rewrittenTree.Root.Children[2]);
  27323. - Assert.Equal("form", formTagHelper.TagName);
  27324. - Assert.Collection(
  27325. - formTagHelper.Children,
  27326. - node => Assert.IsNotType<TagHelperBlock>(node),
  27327. - node => Assert.IsNotType<TagHelperBlock>(node),
  27328. - node => Assert.IsNotType<TagHelperBlock>(node));
  27329. + var tagHelperNodes = descendantNodes.Where(n => n is MarkupTagHelperElementSyntax tagHelper).Cast<MarkupTagHelperElementSyntax>().ToArray();
  27330. +
  27331. + var formTagHelper = Assert.Single(tagHelperNodes);
  27332. + Assert.Equal("form", formTagHelper.TagHelperInfo.TagName);
  27333. }
  27334. [Fact]
  27335. @@ -691,7 +685,7 @@ namespace Microsoft.AspNetCore.Razor.Language
  27336. var visitor = new DefaultRazorTagHelperBinderPhase.DirectiveVisitor(tagHelpers: new List<TagHelperDescriptor>());
  27337. // Act
  27338. - visitor.VisitBlock(syntaxTree.Root);
  27339. + visitor.Visit(syntaxTree.Root);
  27340. // Assert
  27341. Assert.Equal(expectedPrefix, visitor.TagHelperPrefix);
  27342. @@ -857,7 +851,7 @@ namespace Microsoft.AspNetCore.Razor.Language
  27343. var visitor = new DefaultRazorTagHelperBinderPhase.DirectiveVisitor((TagHelperDescriptor[])tagHelpers);
  27344. // Act
  27345. - visitor.VisitBlock(syntaxTree.Root);
  27346. + visitor.Visit(syntaxTree.Root);
  27347. // Assert
  27348. Assert.Equal(expected.Count(), visitor.Matches.Count());
  27349. @@ -1001,7 +995,7 @@ namespace Microsoft.AspNetCore.Razor.Language
  27350. var visitor = new DefaultRazorTagHelperBinderPhase.DirectiveVisitor((TagHelperDescriptor[])tagHelpers);
  27351. // Act
  27352. - visitor.VisitBlock(syntaxTree.Root);
  27353. + visitor.Visit(syntaxTree.Root);
  27354. // Assert
  27355. Assert.Empty(visitor.Matches);
  27356. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/DirectiveTokenEditHandlerTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/DirectiveTokenEditHandlerTest.cs
  27357. index 9cb09633a66..1f0336d0089 100644
  27358. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/DirectiveTokenEditHandlerTest.cs
  27359. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/DirectiveTokenEditHandlerTest.cs
  27360. @@ -1,10 +1,10 @@
  27361. // Copyright (c) .NET Foundation. All rights reserved.
  27362. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  27363. -using System;
  27364. using System.Collections.Generic;
  27365. -using System.Text;
  27366. +using System.Linq;
  27367. using Microsoft.AspNetCore.Razor.Language.Legacy;
  27368. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  27369. using Xunit;
  27370. namespace Microsoft.AspNetCore.Razor.Language.Test
  27371. @@ -18,11 +18,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Test
  27372. public void CanAcceptChange_ProvisionallyAcceptsNonWhitespaceChanges(int index, int length, string newText)
  27373. {
  27374. // Arrange
  27375. - var factory = new SpanFactory();
  27376. var directiveTokenHandler = new TestDirectiveTokenEditHandler();
  27377. - var target = factory.Span(SpanKindInternal.Code, "SomeNamespace", markup: false)
  27378. - .With(directiveTokenHandler)
  27379. - .Accepts(AcceptedCharactersInternal.NonWhitespace);
  27380. + directiveTokenHandler.AcceptedCharacters = AcceptedCharactersInternal.NonWhitespace;
  27381. +
  27382. + var target = GetSyntaxNode(directiveTokenHandler, "SomeNamespace");
  27383. +
  27384. var sourceChange = new SourceChange(index, length, newText);
  27385. // Act
  27386. @@ -39,11 +39,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Test
  27387. public void CanAcceptChange_RejectsWhitespaceChanges(int index, int length, string newText)
  27388. {
  27389. // Arrange
  27390. - var factory = new SpanFactory();
  27391. var directiveTokenHandler = new TestDirectiveTokenEditHandler();
  27392. - var target = factory.Span(SpanKindInternal.Code, "Some Namespace", markup: false)
  27393. - .With(directiveTokenHandler)
  27394. - .Accepts(AcceptedCharactersInternal.NonWhitespace);
  27395. + directiveTokenHandler.AcceptedCharacters = AcceptedCharactersInternal.NonWhitespace;
  27396. +
  27397. + var target = GetSyntaxNode(directiveTokenHandler, "Some Namespace");
  27398. +
  27399. var sourceChange = new SourceChange(index, length, newText);
  27400. // Act
  27401. @@ -53,14 +53,34 @@ namespace Microsoft.AspNetCore.Razor.Language.Test
  27402. Assert.Equal(PartialParseResultInternal.Rejected, result);
  27403. }
  27404. + private static CSharpStatementLiteralSyntax GetSyntaxNode(DirectiveTokenEditHandler editHandler, string content)
  27405. + {
  27406. + var builder = SyntaxListBuilder<SyntaxToken>.Create();
  27407. + var tokens = CSharpLanguageCharacteristics.Instance.TokenizeString(content).ToArray();
  27408. + foreach (var token in tokens)
  27409. + {
  27410. + builder.Add((SyntaxToken)token.CreateRed());
  27411. + }
  27412. + var node = SyntaxFactory.CSharpStatementLiteral(builder.ToList());
  27413. +
  27414. + var context = new SpanContext(SpanChunkGenerator.Null, editHandler);
  27415. +
  27416. + return node.WithSpanContext(context);
  27417. + }
  27418. +
  27419. private class TestDirectiveTokenEditHandler : DirectiveTokenEditHandler
  27420. {
  27421. - public TestDirectiveTokenEditHandler() : base(content => SpanConstructor.TestTokenizer(content))
  27422. + public TestDirectiveTokenEditHandler() : base(content => TestTokenizer(content))
  27423. {
  27424. }
  27425. - public new PartialParseResultInternal CanAcceptChange(Span target, SourceChange change)
  27426. + public new PartialParseResultInternal CanAcceptChange(SyntaxNode target, SourceChange change)
  27427. => base.CanAcceptChange(target, change);
  27428. +
  27429. + internal static IEnumerable<Syntax.InternalSyntax.SyntaxToken> TestTokenizer(string str)
  27430. + {
  27431. + yield return Syntax.InternalSyntax.SyntaxFactory.Token(SyntaxKind.Marker, str);
  27432. + }
  27433. }
  27434. }
  27435. }
  27436. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/HtmlNodeOptimizationPassTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/HtmlNodeOptimizationPassTest.cs
  27437. index 4ece47b0cdb..bf08903e5a3 100644
  27438. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/HtmlNodeOptimizationPassTest.cs
  27439. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/HtmlNodeOptimizationPassTest.cs
  27440. @@ -4,33 +4,13 @@
  27441. using System;
  27442. using System.Linq;
  27443. using Microsoft.AspNetCore.Razor.Language.Legacy;
  27444. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  27445. using Xunit;
  27446. namespace Microsoft.AspNetCore.Razor.Language
  27447. {
  27448. public class HtmlNodeOptimizationPassTest
  27449. {
  27450. - [Fact]
  27451. - public void Execute_CollapsesConditionalAttributes()
  27452. - {
  27453. - // Assert
  27454. - var content = "<input value='hello world' />";
  27455. - var sourceDocument = TestRazorSourceDocument.Create(content);
  27456. - var originalTree = RazorSyntaxTree.Parse(sourceDocument);
  27457. - var pass = new HtmlNodeOptimizationPass();
  27458. - var codeDocument = RazorCodeDocument.Create(sourceDocument);
  27459. -
  27460. - // Act
  27461. - var outputTree = pass.Execute(codeDocument, originalTree);
  27462. -
  27463. - // Assert
  27464. - var tag = Assert.Single(outputTree.Root.Children);
  27465. - var tagBlock = Assert.IsType<Block>(tag);
  27466. - Assert.Equal(BlockKindInternal.Tag, tagBlock.Type);
  27467. - Assert.Equal(3, tagBlock.Children.Count);
  27468. - Assert.IsType<Span>(tagBlock.Children[1]);
  27469. - }
  27470. -
  27471. [Fact]
  27472. public void Execute_RewritesWhitespace()
  27473. {
  27474. @@ -45,9 +25,11 @@ namespace Microsoft.AspNetCore.Razor.Language
  27475. var outputTree = pass.Execute(codeDocument, originalTree);
  27476. // Assert
  27477. - Assert.Equal(4, outputTree.Root.Children.Count);
  27478. - var whitespace = Assert.IsType<Span>(outputTree.Root.Children[1]);
  27479. - Assert.True(whitespace.Content.All(char.IsWhiteSpace));
  27480. + var document = Assert.IsType<RazorDocumentSyntax>(outputTree.Root);
  27481. + var block = Assert.IsType<MarkupBlockSyntax>(document.Document);
  27482. + Assert.Equal(4, block.Children.Count);
  27483. + var whitespace = Assert.IsType<MarkupTextLiteralSyntax>(block.Children[1]);
  27484. + Assert.True(whitespace.GetContent().All(char.IsWhiteSpace));
  27485. }
  27486. }
  27487. }
  27488. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/IntegrationTests/TagHelpersIntegrationTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/IntegrationTests/TagHelpersIntegrationTest.cs
  27489. index c8cd0e41460..c5c9810e765 100644
  27490. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/IntegrationTests/TagHelpersIntegrationTest.cs
  27491. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/IntegrationTests/TagHelpersIntegrationTest.cs
  27492. @@ -94,6 +94,8 @@ namespace Microsoft.AspNetCore.Razor.Language.IntegrationTests
  27493. var codeDocument = projectEngine.Process(projectItem);
  27494. // Assert
  27495. + var syntaxTree = codeDocument.GetSyntaxTree();
  27496. + var irTree = codeDocument.GetDocumentIntermediateNode();
  27497. AssertDocumentNodeMatchesBaseline(codeDocument.GetDocumentIntermediateNode());
  27498. }
  27499. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/BlockTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/BlockTest.cs
  27500. deleted file mode 100644
  27501. index 5cfbec740aa..00000000000
  27502. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/BlockTest.cs
  27503. +++ /dev/null
  27504. @@ -1,119 +0,0 @@
  27505. -// Copyright (c) .NET Foundation. All rights reserved.
  27506. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  27507. -
  27508. -using System.Linq;
  27509. -using Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax;
  27510. -using Xunit;
  27511. -
  27512. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  27513. -{
  27514. - public class BlockTest
  27515. - {
  27516. - [Fact]
  27517. - public void ChildChanged_NotifiesParent()
  27518. - {
  27519. - // Arrange
  27520. - var spanBuilder = new SpanBuilder(SourceLocation.Zero);
  27521. - spanBuilder.Accept(SyntaxFactory.Token(SyntaxKind.Text, "hello"));
  27522. - var span = spanBuilder.Build();
  27523. - var blockBuilder = new BlockBuilder()
  27524. - {
  27525. - Type = BlockKindInternal.Markup,
  27526. - };
  27527. - blockBuilder.Children.Add(span);
  27528. - var childBlock = blockBuilder.Build();
  27529. - blockBuilder = new BlockBuilder()
  27530. - {
  27531. - Type = BlockKindInternal.Markup,
  27532. - };
  27533. - blockBuilder.Children.Add(childBlock);
  27534. - var parentBlock = blockBuilder.Build();
  27535. - var originalBlockLength = parentBlock.Length;
  27536. - spanBuilder = new SpanBuilder(SourceLocation.Zero);
  27537. - spanBuilder.Accept(SyntaxFactory.Token(SyntaxKind.Text, "hi"));
  27538. - span.ReplaceWith(spanBuilder);
  27539. -
  27540. - // Wire up parents now so we can re-trigger ChildChanged to cause cache refresh.
  27541. - span.Parent = childBlock;
  27542. - childBlock.Parent = parentBlock;
  27543. -
  27544. - // Act
  27545. - childBlock.ChildChanged();
  27546. -
  27547. - // Assert
  27548. - Assert.Equal(5, originalBlockLength);
  27549. - Assert.Equal(2, parentBlock.Length);
  27550. - }
  27551. -
  27552. - [Fact]
  27553. - public void Clone_ClonesBlock()
  27554. - {
  27555. - // Arrange
  27556. - var blockBuilder = new BlockBuilder()
  27557. - {
  27558. - ChunkGenerator = new DynamicAttributeBlockChunkGenerator(new LocationTagged<string>("class=\"", SourceLocation.Zero), 0, 0, 0),
  27559. - Type = BlockKindInternal.Expression,
  27560. - };
  27561. - blockBuilder.Children.Add(new SpanBuilder(new SourceLocation(1, 2, 3)).Build());
  27562. - var block = blockBuilder.Build();
  27563. -
  27564. - // Act
  27565. - var copy = (Block)block.Clone();
  27566. -
  27567. - // Assert
  27568. - ParserTestBase.EvaluateParseTree(copy, block);
  27569. - Assert.NotSame(block, copy);
  27570. - }
  27571. -
  27572. - [Fact]
  27573. - public void ConstructorWithBlockBuilderSetsParent()
  27574. - {
  27575. - // Arrange
  27576. - var builder = new BlockBuilder() { Type = BlockKindInternal.Comment };
  27577. - var span = new SpanBuilder(SourceLocation.Undefined) { Kind = SpanKindInternal.Code }.Build();
  27578. - builder.Children.Add(span);
  27579. -
  27580. - // Act
  27581. - var block = builder.Build();
  27582. -
  27583. - // Assert
  27584. - Assert.Same(block, span.Parent);
  27585. - }
  27586. -
  27587. - [Fact]
  27588. - public void ConstructorTransfersInstanceOfChunkGeneratorFromBlockBuilder()
  27589. - {
  27590. - // Arrange
  27591. - var expected = new ExpressionChunkGenerator();
  27592. - var builder = new BlockBuilder()
  27593. - {
  27594. - Type = BlockKindInternal.Statement,
  27595. - ChunkGenerator = expected
  27596. - };
  27597. -
  27598. - // Act
  27599. - var actual = builder.Build();
  27600. -
  27601. - // Assert
  27602. - Assert.Same(expected, actual.ChunkGenerator);
  27603. - }
  27604. -
  27605. - [Fact]
  27606. - public void ConstructorTransfersChildrenFromBlockBuilder()
  27607. - {
  27608. - // Arrange
  27609. - var expected = new SpanBuilder(SourceLocation.Undefined) { Kind = SpanKindInternal.Code }.Build();
  27610. - var builder = new BlockBuilder()
  27611. - {
  27612. - Type = BlockKindInternal.Statement
  27613. - };
  27614. - builder.Children.Add(expected);
  27615. -
  27616. - // Act
  27617. - var block = builder.Build();
  27618. -
  27619. - // Assert
  27620. - Assert.Same(expected, block.Children.Single());
  27621. - }
  27622. - }
  27623. -}
  27624. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpCodeParserTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpCodeParserTest.cs
  27625. index ea86c722268..250eff4f407 100644
  27626. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpCodeParserTest.cs
  27627. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpCodeParserTest.cs
  27628. @@ -5,6 +5,7 @@ using System;
  27629. using System.Collections.Generic;
  27630. using System.Linq;
  27631. using Microsoft.AspNetCore.Razor.Language.Legacy;
  27632. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  27633. using Xunit;
  27634. namespace Microsoft.AspNetCore.Razor.Language.Test.Legacy
  27635. @@ -205,9 +206,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Test.Legacy
  27636. var document = RazorSyntaxTree.Parse(source);
  27637. // Assert
  27638. - var directive = document.Root.Children.OfType<Block>().Last();
  27639. - var erroredSpan = (Span)directive.Children.Last();
  27640. - var chunkGenerator = Assert.IsType<TagHelperPrefixDirectiveChunkGenerator>(erroredSpan.ChunkGenerator);
  27641. + var erroredNode = document.Root.DescendantNodes().Last(n => n.GetSpanContext()?.ChunkGenerator is TagHelperPrefixDirectiveChunkGenerator);
  27642. + var chunkGenerator = Assert.IsType<TagHelperPrefixDirectiveChunkGenerator>(erroredNode.GetSpanContext().ChunkGenerator);
  27643. var diagnostic = Assert.Single(chunkGenerator.Diagnostics);
  27644. Assert.Equal(expectedDiagnostic, diagnostic);
  27645. }
  27646. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpRazorCommentsTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpRazorCommentsTest.cs
  27647. index af280d67f0c..1417356875b 100644
  27648. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpRazorCommentsTest.cs
  27649. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpRazorCommentsTest.cs
  27650. @@ -33,6 +33,18 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  27651. ParseDocumentTest("@foo(@*");
  27652. }
  27653. + [Fact]
  27654. + public void RazorMultilineCommentInBlock()
  27655. + {
  27656. + ParseDocumentTest(@"
  27657. +@{
  27658. + @*
  27659. +This is a comment
  27660. + *@
  27661. +}
  27662. +");
  27663. + }
  27664. +
  27665. [Fact]
  27666. public void RazorCommentInVerbatimBlock()
  27667. {
  27668. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpSectionTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpSectionTest.cs
  27669. index 52bca860e14..c4221e50158 100644
  27670. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpSectionTest.cs
  27671. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpSectionTest.cs
  27672. @@ -139,15 +139,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  27673. public void ReportsErrorAndAcceptsWhitespaceToEOLIfSectionNotFollowedByOpenBrace()
  27674. {
  27675. // ParseSectionBlockReportsErrorAndAcceptsWhitespaceToEndOfLineIfSectionNotFollowedByOpenBrace
  27676. - // Arrange
  27677. - var chunkGenerator = new DirectiveChunkGenerator(SectionDirective.Directive);
  27678. - chunkGenerator.Diagnostics.Add(
  27679. - RazorDiagnosticFactory.CreateParsing_UnexpectedEOFAfterDirective(
  27680. - new SourceSpan(new SourceLocation(18 + Environment.NewLine.Length, 1, 0), contentLength: 1),
  27681. - SectionDirective.Directive.Directive,
  27682. - "{"));
  27683. -
  27684. - // Act & Assert
  27685. ParseDocumentTest(
  27686. "@section foo " + Environment.NewLine,
  27687. new[] { SectionDirective.Directive });
  27688. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpTokenizerTestBase.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpTokenizerTestBase.cs
  27689. index 60652e402f0..83b2adc684f 100644
  27690. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpTokenizerTestBase.cs
  27691. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpTokenizerTestBase.cs
  27692. @@ -7,7 +7,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  27693. {
  27694. public abstract class CSharpTokenizerTestBase : TokenizerTestBase
  27695. {
  27696. - private static SyntaxToken _ignoreRemaining = SyntaxFactory.Token(SyntaxKind.Unknown, string.Empty);
  27697. + private static SyntaxToken _ignoreRemaining = SyntaxFactory.Token(SyntaxKind.Marker, string.Empty);
  27698. internal override object IgnoreRemaining
  27699. {
  27700. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CodeBlockEditHandlerTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CodeBlockEditHandlerTest.cs
  27701. index df17deb5846..a300d388b26 100644
  27702. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CodeBlockEditHandlerTest.cs
  27703. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CodeBlockEditHandlerTest.cs
  27704. @@ -3,6 +3,7 @@
  27705. using System.Linq;
  27706. using Microsoft.AspNetCore.Razor.Language.Legacy;
  27707. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  27708. using Xunit;
  27709. namespace Microsoft.AspNetCore.Razor.Language.Test.Legacy
  27710. @@ -205,17 +206,17 @@ namespace Microsoft.AspNetCore.Razor.Language.Test.Legacy
  27711. Assert.False(result);
  27712. }
  27713. - private static Span GetSpan(SourceLocation start, string content)
  27714. + private static SyntaxNode GetSpan(SourceLocation start, string content)
  27715. {
  27716. - var spanBuilder = new SpanBuilder(start);
  27717. + var builder = SyntaxListBuilder<SyntaxToken>.Create();
  27718. var tokens = CSharpLanguageCharacteristics.Instance.TokenizeString(content).ToArray();
  27719. foreach (var token in tokens)
  27720. {
  27721. - spanBuilder.Accept(token);
  27722. + builder.Add((SyntaxToken)token.CreateRed());
  27723. }
  27724. - var span = spanBuilder.Build();
  27725. + var node = SyntaxFactory.CSharpStatementLiteral(builder.ToList());
  27726. - return span;
  27727. + return node;
  27728. }
  27729. }
  27730. }
  27731. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CsHtmlCodeParserTestBase.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CsHtmlCodeParserTestBase.cs
  27732. index db0f3d845a2..e87bb40d3d4 100644
  27733. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CsHtmlCodeParserTestBase.cs
  27734. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CsHtmlCodeParserTestBase.cs
  27735. @@ -11,10 +11,5 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  27736. {
  27737. get { return CSharpCodeParser.DefaultKeywords; }
  27738. }
  27739. -
  27740. - internal override BlockFactory CreateBlockFactory()
  27741. - {
  27742. - return new BlockFactory(Factory ?? CreateSpanFactory());
  27743. - }
  27744. }
  27745. }
  27746. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CsHtmlMarkupParserTestBase.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CsHtmlMarkupParserTestBase.cs
  27747. index a643ea73af7..072769f1e86 100644
  27748. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CsHtmlMarkupParserTestBase.cs
  27749. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CsHtmlMarkupParserTestBase.cs
  27750. @@ -11,10 +11,5 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  27751. {
  27752. get { return CSharpCodeParser.DefaultKeywords; }
  27753. }
  27754. -
  27755. - internal override BlockFactory CreateBlockFactory()
  27756. - {
  27757. - return new BlockFactory(Factory ?? CreateSpanFactory());
  27758. - }
  27759. }
  27760. }
  27761. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlAttributeTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlAttributeTest.cs
  27762. index 1fae85afba8..41ba2004f26 100644
  27763. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlAttributeTest.cs
  27764. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlAttributeTest.cs
  27765. @@ -219,90 +219,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  27766. ParseDocumentTest("<input value=@foo />");
  27767. }
  27768. - [Fact]
  27769. - public void ConditionalAttributeCollapserDoesNotRewriteEscapedTransitions()
  27770. - {
  27771. - // Act
  27772. - var results = ParseDocument("<span foo='@@' />");
  27773. - var attributeCollapser = new ConditionalAttributeCollapser();
  27774. - var rewritten = attributeCollapser.Rewrite(results.Root);
  27775. -
  27776. - // Assert
  27777. - BaselineTest(rewritten);
  27778. - }
  27779. -
  27780. - [Fact]
  27781. - public void ConditionalAttributesDoNotCreateExtraDataForEntirelyLiteralAttribute()
  27782. - {
  27783. - // Arrange
  27784. - const string code =
  27785. - @"<div class=""sidebar"">
  27786. - <h1>Title</h1>
  27787. - <p>
  27788. - As the author, you can <a href=""/Photo/Edit/photoId"">edit</a>
  27789. - or <a href=""/Photo/Remove/photoId"">remove</a> this photo.
  27790. - </p>
  27791. - <dl>
  27792. - <dt class=""description"">Description</dt>
  27793. - <dd class=""description"">
  27794. - The uploader did not provide a description for this photo.
  27795. - </dd>
  27796. - <dt class=""uploaded-by"">Uploaded by</dt>
  27797. - <dd class=""uploaded-by""><a href=""/User/View/user.UserId"">user.DisplayName</a></dd>
  27798. - <dt class=""upload-date"">Upload date</dt>
  27799. - <dd class=""upload-date"">photo.UploadDate</dd>
  27800. - <dt class=""part-of-gallery"">Gallery</dt>
  27801. - <dd><a href=""/View/gallery.Id"" title=""View gallery.Name gallery"">gallery.Name</a></dd>
  27802. - <dt class=""tags"">Tags</dt>
  27803. - <dd class=""tags"">
  27804. - <ul class=""tags"">
  27805. - <li>This photo has no tags.</li>
  27806. - </ul>
  27807. - <a href=""/Photo/EditTags/photoId"">edit tags</a>
  27808. - </dd>
  27809. - </dl>
  27810. -
  27811. - <p>
  27812. - <a class=""download"" href=""/Photo/Full/photoId"" title=""Download: (photo.FileTitle + photo.FileExtension)"">Download full photo</a> ((photo.FileSize / 1024) KB)
  27813. - </p>
  27814. -</div>
  27815. -<div class=""main"">
  27816. - <img class=""large-photo"" alt=""photo.FileTitle"" src=""/Photo/Thumbnail"" />
  27817. - <h2>Nobody has commented on this photo</h2>
  27818. - <ol class=""comments"">
  27819. - <li>
  27820. - <h3 class=""comment-header"">
  27821. - <a href=""/User/View/comment.UserId"" title=""View comment.DisplayName's profile"">comment.DisplayName</a> commented at comment.CommentDate:
  27822. - </h3>
  27823. - <p class=""comment-body"">comment.CommentText</p>
  27824. - </li>
  27825. - </ol>
  27826. -
  27827. - <form method=""post"" action="""">
  27828. - <fieldset id=""addComment"">
  27829. - <legend>Post new comment</legend>
  27830. - <ol>
  27831. - <li>
  27832. - <label for=""newComment"">Comment</label>
  27833. - <textarea id=""newComment"" name=""newComment"" title=""Your comment"" rows=""6"" cols=""70""></textarea>
  27834. - </li>
  27835. - </ol>
  27836. - <p class=""form-actions"">
  27837. - <input type=""submit"" title=""Add comment"" value=""Add comment"" />
  27838. - </p>
  27839. - </fieldset>
  27840. - </form>
  27841. -</div>";
  27842. -
  27843. - // Act
  27844. - var results = ParseDocument(code);
  27845. - var attributeCollapser = new ConditionalAttributeCollapser();
  27846. - var rewritten = attributeCollapser.Rewrite(results.Root);
  27847. -
  27848. - // Assert
  27849. - Assert.Equal(rewritten.Children.Count(), results.Root.Children.Count());
  27850. - }
  27851. -
  27852. [Fact]
  27853. public void ConditionalAttributesAreEnabledForDataAttributesWithExperimentalFlag()
  27854. {
  27855. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlDocumentTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlDocumentTest.cs
  27856. index f77ee48b607..ca41b2d4773 100644
  27857. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlDocumentTest.cs
  27858. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlDocumentTest.cs
  27859. @@ -2,7 +2,6 @@
  27860. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  27861. using System;
  27862. -using System.Linq;
  27863. using Microsoft.AspNetCore.Razor.Language.Extensions;
  27864. using Xunit;
  27865. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlMarkupParserTests.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlMarkupParserTests.cs
  27866. index c59bd36b080..dafb6b24191 100644
  27867. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlMarkupParserTests.cs
  27868. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlMarkupParserTests.cs
  27869. @@ -1,4 +1,7 @@
  27870. -using System;
  27871. +// Copyright (c) .NET Foundation. All rights reserved.
  27872. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  27873. +
  27874. +using System;
  27875. using System.Collections.Generic;
  27876. using System.Linq;
  27877. using Microsoft.AspNetCore.Razor.Language.Legacy;
  27878. @@ -206,18 +209,13 @@ namespace Microsoft.AspNetCore.Razor.Language.Test.Legacy
  27879. public TestHtmlMarkupParser(ParserContext context) : base(context)
  27880. {
  27881. - this.EnsureCurrent();
  27882. + EnsureCurrent();
  27883. }
  27884. public new SyntaxToken AcceptAllButLastDoubleHyphens()
  27885. {
  27886. return base.AcceptAllButLastDoubleHyphens();
  27887. }
  27888. -
  27889. - public override void BuildSpan(SpanBuilder span, SourceLocation start, string content)
  27890. - {
  27891. - base.BuildSpan(span, start, content);
  27892. - }
  27893. }
  27894. private static TestHtmlMarkupParser CreateTestParserForContent(string content)
  27895. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlToCodeSwitchTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlToCodeSwitchTest.cs
  27896. index 3676dc27ab0..8c32914815f 100644
  27897. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlToCodeSwitchTest.cs
  27898. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlToCodeSwitchTest.cs
  27899. @@ -144,7 +144,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  27900. [Fact]
  27901. public void ParseDocumentTreatsPairsOfAtSignsAsEscapeSequence()
  27902. {
  27903. - var factory = new SpanFactory();
  27904. ParseDocumentTest("<foo>@@@@@bar</foo>");
  27905. }
  27906. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlTokenizerTestBase.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlTokenizerTestBase.cs
  27907. index 76762e5bedd..0b6250d6d8f 100644
  27908. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlTokenizerTestBase.cs
  27909. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlTokenizerTestBase.cs
  27910. @@ -7,7 +7,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  27911. {
  27912. public abstract class HtmlTokenizerTestBase : TokenizerTestBase
  27913. {
  27914. - private static SyntaxToken _ignoreRemaining = SyntaxFactory.Token(SyntaxKind.Unknown, string.Empty);
  27915. + private static SyntaxToken _ignoreRemaining = SyntaxFactory.Token(SyntaxKind.Marker, string.Empty);
  27916. internal override object IgnoreRemaining
  27917. {
  27918. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/ImplicitExpressionEditHandlerTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/ImplicitExpressionEditHandlerTest.cs
  27919. index 2b3d8aa4572..bf71526eded 100644
  27920. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/ImplicitExpressionEditHandlerTest.cs
  27921. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/ImplicitExpressionEditHandlerTest.cs
  27922. @@ -3,7 +3,7 @@
  27923. using System.Collections.Generic;
  27924. using System.Linq;
  27925. -using Microsoft.AspNetCore.Razor.Language.Syntax;
  27926. +using Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax;
  27927. using Xunit;
  27928. namespace Microsoft.AspNetCore.Razor.Language.Legacy
  27929. @@ -14,7 +14,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  27930. public void IsAcceptableDeletionInBalancedParenthesis_DeletionStartNotInBalancedParenthesis_ReturnsFalse()
  27931. {
  27932. // Arrange
  27933. - var span = GetSpan(SourceLocation.Zero, "(Hell)(o)");
  27934. + var span = GetSyntaxNode(SourceLocation.Zero, "(Hell)(o)");
  27935. var change = new SourceChange(new SourceSpan(6, 1), string.Empty);
  27936. // Act
  27937. @@ -28,7 +28,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  27938. public void IsAcceptableDeletionInBalancedParenthesis_DeletionEndNotInBalancedParenthesis_ReturnsFalse()
  27939. {
  27940. // Arrange
  27941. - var span = GetSpan(SourceLocation.Zero, "(Hell)(o)");
  27942. + var span = GetSyntaxNode(SourceLocation.Zero, "(Hell)(o)");
  27943. var change = new SourceChange(new SourceSpan(5, 1), string.Empty);
  27944. // Act
  27945. @@ -42,7 +42,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  27946. public void IsAcceptableDeletionInBalancedParenthesis_DeletionOverlapsBalancedParenthesis_ReturnsFalse()
  27947. {
  27948. // Arrange
  27949. - var span = GetSpan(SourceLocation.Zero, "(Hell)(o)");
  27950. + var span = GetSyntaxNode(SourceLocation.Zero, "(Hell)(o)");
  27951. var change = new SourceChange(new SourceSpan(5, 2), string.Empty);
  27952. // Act
  27953. @@ -56,7 +56,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  27954. public void IsAcceptableDeletionInBalancedParenthesis_DeletionDoesNotImpactBalancedParenthesis_ReturnsTrue()
  27955. {
  27956. // Arrange
  27957. - var span = GetSpan(SourceLocation.Zero, "(H(ell)o)");
  27958. + var span = GetSyntaxNode(SourceLocation.Zero, "(H(ell)o)");
  27959. var change = new SourceChange(new SourceSpan(3, 3), string.Empty);
  27960. // Act
  27961. @@ -160,7 +160,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  27962. public void TryUpdateBalanceCount_SingleLeftParenthesis_CountsCorrectly()
  27963. {
  27964. // Arrange
  27965. - var token = SyntaxFactory.Token(SyntaxKind.LeftParenthesis, "(");
  27966. + var token = Syntax.SyntaxFactory.Token(SyntaxKind.LeftParenthesis, "(");
  27967. var count = 0;
  27968. // Act
  27969. @@ -175,7 +175,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  27970. public void TryUpdateBalanceCount_SingleRightParenthesis_CountsCorrectly()
  27971. {
  27972. // Arrange
  27973. - var token = SyntaxFactory.Token(SyntaxKind.RightParenthesis, ")");
  27974. + var token = Syntax.SyntaxFactory.Token(SyntaxKind.RightParenthesis, ")");
  27975. var count = 2;
  27976. // Act
  27977. @@ -190,7 +190,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  27978. public void TryUpdateBalanceCount_IncompleteStringLiteral_CountsCorrectly()
  27979. {
  27980. // Arrange
  27981. - var token = SyntaxFactory.Token(SyntaxKind.StringLiteral, "\"((");
  27982. + var token = Syntax.SyntaxFactory.Token(SyntaxKind.StringLiteral, "\"((");
  27983. var count = 2;
  27984. // Act
  27985. @@ -205,7 +205,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  27986. public void TryUpdateBalanceCount_IncompleteCharacterLiteral_CountsCorrectly()
  27987. {
  27988. // Arrange
  27989. - var token = SyntaxFactory.Token(SyntaxKind.CharacterLiteral, "'((");
  27990. + var token = Syntax.SyntaxFactory.Token(SyntaxKind.CharacterLiteral, "'((");
  27991. var count = 2;
  27992. // Act
  27993. @@ -220,7 +220,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  27994. public void TryUpdateBalanceCount_CompleteStringLiteral_CountsCorrectly()
  27995. {
  27996. // Arrange
  27997. - var token = SyntaxFactory.Token(SyntaxKind.StringLiteral, "\"((\"");
  27998. + var token = Syntax.SyntaxFactory.Token(SyntaxKind.StringLiteral, "\"((\"");
  27999. var count = 2;
  28000. // Act
  28001. @@ -235,7 +235,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  28002. public void TryUpdateBalanceCount_CompleteCharacterLiteral_CountsCorrectly()
  28003. {
  28004. // Arrange
  28005. - var token = SyntaxFactory.Token(SyntaxKind.CharacterLiteral, "'('");
  28006. + var token = Syntax.SyntaxFactory.Token(SyntaxKind.CharacterLiteral, "'('");
  28007. var count = 2;
  28008. // Act
  28009. @@ -250,7 +250,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  28010. public void TryUpdateBalanceCount_InvalidParenthesis_ReturnsFalse()
  28011. {
  28012. // Arrange
  28013. - var token = SyntaxFactory.Token(SyntaxKind.RightParenthesis, ")");
  28014. + var token = Syntax.SyntaxFactory.Token(SyntaxKind.RightParenthesis, ")");
  28015. var count = 0;
  28016. // Act
  28017. @@ -265,7 +265,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  28018. public void TryUpdateBalanceCount_InvalidParenthesisStringLiteral_ReturnsFalse()
  28019. {
  28020. // Arrange
  28021. - var token = SyntaxFactory.Token(SyntaxKind.StringLiteral, "\")");
  28022. + var token = Syntax.SyntaxFactory.Token(SyntaxKind.StringLiteral, "\")");
  28023. var count = 0;
  28024. // Act
  28025. @@ -280,7 +280,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  28026. public void TryUpdateBalanceCount_InvalidParenthesisCharacterLiteral_ReturnsFalse()
  28027. {
  28028. // Arrange
  28029. - var token = SyntaxFactory.Token(SyntaxKind.CharacterLiteral, "')");
  28030. + var token = Syntax.SyntaxFactory.Token(SyntaxKind.CharacterLiteral, "')");
  28031. var count = 0;
  28032. // Act
  28033. @@ -403,7 +403,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  28034. public void IsAcceptableInsertionInBalancedParenthesis_InsertingParenthesis_ReturnsFalse(string text)
  28035. {
  28036. // Arrange
  28037. - var span = GetSpan(SourceLocation.Zero, "(Hello World)");
  28038. + var span = GetSyntaxNode(SourceLocation.Zero, "(Hello World)");
  28039. var change = new SourceChange(new SourceSpan(3, 0), text);
  28040. // Act
  28041. @@ -417,7 +417,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  28042. public void IsAcceptableInsertionInBalancedParenthesis_UnbalancedParenthesis_ReturnsFalse()
  28043. {
  28044. // Arrange
  28045. - var span = GetSpan(SourceLocation.Zero, "(Hello");
  28046. + var span = GetSyntaxNode(SourceLocation.Zero, "(Hello");
  28047. var change = new SourceChange(new SourceSpan(6, 0), " World");
  28048. // Act
  28049. @@ -431,7 +431,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  28050. public void IsAcceptableInsertionInBalancedParenthesis_BalancedParenthesis_ReturnsTrue()
  28051. {
  28052. // Arrange
  28053. - var span = GetSpan(SourceLocation.Zero, "(Hello)");
  28054. + var span = GetSyntaxNode(SourceLocation.Zero, "(Hello)");
  28055. var change = new SourceChange(new SourceSpan(6, 0), " World");
  28056. // Act
  28057. @@ -441,23 +441,23 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  28058. Assert.True(result);
  28059. }
  28060. - private static Span GetSpan(SourceLocation start, string content)
  28061. + private static Syntax.MarkupTextLiteralSyntax GetSyntaxNode(SourceLocation start, string content)
  28062. {
  28063. - var spanBuilder = new SpanBuilder(start);
  28064. + var builder = SyntaxListBuilder<SyntaxToken>.Create();
  28065. var tokens = CSharpLanguageCharacteristics.Instance.TokenizeString(content).ToArray();
  28066. foreach (var token in tokens)
  28067. {
  28068. - spanBuilder.Accept(token);
  28069. + builder.Add(token);
  28070. }
  28071. - var span = spanBuilder.Build();
  28072. + var node = SyntaxFactory.MarkupTextLiteral(builder.ToList()).CreateRed(parent: null, position: start.AbsoluteIndex);
  28073. - return span;
  28074. + return (Syntax.MarkupTextLiteralSyntax)node;
  28075. }
  28076. - private static IReadOnlyList<SyntaxToken> GetTokens(SourceLocation start, string content)
  28077. + private static IReadOnlyList<Syntax.SyntaxToken> GetTokens(SourceLocation start, string content)
  28078. {
  28079. - var parent = GetSpan(start, content);
  28080. - return parent.Tokens;
  28081. + var parent = GetSyntaxNode(start, content);
  28082. + return parent.LiteralTokens;
  28083. }
  28084. }
  28085. }
  28086. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/MarkupElementRewriterTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/MarkupElementRewriterTest.cs
  28087. new file mode 100644
  28088. index 00000000000..4275ec123a2
  28089. --- /dev/null
  28090. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/MarkupElementRewriterTest.cs
  28091. @@ -0,0 +1,154 @@
  28092. +// Copyright (c) .NET Foundation. All rights reserved.
  28093. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  28094. +
  28095. +using System.Text;
  28096. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  28097. +using Xunit;
  28098. +
  28099. +namespace Microsoft.AspNetCore.Razor.Language.Legacy
  28100. +{
  28101. + public class MarkupElementRewriterTest : CsHtmlMarkupParserTestBase
  28102. + {
  28103. + [Fact]
  28104. + public void Rewrites_ValidTags()
  28105. + {
  28106. + // Arrange
  28107. + var content = @"
  28108. +<div>Foo</div>
  28109. +<p>Bar</p>
  28110. +";
  28111. +
  28112. + // Act & Assert
  28113. + RewriterTest(content);
  28114. + }
  28115. +
  28116. + [Fact]
  28117. + public void Rewrites_ValidNestedTags()
  28118. + {
  28119. + // Arrange
  28120. + var content = @"
  28121. +<div>
  28122. + Foo
  28123. + <p>Bar</p>
  28124. + Baz
  28125. +</div>";
  28126. +
  28127. + // Act & Assert
  28128. + RewriterTest(content);
  28129. + }
  28130. +
  28131. + [Fact]
  28132. + public void Rewrites_ValidNestedTagsMixedWithCode()
  28133. + {
  28134. + // Arrange
  28135. + var content = @"
  28136. +<div>
  28137. + Foo
  28138. + <p>@Bar</p>
  28139. + @{ var x = Bar; }
  28140. +</div>
  28141. +";
  28142. +
  28143. + // Act & Assert
  28144. + RewriterTest(content);
  28145. + }
  28146. +
  28147. + [Fact]
  28148. + public void Rewrites_EndTagsWithMissingStartTags()
  28149. + {
  28150. + // Arrange
  28151. + var content = @"
  28152. +Foo</div>
  28153. +";
  28154. +
  28155. + // Act & Assert
  28156. + RewriterTest(content);
  28157. + }
  28158. +
  28159. + [Fact]
  28160. + public void Rewrites_StartTagsWithMissingEndTags()
  28161. + {
  28162. + // Arrange
  28163. + var content = @"
  28164. +<div>
  28165. + Foo
  28166. + <p>
  28167. + Bar
  28168. + </strong>
  28169. +";
  28170. +
  28171. + // Act & Assert
  28172. + RewriterTest(content);
  28173. + }
  28174. +
  28175. + [Fact]
  28176. + public void Rewrites_SelfClosingTags()
  28177. + {
  28178. + // Arrange
  28179. + var content = @"
  28180. +<br/>Foo<custom />
  28181. +";
  28182. +
  28183. + // Act & Assert
  28184. + RewriterTest(content);
  28185. + }
  28186. +
  28187. + [Fact]
  28188. + public void Rewrites_MalformedTags_RecoversSuccessfully()
  28189. + {
  28190. + // Arrange
  28191. + var content = @"
  28192. +<div>content</span>footer</div>
  28193. +";
  28194. +
  28195. + // Act & Assert
  28196. + RewriterTest(content);
  28197. + }
  28198. +
  28199. + [Fact]
  28200. + public void Rewrites_MisplacedEndTags_RecoversSuccessfully()
  28201. + {
  28202. + // Arrange
  28203. + var content = @"
  28204. +<div>content<span>footer</div></span>
  28205. +";
  28206. +
  28207. + // Act & Assert
  28208. + RewriterTest(content);
  28209. + }
  28210. +
  28211. + [Fact]
  28212. + public void Rewrites_DoesNotSpecialCase_VoidTags()
  28213. + {
  28214. + // Arrange
  28215. + var content = @"
  28216. +<input>Foo</input>
  28217. +";
  28218. +
  28219. + // Act & Assert
  28220. + RewriterTest(content);
  28221. + }
  28222. +
  28223. + [Fact]
  28224. + public void Rewrites_IncompleteTags()
  28225. + {
  28226. + // Arrange
  28227. + var content = @"
  28228. +<<div>>Foo</</div>< >
  28229. +";
  28230. +
  28231. + // Act & Assert
  28232. + RewriterTest(content);
  28233. + }
  28234. +
  28235. + private void RewriterTest(string input)
  28236. + {
  28237. + var syntaxTree = ParseDocument(input, designTime: false);
  28238. + var rewritten = MarkupElementRewriter.AddMarkupElements(syntaxTree);
  28239. + BaselineTest(rewritten);
  28240. +
  28241. + var unrewritten = MarkupElementRewriter.RemoveMarkupElements(rewritten);
  28242. + Assert.Equal(syntaxTree.Root.SerializedValue, unrewritten.Root.SerializedValue);
  28243. + }
  28244. + }
  28245. +}
  28246. \ No newline at end of file
  28247. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/RazorDirectivesTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/RazorDirectivesTest.cs
  28248. index 5da2a4bba01..e4b999fd19c 100644
  28249. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/RazorDirectivesTest.cs
  28250. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/RazorDirectivesTest.cs
  28251. @@ -9,7 +9,7 @@ using Xunit;
  28252. namespace Microsoft.AspNetCore.Razor.Language.Legacy
  28253. {
  28254. - public class CSharpDirectivesTest : CsHtmlCodeParserTestBase
  28255. + public class RazorDirectivesTest : CsHtmlCodeParserTestBase
  28256. {
  28257. [Fact]
  28258. public void DirectiveDescriptor_FileScopedMultipleOccurring_CanHaveDuplicates()
  28259. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/RazorParserTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/RazorParserTest.cs
  28260. index 43d53bf84bf..7d848c29754 100644
  28261. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/RazorParserTest.cs
  28262. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/RazorParserTest.cs
  28263. @@ -1,7 +1,6 @@
  28264. // Copyright (c) .NET Foundation. All rights reserved.
  28265. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  28266. -using System.Linq;
  28267. using Xunit;
  28268. namespace Microsoft.AspNetCore.Razor.Language.Legacy
  28269. @@ -22,67 +21,32 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  28270. public void ParseMethodCallsParseDocumentOnMarkupParserAndReturnsResults()
  28271. {
  28272. // Arrange
  28273. - var factory = new SpanFactory();
  28274. var parser = new RazorParser();
  28275. + var expected =
  28276. +@"RazorDocument - [0..12)::12 - [foo @bar baz]
  28277. + MarkupBlock - [0..12)::12
  28278. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  28279. + Text;[foo];
  28280. + Whitespace;[ ];
  28281. + CSharpCodeBlock - [4..8)::4
  28282. + CSharpImplicitExpression - [4..8)::4
  28283. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  28284. + Transition;[@];
  28285. + CSharpImplicitExpressionBody - [5..8)::3
  28286. + CSharpCodeBlock - [5..8)::3
  28287. + CSharpExpressionLiteral - [5..8)::3 - [bar] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  28288. + Identifier;[bar];
  28289. + MarkupTextLiteral - [8..12)::4 - [ baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  28290. + Whitespace;[ ];
  28291. + Text;[baz];
  28292. +";
  28293. // Act
  28294. var syntaxTree = parser.Parse(TestRazorSourceDocument.Create("foo @bar baz"));
  28295. // Assert
  28296. - ParserTestBase.EvaluateResults(parser.Parse(TestRazorSourceDocument.Create("foo @bar baz")),
  28297. - new MarkupBlock(
  28298. - factory.Markup("foo "),
  28299. - new ExpressionBlock(
  28300. - factory.CodeTransition(),
  28301. - factory.Code("bar")
  28302. - .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
  28303. - .Accepts(AcceptedCharactersInternal.NonWhitespace)),
  28304. - factory.Markup(" baz")));
  28305. - }
  28306. -
  28307. - [Fact]
  28308. - public void ParseMethodUsesProvidedParserListenerIfSpecified()
  28309. - {
  28310. - // Arrange
  28311. - var factory = new SpanFactory();
  28312. - var parser = new RazorParser();
  28313. -
  28314. - // Act
  28315. - var results = parser.Parse(TestRazorSourceDocument.Create("foo @bar baz"));
  28316. -
  28317. - // Assert
  28318. - ParserTestBase.EvaluateResults(results,
  28319. - new MarkupBlock(
  28320. - factory.Markup("foo "),
  28321. - new ExpressionBlock(
  28322. - factory.CodeTransition(),
  28323. - factory.Code("bar")
  28324. - .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
  28325. - .Accepts(AcceptedCharactersInternal.NonWhitespace)),
  28326. - factory.Markup(" baz")));
  28327. - }
  28328. -
  28329. - [Fact]
  28330. - public void Parse_SyntaxTreeSpansAreLinked()
  28331. - {
  28332. - // Arrange
  28333. - var factory = new SpanFactory();
  28334. - var parser = new RazorParser();
  28335. -
  28336. - // Act
  28337. - var results = parser.Parse(TestRazorSourceDocument.Create("foo @bar baz"));
  28338. -
  28339. - // Assert
  28340. - var spans = results.Root.Flatten().ToArray();
  28341. - for (var i = 0; i < spans.Length - 1; i++)
  28342. - {
  28343. - Assert.Same(spans[i + 1], spans[i].Next);
  28344. - }
  28345. -
  28346. - for (var i = spans.Length - 1; i > 0; i--)
  28347. - {
  28348. - Assert.Same(spans[i - 1], spans[i].Previous);
  28349. - }
  28350. + var actual = SyntaxNodeSerializer.Serialize(syntaxTree.Root);
  28351. + Assert.Equal(expected, actual);
  28352. }
  28353. }
  28354. }
  28355. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/SpanTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/SpanTest.cs
  28356. deleted file mode 100644
  28357. index 15b01b5d784..00000000000
  28358. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/SpanTest.cs
  28359. +++ /dev/null
  28360. @@ -1,79 +0,0 @@
  28361. -// Copyright (c) .NET Foundation. All rights reserved.
  28362. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  28363. -
  28364. -using Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax;
  28365. -using Xunit;
  28366. -
  28367. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  28368. -{
  28369. - public class SpanTest
  28370. - {
  28371. - [Fact]
  28372. - public void ReplaceWith_ResetsLength()
  28373. - {
  28374. - // Arrange
  28375. - var builder = new SpanBuilder(SourceLocation.Zero);
  28376. - builder.Accept(SyntaxFactory.Token(SyntaxKind.Text, "hello"));
  28377. - var span = builder.Build();
  28378. - var newBuilder = new SpanBuilder(SourceLocation.Zero);
  28379. - newBuilder.Accept(SyntaxFactory.Token(SyntaxKind.Text, "hi"));
  28380. - var originalLength = span.Length;
  28381. -
  28382. - // Act
  28383. - span.ReplaceWith(newBuilder);
  28384. -
  28385. - // Assert
  28386. - Assert.Equal(5, originalLength);
  28387. - Assert.Equal(2, span.Length);
  28388. - }
  28389. -
  28390. - // Note: This is more of an integration-like test. However, it's valuable to determine
  28391. - // that the Span's ReplaceWith code is properly propogating change notifications to parents.
  28392. - [Fact]
  28393. - public void ReplaceWith_NotifiesParentChildHasChanged()
  28394. - {
  28395. - // Arrange
  28396. - var spanBuilder = new SpanBuilder(SourceLocation.Zero);
  28397. - spanBuilder.Accept(SyntaxFactory.Token(SyntaxKind.Text, "hello"));
  28398. - var span = spanBuilder.Build();
  28399. - var blockBuilder = new BlockBuilder()
  28400. - {
  28401. - Type = BlockKindInternal.Markup,
  28402. - };
  28403. - blockBuilder.Children.Add(span);
  28404. - var block = blockBuilder.Build();
  28405. - span.Parent = block;
  28406. - var originalBlockLength = block.Length;
  28407. - var newSpanBuilder = new SpanBuilder(SourceLocation.Zero);
  28408. - newSpanBuilder.Accept(SyntaxFactory.Token(SyntaxKind.Text, "hi"));
  28409. -
  28410. - // Act
  28411. - span.ReplaceWith(newSpanBuilder);
  28412. -
  28413. - // Assert
  28414. - Assert.Equal(5, originalBlockLength);
  28415. - Assert.Equal(2, block.Length);
  28416. - }
  28417. -
  28418. - [Fact]
  28419. - public void Clone_ClonesSpan()
  28420. - {
  28421. - // Arrange
  28422. - var spanBuilder = new SpanBuilder(new SourceLocation(1, 2, 3))
  28423. - {
  28424. - EditHandler = new SpanEditHandler(CSharpLanguageCharacteristics.Instance.TokenizeString),
  28425. - Kind = SpanKindInternal.Transition,
  28426. - ChunkGenerator = new ExpressionChunkGenerator(),
  28427. - };
  28428. - spanBuilder.Accept(SyntaxFactory.Token(SyntaxKind.Transition, "@"));
  28429. - var span = spanBuilder.Build();
  28430. -
  28431. - // Act
  28432. - var copy = (Span)span.Clone();
  28433. -
  28434. - // Assert
  28435. - Assert.Equal(span, copy);
  28436. - Assert.NotSame(span, copy);
  28437. - }
  28438. - }
  28439. -}
  28440. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/TagHelperBlockTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/TagHelperBlockTest.cs
  28441. deleted file mode 100644
  28442. index 971e97f3616..00000000000
  28443. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/TagHelperBlockTest.cs
  28444. +++ /dev/null
  28445. @@ -1,207 +0,0 @@
  28446. -// Copyright (c) .NET Foundation. All rights reserved.
  28447. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  28448. -
  28449. -using System.Collections.Generic;
  28450. -using System.Linq;
  28451. -using Xunit;
  28452. -
  28453. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  28454. -{
  28455. - public class TagHelperBlockTest
  28456. - {
  28457. - [Fact]
  28458. - public void Clone_ClonesTagHelperChildren()
  28459. - {
  28460. - // Arrange
  28461. - var tagHelper = new TagHelperBlockBuilder(
  28462. - "p",
  28463. - TagMode.StartTagAndEndTag,
  28464. - attributes: new List<TagHelperAttributeNode>(),
  28465. - children: new[]
  28466. - {
  28467. - new SpanBuilder(SourceLocation.Zero).Build(),
  28468. - new SpanBuilder(new SourceLocation(0, 1, 2)).Build(),
  28469. - }).Build();
  28470. -
  28471. - // Act
  28472. - var copy = (TagHelperBlock)tagHelper.Clone();
  28473. -
  28474. - // Assert
  28475. - ParserTestBase.EvaluateParseTree(copy, tagHelper);
  28476. - Assert.Collection(
  28477. - copy.Children,
  28478. - child => Assert.NotSame(tagHelper.Children[0], child),
  28479. - child => Assert.NotSame(tagHelper.Children[1], child));
  28480. - }
  28481. -
  28482. - [Fact]
  28483. - public void Clone_ClonesTagHelperAttributes()
  28484. - {
  28485. - // Arrange
  28486. - var tagHelper = (TagHelperBlock)new TagHelperBlockBuilder(
  28487. - "p",
  28488. - TagMode.StartTagAndEndTag,
  28489. - attributes: new List<TagHelperAttributeNode>()
  28490. - {
  28491. - new TagHelperAttributeNode("class", new SpanBuilder(SourceLocation.Zero).Build(), AttributeStructure.NoQuotes),
  28492. - new TagHelperAttributeNode("checked", new SpanBuilder(SourceLocation.Undefined).Build(), AttributeStructure.NoQuotes)
  28493. - },
  28494. - children: Enumerable.Empty<SyntaxTreeNode>()).Build();
  28495. -
  28496. - // Act
  28497. - var copy = (TagHelperBlock)tagHelper.Clone();
  28498. -
  28499. - // Assert
  28500. - ParserTestBase.EvaluateParseTree(copy, tagHelper);
  28501. - Assert.Collection(
  28502. - copy.Attributes,
  28503. - attribute => Assert.NotSame(tagHelper.Attributes[0], attribute),
  28504. - attribute => Assert.NotSame(tagHelper.Attributes[1], attribute));
  28505. - }
  28506. -
  28507. - [Fact]
  28508. - public void Clone_ClonesTagHelperSourceStartTag()
  28509. - {
  28510. - // Arrange
  28511. - var tagHelper = (TagHelperBlock)new TagHelperBlockBuilder(
  28512. - "p",
  28513. - TagMode.StartTagAndEndTag,
  28514. - attributes: new List<TagHelperAttributeNode>(),
  28515. - children: Enumerable.Empty<SyntaxTreeNode>())
  28516. - {
  28517. - SourceStartTag = new BlockBuilder()
  28518. - {
  28519. - Type = BlockKindInternal.Comment,
  28520. - ChunkGenerator = new RazorCommentChunkGenerator()
  28521. - }.Build()
  28522. - }.Build();
  28523. -
  28524. - // Act
  28525. - var copy = (TagHelperBlock)tagHelper.Clone();
  28526. -
  28527. - // Assert
  28528. - ParserTestBase.EvaluateParseTree(copy, tagHelper);
  28529. - Assert.NotSame(tagHelper.SourceStartTag, copy.SourceStartTag);
  28530. - }
  28531. -
  28532. - [Fact]
  28533. - public void Clone_ClonesTagHelperSourceEndTag()
  28534. - {
  28535. - // Arrange
  28536. - var tagHelper = (TagHelperBlock)new TagHelperBlockBuilder(
  28537. - "p",
  28538. - TagMode.StartTagAndEndTag,
  28539. - attributes: new List<TagHelperAttributeNode>(),
  28540. - children: Enumerable.Empty<SyntaxTreeNode>())
  28541. - {
  28542. - SourceEndTag = new BlockBuilder()
  28543. - {
  28544. - Type = BlockKindInternal.Comment,
  28545. - ChunkGenerator = new RazorCommentChunkGenerator()
  28546. - }.Build()
  28547. - }.Build();
  28548. -
  28549. - // Act
  28550. - var copy = (TagHelperBlock)tagHelper.Clone();
  28551. -
  28552. - // Assert
  28553. - ParserTestBase.EvaluateParseTree(copy, tagHelper);
  28554. - Assert.NotSame(tagHelper.SourceEndTag, copy.SourceEndTag);
  28555. - }
  28556. -
  28557. - [Fact]
  28558. - public void FlattenFlattensSelfClosingTagHelpers()
  28559. - {
  28560. - // Arrange
  28561. - var spanFactory = new SpanFactory();
  28562. - var blockFactory = new BlockFactory(spanFactory);
  28563. - var tagHelper = (TagHelperBlock)blockFactory.TagHelperBlock(
  28564. - tagName: "input",
  28565. - tagMode: TagMode.SelfClosing,
  28566. - start: SourceLocation.Zero,
  28567. - startTag: blockFactory.MarkupTagBlock("<input />"),
  28568. - children: new SyntaxTreeNode[0],
  28569. - endTag: null);
  28570. - spanFactory.Reset();
  28571. - var expectedNode = spanFactory.Markup("<input />");
  28572. -
  28573. - // Act
  28574. - var flattenedNodes = tagHelper.Flatten();
  28575. -
  28576. - // Assert
  28577. - var node = Assert.Single(flattenedNodes);
  28578. - Assert.True(node.EquivalentTo(expectedNode));
  28579. - }
  28580. -
  28581. - [Fact]
  28582. - public void FlattenFlattensStartAndEndTagTagHelpers()
  28583. - {
  28584. - // Arrange
  28585. - var spanFactory = new SpanFactory();
  28586. - var blockFactory = new BlockFactory(spanFactory);
  28587. - var tagHelper = (TagHelperBlock)blockFactory.TagHelperBlock(
  28588. - tagName: "div",
  28589. - tagMode: TagMode.StartTagAndEndTag,
  28590. - start: SourceLocation.Zero,
  28591. - startTag: blockFactory.MarkupTagBlock("<div>"),
  28592. - children: new SyntaxTreeNode[0],
  28593. - endTag: blockFactory.MarkupTagBlock("</div>"));
  28594. - spanFactory.Reset();
  28595. - var expectedStartTag = spanFactory.Markup("<div>");
  28596. - var expectedEndTag = spanFactory.Markup("</div>");
  28597. -
  28598. - // Act
  28599. - var flattenedNodes = tagHelper.Flatten();
  28600. -
  28601. - // Assert
  28602. - Assert.Collection(
  28603. - flattenedNodes,
  28604. - first =>
  28605. - {
  28606. - Assert.True(first.EquivalentTo(expectedStartTag));
  28607. - },
  28608. - second =>
  28609. - {
  28610. - Assert.True(second.EquivalentTo(expectedEndTag));
  28611. - });
  28612. - }
  28613. -
  28614. - [Fact]
  28615. - public void FlattenFlattensStartAndEndTagWithChildrenTagHelpers()
  28616. - {
  28617. - // Arrange
  28618. - var spanFactory = new SpanFactory();
  28619. - var blockFactory = new BlockFactory(spanFactory);
  28620. - var tagHelper = (TagHelperBlock)blockFactory.TagHelperBlock(
  28621. - tagName: "div",
  28622. - tagMode: TagMode.StartTagAndEndTag,
  28623. - start: SourceLocation.Zero,
  28624. - startTag: blockFactory.MarkupTagBlock("<div>"),
  28625. - children: new SyntaxTreeNode[] { spanFactory.Markup("Hello World") },
  28626. - endTag: blockFactory.MarkupTagBlock("</div>"));
  28627. - spanFactory.Reset();
  28628. - var expectedStartTag = spanFactory.Markup("<div>");
  28629. - var expectedChildren = spanFactory.Markup("Hello World");
  28630. - var expectedEndTag = spanFactory.Markup("</div>");
  28631. -
  28632. - // Act
  28633. - var flattenedNodes = tagHelper.Flatten();
  28634. -
  28635. - // Assert
  28636. - Assert.Collection(
  28637. - flattenedNodes,
  28638. - first =>
  28639. - {
  28640. - Assert.True(first.EquivalentTo(expectedStartTag));
  28641. - },
  28642. - second =>
  28643. - {
  28644. - Assert.True(second.EquivalentTo(expectedChildren));
  28645. - },
  28646. - third =>
  28647. - {
  28648. - Assert.True(third.EquivalentTo(expectedEndTag));
  28649. - });
  28650. - }
  28651. - }
  28652. -}
  28653. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/TagHelperParseTreeRewriterTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/TagHelperParseTreeRewriterTest.cs
  28654. index 76ef95f37a7..6fd3c4281ec 100644
  28655. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/TagHelperParseTreeRewriterTest.cs
  28656. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/TagHelperParseTreeRewriterTest.cs
  28657. @@ -4,6 +4,7 @@
  28658. using System;
  28659. using System.Collections.Generic;
  28660. using System.Linq;
  28661. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  28662. using Xunit;
  28663. namespace Microsoft.AspNetCore.Razor.Language.Legacy
  28664. @@ -14,12 +15,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  28665. {
  28666. get
  28667. {
  28668. - var factory = new SpanFactory();
  28669. - var blockFactory = new BlockFactory(factory);
  28670. Func<string, string, KeyValuePair<string, string>> kvp =
  28671. (key, value) => new KeyValuePair<string, string>(key, value);
  28672. var empty = Enumerable.Empty<KeyValuePair<string, string>>();
  28673. - var csharp = TagHelperParseTreeRewriter.InvalidAttributeValueMarker;
  28674. + var csharp = TagHelperParseTreeRewriter.Rewriter.InvalidAttributeValueMarker;
  28675. // documentContent, expectedPairs
  28676. return new TheoryData<string, IEnumerable<KeyValuePair<string, string>>>
  28677. @@ -29,13 +28,13 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  28678. { "<a href=\"@true\">", new[] { kvp("href", csharp) } },
  28679. { "<a href=\"prefix @true suffix\">", new[] { kvp("href", $"prefix{csharp} suffix") } },
  28680. { "<a href=~/home>", new[] { kvp("href", "~/home") } },
  28681. - { "<a href=~/home @{ } nothing='something'>", new[] { kvp("href", "~/home"), kvp("", "") } },
  28682. + { "<a href=~/home @{ } nothing='something'>", new[] { kvp("href", "~/home") } },
  28683. {
  28684. "<a href=\"@DateTime.Now::0\" class='btn btn-success' random>",
  28685. new[] { kvp("href", $"{csharp}::0"), kvp("class", "btn btn-success"), kvp("random", "") }
  28686. },
  28687. { "<a href=>", new[] { kvp("href", "") } },
  28688. - { "<a href='\"> ", new[] { kvp("href", "\">") } },
  28689. + { "<a href='\"> ", new[] { kvp("href", "\"> ") } },
  28690. { "<a href'", new[] { kvp("href'", "") } },
  28691. };
  28692. }
  28693. @@ -51,13 +50,18 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  28694. var errorSink = new ErrorSink();
  28695. var parseResult = ParseDocument(documentContent);
  28696. var document = parseResult.Root;
  28697. - var parseTreeRewriter = new TagHelperParseTreeRewriter(null, Enumerable.Empty<TagHelperDescriptor>(), parseResult.Options.FeatureFlags);
  28698. + var parseTreeRewriter = new TagHelperParseTreeRewriter.Rewriter(
  28699. + parseResult.Source,
  28700. + null,
  28701. + Enumerable.Empty<TagHelperDescriptor>(),
  28702. + parseResult.Options.FeatureFlags,
  28703. + errorSink);
  28704. // Assert - Guard
  28705. - var rootBlock = Assert.IsType<Block>(document);
  28706. - var child = Assert.Single(rootBlock.Children);
  28707. - var tagBlock = Assert.IsType<Block>(child);
  28708. - Assert.Equal(BlockKindInternal.Tag, tagBlock.Type);
  28709. + var rootBlock = Assert.IsType<RazorDocumentSyntax>(document);
  28710. + var rootMarkup = Assert.IsType<MarkupBlockSyntax>(rootBlock.Document);
  28711. + var childBlock = Assert.Single(rootMarkup.Children);
  28712. + var tagBlock = Assert.IsType<MarkupTagBlockSyntax>(childBlock);
  28713. Assert.Empty(errorSink.Errors);
  28714. // Act
  28715. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/TagHelperRewritingTestBase.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/TagHelperRewritingTestBase.cs
  28716. index a6db68b3c78..98d19a307e5 100644
  28717. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/TagHelperRewritingTestBase.cs
  28718. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/TagHelperRewritingTestBase.cs
  28719. @@ -10,31 +10,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  28720. public class TagHelperRewritingTestBase : CsHtmlMarkupParserTestBase
  28721. {
  28722. internal void RunParseTreeRewriterTest(string documentContent, params string[] tagNames)
  28723. - {
  28724. - RunParseTreeRewriterTest(documentContent, expectedOutput: null, tagNames: tagNames);
  28725. - }
  28726. -
  28727. - internal void RunParseTreeRewriterTest(
  28728. - string documentContent,
  28729. - MarkupBlock expectedOutput,
  28730. - params string[] tagNames)
  28731. - {
  28732. - RunParseTreeRewriterTest(
  28733. - documentContent,
  28734. - expectedOutput,
  28735. - errors: Enumerable.Empty<RazorDiagnostic>(),
  28736. - tagNames: tagNames);
  28737. - }
  28738. -
  28739. - internal void RunParseTreeRewriterTest(
  28740. - string documentContent,
  28741. - MarkupBlock expectedOutput,
  28742. - IEnumerable<RazorDiagnostic> errors,
  28743. - params string[] tagNames)
  28744. {
  28745. var descriptors = BuildDescriptors(tagNames);
  28746. - EvaluateData(descriptors, documentContent, expectedOutput, errors);
  28747. + EvaluateData(descriptors, documentContent);
  28748. }
  28749. internal IEnumerable<TagHelperDescriptor> BuildDescriptors(params string[] tagNames)
  28750. @@ -58,32 +37,12 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  28751. string tagHelperPrefix = null,
  28752. RazorParserFeatureFlags featureFlags = null)
  28753. {
  28754. - EvaluateData(descriptors, documentContent, null, Array.Empty<RazorDiagnostic>(), tagHelperPrefix, featureFlags);
  28755. - }
  28756. -
  28757. - internal void EvaluateData(
  28758. - IEnumerable<TagHelperDescriptor> descriptors,
  28759. - string documentContent,
  28760. - MarkupBlock expectedOutput,
  28761. - IEnumerable<RazorDiagnostic> expectedErrors,
  28762. - string tagHelperPrefix = null,
  28763. - RazorParserFeatureFlags featureFlags = null)
  28764. - {
  28765. - var syntaxTree = ParseDocument(documentContent);
  28766. + var syntaxTree = ParseDocument(documentContent, featureFlags: featureFlags);
  28767. var errorSink = new ErrorSink();
  28768. - var parseTreeRewriter = new TagHelperParseTreeRewriter(
  28769. - tagHelperPrefix,
  28770. - descriptors,
  28771. - featureFlags ?? syntaxTree.Options.FeatureFlags);
  28772. -
  28773. - var actualTree = parseTreeRewriter.Rewrite(syntaxTree.Root, errorSink);
  28774. - var allErrors = syntaxTree.Diagnostics.Concat(errorSink.Errors);
  28775. - var actualErrors = allErrors
  28776. - .OrderBy(error => error.Span.AbsoluteIndex)
  28777. - .ToList();
  28778. + var rewrittenTree = TagHelperParseTreeRewriter.Rewrite(syntaxTree, tagHelperPrefix, descriptors);
  28779. - BaselineTest(actualTree, filePath: null, verifySyntaxTree: false, actualErrors.ToArray());
  28780. + BaselineTest(rewrittenTree, verifySyntaxTree: false);
  28781. }
  28782. }
  28783. }
  28784. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/TokenizerLookaheadTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/TokenizerLookaheadTest.cs
  28785. index 7776b5f5317..655a88d14ae 100644
  28786. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/TokenizerLookaheadTest.cs
  28787. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/TokenizerLookaheadTest.cs
  28788. @@ -208,16 +208,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  28789. {
  28790. }
  28791. - public override void ParseBlock()
  28792. - {
  28793. - throw new NotImplementedException();
  28794. - }
  28795. -
  28796. - protected override bool TokenKindEquals(SyntaxKind x, SyntaxKind y)
  28797. - {
  28798. - throw new NotImplementedException();
  28799. - }
  28800. -
  28801. internal new bool LookaheadUntil(Func<SyntaxToken, IEnumerable<SyntaxToken>, bool> condition)
  28802. {
  28803. return base.LookaheadUntil(condition);
  28804. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/WhiteSpaceRewriterTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/WhiteSpaceRewriterTest.cs
  28805. index 856172a1046..f8c2c34b4e0 100644
  28806. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/WhiteSpaceRewriterTest.cs
  28807. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/WhiteSpaceRewriterTest.cs
  28808. @@ -12,18 +12,26 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  28809. public void Moves_Whitespace_Preceeding_ExpressionBlock_To_Parent_Block()
  28810. {
  28811. // Arrange
  28812. + var content = @"
  28813. +<div>
  28814. + @result
  28815. +</div>
  28816. +<div>
  28817. + @(result)
  28818. +</div>";
  28819. var parsed = ParseDocument(
  28820. RazorLanguageVersion.Latest,
  28821. - "test @foo test",
  28822. + content,
  28823. Array.Empty<DirectiveDescriptor>());
  28824. - var rewriter = new WhiteSpaceRewriter();
  28825. + var rewriter = new WhitespaceRewriter();
  28826. // Act
  28827. - var rewritten = rewriter.Rewrite(parsed.Root);
  28828. + var rewritten = rewriter.Visit(parsed.Root);
  28829. // Assert
  28830. - BaselineTest(parsed);
  28831. + var rewrittenTree = RazorSyntaxTree.Create(rewritten, parsed.Source, parsed.Diagnostics, parsed.Options);
  28832. + BaselineTest(rewrittenTree);
  28833. }
  28834. }
  28835. }
  28836. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/RazorSyntaxTreeTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/RazorSyntaxTreeTest.cs
  28837. index 09b36651ce0..dde505ab023 100644
  28838. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/RazorSyntaxTreeTest.cs
  28839. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/RazorSyntaxTreeTest.cs
  28840. @@ -1,9 +1,8 @@
  28841. // Copyright (c) .NET Foundation. All rights reserved.
  28842. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  28843. -using System;
  28844. -using System.Collections.Generic;
  28845. -using Microsoft.AspNetCore.Razor.Language.Legacy;
  28846. +using System.Linq;
  28847. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  28848. using Xunit;
  28849. namespace Microsoft.AspNetCore.Razor.Language.Test
  28850. @@ -25,7 +24,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Test
  28851. }
  28852. [Fact]
  28853. - public void Parse_Persists_FilePath()
  28854. + public void Parse_NodesReturnCorrectFilePath()
  28855. {
  28856. // Arrange
  28857. var filePath = "test.cshtml";
  28858. @@ -38,24 +37,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Test
  28859. Assert.Empty(syntaxTree.Diagnostics);
  28860. Assert.NotNull(syntaxTree);
  28861. - var spans = new List<SyntaxTreeNode>();
  28862. - GetChildren(syntaxTree.Root);
  28863. - Assert.All(spans, node => Assert.Equal(filePath, node.Start.FilePath));
  28864. -
  28865. - void GetChildren(SyntaxTreeNode node)
  28866. - {
  28867. - if (node is Block block)
  28868. - {
  28869. - foreach (var child in block.Children)
  28870. - {
  28871. - GetChildren(child);
  28872. - }
  28873. - }
  28874. - else
  28875. - {
  28876. - spans.Add(node);
  28877. - }
  28878. - }
  28879. + var children = syntaxTree.Root.DescendantNodes();
  28880. + Assert.All(children, node => Assert.Equal(filePath, node.GetSourceLocation(source).FilePath));
  28881. }
  28882. [Fact]
  28883. @@ -69,10 +52,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Test
  28884. var syntaxTree = RazorSyntaxTree.Parse(source, options);
  28885. // Assert
  28886. + var root = syntaxTree.Root;
  28887. Assert.NotNull(syntaxTree);
  28888. - Assert.Equal(6, syntaxTree.Root.Children.Count);
  28889. - var block = Assert.IsType<Block>(syntaxTree.Root.Children[4]);
  28890. - Assert.Equal(BlockKindInternal.Directive, block.Type);
  28891. + Assert.Equal(61, root.EndPosition);
  28892. + Assert.Single(root.DescendantNodes().Where(n => n is RazorDirectiveBodySyntax body && body.Keyword.GetContent() == "tagHelperPrefix"));
  28893. + Assert.Empty(root.DescendantNodes().Where(n => n is MarkupTagBlockSyntax));
  28894. Assert.Empty(syntaxTree.Diagnostics);
  28895. }
  28896. }
  28897. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/SourceChangeTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/SourceChangeTest.cs
  28898. index d569974b67e..2d829be3812 100644
  28899. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/SourceChangeTest.cs
  28900. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/SourceChangeTest.cs
  28901. @@ -101,19 +101,19 @@ namespace Microsoft.AspNetCore.Razor.Language
  28902. }
  28903. [Fact]
  28904. - public void GetEditedContent_Span_ReturnsNewContent()
  28905. + public void GetEditedContent_SyntaxNode_ReturnsNewContent()
  28906. {
  28907. // Arrange
  28908. - var builder = new SpanBuilder(new SourceLocation(0, 0, 0));
  28909. - builder.Accept(SyntaxFactory.Token(SyntaxKind.Unknown, "Hello, "));
  28910. - builder.Accept(SyntaxFactory.Token(SyntaxKind.Unknown, "World"));
  28911. + var builder = SyntaxListBuilder<SyntaxToken>.Create();
  28912. + builder.Add(SyntaxFactory.Token(SyntaxKind.Marker, "Hello, "));
  28913. + builder.Add(SyntaxFactory.Token(SyntaxKind.Marker, "World"));
  28914. - var span = new Span(builder);
  28915. + var node = SyntaxFactory.MarkupTextLiteral(builder.ToList()).CreateRed();
  28916. var change = new SourceChange(2, 2, "heyo");
  28917. // Act
  28918. - var result = change.GetEditedContent(span);
  28919. + var result = change.GetEditedContent(node);
  28920. // Act
  28921. Assert.Equal("Heheyoo, World", result);
  28922. @@ -123,16 +123,16 @@ namespace Microsoft.AspNetCore.Razor.Language
  28923. public void GetOffSet_SpanIsOwner_ReturnsOffset()
  28924. {
  28925. // Arrange
  28926. - var builder = new SpanBuilder(new SourceLocation(13, 0, 0));
  28927. - builder.Accept(SyntaxFactory.Token(SyntaxKind.Unknown, "Hello, "));
  28928. - builder.Accept(SyntaxFactory.Token(SyntaxKind.Unknown, "World"));
  28929. + var builder = SyntaxListBuilder<SyntaxToken>.Create();
  28930. + builder.Add(SyntaxFactory.Token(SyntaxKind.Marker, "Hello, "));
  28931. + builder.Add(SyntaxFactory.Token(SyntaxKind.Marker, "World"));
  28932. - var span = new Span(builder);
  28933. + var node = SyntaxFactory.MarkupTextLiteral(builder.ToList()).CreateRed(null, 13);
  28934. var change = new SourceChange(15, 2, "heyo");
  28935. // Act
  28936. - var result = change.GetOffset(span);
  28937. + var result = change.GetOffset(node);
  28938. // Act
  28939. Assert.Equal(2, result);
  28940. @@ -142,18 +142,18 @@ namespace Microsoft.AspNetCore.Razor.Language
  28941. public void GetOffSet_SpanIsNotOwnerOfChange_ThrowsException()
  28942. {
  28943. // Arrange
  28944. - var builder = new SpanBuilder(new SourceLocation(13, 0, 0));
  28945. - builder.Accept(SyntaxFactory.Token(SyntaxKind.Unknown, "Hello, "));
  28946. - builder.Accept(SyntaxFactory.Token(SyntaxKind.Unknown, "World"));
  28947. + var builder = SyntaxListBuilder<SyntaxToken>.Create();
  28948. + builder.Add(SyntaxFactory.Token(SyntaxKind.Marker, "Hello, "));
  28949. + builder.Add(SyntaxFactory.Token(SyntaxKind.Marker, "World"));
  28950. - var span = new Span(builder);
  28951. + var node = SyntaxFactory.MarkupTextLiteral(builder.ToList()).CreateRed(null, 13);
  28952. var change = new SourceChange(12, 2, "heyo");
  28953. - var expected = $"The node '{span}' is not the owner of change '{change}'.";
  28954. + var expected = $"The node '{node}' is not the owner of change '{change}'.";
  28955. // Act & Assert
  28956. - var exception = Assert.Throws<InvalidOperationException>(() => { change.GetOffset(span); });
  28957. + var exception = Assert.Throws<InvalidOperationException>(() => { change.GetOffset(node); });
  28958. Assert.Equal(expected, exception.Message);
  28959. }
  28960. @@ -161,16 +161,16 @@ namespace Microsoft.AspNetCore.Razor.Language
  28961. public void GetOrigninalText_SpanIsOwner_ReturnsContent()
  28962. {
  28963. // Arrange
  28964. - var builder = new SpanBuilder(new SourceLocation(13, 0, 0));
  28965. - builder.Accept(SyntaxFactory.Token(SyntaxKind.Unknown, "Hello, "));
  28966. - builder.Accept(SyntaxFactory.Token(SyntaxKind.Unknown, "World"));
  28967. + var builder = SyntaxListBuilder<SyntaxToken>.Create();
  28968. + builder.Add(SyntaxFactory.Token(SyntaxKind.Marker, "Hello, "));
  28969. + builder.Add(SyntaxFactory.Token(SyntaxKind.Marker, "World"));
  28970. - var span = new Span(builder);
  28971. + var node = SyntaxFactory.MarkupTextLiteral(builder.ToList()).CreateRed(null, 13);
  28972. var change = new SourceChange(15, 2, "heyo");
  28973. // Act
  28974. - var result = change.GetOriginalText(span);
  28975. + var result = change.GetOriginalText(node);
  28976. // Act
  28977. Assert.Equal("ll", result);
  28978. @@ -180,16 +180,16 @@ namespace Microsoft.AspNetCore.Razor.Language
  28979. public void GetOrigninalText_SpanIsOwner_ReturnsContent_ZeroLengthSpan()
  28980. {
  28981. // Arrange
  28982. - var builder = new SpanBuilder(new SourceLocation(13, 0, 0));
  28983. - builder.Accept(SyntaxFactory.Token(SyntaxKind.Unknown, "Hello, "));
  28984. - builder.Accept(SyntaxFactory.Token(SyntaxKind.Unknown, "World"));
  28985. + var builder = SyntaxListBuilder<SyntaxToken>.Create();
  28986. + builder.Add(SyntaxFactory.Token(SyntaxKind.Marker, "Hello, "));
  28987. + builder.Add(SyntaxFactory.Token(SyntaxKind.Marker, "World"));
  28988. - var span = new Span(builder);
  28989. + var node = SyntaxFactory.MarkupTextLiteral(builder.ToList()).CreateRed(null, 13);
  28990. var change = new SourceChange(15, 0, "heyo");
  28991. // Act
  28992. - var result = change.GetOriginalText(span);
  28993. + var result = change.GetOriginalText(node);
  28994. // Act
  28995. Assert.Equal(string.Empty, result);
  28996. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TagHelperParseTreeRewriterTests.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/TagHelperParseTreeRewriterTests.cs
  28997. deleted file mode 100644
  28998. index a24a9c8d4fe..00000000000
  28999. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TagHelperParseTreeRewriterTests.cs
  29000. +++ /dev/null
  29001. @@ -1,26 +0,0 @@
  29002. -using System;
  29003. -using System.Collections.Generic;
  29004. -using System.Text;
  29005. -using Microsoft.AspNetCore.Razor.Language.Legacy;
  29006. -using Xunit;
  29007. -
  29008. -namespace Microsoft.AspNetCore.Razor.Language.Test
  29009. -{
  29010. - public class TagHelperParseTreeRewriterTests
  29011. - {
  29012. - public void IsComment_ReturnsTrueForSpanInHtmlCommentBlock()
  29013. - {
  29014. - // Arrange
  29015. - SpanFactory spanFactory = new SpanFactory();
  29016. -
  29017. - Span content = spanFactory.Markup("<!-- comment -->");
  29018. - Block commentBlock = new HtmlCommentBlock(content);
  29019. -
  29020. - // Act
  29021. - bool actualResult = TagHelperParseTreeRewriter.IsComment(content);
  29022. -
  29023. - // Assert
  29024. - Assert.True(actualResult);
  29025. - }
  29026. - }
  29027. -}
  29028. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/FunctionsBlockMinimal_Runtime.ir.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/FunctionsBlockMinimal_Runtime.ir.txt
  29029. index 2d4242e8c41..2d86df35796 100644
  29030. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/FunctionsBlockMinimal_Runtime.ir.txt
  29031. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/FunctionsBlockMinimal_Runtime.ir.txt
  29032. @@ -6,7 +6,7 @@ Document -
  29033. MethodDeclaration - - public async - System.Threading.Tasks.Task - ExecuteAsync
  29034. HtmlContent - (0:0,0 [4] FunctionsBlockMinimal.cshtml)
  29035. IntermediateToken - (0:0,0 [4] FunctionsBlockMinimal.cshtml) - Html - \n\n
  29036. - CSharpCode - (4:2,0 [1] FunctionsBlockMinimal.cshtml)
  29037. - IntermediateToken - (4:2,0 [1] FunctionsBlockMinimal.cshtml) - CSharp -
  29038. + CSharpCode - (4:2,0 [1] FunctionsBlockMinimal.cshtml)
  29039. + IntermediateToken - (4:2,0 [1] FunctionsBlockMinimal.cshtml) - CSharp -
  29040. CSharpCode - (16:2,12 [55] FunctionsBlockMinimal.cshtml)
  29041. IntermediateToken - (16:2,12 [55] FunctionsBlockMinimal.cshtml) - CSharp - \nstring foo(string input) {\n return input + "!";\n}\n
  29042. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/TagHelpersWithWeirdlySpacedAttributes_DesignTime.ir.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/TagHelpersWithWeirdlySpacedAttributes_DesignTime.ir.txt
  29043. index 2ada0a9862c..8f89ff3a4f1 100644
  29044. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/TagHelpersWithWeirdlySpacedAttributes_DesignTime.ir.txt
  29045. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/TagHelpersWithWeirdlySpacedAttributes_DesignTime.ir.txt
  29046. @@ -69,7 +69,7 @@ Document -
  29047. DefaultTagHelperProperty - (247:14,8 [8] TagHelpersWithWeirdlySpacedAttributes.cshtml) - type - string TestNamespace.InputTagHelper2.Type - HtmlAttributeValueStyle.DoubleQuotes
  29048. HtmlContent - (247:14,8 [8] TagHelpersWithWeirdlySpacedAttributes.cshtml)
  29049. IntermediateToken - (247:14,8 [8] TagHelpersWithWeirdlySpacedAttributes.cshtml) - Html - password
  29050. - DefaultTagHelperHtmlAttribute - - data-content - HtmlAttributeValueStyle.NoQuotes
  29051. + DefaultTagHelperHtmlAttribute - - data-content - HtmlAttributeValueStyle.DoubleQuotes
  29052. HtmlContent - (270:14,31 [4] TagHelpersWithWeirdlySpacedAttributes.cshtml)
  29053. IntermediateToken - (270:14,31 [4] TagHelpersWithWeirdlySpacedAttributes.cshtml) - Html - blah
  29054. DefaultTagHelperExecute -
  29055. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/TagHelpersWithWeirdlySpacedAttributes_Runtime.codegen.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/TagHelpersWithWeirdlySpacedAttributes_Runtime.codegen.cs
  29056. index b975f6f6ee2..9a0be1c8e23 100644
  29057. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/TagHelpersWithWeirdlySpacedAttributes_Runtime.codegen.cs
  29058. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/TagHelpersWithWeirdlySpacedAttributes_Runtime.codegen.cs
  29059. @@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Razor.Language.IntegrationTests.TestFiles
  29060. private static readonly global::Microsoft.AspNetCore.Razor.TagHelpers.TagHelperAttribute __tagHelperAttribute_2 = new global::Microsoft.AspNetCore.Razor.TagHelpers.TagHelperAttribute("data-content", new global::Microsoft.AspNetCore.Html.HtmlString("hello"), global::Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeValueStyle.DoubleQuotes);
  29061. private static readonly global::Microsoft.AspNetCore.Razor.TagHelpers.TagHelperAttribute __tagHelperAttribute_3 = new global::Microsoft.AspNetCore.Razor.TagHelpers.TagHelperAttribute("data-content", new global::Microsoft.AspNetCore.Html.HtmlString("hello2"), global::Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeValueStyle.SingleQuotes);
  29062. private static readonly global::Microsoft.AspNetCore.Razor.TagHelpers.TagHelperAttribute __tagHelperAttribute_4 = new global::Microsoft.AspNetCore.Razor.TagHelpers.TagHelperAttribute("type", "password", global::Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeValueStyle.DoubleQuotes);
  29063. - private static readonly global::Microsoft.AspNetCore.Razor.TagHelpers.TagHelperAttribute __tagHelperAttribute_5 = new global::Microsoft.AspNetCore.Razor.TagHelpers.TagHelperAttribute("data-content", new global::Microsoft.AspNetCore.Html.HtmlString("blah"), global::Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeValueStyle.NoQuotes);
  29064. + private static readonly global::Microsoft.AspNetCore.Razor.TagHelpers.TagHelperAttribute __tagHelperAttribute_5 = new global::Microsoft.AspNetCore.Razor.TagHelpers.TagHelperAttribute("data-content", new global::Microsoft.AspNetCore.Html.HtmlString("blah"), global::Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeValueStyle.DoubleQuotes);
  29065. #line hidden
  29066. #pragma warning disable 0169
  29067. private string __tagHelperStringValueBuffer;
  29068. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/TagHelpersWithWeirdlySpacedAttributes_Runtime.ir.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/TagHelpersWithWeirdlySpacedAttributes_Runtime.ir.txt
  29069. index e6920b30674..b89b1ddb275 100644
  29070. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/TagHelpersWithWeirdlySpacedAttributes_Runtime.ir.txt
  29071. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/TagHelpersWithWeirdlySpacedAttributes_Runtime.ir.txt
  29072. @@ -8,7 +8,7 @@ Document -
  29073. PreallocatedTagHelperHtmlAttributeValue - - __tagHelperAttribute_2 - data-content - hello - HtmlAttributeValueStyle.DoubleQuotes
  29074. PreallocatedTagHelperHtmlAttributeValue - - __tagHelperAttribute_3 - data-content - hello2 - HtmlAttributeValueStyle.SingleQuotes
  29075. PreallocatedTagHelperPropertyValue - - __tagHelperAttribute_4 - type - password - HtmlAttributeValueStyle.DoubleQuotes
  29076. - PreallocatedTagHelperHtmlAttributeValue - - __tagHelperAttribute_5 - data-content - blah - HtmlAttributeValueStyle.NoQuotes
  29077. + PreallocatedTagHelperHtmlAttributeValue - - __tagHelperAttribute_5 - data-content - blah - HtmlAttributeValueStyle.DoubleQuotes
  29078. DefaultTagHelperRuntime -
  29079. FieldDeclaration - - private - global::TestNamespace.PTagHelper - __TestNamespace_PTagHelper
  29080. FieldDeclaration - - private - global::TestNamespace.InputTagHelper - __TestNamespace_InputTagHelper
  29081. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/FunctionsDirectiveAutoCompleteAtEOF.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/FunctionsDirectiveAutoCompleteAtEOF.stree.txt
  29082. index 96c1e627ca9..b8015bc064a 100644
  29083. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/FunctionsDirectiveAutoCompleteAtEOF.stree.txt
  29084. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/FunctionsDirectiveAutoCompleteAtEOF.stree.txt
  29085. @@ -1,9 +1,15 @@
  29086. -Directive block - Gen<Directive:{functions;CodeBlock;Unrestricted} [RZ1006(10:0,10 [1] )]> - 11 - (0:0,0)
  29087. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  29088. - SyntaxKind.Transition;[@];
  29089. - MetaCode span - Gen<None> - [functions] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  29090. - SyntaxKind.Identifier;[functions];
  29091. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd - (10:0,10) - Tokens:1
  29092. - SyntaxKind.LeftBrace;[{];
  29093. - Code span - Gen<Stmt> - [] - CodeBlockEditHandler;Accepts:Any;CodeBlock - (11:0,11) - Tokens:1
  29094. - SyntaxKind.Unknown;[];
  29095. +CSharpCodeBlock - [0..11)::11 - [@functions{]
  29096. + RazorDirective - [0..11)::11 - Directive:{functions;CodeBlock;Unrestricted} [RZ1006(10:0,10 [1] )]
  29097. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  29098. + Transition;[@];
  29099. + RazorDirectiveBody - [1..11)::10
  29100. + RazorMetaCode - [1..10)::9 - Gen<None> - SpanEditHandler;Accepts:None
  29101. + Identifier;[functions];
  29102. + CSharpCodeBlock - [10..11)::1
  29103. + RazorMetaCode - [10..11)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd
  29104. + LeftBrace;[{];
  29105. + CSharpCodeBlock - [11..11)::0
  29106. + CSharpStatementLiteral - [11..11)::0 - [] - Gen<Stmt> - CodeBlockEditHandler;Accepts:Any;CodeBlock
  29107. + Marker;[];
  29108. + RazorMetaCode - [11..11)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  29109. + RightBrace;[<Missing>];
  29110. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/FunctionsDirectiveAutoCompleteAtStartOfFile.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/FunctionsDirectiveAutoCompleteAtStartOfFile.stree.txt
  29111. index 62f1357ad5c..e6bcdf142b5 100644
  29112. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/FunctionsDirectiveAutoCompleteAtStartOfFile.stree.txt
  29113. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/FunctionsDirectiveAutoCompleteAtStartOfFile.stree.txt
  29114. @@ -1,10 +1,16 @@
  29115. -Directive block - Gen<Directive:{functions;CodeBlock;Unrestricted} [RZ1006(10:0,10 [1] )]> - 16 - (0:0,0)
  29116. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  29117. - SyntaxKind.Transition;[@];
  29118. - MetaCode span - Gen<None> - [functions] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  29119. - SyntaxKind.Identifier;[functions];
  29120. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd - (10:0,10) - Tokens:1
  29121. - SyntaxKind.LeftBrace;[{];
  29122. - Code span - Gen<Stmt> - [LFfoo] - CodeBlockEditHandler;Accepts:Any;CodeBlock - (11:0,11) - Tokens:2
  29123. - SyntaxKind.NewLine;[LF];
  29124. - SyntaxKind.Identifier;[foo];
  29125. +CSharpCodeBlock - [0..16)::16 - [@functions{LFfoo]
  29126. + RazorDirective - [0..16)::16 - Directive:{functions;CodeBlock;Unrestricted} [RZ1006(10:0,10 [1] )]
  29127. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  29128. + Transition;[@];
  29129. + RazorDirectiveBody - [1..16)::15
  29130. + RazorMetaCode - [1..10)::9 - Gen<None> - SpanEditHandler;Accepts:None
  29131. + Identifier;[functions];
  29132. + CSharpCodeBlock - [10..16)::6
  29133. + RazorMetaCode - [10..11)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd
  29134. + LeftBrace;[{];
  29135. + CSharpCodeBlock - [11..16)::5
  29136. + CSharpStatementLiteral - [11..16)::5 - [LFfoo] - Gen<Stmt> - CodeBlockEditHandler;Accepts:Any;CodeBlock
  29137. + NewLine;[LF];
  29138. + Identifier;[foo];
  29139. + RazorMetaCode - [16..16)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  29140. + RightBrace;[<Missing>];
  29141. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/SectionDirectiveAutoCompleteAtEOF.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/SectionDirectiveAutoCompleteAtEOF.stree.txt
  29142. index 1a861c9f178..c3e53c2bf08 100644
  29143. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/SectionDirectiveAutoCompleteAtEOF.stree.txt
  29144. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/SectionDirectiveAutoCompleteAtEOF.stree.txt
  29145. @@ -1,16 +1,21 @@
  29146. -Directive block - Gen<Directive:{section;RazorBlock;Unrestricted} [RZ1006(16:0,16 [1] )]> - 17 - (0:0,0)
  29147. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  29148. - SyntaxKind.Transition;[@];
  29149. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  29150. - SyntaxKind.Identifier;[section];
  29151. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  29152. - SyntaxKind.Whitespace;[ ];
  29153. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [Header] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  29154. - SyntaxKind.Identifier;[Header];
  29155. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (15:0,15) - Tokens:1
  29156. - SyntaxKind.Whitespace;[ ];
  29157. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd - (16:0,16) - Tokens:1
  29158. - SyntaxKind.LeftBrace;[{];
  29159. - Markup block - Gen<None> - 0 - (17:0,17)
  29160. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:1
  29161. - SyntaxKind.Unknown;[];
  29162. +CSharpCodeBlock - [0..17)::17 - [@section Header {]
  29163. + RazorDirective - [0..17)::17 - Directive:{section;RazorBlock;Unrestricted} [RZ1006(16:0,16 [1] )]
  29164. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  29165. + Transition;[@];
  29166. + RazorDirectiveBody - [1..17)::16
  29167. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  29168. + Identifier;[section];
  29169. + CSharpCodeBlock - [8..17)::9
  29170. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  29171. + Whitespace;[ ];
  29172. + CSharpStatementLiteral - [9..15)::6 - [Header] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  29173. + Identifier;[Header];
  29174. + MarkupTextLiteral - [15..16)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  29175. + Whitespace;[ ];
  29176. + RazorMetaCode - [16..17)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd
  29177. + LeftBrace;[{];
  29178. + MarkupBlock - [17..17)::0
  29179. + MarkupTextLiteral - [17..17)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  29180. + Marker;[];
  29181. + RazorMetaCode - [17..17)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  29182. + RightBrace;[<Missing>];
  29183. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/SectionDirectiveAutoCompleteAtStartOfFile.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/SectionDirectiveAutoCompleteAtStartOfFile.stree.txt
  29184. index 71141a41bbb..ae4c4c31934 100644
  29185. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/SectionDirectiveAutoCompleteAtStartOfFile.stree.txt
  29186. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/SectionDirectiveAutoCompleteAtStartOfFile.stree.txt
  29187. @@ -1,29 +1,34 @@
  29188. -Directive block - Gen<Directive:{section;RazorBlock;Unrestricted} [RZ1006(16:0,16 [1] )]> - 29 - (0:0,0)
  29189. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  29190. - SyntaxKind.Transition;[@];
  29191. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  29192. - SyntaxKind.Identifier;[section];
  29193. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  29194. - SyntaxKind.Whitespace;[ ];
  29195. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [Header] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  29196. - SyntaxKind.Identifier;[Header];
  29197. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (15:0,15) - Tokens:1
  29198. - SyntaxKind.Whitespace;[ ];
  29199. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd - (16:0,16) - Tokens:1
  29200. - SyntaxKind.LeftBrace;[{];
  29201. - Markup block - Gen<None> - 12 - (17:0,17)
  29202. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:1
  29203. - SyntaxKind.NewLine;[LF];
  29204. - Tag block - Gen<None> - 3 - (19:1,0)
  29205. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (19:1,0) - Tokens:3
  29206. - SyntaxKind.OpenAngle;[<];
  29207. - SyntaxKind.Text;[p];
  29208. - SyntaxKind.CloseAngle;[>];
  29209. - SyntaxKind.HtmlTextLiteral - [Foo] - [22..25) - FullWidth: 3 - Slots: 1
  29210. - SyntaxKind.Text;[Foo];
  29211. - Tag block - Gen<None> - 4 - (25:1,6)
  29212. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (25:1,6) - Tokens:4
  29213. - SyntaxKind.OpenAngle;[<];
  29214. - SyntaxKind.ForwardSlash;[/];
  29215. - SyntaxKind.Text;[p];
  29216. - SyntaxKind.CloseAngle;[>];
  29217. +CSharpCodeBlock - [0..29)::29 - [@section Header {LF<p>Foo</p>]
  29218. + RazorDirective - [0..29)::29 - Directive:{section;RazorBlock;Unrestricted} [RZ1006(16:0,16 [1] )]
  29219. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  29220. + Transition;[@];
  29221. + RazorDirectiveBody - [1..29)::28
  29222. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  29223. + Identifier;[section];
  29224. + CSharpCodeBlock - [8..29)::21
  29225. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  29226. + Whitespace;[ ];
  29227. + CSharpStatementLiteral - [9..15)::6 - [Header] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  29228. + Identifier;[Header];
  29229. + MarkupTextLiteral - [15..16)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  29230. + Whitespace;[ ];
  29231. + RazorMetaCode - [16..17)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd
  29232. + LeftBrace;[{];
  29233. + MarkupBlock - [17..29)::12
  29234. + MarkupTextLiteral - [17..19)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  29235. + NewLine;[LF];
  29236. + MarkupTagBlock - [19..22)::3 - [<p>]
  29237. + MarkupTextLiteral - [19..22)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  29238. + OpenAngle;[<];
  29239. + Text;[p];
  29240. + CloseAngle;[>];
  29241. + MarkupTextLiteral - [22..25)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  29242. + Text;[Foo];
  29243. + MarkupTagBlock - [25..29)::4 - [</p>]
  29244. + MarkupTextLiteral - [25..29)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  29245. + OpenAngle;[<];
  29246. + ForwardSlash;[/];
  29247. + Text;[p];
  29248. + CloseAngle;[>];
  29249. + RazorMetaCode - [29..29)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  29250. + RightBrace;[<Missing>];
  29251. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/VerbatimBlockAutoCompleteAtEOF.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/VerbatimBlockAutoCompleteAtEOF.stree.txt
  29252. index b2da8414aba..b3c2a27531f 100644
  29253. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/VerbatimBlockAutoCompleteAtEOF.stree.txt
  29254. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/VerbatimBlockAutoCompleteAtEOF.stree.txt
  29255. @@ -1,7 +1,12 @@
  29256. -Statement block - Gen<None> - 2 - (0:0,0)
  29257. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  29258. - SyntaxKind.Transition;[@];
  29259. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  29260. - SyntaxKind.LeftBrace;[{];
  29261. - Code span - Gen<Stmt> - [] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[}];AtEOL - (2:0,2) - Tokens:1
  29262. - SyntaxKind.Unknown;[];
  29263. +CSharpCodeBlock - [0..2)::2 - [@{]
  29264. + CSharpStatement - [0..2)::2
  29265. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  29266. + Transition;[@];
  29267. + CSharpStatementBody - [1..2)::1
  29268. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  29269. + LeftBrace;[{];
  29270. + CSharpCodeBlock - [2..2)::0
  29271. + CSharpStatementLiteral - [2..2)::0 - [] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[}];AtEOL
  29272. + Marker;[];
  29273. + RazorMetaCode - [2..2)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  29274. + RightBrace;[<Missing>];
  29275. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/VerbatimBlockAutoCompleteAtStartOfFile.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/VerbatimBlockAutoCompleteAtStartOfFile.stree.txt
  29276. index 928cc26ae4b..85fa027b22f 100644
  29277. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/VerbatimBlockAutoCompleteAtStartOfFile.stree.txt
  29278. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpAutoCompleteTest/VerbatimBlockAutoCompleteAtStartOfFile.stree.txt
  29279. @@ -1,21 +1,26 @@
  29280. -Statement block - Gen<None> - 11 - (0:0,0)
  29281. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  29282. - SyntaxKind.Transition;[@];
  29283. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  29284. - SyntaxKind.LeftBrace;[{];
  29285. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[}];AtEOL - (2:0,2) - Tokens:1
  29286. - SyntaxKind.NewLine;[LF];
  29287. - Markup block - Gen<None> - 7 - (4:1,0)
  29288. - Tag block - Gen<None> - 3 - (4:1,0)
  29289. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (4:1,0) - Tokens:3
  29290. - SyntaxKind.OpenAngle;[<];
  29291. - SyntaxKind.Text;[p];
  29292. - SyntaxKind.CloseAngle;[>];
  29293. - Tag block - Gen<None> - 4 - (7:1,3)
  29294. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (7:1,3) - Tokens:4
  29295. - SyntaxKind.OpenAngle;[<];
  29296. - SyntaxKind.ForwardSlash;[/];
  29297. - SyntaxKind.Text;[p];
  29298. - SyntaxKind.CloseAngle;[>];
  29299. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (11:1,7) - Tokens:1
  29300. - SyntaxKind.Unknown;[];
  29301. +CSharpCodeBlock - [0..11)::11 - [@{LF<p></p>]
  29302. + CSharpStatement - [0..11)::11
  29303. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  29304. + Transition;[@];
  29305. + CSharpStatementBody - [1..11)::10
  29306. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  29307. + LeftBrace;[{];
  29308. + CSharpCodeBlock - [2..11)::9
  29309. + CSharpStatementLiteral - [2..4)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[}];AtEOL
  29310. + NewLine;[LF];
  29311. + MarkupBlock - [4..11)::7
  29312. + MarkupTagBlock - [4..7)::3 - [<p>]
  29313. + MarkupTextLiteral - [4..7)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  29314. + OpenAngle;[<];
  29315. + Text;[p];
  29316. + CloseAngle;[>];
  29317. + MarkupTagBlock - [7..11)::4 - [</p>]
  29318. + MarkupTextLiteral - [7..11)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  29319. + OpenAngle;[<];
  29320. + ForwardSlash;[/];
  29321. + Text;[p];
  29322. + CloseAngle;[>];
  29323. + CSharpStatementLiteral - [11..11)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  29324. + Marker;[];
  29325. + RazorMetaCode - [11..11)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  29326. + RightBrace;[<Missing>];
  29327. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/AcceptsElseIfWithNoCondition.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/AcceptsElseIfWithNoCondition.stree.txt
  29328. index 868839ebf61..4342976bf76 100644
  29329. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/AcceptsElseIfWithNoCondition.stree.txt
  29330. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/AcceptsElseIfWithNoCondition.stree.txt
  29331. @@ -1,60 +1,62 @@
  29332. -Statement block - Gen<None> - 106 - (0:0,0)
  29333. - Code span - Gen<Stmt> - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"foo } bar");LF} else if { foo(); }] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:58
  29334. - SyntaxKind.Keyword;[if];
  29335. - SyntaxKind.LeftParenthesis;[(];
  29336. - SyntaxKind.Keyword;[int];
  29337. - SyntaxKind.Whitespace;[ ];
  29338. - SyntaxKind.Identifier;[i];
  29339. - SyntaxKind.Whitespace;[ ];
  29340. - SyntaxKind.Assign;[=];
  29341. - SyntaxKind.Whitespace;[ ];
  29342. - SyntaxKind.IntegerLiteral;[0];
  29343. - SyntaxKind.Semicolon;[;];
  29344. - SyntaxKind.Whitespace;[ ];
  29345. - SyntaxKind.Identifier;[i];
  29346. - SyntaxKind.Whitespace;[ ];
  29347. - SyntaxKind.LessThan;[<];
  29348. - SyntaxKind.Whitespace;[ ];
  29349. - SyntaxKind.IntegerLiteral;[10];
  29350. - SyntaxKind.Semicolon;[;];
  29351. - SyntaxKind.Whitespace;[ ];
  29352. - SyntaxKind.Keyword;[new];
  29353. - SyntaxKind.Whitespace;[ ];
  29354. - SyntaxKind.Identifier;[Foo];
  29355. - SyntaxKind.Whitespace;[ ];
  29356. - SyntaxKind.LeftBrace;[{];
  29357. - SyntaxKind.Whitespace;[ ];
  29358. - SyntaxKind.Identifier;[Bar];
  29359. - SyntaxKind.Whitespace;[ ];
  29360. - SyntaxKind.Assign;[=];
  29361. - SyntaxKind.Whitespace;[ ];
  29362. - SyntaxKind.StringLiteral;["baz"];
  29363. - SyntaxKind.Whitespace;[ ];
  29364. - SyntaxKind.RightBrace;[}];
  29365. - SyntaxKind.RightParenthesis;[)];
  29366. - SyntaxKind.Whitespace;[ ];
  29367. - SyntaxKind.LeftBrace;[{];
  29368. - SyntaxKind.NewLine;[LF];
  29369. - SyntaxKind.Whitespace;[ ];
  29370. - SyntaxKind.Identifier;[Debug];
  29371. - SyntaxKind.Dot;[.];
  29372. - SyntaxKind.Identifier;[WriteLine];
  29373. - SyntaxKind.LeftParenthesis;[(];
  29374. - SyntaxKind.StringLiteral;[@"foo } bar"];
  29375. - SyntaxKind.RightParenthesis;[)];
  29376. - SyntaxKind.Semicolon;[;];
  29377. - SyntaxKind.NewLine;[LF];
  29378. - SyntaxKind.RightBrace;[}];
  29379. - SyntaxKind.Whitespace;[ ];
  29380. - SyntaxKind.Keyword;[else];
  29381. - SyntaxKind.Whitespace;[ ];
  29382. - SyntaxKind.Keyword;[if];
  29383. - SyntaxKind.Whitespace;[ ];
  29384. - SyntaxKind.LeftBrace;[{];
  29385. - SyntaxKind.Whitespace;[ ];
  29386. - SyntaxKind.Identifier;[foo];
  29387. - SyntaxKind.LeftParenthesis;[(];
  29388. - SyntaxKind.RightParenthesis;[)];
  29389. - SyntaxKind.Semicolon;[;];
  29390. - SyntaxKind.Whitespace;[ ];
  29391. - SyntaxKind.RightBrace;[}];
  29392. +CSharpCodeBlock - [0..106)::106 - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"foo } bar");LF} else if { foo(); }]
  29393. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  29394. + Transition;[<Missing>];
  29395. + CSharpStatementLiteral - [0..106)::106 - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"foo } bar");LF} else if { foo(); }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  29396. + Keyword;[if];
  29397. + LeftParenthesis;[(];
  29398. + Keyword;[int];
  29399. + Whitespace;[ ];
  29400. + Identifier;[i];
  29401. + Whitespace;[ ];
  29402. + Assign;[=];
  29403. + Whitespace;[ ];
  29404. + IntegerLiteral;[0];
  29405. + Semicolon;[;];
  29406. + Whitespace;[ ];
  29407. + Identifier;[i];
  29408. + Whitespace;[ ];
  29409. + LessThan;[<];
  29410. + Whitespace;[ ];
  29411. + IntegerLiteral;[10];
  29412. + Semicolon;[;];
  29413. + Whitespace;[ ];
  29414. + Keyword;[new];
  29415. + Whitespace;[ ];
  29416. + Identifier;[Foo];
  29417. + Whitespace;[ ];
  29418. + LeftBrace;[{];
  29419. + Whitespace;[ ];
  29420. + Identifier;[Bar];
  29421. + Whitespace;[ ];
  29422. + Assign;[=];
  29423. + Whitespace;[ ];
  29424. + StringLiteral;["baz"];
  29425. + Whitespace;[ ];
  29426. + RightBrace;[}];
  29427. + RightParenthesis;[)];
  29428. + Whitespace;[ ];
  29429. + LeftBrace;[{];
  29430. + NewLine;[LF];
  29431. + Whitespace;[ ];
  29432. + Identifier;[Debug];
  29433. + Dot;[.];
  29434. + Identifier;[WriteLine];
  29435. + LeftParenthesis;[(];
  29436. + StringLiteral;[@"foo } bar"];
  29437. + RightParenthesis;[)];
  29438. + Semicolon;[;];
  29439. + NewLine;[LF];
  29440. + RightBrace;[}];
  29441. + Whitespace;[ ];
  29442. + Keyword;[else];
  29443. + Whitespace;[ ];
  29444. + Keyword;[if];
  29445. + Whitespace;[ ];
  29446. + LeftBrace;[{];
  29447. + Whitespace;[ ];
  29448. + Identifier;[foo];
  29449. + LeftParenthesis;[(];
  29450. + RightParenthesis;[)];
  29451. + Semicolon;[;];
  29452. + Whitespace;[ ];
  29453. + RightBrace;[}];
  29454. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/AcceptsTrailingDotIntoImplicitExpressionWhenEmbeddedInCode.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/AcceptsTrailingDotIntoImplicitExpressionWhenEmbeddedInCode.stree.txt
  29455. index da0e4e56847..a4c12625274 100644
  29456. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/AcceptsTrailingDotIntoImplicitExpressionWhenEmbeddedInCode.stree.txt
  29457. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/AcceptsTrailingDotIntoImplicitExpressionWhenEmbeddedInCode.stree.txt
  29458. @@ -1,18 +1,23 @@
  29459. -Statement block - Gen<None> - 17 - (0:0,0)
  29460. - Code span - Gen<Stmt> - [if(foo) { ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:7
  29461. - SyntaxKind.Keyword;[if];
  29462. - SyntaxKind.LeftParenthesis;[(];
  29463. - SyntaxKind.Identifier;[foo];
  29464. - SyntaxKind.RightParenthesis;[)];
  29465. - SyntaxKind.Whitespace;[ ];
  29466. - SyntaxKind.LeftBrace;[{];
  29467. - SyntaxKind.Whitespace;[ ];
  29468. - Expression block - Gen<Expr> - 5 - (10:0,10)
  29469. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  29470. - SyntaxKind.Transition;[@];
  29471. - Code span - Gen<Expr> - [foo.] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K14 - (11:0,11) - Tokens:2
  29472. - SyntaxKind.Identifier;[foo];
  29473. - SyntaxKind.Dot;[.];
  29474. - Code span - Gen<Stmt> - [ }] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:2
  29475. - SyntaxKind.Whitespace;[ ];
  29476. - SyntaxKind.RightBrace;[}];
  29477. +CSharpCodeBlock - [0..17)::17 - [if(foo) { @foo. }]
  29478. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  29479. + Transition;[<Missing>];
  29480. + CSharpStatementLiteral - [0..10)::10 - [if(foo) { ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  29481. + Keyword;[if];
  29482. + LeftParenthesis;[(];
  29483. + Identifier;[foo];
  29484. + RightParenthesis;[)];
  29485. + Whitespace;[ ];
  29486. + LeftBrace;[{];
  29487. + Whitespace;[ ];
  29488. + CSharpCodeBlock - [10..15)::5
  29489. + CSharpImplicitExpression - [10..15)::5
  29490. + CSharpTransition - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  29491. + Transition;[@];
  29492. + CSharpImplicitExpressionBody - [11..15)::4
  29493. + CSharpCodeBlock - [11..15)::4
  29494. + CSharpExpressionLiteral - [11..15)::4 - [foo.] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K14
  29495. + Identifier;[foo];
  29496. + Dot;[.];
  29497. + CSharpStatementLiteral - [15..17)::2 - [ }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  29498. + Whitespace;[ ];
  29499. + RightBrace;[}];
  29500. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/AllowsEmptyBlockStatement.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/AllowsEmptyBlockStatement.stree.txt
  29501. index e52cb3277b4..3d1e8ad34bf 100644
  29502. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/AllowsEmptyBlockStatement.stree.txt
  29503. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/AllowsEmptyBlockStatement.stree.txt
  29504. @@ -1,10 +1,12 @@
  29505. -Statement block - Gen<None> - 13 - (0:0,0)
  29506. - Code span - Gen<Stmt> - [if(false) { }] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:8
  29507. - SyntaxKind.Keyword;[if];
  29508. - SyntaxKind.LeftParenthesis;[(];
  29509. - SyntaxKind.Keyword;[false];
  29510. - SyntaxKind.RightParenthesis;[)];
  29511. - SyntaxKind.Whitespace;[ ];
  29512. - SyntaxKind.LeftBrace;[{];
  29513. - SyntaxKind.Whitespace;[ ];
  29514. - SyntaxKind.RightBrace;[}];
  29515. +CSharpCodeBlock - [0..13)::13 - [if(false) { }]
  29516. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  29517. + Transition;[<Missing>];
  29518. + CSharpStatementLiteral - [0..13)::13 - [if(false) { }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  29519. + Keyword;[if];
  29520. + LeftParenthesis;[(];
  29521. + Keyword;[false];
  29522. + RightParenthesis;[)];
  29523. + Whitespace;[ ];
  29524. + LeftBrace;[{];
  29525. + Whitespace;[ ];
  29526. + RightBrace;[}];
  29527. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/BalancingBracketsIgnoresStringLiteralCharactersAndBrackets.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/BalancingBracketsIgnoresStringLiteralCharactersAndBrackets.stree.txt
  29528. index 6fa6c5ed364..a7c7c7baf36 100644
  29529. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/BalancingBracketsIgnoresStringLiteralCharactersAndBrackets.stree.txt
  29530. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/BalancingBracketsIgnoresStringLiteralCharactersAndBrackets.stree.txt
  29531. @@ -1,19 +1,21 @@
  29532. -Statement block - Gen<None> - 47 - (0:0,0)
  29533. - Code span - Gen<Stmt> - [if(foo) {LF // bar } " baz 'LF zoop();LF}] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:17
  29534. - SyntaxKind.Keyword;[if];
  29535. - SyntaxKind.LeftParenthesis;[(];
  29536. - SyntaxKind.Identifier;[foo];
  29537. - SyntaxKind.RightParenthesis;[)];
  29538. - SyntaxKind.Whitespace;[ ];
  29539. - SyntaxKind.LeftBrace;[{];
  29540. - SyntaxKind.NewLine;[LF];
  29541. - SyntaxKind.Whitespace;[ ];
  29542. - SyntaxKind.CSharpComment;[// bar } " baz '];
  29543. - SyntaxKind.NewLine;[LF];
  29544. - SyntaxKind.Whitespace;[ ];
  29545. - SyntaxKind.Identifier;[zoop];
  29546. - SyntaxKind.LeftParenthesis;[(];
  29547. - SyntaxKind.RightParenthesis;[)];
  29548. - SyntaxKind.Semicolon;[;];
  29549. - SyntaxKind.NewLine;[LF];
  29550. - SyntaxKind.RightBrace;[}];
  29551. +CSharpCodeBlock - [0..47)::47 - [if(foo) {LF // bar } " baz 'LF zoop();LF}]
  29552. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  29553. + Transition;[<Missing>];
  29554. + CSharpStatementLiteral - [0..47)::47 - [if(foo) {LF // bar } " baz 'LF zoop();LF}] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  29555. + Keyword;[if];
  29556. + LeftParenthesis;[(];
  29557. + Identifier;[foo];
  29558. + RightParenthesis;[)];
  29559. + Whitespace;[ ];
  29560. + LeftBrace;[{];
  29561. + NewLine;[LF];
  29562. + Whitespace;[ ];
  29563. + CSharpComment;[// bar } " baz '];
  29564. + NewLine;[LF];
  29565. + Whitespace;[ ];
  29566. + Identifier;[zoop];
  29567. + LeftParenthesis;[(];
  29568. + RightParenthesis;[)];
  29569. + Semicolon;[;];
  29570. + NewLine;[LF];
  29571. + RightBrace;[}];
  29572. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/BalancingBracketsIgnoresStringLiteralCharactersAndBracketsInsideBlockComments.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/BalancingBracketsIgnoresStringLiteralCharactersAndBracketsInsideBlockComments.stree.txt
  29573. index 7d34a81381d..435942c4e66 100644
  29574. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/BalancingBracketsIgnoresStringLiteralCharactersAndBracketsInsideBlockComments.stree.txt
  29575. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/BalancingBracketsIgnoresStringLiteralCharactersAndBracketsInsideBlockComments.stree.txt
  29576. @@ -1,21 +1,23 @@
  29577. -Statement block - Gen<None> - 54 - (0:0,0)
  29578. - Code span - Gen<Stmt> - [if(foo) {LF /* bar } " */ ' baz } 'LF zoop();LF}] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:19
  29579. - SyntaxKind.Keyword;[if];
  29580. - SyntaxKind.LeftParenthesis;[(];
  29581. - SyntaxKind.Identifier;[foo];
  29582. - SyntaxKind.RightParenthesis;[)];
  29583. - SyntaxKind.Whitespace;[ ];
  29584. - SyntaxKind.LeftBrace;[{];
  29585. - SyntaxKind.NewLine;[LF];
  29586. - SyntaxKind.Whitespace;[ ];
  29587. - SyntaxKind.CSharpComment;[/* bar } " */];
  29588. - SyntaxKind.Whitespace;[ ];
  29589. - SyntaxKind.CharacterLiteral;[' baz } '];
  29590. - SyntaxKind.NewLine;[LF];
  29591. - SyntaxKind.Whitespace;[ ];
  29592. - SyntaxKind.Identifier;[zoop];
  29593. - SyntaxKind.LeftParenthesis;[(];
  29594. - SyntaxKind.RightParenthesis;[)];
  29595. - SyntaxKind.Semicolon;[;];
  29596. - SyntaxKind.NewLine;[LF];
  29597. - SyntaxKind.RightBrace;[}];
  29598. +CSharpCodeBlock - [0..54)::54 - [if(foo) {LF /* bar } " */ ' baz } 'LF zoop();LF}]
  29599. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  29600. + Transition;[<Missing>];
  29601. + CSharpStatementLiteral - [0..54)::54 - [if(foo) {LF /* bar } " */ ' baz } 'LF zoop();LF}] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  29602. + Keyword;[if];
  29603. + LeftParenthesis;[(];
  29604. + Identifier;[foo];
  29605. + RightParenthesis;[)];
  29606. + Whitespace;[ ];
  29607. + LeftBrace;[{];
  29608. + NewLine;[LF];
  29609. + Whitespace;[ ];
  29610. + CSharpComment;[/* bar } " */];
  29611. + Whitespace;[ ];
  29612. + CharacterLiteral;[' baz } '];
  29613. + NewLine;[LF];
  29614. + Whitespace;[ ];
  29615. + Identifier;[zoop];
  29616. + LeftParenthesis;[(];
  29617. + RightParenthesis;[)];
  29618. + Semicolon;[;];
  29619. + NewLine;[LF];
  29620. + RightBrace;[}];
  29621. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CapturesNewlineAfterUsing.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CapturesNewlineAfterUsing.stree.txt
  29622. index 6b754ce0a0c..ce48e1b53bb 100644
  29623. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CapturesNewlineAfterUsing.stree.txt
  29624. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CapturesNewlineAfterUsing.stree.txt
  29625. @@ -1,6 +1,10 @@
  29626. -Directive block - Gen<None> - 11 - (0:0,0)
  29627. - Code span - Gen<Import: Foo;> - [using FooLF] - SpanEditHandler;Accepts:AnyExceptNewline - (0:0,0) - Tokens:4
  29628. - SyntaxKind.Keyword;[using];
  29629. - SyntaxKind.Whitespace;[ ];
  29630. - SyntaxKind.Identifier;[Foo];
  29631. - SyntaxKind.NewLine;[LF];
  29632. +CSharpCodeBlock - [0..11)::11 - [using FooLF]
  29633. + RazorDirective - [0..11)::11
  29634. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  29635. + Transition;[<Missing>];
  29636. + RazorDirectiveBody - [0..11)::11
  29637. + CSharpStatementLiteral - [0..11)::11 - [using FooLF] - Gen<Import: Foo;> - SpanEditHandler;Accepts:AnyExceptNewline
  29638. + Keyword;[using];
  29639. + Whitespace;[ ];
  29640. + Identifier;[Foo];
  29641. + NewLine;[LF];
  29642. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CorrectlyParsesDoWhileBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CorrectlyParsesDoWhileBlock.stree.txt
  29643. index ead956f3304..5b18684838b 100644
  29644. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CorrectlyParsesDoWhileBlock.stree.txt
  29645. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CorrectlyParsesDoWhileBlock.stree.txt
  29646. @@ -1,26 +1,28 @@
  29647. -Statement block - Gen<None> - 40 - (0:0,0)
  29648. - Code span - Gen<Stmt> - [do { var foo = bar; } while(foo != bar);] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:24
  29649. - SyntaxKind.Keyword;[do];
  29650. - SyntaxKind.Whitespace;[ ];
  29651. - SyntaxKind.LeftBrace;[{];
  29652. - SyntaxKind.Whitespace;[ ];
  29653. - SyntaxKind.Identifier;[var];
  29654. - SyntaxKind.Whitespace;[ ];
  29655. - SyntaxKind.Identifier;[foo];
  29656. - SyntaxKind.Whitespace;[ ];
  29657. - SyntaxKind.Assign;[=];
  29658. - SyntaxKind.Whitespace;[ ];
  29659. - SyntaxKind.Identifier;[bar];
  29660. - SyntaxKind.Semicolon;[;];
  29661. - SyntaxKind.Whitespace;[ ];
  29662. - SyntaxKind.RightBrace;[}];
  29663. - SyntaxKind.Whitespace;[ ];
  29664. - SyntaxKind.Keyword;[while];
  29665. - SyntaxKind.LeftParenthesis;[(];
  29666. - SyntaxKind.Identifier;[foo];
  29667. - SyntaxKind.Whitespace;[ ];
  29668. - SyntaxKind.NotEqual;[!=];
  29669. - SyntaxKind.Whitespace;[ ];
  29670. - SyntaxKind.Identifier;[bar];
  29671. - SyntaxKind.RightParenthesis;[)];
  29672. - SyntaxKind.Semicolon;[;];
  29673. +CSharpCodeBlock - [0..40)::40 - [do { var foo = bar; } while(foo != bar);]
  29674. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  29675. + Transition;[<Missing>];
  29676. + CSharpStatementLiteral - [0..40)::40 - [do { var foo = bar; } while(foo != bar);] - Gen<Stmt> - SpanEditHandler;Accepts:None
  29677. + Keyword;[do];
  29678. + Whitespace;[ ];
  29679. + LeftBrace;[{];
  29680. + Whitespace;[ ];
  29681. + Identifier;[var];
  29682. + Whitespace;[ ];
  29683. + Identifier;[foo];
  29684. + Whitespace;[ ];
  29685. + Assign;[=];
  29686. + Whitespace;[ ];
  29687. + Identifier;[bar];
  29688. + Semicolon;[;];
  29689. + Whitespace;[ ];
  29690. + RightBrace;[}];
  29691. + Whitespace;[ ];
  29692. + Keyword;[while];
  29693. + LeftParenthesis;[(];
  29694. + Identifier;[foo];
  29695. + Whitespace;[ ];
  29696. + NotEqual;[!=];
  29697. + Whitespace;[ ];
  29698. + Identifier;[bar];
  29699. + RightParenthesis;[)];
  29700. + Semicolon;[;];
  29701. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CorrectlyParsesDoWhileBlockMissingSemicolon.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CorrectlyParsesDoWhileBlockMissingSemicolon.stree.txt
  29702. index e7b6d30e06e..454ba645d46 100644
  29703. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CorrectlyParsesDoWhileBlockMissingSemicolon.stree.txt
  29704. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CorrectlyParsesDoWhileBlockMissingSemicolon.stree.txt
  29705. @@ -1,25 +1,27 @@
  29706. -Statement block - Gen<None> - 39 - (0:0,0)
  29707. - Code span - Gen<Stmt> - [do { var foo = bar; } while(foo != bar)] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:23
  29708. - SyntaxKind.Keyword;[do];
  29709. - SyntaxKind.Whitespace;[ ];
  29710. - SyntaxKind.LeftBrace;[{];
  29711. - SyntaxKind.Whitespace;[ ];
  29712. - SyntaxKind.Identifier;[var];
  29713. - SyntaxKind.Whitespace;[ ];
  29714. - SyntaxKind.Identifier;[foo];
  29715. - SyntaxKind.Whitespace;[ ];
  29716. - SyntaxKind.Assign;[=];
  29717. - SyntaxKind.Whitespace;[ ];
  29718. - SyntaxKind.Identifier;[bar];
  29719. - SyntaxKind.Semicolon;[;];
  29720. - SyntaxKind.Whitespace;[ ];
  29721. - SyntaxKind.RightBrace;[}];
  29722. - SyntaxKind.Whitespace;[ ];
  29723. - SyntaxKind.Keyword;[while];
  29724. - SyntaxKind.LeftParenthesis;[(];
  29725. - SyntaxKind.Identifier;[foo];
  29726. - SyntaxKind.Whitespace;[ ];
  29727. - SyntaxKind.NotEqual;[!=];
  29728. - SyntaxKind.Whitespace;[ ];
  29729. - SyntaxKind.Identifier;[bar];
  29730. - SyntaxKind.RightParenthesis;[)];
  29731. +CSharpCodeBlock - [0..39)::39 - [do { var foo = bar; } while(foo != bar)]
  29732. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  29733. + Transition;[<Missing>];
  29734. + CSharpStatementLiteral - [0..39)::39 - [do { var foo = bar; } while(foo != bar)] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  29735. + Keyword;[do];
  29736. + Whitespace;[ ];
  29737. + LeftBrace;[{];
  29738. + Whitespace;[ ];
  29739. + Identifier;[var];
  29740. + Whitespace;[ ];
  29741. + Identifier;[foo];
  29742. + Whitespace;[ ];
  29743. + Assign;[=];
  29744. + Whitespace;[ ];
  29745. + Identifier;[bar];
  29746. + Semicolon;[;];
  29747. + Whitespace;[ ];
  29748. + RightBrace;[}];
  29749. + Whitespace;[ ];
  29750. + Keyword;[while];
  29751. + LeftParenthesis;[(];
  29752. + Identifier;[foo];
  29753. + Whitespace;[ ];
  29754. + NotEqual;[!=];
  29755. + Whitespace;[ ];
  29756. + Identifier;[bar];
  29757. + RightParenthesis;[)];
  29758. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CorrectlyParsesDoWhileBlockMissingWhileClauseEntirely.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CorrectlyParsesDoWhileBlockMissingWhileClauseEntirely.stree.txt
  29759. index 45a35ab1d6b..9c1ddef84f9 100644
  29760. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CorrectlyParsesDoWhileBlockMissingWhileClauseEntirely.stree.txt
  29761. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CorrectlyParsesDoWhileBlockMissingWhileClauseEntirely.stree.txt
  29762. @@ -1,16 +1,18 @@
  29763. -Statement block - Gen<None> - 21 - (0:0,0)
  29764. - Code span - Gen<Stmt> - [do { var foo = bar; }] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:14
  29765. - SyntaxKind.Keyword;[do];
  29766. - SyntaxKind.Whitespace;[ ];
  29767. - SyntaxKind.LeftBrace;[{];
  29768. - SyntaxKind.Whitespace;[ ];
  29769. - SyntaxKind.Identifier;[var];
  29770. - SyntaxKind.Whitespace;[ ];
  29771. - SyntaxKind.Identifier;[foo];
  29772. - SyntaxKind.Whitespace;[ ];
  29773. - SyntaxKind.Assign;[=];
  29774. - SyntaxKind.Whitespace;[ ];
  29775. - SyntaxKind.Identifier;[bar];
  29776. - SyntaxKind.Semicolon;[;];
  29777. - SyntaxKind.Whitespace;[ ];
  29778. - SyntaxKind.RightBrace;[}];
  29779. +CSharpCodeBlock - [0..21)::21 - [do { var foo = bar; }]
  29780. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  29781. + Transition;[<Missing>];
  29782. + CSharpStatementLiteral - [0..21)::21 - [do { var foo = bar; }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  29783. + Keyword;[do];
  29784. + Whitespace;[ ];
  29785. + LeftBrace;[{];
  29786. + Whitespace;[ ];
  29787. + Identifier;[var];
  29788. + Whitespace;[ ];
  29789. + Identifier;[foo];
  29790. + Whitespace;[ ];
  29791. + Assign;[=];
  29792. + Whitespace;[ ];
  29793. + Identifier;[bar];
  29794. + Semicolon;[;];
  29795. + Whitespace;[ ];
  29796. + RightBrace;[}];
  29797. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CorrectlyParsesDoWhileBlockMissingWhileCondition.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CorrectlyParsesDoWhileBlockMissingWhileCondition.stree.txt
  29798. index acc83fbd925..3aa59c8da66 100644
  29799. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CorrectlyParsesDoWhileBlockMissingWhileCondition.stree.txt
  29800. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CorrectlyParsesDoWhileBlockMissingWhileCondition.stree.txt
  29801. @@ -1,18 +1,20 @@
  29802. -Statement block - Gen<None> - 27 - (0:0,0)
  29803. - Code span - Gen<Stmt> - [do { var foo = bar; } while] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:16
  29804. - SyntaxKind.Keyword;[do];
  29805. - SyntaxKind.Whitespace;[ ];
  29806. - SyntaxKind.LeftBrace;[{];
  29807. - SyntaxKind.Whitespace;[ ];
  29808. - SyntaxKind.Identifier;[var];
  29809. - SyntaxKind.Whitespace;[ ];
  29810. - SyntaxKind.Identifier;[foo];
  29811. - SyntaxKind.Whitespace;[ ];
  29812. - SyntaxKind.Assign;[=];
  29813. - SyntaxKind.Whitespace;[ ];
  29814. - SyntaxKind.Identifier;[bar];
  29815. - SyntaxKind.Semicolon;[;];
  29816. - SyntaxKind.Whitespace;[ ];
  29817. - SyntaxKind.RightBrace;[}];
  29818. - SyntaxKind.Whitespace;[ ];
  29819. - SyntaxKind.Keyword;[while];
  29820. +CSharpCodeBlock - [0..27)::27 - [do { var foo = bar; } while]
  29821. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  29822. + Transition;[<Missing>];
  29823. + CSharpStatementLiteral - [0..27)::27 - [do { var foo = bar; } while] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  29824. + Keyword;[do];
  29825. + Whitespace;[ ];
  29826. + LeftBrace;[{];
  29827. + Whitespace;[ ];
  29828. + Identifier;[var];
  29829. + Whitespace;[ ];
  29830. + Identifier;[foo];
  29831. + Whitespace;[ ];
  29832. + Assign;[=];
  29833. + Whitespace;[ ];
  29834. + Identifier;[bar];
  29835. + Semicolon;[;];
  29836. + Whitespace;[ ];
  29837. + RightBrace;[}];
  29838. + Whitespace;[ ];
  29839. + Keyword;[while];
  29840. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CorrectlyParsesDoWhileBlockMissingWhileConditionWithSemicolon.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CorrectlyParsesDoWhileBlockMissingWhileConditionWithSemicolon.stree.txt
  29841. index 84dbbd25a4e..3e8f224bd00 100644
  29842. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CorrectlyParsesDoWhileBlockMissingWhileConditionWithSemicolon.stree.txt
  29843. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CorrectlyParsesDoWhileBlockMissingWhileConditionWithSemicolon.stree.txt
  29844. @@ -1,19 +1,21 @@
  29845. -Statement block - Gen<None> - 28 - (0:0,0)
  29846. - Code span - Gen<Stmt> - [do { var foo = bar; } while;] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:17
  29847. - SyntaxKind.Keyword;[do];
  29848. - SyntaxKind.Whitespace;[ ];
  29849. - SyntaxKind.LeftBrace;[{];
  29850. - SyntaxKind.Whitespace;[ ];
  29851. - SyntaxKind.Identifier;[var];
  29852. - SyntaxKind.Whitespace;[ ];
  29853. - SyntaxKind.Identifier;[foo];
  29854. - SyntaxKind.Whitespace;[ ];
  29855. - SyntaxKind.Assign;[=];
  29856. - SyntaxKind.Whitespace;[ ];
  29857. - SyntaxKind.Identifier;[bar];
  29858. - SyntaxKind.Semicolon;[;];
  29859. - SyntaxKind.Whitespace;[ ];
  29860. - SyntaxKind.RightBrace;[}];
  29861. - SyntaxKind.Whitespace;[ ];
  29862. - SyntaxKind.Keyword;[while];
  29863. - SyntaxKind.Semicolon;[;];
  29864. +CSharpCodeBlock - [0..28)::28 - [do { var foo = bar; } while;]
  29865. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  29866. + Transition;[<Missing>];
  29867. + CSharpStatementLiteral - [0..28)::28 - [do { var foo = bar; } while;] - Gen<Stmt> - SpanEditHandler;Accepts:None
  29868. + Keyword;[do];
  29869. + Whitespace;[ ];
  29870. + LeftBrace;[{];
  29871. + Whitespace;[ ];
  29872. + Identifier;[var];
  29873. + Whitespace;[ ];
  29874. + Identifier;[foo];
  29875. + Whitespace;[ ];
  29876. + Assign;[=];
  29877. + Whitespace;[ ];
  29878. + Identifier;[bar];
  29879. + Semicolon;[;];
  29880. + Whitespace;[ ];
  29881. + RightBrace;[}];
  29882. + Whitespace;[ ];
  29883. + Keyword;[while];
  29884. + Semicolon;[;];
  29885. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CorrectlyParsesMarkupInDoWhileBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CorrectlyParsesMarkupInDoWhileBlock.stree.txt
  29886. index ea31ba71070..8cfa9e2ee1f 100644
  29887. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CorrectlyParsesMarkupInDoWhileBlock.stree.txt
  29888. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/CorrectlyParsesMarkupInDoWhileBlock.stree.txt
  29889. @@ -1,50 +1,50 @@
  29890. -Statement block - Gen<None> - 58 - (0:0,0)
  29891. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  29892. - SyntaxKind.Transition;[@];
  29893. - Code span - Gen<Stmt> - [do { var foo = bar;] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:12
  29894. - SyntaxKind.Keyword;[do];
  29895. - SyntaxKind.Whitespace;[ ];
  29896. - SyntaxKind.LeftBrace;[{];
  29897. - SyntaxKind.Whitespace;[ ];
  29898. - SyntaxKind.Identifier;[var];
  29899. - SyntaxKind.Whitespace;[ ];
  29900. - SyntaxKind.Identifier;[foo];
  29901. - SyntaxKind.Whitespace;[ ];
  29902. - SyntaxKind.Assign;[=];
  29903. - SyntaxKind.Whitespace;[ ];
  29904. - SyntaxKind.Identifier;[bar];
  29905. - SyntaxKind.Semicolon;[;];
  29906. - Markup block - Gen<None> - 12 - (20:0,20)
  29907. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:1
  29908. - SyntaxKind.Whitespace;[ ];
  29909. - Tag block - Gen<None> - 3 - (21:0,21)
  29910. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:3
  29911. - SyntaxKind.OpenAngle;[<];
  29912. - SyntaxKind.Text;[p];
  29913. - SyntaxKind.CloseAngle;[>];
  29914. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:Any - (24:0,24) - Tokens:1
  29915. - SyntaxKind.Text;[Foo];
  29916. - Tag block - Gen<None> - 4 - (27:0,27)
  29917. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (27:0,27) - Tokens:4
  29918. - SyntaxKind.OpenAngle;[<];
  29919. - SyntaxKind.ForwardSlash;[/];
  29920. - SyntaxKind.Text;[p];
  29921. - SyntaxKind.CloseAngle;[>];
  29922. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (31:0,31) - Tokens:1
  29923. - SyntaxKind.Whitespace;[ ];
  29924. - Code span - Gen<Stmt> - [foo++; } while (foo<bar>);] - SpanEditHandler;Accepts:None - (32:0,32) - Tokens:15
  29925. - SyntaxKind.Identifier;[foo];
  29926. - SyntaxKind.Increment;[++];
  29927. - SyntaxKind.Semicolon;[;];
  29928. - SyntaxKind.Whitespace;[ ];
  29929. - SyntaxKind.RightBrace;[}];
  29930. - SyntaxKind.Whitespace;[ ];
  29931. - SyntaxKind.Keyword;[while];
  29932. - SyntaxKind.Whitespace;[ ];
  29933. - SyntaxKind.LeftParenthesis;[(];
  29934. - SyntaxKind.Identifier;[foo];
  29935. - SyntaxKind.LessThan;[<];
  29936. - SyntaxKind.Identifier;[bar];
  29937. - SyntaxKind.GreaterThan;[>];
  29938. - SyntaxKind.RightParenthesis;[)];
  29939. - SyntaxKind.Semicolon;[;];
  29940. +CSharpCodeBlock - [0..58)::58 - [@do { var foo = bar; <p>Foo</p> foo++; } while (foo<bar>);]
  29941. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  29942. + Transition;[@];
  29943. + CSharpStatementLiteral - [1..20)::19 - [do { var foo = bar;] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  29944. + Keyword;[do];
  29945. + Whitespace;[ ];
  29946. + LeftBrace;[{];
  29947. + Whitespace;[ ];
  29948. + Identifier;[var];
  29949. + Whitespace;[ ];
  29950. + Identifier;[foo];
  29951. + Whitespace;[ ];
  29952. + Assign;[=];
  29953. + Whitespace;[ ];
  29954. + Identifier;[bar];
  29955. + Semicolon;[;];
  29956. + MarkupBlock - [20..32)::12
  29957. + MarkupTextLiteral - [20..21)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  29958. + Whitespace;[ ];
  29959. + MarkupTagBlock - [21..24)::3 - [<p>]
  29960. + MarkupTextLiteral - [21..24)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  29961. + OpenAngle;[<];
  29962. + Text;[p];
  29963. + CloseAngle;[>];
  29964. + MarkupTextLiteral - [24..27)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  29965. + Text;[Foo];
  29966. + MarkupTagBlock - [27..31)::4 - [</p>]
  29967. + MarkupTextLiteral - [27..31)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  29968. + OpenAngle;[<];
  29969. + ForwardSlash;[/];
  29970. + Text;[p];
  29971. + CloseAngle;[>];
  29972. + MarkupTextLiteral - [31..32)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  29973. + Whitespace;[ ];
  29974. + CSharpStatementLiteral - [32..58)::26 - [foo++; } while (foo<bar>);] - Gen<Stmt> - SpanEditHandler;Accepts:None
  29975. + Identifier;[foo];
  29976. + Increment;[++];
  29977. + Semicolon;[;];
  29978. + Whitespace;[ ];
  29979. + RightBrace;[}];
  29980. + Whitespace;[ ];
  29981. + Keyword;[while];
  29982. + Whitespace;[ ];
  29983. + LeftParenthesis;[(];
  29984. + Identifier;[foo];
  29985. + LessThan;[<];
  29986. + Identifier;[bar];
  29987. + GreaterThan;[>];
  29988. + RightParenthesis;[)];
  29989. + Semicolon;[;];
  29990. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/DoesNotAllowMultipleFinallyBlocks.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/DoesNotAllowMultipleFinallyBlocks.stree.txt
  29991. index 8ae4de426a1..cb95bfbf577 100644
  29992. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/DoesNotAllowMultipleFinallyBlocks.stree.txt
  29993. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/DoesNotAllowMultipleFinallyBlocks.stree.txt
  29994. @@ -1,37 +1,39 @@
  29995. -Statement block - Gen<None> - 55 - (0:0,0)
  29996. - Code span - Gen<Stmt> - [try { var foo = new { } } finally { var foo = new { } }] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:35
  29997. - SyntaxKind.Keyword;[try];
  29998. - SyntaxKind.Whitespace;[ ];
  29999. - SyntaxKind.LeftBrace;[{];
  30000. - SyntaxKind.Whitespace;[ ];
  30001. - SyntaxKind.Identifier;[var];
  30002. - SyntaxKind.Whitespace;[ ];
  30003. - SyntaxKind.Identifier;[foo];
  30004. - SyntaxKind.Whitespace;[ ];
  30005. - SyntaxKind.Assign;[=];
  30006. - SyntaxKind.Whitespace;[ ];
  30007. - SyntaxKind.Keyword;[new];
  30008. - SyntaxKind.Whitespace;[ ];
  30009. - SyntaxKind.LeftBrace;[{];
  30010. - SyntaxKind.Whitespace;[ ];
  30011. - SyntaxKind.RightBrace;[}];
  30012. - SyntaxKind.Whitespace;[ ];
  30013. - SyntaxKind.RightBrace;[}];
  30014. - SyntaxKind.Whitespace;[ ];
  30015. - SyntaxKind.Keyword;[finally];
  30016. - SyntaxKind.Whitespace;[ ];
  30017. - SyntaxKind.LeftBrace;[{];
  30018. - SyntaxKind.Whitespace;[ ];
  30019. - SyntaxKind.Identifier;[var];
  30020. - SyntaxKind.Whitespace;[ ];
  30021. - SyntaxKind.Identifier;[foo];
  30022. - SyntaxKind.Whitespace;[ ];
  30023. - SyntaxKind.Assign;[=];
  30024. - SyntaxKind.Whitespace;[ ];
  30025. - SyntaxKind.Keyword;[new];
  30026. - SyntaxKind.Whitespace;[ ];
  30027. - SyntaxKind.LeftBrace;[{];
  30028. - SyntaxKind.Whitespace;[ ];
  30029. - SyntaxKind.RightBrace;[}];
  30030. - SyntaxKind.Whitespace;[ ];
  30031. - SyntaxKind.RightBrace;[}];
  30032. +CSharpCodeBlock - [0..55)::55 - [try { var foo = new { } } finally { var foo = new { } }]
  30033. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  30034. + Transition;[<Missing>];
  30035. + CSharpStatementLiteral - [0..55)::55 - [try { var foo = new { } } finally { var foo = new { } }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  30036. + Keyword;[try];
  30037. + Whitespace;[ ];
  30038. + LeftBrace;[{];
  30039. + Whitespace;[ ];
  30040. + Identifier;[var];
  30041. + Whitespace;[ ];
  30042. + Identifier;[foo];
  30043. + Whitespace;[ ];
  30044. + Assign;[=];
  30045. + Whitespace;[ ];
  30046. + Keyword;[new];
  30047. + Whitespace;[ ];
  30048. + LeftBrace;[{];
  30049. + Whitespace;[ ];
  30050. + RightBrace;[}];
  30051. + Whitespace;[ ];
  30052. + RightBrace;[}];
  30053. + Whitespace;[ ];
  30054. + Keyword;[finally];
  30055. + Whitespace;[ ];
  30056. + LeftBrace;[{];
  30057. + Whitespace;[ ];
  30058. + Identifier;[var];
  30059. + Whitespace;[ ];
  30060. + Identifier;[foo];
  30061. + Whitespace;[ ];
  30062. + Assign;[=];
  30063. + Whitespace;[ ];
  30064. + Keyword;[new];
  30065. + Whitespace;[ ];
  30066. + LeftBrace;[{];
  30067. + Whitespace;[ ];
  30068. + RightBrace;[}];
  30069. + Whitespace;[ ];
  30070. + RightBrace;[}];
  30071. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/DoesNotParseOnSwitchCharacterNotFollowedByOpenAngleOrColon.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/DoesNotParseOnSwitchCharacterNotFollowedByOpenAngleOrColon.stree.txt
  30072. index a2187f43541..511ac5e9055 100644
  30073. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/DoesNotParseOnSwitchCharacterNotFollowedByOpenAngleOrColon.stree.txt
  30074. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/DoesNotParseOnSwitchCharacterNotFollowedByOpenAngleOrColon.stree.txt
  30075. @@ -1,17 +1,19 @@
  30076. -Statement block - Gen<None> - 30 - (0:0,0)
  30077. - Code span - Gen<Stmt> - [if(foo) { @"Foo".ToString(); }] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:15
  30078. - SyntaxKind.Keyword;[if];
  30079. - SyntaxKind.LeftParenthesis;[(];
  30080. - SyntaxKind.Identifier;[foo];
  30081. - SyntaxKind.RightParenthesis;[)];
  30082. - SyntaxKind.Whitespace;[ ];
  30083. - SyntaxKind.LeftBrace;[{];
  30084. - SyntaxKind.Whitespace;[ ];
  30085. - SyntaxKind.StringLiteral;[@"Foo"];
  30086. - SyntaxKind.Dot;[.];
  30087. - SyntaxKind.Identifier;[ToString];
  30088. - SyntaxKind.LeftParenthesis;[(];
  30089. - SyntaxKind.RightParenthesis;[)];
  30090. - SyntaxKind.Semicolon;[;];
  30091. - SyntaxKind.Whitespace;[ ];
  30092. - SyntaxKind.RightBrace;[}];
  30093. +CSharpCodeBlock - [0..30)::30 - [if(foo) { @"Foo".ToString(); }]
  30094. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  30095. + Transition;[<Missing>];
  30096. + CSharpStatementLiteral - [0..30)::30 - [if(foo) { @"Foo".ToString(); }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  30097. + Keyword;[if];
  30098. + LeftParenthesis;[(];
  30099. + Identifier;[foo];
  30100. + RightParenthesis;[)];
  30101. + Whitespace;[ ];
  30102. + LeftBrace;[{];
  30103. + Whitespace;[ ];
  30104. + StringLiteral;[@"Foo"];
  30105. + Dot;[.];
  30106. + Identifier;[ToString];
  30107. + LeftParenthesis;[(];
  30108. + RightParenthesis;[)];
  30109. + Semicolon;[;];
  30110. + Whitespace;[ ];
  30111. + RightBrace;[}];
  30112. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/DoesntCaptureWhitespaceAfterUsing.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/DoesntCaptureWhitespaceAfterUsing.stree.txt
  30113. index 955f9551aae..bcea8cb1106 100644
  30114. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/DoesntCaptureWhitespaceAfterUsing.stree.txt
  30115. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/DoesntCaptureWhitespaceAfterUsing.stree.txt
  30116. @@ -1,5 +1,9 @@
  30117. -Directive block - Gen<None> - 9 - (0:0,0)
  30118. - Code span - Gen<Import: Foo;> - [using Foo] - SpanEditHandler;Accepts:AnyExceptNewline - (0:0,0) - Tokens:3
  30119. - SyntaxKind.Keyword;[using];
  30120. - SyntaxKind.Whitespace;[ ];
  30121. - SyntaxKind.Identifier;[Foo];
  30122. +CSharpCodeBlock - [0..9)::9 - [using Foo]
  30123. + RazorDirective - [0..9)::9
  30124. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  30125. + Transition;[<Missing>];
  30126. + RazorDirectiveBody - [0..9)::9
  30127. + CSharpStatementLiteral - [0..9)::9 - [using Foo] - Gen<Import: Foo;> - SpanEditHandler;Accepts:AnyExceptNewline
  30128. + Keyword;[using];
  30129. + Whitespace;[ ];
  30130. + Identifier;[Foo];
  30131. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/HasErrorsIfNamespaceAliasMissingSemicolon.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/HasErrorsIfNamespaceAliasMissingSemicolon.stree.txt
  30132. index d2ea2314213..d118c30b280 100644
  30133. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/HasErrorsIfNamespaceAliasMissingSemicolon.stree.txt
  30134. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/HasErrorsIfNamespaceAliasMissingSemicolon.stree.txt
  30135. @@ -1,13 +1,17 @@
  30136. -Directive block - Gen<None> - 29 - (0:0,0)
  30137. - Code span - Gen<Import: Foo.Bar.Baz = FooBarBaz;> - [using Foo.Bar.Baz = FooBarBaz] - SpanEditHandler;Accepts:AnyExceptNewline - (0:0,0) - Tokens:11
  30138. - SyntaxKind.Keyword;[using];
  30139. - SyntaxKind.Whitespace;[ ];
  30140. - SyntaxKind.Identifier;[Foo];
  30141. - SyntaxKind.Dot;[.];
  30142. - SyntaxKind.Identifier;[Bar];
  30143. - SyntaxKind.Dot;[.];
  30144. - SyntaxKind.Identifier;[Baz];
  30145. - SyntaxKind.Whitespace;[ ];
  30146. - SyntaxKind.Assign;[=];
  30147. - SyntaxKind.Whitespace;[ ];
  30148. - SyntaxKind.Identifier;[FooBarBaz];
  30149. +CSharpCodeBlock - [0..29)::29 - [using Foo.Bar.Baz = FooBarBaz]
  30150. + RazorDirective - [0..29)::29
  30151. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  30152. + Transition;[<Missing>];
  30153. + RazorDirectiveBody - [0..29)::29
  30154. + CSharpStatementLiteral - [0..29)::29 - [using Foo.Bar.Baz = FooBarBaz] - Gen<Import: Foo.Bar.Baz = FooBarBaz;> - SpanEditHandler;Accepts:AnyExceptNewline
  30155. + Keyword;[using];
  30156. + Whitespace;[ ];
  30157. + Identifier;[Foo];
  30158. + Dot;[.];
  30159. + Identifier;[Bar];
  30160. + Dot;[.];
  30161. + Identifier;[Baz];
  30162. + Whitespace;[ ];
  30163. + Assign;[=];
  30164. + Whitespace;[ ];
  30165. + Identifier;[FooBarBaz];
  30166. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/HasErrorsIfNamespaceImportMissingSemicolon.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/HasErrorsIfNamespaceImportMissingSemicolon.stree.txt
  30167. index 92f8d6a426f..2218ed9ac2a 100644
  30168. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/HasErrorsIfNamespaceImportMissingSemicolon.stree.txt
  30169. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/HasErrorsIfNamespaceImportMissingSemicolon.stree.txt
  30170. @@ -1,9 +1,13 @@
  30171. -Directive block - Gen<None> - 17 - (0:0,0)
  30172. - Code span - Gen<Import: Foo.Bar.Baz;> - [using Foo.Bar.Baz] - SpanEditHandler;Accepts:AnyExceptNewline - (0:0,0) - Tokens:7
  30173. - SyntaxKind.Keyword;[using];
  30174. - SyntaxKind.Whitespace;[ ];
  30175. - SyntaxKind.Identifier;[Foo];
  30176. - SyntaxKind.Dot;[.];
  30177. - SyntaxKind.Identifier;[Bar];
  30178. - SyntaxKind.Dot;[.];
  30179. - SyntaxKind.Identifier;[Baz];
  30180. +CSharpCodeBlock - [0..17)::17 - [using Foo.Bar.Baz]
  30181. + RazorDirective - [0..17)::17
  30182. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  30183. + Transition;[<Missing>];
  30184. + RazorDirectiveBody - [0..17)::17
  30185. + CSharpStatementLiteral - [0..17)::17 - [using Foo.Bar.Baz] - Gen<Import: Foo.Bar.Baz;> - SpanEditHandler;Accepts:AnyExceptNewline
  30186. + Keyword;[using];
  30187. + Whitespace;[ ];
  30188. + Identifier;[Foo];
  30189. + Dot;[.];
  30190. + Identifier;[Bar];
  30191. + Dot;[.];
  30192. + Identifier;[Baz];
  30193. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/NestedCodeBlockWithAtDoesntCauseError.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/NestedCodeBlockWithAtDoesntCauseError.stree.txt
  30194. index 88eb4a4448c..b46729f160d 100644
  30195. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/NestedCodeBlockWithAtDoesntCauseError.stree.txt
  30196. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/NestedCodeBlockWithAtDoesntCauseError.stree.txt
  30197. @@ -1,25 +1,27 @@
  30198. -Statement block - Gen<None> - 28 - (0:0,0)
  30199. - Code span - Gen<Stmt> - [if (true) { ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:8
  30200. - SyntaxKind.Keyword;[if];
  30201. - SyntaxKind.Whitespace;[ ];
  30202. - SyntaxKind.LeftParenthesis;[(];
  30203. - SyntaxKind.Keyword;[true];
  30204. - SyntaxKind.RightParenthesis;[)];
  30205. - SyntaxKind.Whitespace;[ ];
  30206. - SyntaxKind.LeftBrace;[{];
  30207. - SyntaxKind.Whitespace;[ ];
  30208. - Statement block - Gen<None> - 14 - (12:0,12)
  30209. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:1
  30210. - SyntaxKind.Transition;[@];
  30211. - Code span - Gen<Stmt> - [if(false) { }] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:8
  30212. - SyntaxKind.Keyword;[if];
  30213. - SyntaxKind.LeftParenthesis;[(];
  30214. - SyntaxKind.Keyword;[false];
  30215. - SyntaxKind.RightParenthesis;[)];
  30216. - SyntaxKind.Whitespace;[ ];
  30217. - SyntaxKind.LeftBrace;[{];
  30218. - SyntaxKind.Whitespace;[ ];
  30219. - SyntaxKind.RightBrace;[}];
  30220. - Code span - Gen<Stmt> - [ }] - SpanEditHandler;Accepts:Any - (26:0,26) - Tokens:2
  30221. - SyntaxKind.Whitespace;[ ];
  30222. - SyntaxKind.RightBrace;[}];
  30223. +CSharpCodeBlock - [0..28)::28 - [if (true) { @if(false) { } }]
  30224. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  30225. + Transition;[<Missing>];
  30226. + CSharpStatementLiteral - [0..12)::12 - [if (true) { ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  30227. + Keyword;[if];
  30228. + Whitespace;[ ];
  30229. + LeftParenthesis;[(];
  30230. + Keyword;[true];
  30231. + RightParenthesis;[)];
  30232. + Whitespace;[ ];
  30233. + LeftBrace;[{];
  30234. + Whitespace;[ ];
  30235. + CSharpCodeBlock - [12..26)::14
  30236. + CSharpTransition - [12..13)::1 - Gen<None> - SpanEditHandler;Accepts:None
  30237. + Transition;[@];
  30238. + CSharpStatementLiteral - [13..26)::13 - [if(false) { }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  30239. + Keyword;[if];
  30240. + LeftParenthesis;[(];
  30241. + Keyword;[false];
  30242. + RightParenthesis;[)];
  30243. + Whitespace;[ ];
  30244. + LeftBrace;[{];
  30245. + Whitespace;[ ];
  30246. + RightBrace;[}];
  30247. + CSharpStatementLiteral - [26..28)::2 - [ }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  30248. + Whitespace;[ ];
  30249. + RightBrace;[}];
  30250. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/NestedCodeBlockWithCSharpAt.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/NestedCodeBlockWithCSharpAt.stree.txt
  30251. index 4d2b1826643..f4b22b07227 100644
  30252. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/NestedCodeBlockWithCSharpAt.stree.txt
  30253. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/NestedCodeBlockWithCSharpAt.stree.txt
  30254. @@ -1,41 +1,46 @@
  30255. -Statement block - Gen<None> - 49 - (0:0,0)
  30256. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  30257. - SyntaxKind.LeftBrace;[{];
  30258. - Code span - Gen<Stmt> - [ if (true) { var val = @x; if (val != 3) { } } ] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:35
  30259. - SyntaxKind.Whitespace;[ ];
  30260. - SyntaxKind.Keyword;[if];
  30261. - SyntaxKind.Whitespace;[ ];
  30262. - SyntaxKind.LeftParenthesis;[(];
  30263. - SyntaxKind.Keyword;[true];
  30264. - SyntaxKind.RightParenthesis;[)];
  30265. - SyntaxKind.Whitespace;[ ];
  30266. - SyntaxKind.LeftBrace;[{];
  30267. - SyntaxKind.Whitespace;[ ];
  30268. - SyntaxKind.Identifier;[var];
  30269. - SyntaxKind.Whitespace;[ ];
  30270. - SyntaxKind.Identifier;[val];
  30271. - SyntaxKind.Whitespace;[ ];
  30272. - SyntaxKind.Assign;[=];
  30273. - SyntaxKind.Whitespace;[ ];
  30274. - SyntaxKind.Transition;[@];
  30275. - SyntaxKind.Identifier;[x];
  30276. - SyntaxKind.Semicolon;[;];
  30277. - SyntaxKind.Whitespace;[ ];
  30278. - SyntaxKind.Keyword;[if];
  30279. - SyntaxKind.Whitespace;[ ];
  30280. - SyntaxKind.LeftParenthesis;[(];
  30281. - SyntaxKind.Identifier;[val];
  30282. - SyntaxKind.Whitespace;[ ];
  30283. - SyntaxKind.NotEqual;[!=];
  30284. - SyntaxKind.Whitespace;[ ];
  30285. - SyntaxKind.IntegerLiteral;[3];
  30286. - SyntaxKind.RightParenthesis;[)];
  30287. - SyntaxKind.Whitespace;[ ];
  30288. - SyntaxKind.LeftBrace;[{];
  30289. - SyntaxKind.Whitespace;[ ];
  30290. - SyntaxKind.RightBrace;[}];
  30291. - SyntaxKind.Whitespace;[ ];
  30292. - SyntaxKind.RightBrace;[}];
  30293. - SyntaxKind.Whitespace;[ ];
  30294. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (48:0,48) - Tokens:1
  30295. - SyntaxKind.RightBrace;[}];
  30296. +CSharpCodeBlock - [0..49)::49 - [{ if (true) { var val = @x; if (val != 3) { } } }]
  30297. + CSharpStatement - [0..49)::49
  30298. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  30299. + Transition;[<Missing>];
  30300. + CSharpStatementBody - [0..49)::49
  30301. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  30302. + LeftBrace;[{];
  30303. + CSharpCodeBlock - [1..48)::47
  30304. + CSharpStatementLiteral - [1..48)::47 - [ if (true) { var val = @x; if (val != 3) { } } ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  30305. + Whitespace;[ ];
  30306. + Keyword;[if];
  30307. + Whitespace;[ ];
  30308. + LeftParenthesis;[(];
  30309. + Keyword;[true];
  30310. + RightParenthesis;[)];
  30311. + Whitespace;[ ];
  30312. + LeftBrace;[{];
  30313. + Whitespace;[ ];
  30314. + Identifier;[var];
  30315. + Whitespace;[ ];
  30316. + Identifier;[val];
  30317. + Whitespace;[ ];
  30318. + Assign;[=];
  30319. + Whitespace;[ ];
  30320. + Transition;[@];
  30321. + Identifier;[x];
  30322. + Semicolon;[;];
  30323. + Whitespace;[ ];
  30324. + Keyword;[if];
  30325. + Whitespace;[ ];
  30326. + LeftParenthesis;[(];
  30327. + Identifier;[val];
  30328. + Whitespace;[ ];
  30329. + NotEqual;[!=];
  30330. + Whitespace;[ ];
  30331. + IntegerLiteral;[3];
  30332. + RightParenthesis;[)];
  30333. + Whitespace;[ ];
  30334. + LeftBrace;[{];
  30335. + Whitespace;[ ];
  30336. + RightBrace;[}];
  30337. + Whitespace;[ ];
  30338. + RightBrace;[}];
  30339. + Whitespace;[ ];
  30340. + RazorMetaCode - [48..49)::1 - Gen<None> - SpanEditHandler;Accepts:None
  30341. + RightBrace;[}];
  30342. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/NestedCodeBlockWithMarkupSetsDotAsMarkup.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/NestedCodeBlockWithMarkupSetsDotAsMarkup.stree.txt
  30343. index faaeb88e726..93ac739d15f 100644
  30344. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/NestedCodeBlockWithMarkupSetsDotAsMarkup.stree.txt
  30345. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/NestedCodeBlockWithMarkupSetsDotAsMarkup.stree.txt
  30346. @@ -1,50 +1,55 @@
  30347. -Statement block - Gen<None> - 51 - (0:0,0)
  30348. - Code span - Gen<Stmt> - [if (true) { ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:8
  30349. - SyntaxKind.Keyword;[if];
  30350. - SyntaxKind.Whitespace;[ ];
  30351. - SyntaxKind.LeftParenthesis;[(];
  30352. - SyntaxKind.Keyword;[true];
  30353. - SyntaxKind.RightParenthesis;[)];
  30354. - SyntaxKind.Whitespace;[ ];
  30355. - SyntaxKind.LeftBrace;[{];
  30356. - SyntaxKind.Whitespace;[ ];
  30357. - Statement block - Gen<None> - 37 - (12:0,12)
  30358. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:1
  30359. - SyntaxKind.Transition;[@];
  30360. - Code span - Gen<Stmt> - [if(false) {] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:6
  30361. - SyntaxKind.Keyword;[if];
  30362. - SyntaxKind.LeftParenthesis;[(];
  30363. - SyntaxKind.Keyword;[false];
  30364. - SyntaxKind.RightParenthesis;[)];
  30365. - SyntaxKind.Whitespace;[ ];
  30366. - SyntaxKind.LeftBrace;[{];
  30367. - Markup block - Gen<None> - 24 - (24:0,24)
  30368. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (24:0,24) - Tokens:1
  30369. - SyntaxKind.Whitespace;[ ];
  30370. - Tag block - Gen<None> - 5 - (25:0,25)
  30371. - Markup span - Gen<Markup> - [<div>] - SpanEditHandler;Accepts:None - (25:0,25) - Tokens:3
  30372. - SyntaxKind.OpenAngle;[<];
  30373. - SyntaxKind.Text;[div];
  30374. - SyntaxKind.CloseAngle;[>];
  30375. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (30:0,30) - Tokens:1
  30376. - SyntaxKind.Unknown;[];
  30377. - Expression block - Gen<Expr> - 10 - (30:0,30)
  30378. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (30:0,30) - Tokens:1
  30379. - SyntaxKind.Transition;[@];
  30380. - Code span - Gen<Expr> - [something] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (31:0,31) - Tokens:1
  30381. - SyntaxKind.Identifier;[something];
  30382. - Markup span - Gen<Markup> - [.] - SpanEditHandler;Accepts:Any - (40:0,40) - Tokens:1
  30383. - SyntaxKind.Text;[.];
  30384. - Tag block - Gen<None> - 6 - (41:0,41)
  30385. - Markup span - Gen<Markup> - [</div>] - SpanEditHandler;Accepts:None - (41:0,41) - Tokens:4
  30386. - SyntaxKind.OpenAngle;[<];
  30387. - SyntaxKind.ForwardSlash;[/];
  30388. - SyntaxKind.Text;[div];
  30389. - SyntaxKind.CloseAngle;[>];
  30390. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (47:0,47) - Tokens:1
  30391. - SyntaxKind.Whitespace;[ ];
  30392. - Code span - Gen<Stmt> - [}] - SpanEditHandler;Accepts:Any - (48:0,48) - Tokens:1
  30393. - SyntaxKind.RightBrace;[}];
  30394. - Code span - Gen<Stmt> - [ }] - SpanEditHandler;Accepts:Any - (49:0,49) - Tokens:2
  30395. - SyntaxKind.Whitespace;[ ];
  30396. - SyntaxKind.RightBrace;[}];
  30397. +CSharpCodeBlock - [0..51)::51 - [if (true) { @if(false) { <div>@something.</div> } }]
  30398. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  30399. + Transition;[<Missing>];
  30400. + CSharpStatementLiteral - [0..12)::12 - [if (true) { ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  30401. + Keyword;[if];
  30402. + Whitespace;[ ];
  30403. + LeftParenthesis;[(];
  30404. + Keyword;[true];
  30405. + RightParenthesis;[)];
  30406. + Whitespace;[ ];
  30407. + LeftBrace;[{];
  30408. + Whitespace;[ ];
  30409. + CSharpCodeBlock - [12..49)::37
  30410. + CSharpTransition - [12..13)::1 - Gen<None> - SpanEditHandler;Accepts:None
  30411. + Transition;[@];
  30412. + CSharpStatementLiteral - [13..24)::11 - [if(false) {] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  30413. + Keyword;[if];
  30414. + LeftParenthesis;[(];
  30415. + Keyword;[false];
  30416. + RightParenthesis;[)];
  30417. + Whitespace;[ ];
  30418. + LeftBrace;[{];
  30419. + MarkupBlock - [24..48)::24
  30420. + MarkupTextLiteral - [24..25)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  30421. + Whitespace;[ ];
  30422. + MarkupTagBlock - [25..30)::5 - [<div>]
  30423. + MarkupTextLiteral - [25..30)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:None
  30424. + OpenAngle;[<];
  30425. + Text;[div];
  30426. + CloseAngle;[>];
  30427. + MarkupTextLiteral - [30..30)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  30428. + Marker;[];
  30429. + CSharpCodeBlock - [30..40)::10
  30430. + CSharpImplicitExpression - [30..40)::10
  30431. + CSharpTransition - [30..31)::1 - Gen<None> - SpanEditHandler;Accepts:None
  30432. + Transition;[@];
  30433. + CSharpImplicitExpressionBody - [31..40)::9
  30434. + CSharpCodeBlock - [31..40)::9
  30435. + CSharpExpressionLiteral - [31..40)::9 - [something] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  30436. + Identifier;[something];
  30437. + MarkupTextLiteral - [40..41)::1 - [.] - Gen<Markup> - SpanEditHandler;Accepts:Any
  30438. + Text;[.];
  30439. + MarkupTagBlock - [41..47)::6 - [</div>]
  30440. + MarkupTextLiteral - [41..47)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:None
  30441. + OpenAngle;[<];
  30442. + ForwardSlash;[/];
  30443. + Text;[div];
  30444. + CloseAngle;[>];
  30445. + MarkupTextLiteral - [47..48)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  30446. + Whitespace;[ ];
  30447. + CSharpStatementLiteral - [48..49)::1 - [}] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  30448. + RightBrace;[}];
  30449. + CSharpStatementLiteral - [49..51)::2 - [ }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  30450. + Whitespace;[ ];
  30451. + RightBrace;[}];
  30452. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsersCanNestRecursively.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsersCanNestRecursively.stree.txt
  30453. index a8cf9335199..e37aa10fd3f 100644
  30454. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsersCanNestRecursively.stree.txt
  30455. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsersCanNestRecursively.stree.txt
  30456. @@ -1,179 +1,194 @@
  30457. -Statement block - Gen<None> - 351 - (0:0,0)
  30458. - Code span - Gen<Stmt> - [foreach(var c in db.Categories) {LF] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:15
  30459. - SyntaxKind.Keyword;[foreach];
  30460. - SyntaxKind.LeftParenthesis;[(];
  30461. - SyntaxKind.Identifier;[var];
  30462. - SyntaxKind.Whitespace;[ ];
  30463. - SyntaxKind.Identifier;[c];
  30464. - SyntaxKind.Whitespace;[ ];
  30465. - SyntaxKind.Keyword;[in];
  30466. - SyntaxKind.Whitespace;[ ];
  30467. - SyntaxKind.Identifier;[db];
  30468. - SyntaxKind.Dot;[.];
  30469. - SyntaxKind.Identifier;[Categories];
  30470. - SyntaxKind.RightParenthesis;[)];
  30471. - SyntaxKind.Whitespace;[ ];
  30472. - SyntaxKind.LeftBrace;[{];
  30473. - SyntaxKind.NewLine;[LF];
  30474. - Markup block - Gen<None> - 307 - (35:1,0)
  30475. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (35:1,0) - Tokens:1
  30476. - SyntaxKind.Whitespace;[ ];
  30477. - Tag block - Gen<None> - 5 - (47:1,12)
  30478. - Markup span - Gen<Markup> - [<div>] - SpanEditHandler;Accepts:None - (47:1,12) - Tokens:3
  30479. - SyntaxKind.OpenAngle;[<];
  30480. - SyntaxKind.Text;[div];
  30481. - SyntaxKind.CloseAngle;[>];
  30482. - Markup span - Gen<Markup> - [LF ] - SpanEditHandler;Accepts:Any - (52:1,17) - Tokens:2
  30483. - SyntaxKind.NewLine;[LF];
  30484. - SyntaxKind.Whitespace;[ ];
  30485. - Tag block - Gen<None> - 4 - (70:2,16)
  30486. - Markup span - Gen<Markup> - [<h1>] - SpanEditHandler;Accepts:None - (70:2,16) - Tokens:3
  30487. - SyntaxKind.OpenAngle;[<];
  30488. - SyntaxKind.Text;[h1];
  30489. - SyntaxKind.CloseAngle;[>];
  30490. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (74:2,20) - Tokens:1
  30491. - SyntaxKind.Unknown;[];
  30492. - Expression block - Gen<Expr> - 7 - (74:2,20)
  30493. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (74:2,20) - Tokens:1
  30494. - SyntaxKind.Transition;[@];
  30495. - Code span - Gen<Expr> - [c.Name] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (75:2,21) - Tokens:3
  30496. - SyntaxKind.Identifier;[c];
  30497. - SyntaxKind.Dot;[.];
  30498. - SyntaxKind.Identifier;[Name];
  30499. - Tag block - Gen<None> - 5 - (81:2,27)
  30500. - Markup span - Gen<Markup> - [</h1>] - SpanEditHandler;Accepts:None - (81:2,27) - Tokens:4
  30501. - SyntaxKind.OpenAngle;[<];
  30502. - SyntaxKind.ForwardSlash;[/];
  30503. - SyntaxKind.Text;[h1];
  30504. - SyntaxKind.CloseAngle;[>];
  30505. - Markup span - Gen<Markup> - [LF ] - SpanEditHandler;Accepts:Any - (86:2,32) - Tokens:2
  30506. - SyntaxKind.NewLine;[LF];
  30507. - SyntaxKind.Whitespace;[ ];
  30508. - Tag block - Gen<None> - 4 - (104:3,16)
  30509. - Markup span - Gen<Markup> - [<ul>] - SpanEditHandler;Accepts:None - (104:3,16) - Tokens:3
  30510. - SyntaxKind.OpenAngle;[<];
  30511. - SyntaxKind.Text;[ul];
  30512. - SyntaxKind.CloseAngle;[>];
  30513. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:Any - (108:3,20) - Tokens:1
  30514. - SyntaxKind.NewLine;[LF];
  30515. - Statement block - Gen<None> - 189 - (110:4,0)
  30516. - Code span - Gen<Stmt> - [ ] - SpanEditHandler;Accepts:Any - (110:4,0) - Tokens:1
  30517. - SyntaxKind.Whitespace;[ ];
  30518. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (130:4,20) - Tokens:1
  30519. - SyntaxKind.Transition;[@];
  30520. - Code span - Gen<Stmt> - [foreach(var p in c.Products) {LF] - SpanEditHandler;Accepts:Any - (131:4,21) - Tokens:15
  30521. - SyntaxKind.Keyword;[foreach];
  30522. - SyntaxKind.LeftParenthesis;[(];
  30523. - SyntaxKind.Identifier;[var];
  30524. - SyntaxKind.Whitespace;[ ];
  30525. - SyntaxKind.Identifier;[p];
  30526. - SyntaxKind.Whitespace;[ ];
  30527. - SyntaxKind.Keyword;[in];
  30528. - SyntaxKind.Whitespace;[ ];
  30529. - SyntaxKind.Identifier;[c];
  30530. - SyntaxKind.Dot;[.];
  30531. - SyntaxKind.Identifier;[Products];
  30532. - SyntaxKind.RightParenthesis;[)];
  30533. - SyntaxKind.Whitespace;[ ];
  30534. - SyntaxKind.LeftBrace;[{];
  30535. - SyntaxKind.NewLine;[LF];
  30536. - Markup block - Gen<None> - 113 - (163:5,0)
  30537. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (163:5,0) - Tokens:1
  30538. - SyntaxKind.Whitespace;[ ];
  30539. - Tag block - Gen<None> - 4 - (187:5,24)
  30540. - Markup span - Gen<Markup> - [<li>] - SpanEditHandler;Accepts:None - (187:5,24) - Tokens:3
  30541. - SyntaxKind.OpenAngle;[<];
  30542. - SyntaxKind.Text;[li];
  30543. - SyntaxKind.CloseAngle;[>];
  30544. - Tag block - Gen<None> - 67 - (191:5,28)
  30545. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (191:5,28) - Tokens:2
  30546. - SyntaxKind.OpenAngle;[<];
  30547. - SyntaxKind.Text;[a];
  30548. - Markup block - Gen<Attr:href, href="@(193:5,30),"@(256:5,93)> - 64 - (193:5,30)
  30549. - Markup span - Gen<None> - [ href="] - SpanEditHandler;Accepts:Any - (193:5,30) - Tokens:4
  30550. - SyntaxKind.Whitespace;[ ];
  30551. - SyntaxKind.Text;[href];
  30552. - SyntaxKind.Equals;[=];
  30553. - SyntaxKind.DoubleQuote;["];
  30554. - Markup block - Gen<DynAttr:@(200:5,37)> - 56 - (200:5,37)
  30555. - Expression block - Gen<Expr> - 56 - (200:5,37)
  30556. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (200:5,37) - Tokens:1
  30557. - SyntaxKind.Transition;[@];
  30558. - Code span - Gen<Expr> - [Html.ActionUrl("Products", "Detail", new { id = p.Id })] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (201:5,38) - Tokens:24
  30559. - SyntaxKind.Identifier;[Html];
  30560. - SyntaxKind.Dot;[.];
  30561. - SyntaxKind.Identifier;[ActionUrl];
  30562. - SyntaxKind.LeftParenthesis;[(];
  30563. - SyntaxKind.StringLiteral;["Products"];
  30564. - SyntaxKind.Comma;[,];
  30565. - SyntaxKind.Whitespace;[ ];
  30566. - SyntaxKind.StringLiteral;["Detail"];
  30567. - SyntaxKind.Comma;[,];
  30568. - SyntaxKind.Whitespace;[ ];
  30569. - SyntaxKind.Keyword;[new];
  30570. - SyntaxKind.Whitespace;[ ];
  30571. - SyntaxKind.LeftBrace;[{];
  30572. - SyntaxKind.Whitespace;[ ];
  30573. - SyntaxKind.Identifier;[id];
  30574. - SyntaxKind.Whitespace;[ ];
  30575. - SyntaxKind.Assign;[=];
  30576. - SyntaxKind.Whitespace;[ ];
  30577. - SyntaxKind.Identifier;[p];
  30578. - SyntaxKind.Dot;[.];
  30579. - SyntaxKind.Identifier;[Id];
  30580. - SyntaxKind.Whitespace;[ ];
  30581. - SyntaxKind.RightBrace;[}];
  30582. - SyntaxKind.RightParenthesis;[)];
  30583. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (256:5,93) - Tokens:1
  30584. - SyntaxKind.DoubleQuote;["];
  30585. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:None - (257:5,94) - Tokens:1
  30586. - SyntaxKind.CloseAngle;[>];
  30587. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (258:5,95) - Tokens:1
  30588. - SyntaxKind.Unknown;[];
  30589. - Expression block - Gen<Expr> - 7 - (258:5,95)
  30590. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (258:5,95) - Tokens:1
  30591. - SyntaxKind.Transition;[@];
  30592. - Code span - Gen<Expr> - [p.Name] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (259:5,96) - Tokens:3
  30593. - SyntaxKind.Identifier;[p];
  30594. - SyntaxKind.Dot;[.];
  30595. - SyntaxKind.Identifier;[Name];
  30596. - Tag block - Gen<None> - 4 - (265:5,102)
  30597. - Markup span - Gen<Markup> - [</a>] - SpanEditHandler;Accepts:None - (265:5,102) - Tokens:4
  30598. - SyntaxKind.OpenAngle;[<];
  30599. - SyntaxKind.ForwardSlash;[/];
  30600. - SyntaxKind.Text;[a];
  30601. - SyntaxKind.CloseAngle;[>];
  30602. - Tag block - Gen<None> - 5 - (269:5,106)
  30603. - Markup span - Gen<Markup> - [</li>] - SpanEditHandler;Accepts:None - (269:5,106) - Tokens:4
  30604. - SyntaxKind.OpenAngle;[<];
  30605. - SyntaxKind.ForwardSlash;[/];
  30606. - SyntaxKind.Text;[li];
  30607. - SyntaxKind.CloseAngle;[>];
  30608. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (274:5,111) - Tokens:1
  30609. - SyntaxKind.NewLine;[LF];
  30610. - Code span - Gen<Stmt> - [ }LF] - SpanEditHandler;Accepts:None - (276:6,0) - Tokens:3
  30611. - SyntaxKind.Whitespace;[ ];
  30612. - SyntaxKind.RightBrace;[}];
  30613. - SyntaxKind.NewLine;[LF];
  30614. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (299:7,0) - Tokens:1
  30615. - SyntaxKind.Whitespace;[ ];
  30616. - Tag block - Gen<None> - 5 - (315:7,16)
  30617. - Markup span - Gen<Markup> - [</ul>] - SpanEditHandler;Accepts:None - (315:7,16) - Tokens:4
  30618. - SyntaxKind.OpenAngle;[<];
  30619. - SyntaxKind.ForwardSlash;[/];
  30620. - SyntaxKind.Text;[ul];
  30621. - SyntaxKind.CloseAngle;[>];
  30622. - Markup span - Gen<Markup> - [LF ] - SpanEditHandler;Accepts:Any - (320:7,21) - Tokens:2
  30623. - SyntaxKind.NewLine;[LF];
  30624. - SyntaxKind.Whitespace;[ ];
  30625. - Tag block - Gen<None> - 6 - (334:8,12)
  30626. - Markup span - Gen<Markup> - [</div>] - SpanEditHandler;Accepts:None - (334:8,12) - Tokens:4
  30627. - SyntaxKind.OpenAngle;[<];
  30628. - SyntaxKind.ForwardSlash;[/];
  30629. - SyntaxKind.Text;[div];
  30630. - SyntaxKind.CloseAngle;[>];
  30631. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (340:8,18) - Tokens:1
  30632. - SyntaxKind.NewLine;[LF];
  30633. - Code span - Gen<Stmt> - [ }] - SpanEditHandler;Accepts:None - (342:9,0) - Tokens:2
  30634. - SyntaxKind.Whitespace;[ ];
  30635. - SyntaxKind.RightBrace;[}];
  30636. +CSharpCodeBlock - [0..351)::351 - [foreach(var c in db.Categories) {LF <div>LF <h1>@c.Name</h1>LF <ul>LF @foreach(var p in c.Products) {LF <li><a href="@Html.ActionUrl("Products", "Detail", new { id = p.Id })">@p.Name</a></li>LF }LF </ul>LF </div>LF }]
  30637. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  30638. + Transition;[<Missing>];
  30639. + CSharpStatementLiteral - [0..35)::35 - [foreach(var c in db.Categories) {LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  30640. + Keyword;[foreach];
  30641. + LeftParenthesis;[(];
  30642. + Identifier;[var];
  30643. + Whitespace;[ ];
  30644. + Identifier;[c];
  30645. + Whitespace;[ ];
  30646. + Keyword;[in];
  30647. + Whitespace;[ ];
  30648. + Identifier;[db];
  30649. + Dot;[.];
  30650. + Identifier;[Categories];
  30651. + RightParenthesis;[)];
  30652. + Whitespace;[ ];
  30653. + LeftBrace;[{];
  30654. + NewLine;[LF];
  30655. + MarkupBlock - [35..342)::307
  30656. + MarkupTextLiteral - [35..47)::12 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  30657. + Whitespace;[ ];
  30658. + MarkupTagBlock - [47..52)::5 - [<div>]
  30659. + MarkupTextLiteral - [47..52)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:None
  30660. + OpenAngle;[<];
  30661. + Text;[div];
  30662. + CloseAngle;[>];
  30663. + MarkupTextLiteral - [52..70)::18 - [LF ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  30664. + NewLine;[LF];
  30665. + Whitespace;[ ];
  30666. + MarkupTagBlock - [70..74)::4 - [<h1>]
  30667. + MarkupTextLiteral - [70..74)::4 - [<h1>] - Gen<Markup> - SpanEditHandler;Accepts:None
  30668. + OpenAngle;[<];
  30669. + Text;[h1];
  30670. + CloseAngle;[>];
  30671. + MarkupTextLiteral - [74..74)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  30672. + Marker;[];
  30673. + CSharpCodeBlock - [74..81)::7
  30674. + CSharpImplicitExpression - [74..81)::7
  30675. + CSharpTransition - [74..75)::1 - Gen<None> - SpanEditHandler;Accepts:None
  30676. + Transition;[@];
  30677. + CSharpImplicitExpressionBody - [75..81)::6
  30678. + CSharpCodeBlock - [75..81)::6
  30679. + CSharpExpressionLiteral - [75..81)::6 - [c.Name] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  30680. + Identifier;[c];
  30681. + Dot;[.];
  30682. + Identifier;[Name];
  30683. + MarkupTagBlock - [81..86)::5 - [</h1>]
  30684. + MarkupTextLiteral - [81..86)::5 - [</h1>] - Gen<Markup> - SpanEditHandler;Accepts:None
  30685. + OpenAngle;[<];
  30686. + ForwardSlash;[/];
  30687. + Text;[h1];
  30688. + CloseAngle;[>];
  30689. + MarkupTextLiteral - [86..104)::18 - [LF ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  30690. + NewLine;[LF];
  30691. + Whitespace;[ ];
  30692. + MarkupTagBlock - [104..108)::4 - [<ul>]
  30693. + MarkupTextLiteral - [104..108)::4 - [<ul>] - Gen<Markup> - SpanEditHandler;Accepts:None
  30694. + OpenAngle;[<];
  30695. + Text;[ul];
  30696. + CloseAngle;[>];
  30697. + MarkupTextLiteral - [108..110)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  30698. + NewLine;[LF];
  30699. + CSharpCodeBlock - [110..299)::189
  30700. + CSharpStatementLiteral - [110..130)::20 - [ ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  30701. + Whitespace;[ ];
  30702. + CSharpTransition - [130..131)::1 - Gen<None> - SpanEditHandler;Accepts:None
  30703. + Transition;[@];
  30704. + CSharpStatementLiteral - [131..163)::32 - [foreach(var p in c.Products) {LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  30705. + Keyword;[foreach];
  30706. + LeftParenthesis;[(];
  30707. + Identifier;[var];
  30708. + Whitespace;[ ];
  30709. + Identifier;[p];
  30710. + Whitespace;[ ];
  30711. + Keyword;[in];
  30712. + Whitespace;[ ];
  30713. + Identifier;[c];
  30714. + Dot;[.];
  30715. + Identifier;[Products];
  30716. + RightParenthesis;[)];
  30717. + Whitespace;[ ];
  30718. + LeftBrace;[{];
  30719. + NewLine;[LF];
  30720. + MarkupBlock - [163..276)::113
  30721. + MarkupTextLiteral - [163..187)::24 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  30722. + Whitespace;[ ];
  30723. + MarkupTagBlock - [187..191)::4 - [<li>]
  30724. + MarkupTextLiteral - [187..191)::4 - [<li>] - Gen<Markup> - SpanEditHandler;Accepts:None
  30725. + OpenAngle;[<];
  30726. + Text;[li];
  30727. + CloseAngle;[>];
  30728. + MarkupTagBlock - [191..258)::67 - [<a href="@Html.ActionUrl("Products", "Detail", new { id = p.Id })">]
  30729. + MarkupTextLiteral - [191..193)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  30730. + OpenAngle;[<];
  30731. + Text;[a];
  30732. + MarkupAttributeBlock - [193..257)::64 - [ href="@Html.ActionUrl("Products", "Detail", new { id = p.Id })"]
  30733. + MarkupTextLiteral - [193..194)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  30734. + Whitespace;[ ];
  30735. + MarkupTextLiteral - [194..198)::4 - [href] - Gen<Markup> - SpanEditHandler;Accepts:Any
  30736. + Text;[href];
  30737. + Equals;[=];
  30738. + MarkupTextLiteral - [199..200)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  30739. + DoubleQuote;["];
  30740. + GenericBlock - [200..256)::56
  30741. + MarkupDynamicAttributeValue - [200..256)::56 - [@Html.ActionUrl("Products", "Detail", new { id = p.Id })]
  30742. + GenericBlock - [200..256)::56
  30743. + CSharpCodeBlock - [200..256)::56
  30744. + CSharpImplicitExpression - [200..256)::56
  30745. + CSharpTransition - [200..201)::1 - Gen<None> - SpanEditHandler;Accepts:None
  30746. + Transition;[@];
  30747. + CSharpImplicitExpressionBody - [201..256)::55
  30748. + CSharpCodeBlock - [201..256)::55
  30749. + CSharpExpressionLiteral - [201..256)::55 - [Html.ActionUrl("Products", "Detail", new { id = p.Id })] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  30750. + Identifier;[Html];
  30751. + Dot;[.];
  30752. + Identifier;[ActionUrl];
  30753. + LeftParenthesis;[(];
  30754. + StringLiteral;["Products"];
  30755. + Comma;[,];
  30756. + Whitespace;[ ];
  30757. + StringLiteral;["Detail"];
  30758. + Comma;[,];
  30759. + Whitespace;[ ];
  30760. + Keyword;[new];
  30761. + Whitespace;[ ];
  30762. + LeftBrace;[{];
  30763. + Whitespace;[ ];
  30764. + Identifier;[id];
  30765. + Whitespace;[ ];
  30766. + Assign;[=];
  30767. + Whitespace;[ ];
  30768. + Identifier;[p];
  30769. + Dot;[.];
  30770. + Identifier;[Id];
  30771. + Whitespace;[ ];
  30772. + RightBrace;[}];
  30773. + RightParenthesis;[)];
  30774. + MarkupTextLiteral - [256..257)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  30775. + DoubleQuote;["];
  30776. + MarkupTextLiteral - [257..258)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  30777. + CloseAngle;[>];
  30778. + MarkupTextLiteral - [258..258)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  30779. + Marker;[];
  30780. + CSharpCodeBlock - [258..265)::7
  30781. + CSharpImplicitExpression - [258..265)::7
  30782. + CSharpTransition - [258..259)::1 - Gen<None> - SpanEditHandler;Accepts:None
  30783. + Transition;[@];
  30784. + CSharpImplicitExpressionBody - [259..265)::6
  30785. + CSharpCodeBlock - [259..265)::6
  30786. + CSharpExpressionLiteral - [259..265)::6 - [p.Name] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  30787. + Identifier;[p];
  30788. + Dot;[.];
  30789. + Identifier;[Name];
  30790. + MarkupTagBlock - [265..269)::4 - [</a>]
  30791. + MarkupTextLiteral - [265..269)::4 - [</a>] - Gen<Markup> - SpanEditHandler;Accepts:None
  30792. + OpenAngle;[<];
  30793. + ForwardSlash;[/];
  30794. + Text;[a];
  30795. + CloseAngle;[>];
  30796. + MarkupTagBlock - [269..274)::5 - [</li>]
  30797. + MarkupTextLiteral - [269..274)::5 - [</li>] - Gen<Markup> - SpanEditHandler;Accepts:None
  30798. + OpenAngle;[<];
  30799. + ForwardSlash;[/];
  30800. + Text;[li];
  30801. + CloseAngle;[>];
  30802. + MarkupTextLiteral - [274..276)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  30803. + NewLine;[LF];
  30804. + CSharpStatementLiteral - [276..299)::23 - [ }LF] - Gen<Stmt> - SpanEditHandler;Accepts:None
  30805. + Whitespace;[ ];
  30806. + RightBrace;[}];
  30807. + NewLine;[LF];
  30808. + MarkupTextLiteral - [299..315)::16 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  30809. + Whitespace;[ ];
  30810. + MarkupTagBlock - [315..320)::5 - [</ul>]
  30811. + MarkupTextLiteral - [315..320)::5 - [</ul>] - Gen<Markup> - SpanEditHandler;Accepts:None
  30812. + OpenAngle;[<];
  30813. + ForwardSlash;[/];
  30814. + Text;[ul];
  30815. + CloseAngle;[>];
  30816. + MarkupTextLiteral - [320..334)::14 - [LF ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  30817. + NewLine;[LF];
  30818. + Whitespace;[ ];
  30819. + MarkupTagBlock - [334..340)::6 - [</div>]
  30820. + MarkupTextLiteral - [334..340)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:None
  30821. + OpenAngle;[<];
  30822. + ForwardSlash;[/];
  30823. + Text;[div];
  30824. + CloseAngle;[>];
  30825. + MarkupTextLiteral - [340..342)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  30826. + NewLine;[LF];
  30827. + CSharpStatementLiteral - [342..351)::9 - [ }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  30828. + Whitespace;[ ];
  30829. + RightBrace;[}];
  30830. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesElseIfBranchesOfIfStatement.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesElseIfBranchesOfIfStatement.stree.txt
  30831. index c86d52c6143..874dd8d6403 100644
  30832. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesElseIfBranchesOfIfStatement.stree.txt
  30833. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesElseIfBranchesOfIfStatement.stree.txt
  30834. @@ -1,95 +1,97 @@
  30835. -Statement block - Gen<None> - 180 - (0:0,0)
  30836. - Code span - Gen<Stmt> - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"foo } bar");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF}] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:93
  30837. - SyntaxKind.Keyword;[if];
  30838. - SyntaxKind.LeftParenthesis;[(];
  30839. - SyntaxKind.Keyword;[int];
  30840. - SyntaxKind.Whitespace;[ ];
  30841. - SyntaxKind.Identifier;[i];
  30842. - SyntaxKind.Whitespace;[ ];
  30843. - SyntaxKind.Assign;[=];
  30844. - SyntaxKind.Whitespace;[ ];
  30845. - SyntaxKind.IntegerLiteral;[0];
  30846. - SyntaxKind.Semicolon;[;];
  30847. - SyntaxKind.Whitespace;[ ];
  30848. - SyntaxKind.Identifier;[i];
  30849. - SyntaxKind.Whitespace;[ ];
  30850. - SyntaxKind.LessThan;[<];
  30851. - SyntaxKind.Whitespace;[ ];
  30852. - SyntaxKind.IntegerLiteral;[10];
  30853. - SyntaxKind.Semicolon;[;];
  30854. - SyntaxKind.Whitespace;[ ];
  30855. - SyntaxKind.Keyword;[new];
  30856. - SyntaxKind.Whitespace;[ ];
  30857. - SyntaxKind.Identifier;[Foo];
  30858. - SyntaxKind.Whitespace;[ ];
  30859. - SyntaxKind.LeftBrace;[{];
  30860. - SyntaxKind.Whitespace;[ ];
  30861. - SyntaxKind.Identifier;[Bar];
  30862. - SyntaxKind.Whitespace;[ ];
  30863. - SyntaxKind.Assign;[=];
  30864. - SyntaxKind.Whitespace;[ ];
  30865. - SyntaxKind.StringLiteral;["baz"];
  30866. - SyntaxKind.Whitespace;[ ];
  30867. - SyntaxKind.RightBrace;[}];
  30868. - SyntaxKind.RightParenthesis;[)];
  30869. - SyntaxKind.Whitespace;[ ];
  30870. - SyntaxKind.LeftBrace;[{];
  30871. - SyntaxKind.NewLine;[LF];
  30872. - SyntaxKind.Whitespace;[ ];
  30873. - SyntaxKind.Identifier;[Debug];
  30874. - SyntaxKind.Dot;[.];
  30875. - SyntaxKind.Identifier;[WriteLine];
  30876. - SyntaxKind.LeftParenthesis;[(];
  30877. - SyntaxKind.StringLiteral;[@"foo } bar"];
  30878. - SyntaxKind.RightParenthesis;[)];
  30879. - SyntaxKind.Semicolon;[;];
  30880. - SyntaxKind.NewLine;[LF];
  30881. - SyntaxKind.RightBrace;[}];
  30882. - SyntaxKind.Whitespace;[ ];
  30883. - SyntaxKind.Keyword;[else];
  30884. - SyntaxKind.Whitespace;[ ];
  30885. - SyntaxKind.Keyword;[if];
  30886. - SyntaxKind.LeftParenthesis;[(];
  30887. - SyntaxKind.Keyword;[int];
  30888. - SyntaxKind.Whitespace;[ ];
  30889. - SyntaxKind.Identifier;[i];
  30890. - SyntaxKind.Whitespace;[ ];
  30891. - SyntaxKind.Assign;[=];
  30892. - SyntaxKind.Whitespace;[ ];
  30893. - SyntaxKind.IntegerLiteral;[0];
  30894. - SyntaxKind.Semicolon;[;];
  30895. - SyntaxKind.Whitespace;[ ];
  30896. - SyntaxKind.Identifier;[i];
  30897. - SyntaxKind.Whitespace;[ ];
  30898. - SyntaxKind.LessThan;[<];
  30899. - SyntaxKind.Whitespace;[ ];
  30900. - SyntaxKind.IntegerLiteral;[10];
  30901. - SyntaxKind.Semicolon;[;];
  30902. - SyntaxKind.Whitespace;[ ];
  30903. - SyntaxKind.Keyword;[new];
  30904. - SyntaxKind.Whitespace;[ ];
  30905. - SyntaxKind.Identifier;[Foo];
  30906. - SyntaxKind.Whitespace;[ ];
  30907. - SyntaxKind.LeftBrace;[{];
  30908. - SyntaxKind.Whitespace;[ ];
  30909. - SyntaxKind.Identifier;[Bar];
  30910. - SyntaxKind.Whitespace;[ ];
  30911. - SyntaxKind.Assign;[=];
  30912. - SyntaxKind.Whitespace;[ ];
  30913. - SyntaxKind.StringLiteral;["baz"];
  30914. - SyntaxKind.Whitespace;[ ];
  30915. - SyntaxKind.RightBrace;[}];
  30916. - SyntaxKind.RightParenthesis;[)];
  30917. - SyntaxKind.Whitespace;[ ];
  30918. - SyntaxKind.LeftBrace;[{];
  30919. - SyntaxKind.NewLine;[LF];
  30920. - SyntaxKind.Whitespace;[ ];
  30921. - SyntaxKind.Identifier;[Debug];
  30922. - SyntaxKind.Dot;[.];
  30923. - SyntaxKind.Identifier;[WriteLine];
  30924. - SyntaxKind.LeftParenthesis;[(];
  30925. - SyntaxKind.StringLiteral;[@"bar } baz"];
  30926. - SyntaxKind.RightParenthesis;[)];
  30927. - SyntaxKind.Semicolon;[;];
  30928. - SyntaxKind.NewLine;[LF];
  30929. - SyntaxKind.RightBrace;[}];
  30930. +CSharpCodeBlock - [0..180)::180 - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"foo } bar");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF}]
  30931. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  30932. + Transition;[<Missing>];
  30933. + CSharpStatementLiteral - [0..180)::180 - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"foo } bar");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF}] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  30934. + Keyword;[if];
  30935. + LeftParenthesis;[(];
  30936. + Keyword;[int];
  30937. + Whitespace;[ ];
  30938. + Identifier;[i];
  30939. + Whitespace;[ ];
  30940. + Assign;[=];
  30941. + Whitespace;[ ];
  30942. + IntegerLiteral;[0];
  30943. + Semicolon;[;];
  30944. + Whitespace;[ ];
  30945. + Identifier;[i];
  30946. + Whitespace;[ ];
  30947. + LessThan;[<];
  30948. + Whitespace;[ ];
  30949. + IntegerLiteral;[10];
  30950. + Semicolon;[;];
  30951. + Whitespace;[ ];
  30952. + Keyword;[new];
  30953. + Whitespace;[ ];
  30954. + Identifier;[Foo];
  30955. + Whitespace;[ ];
  30956. + LeftBrace;[{];
  30957. + Whitespace;[ ];
  30958. + Identifier;[Bar];
  30959. + Whitespace;[ ];
  30960. + Assign;[=];
  30961. + Whitespace;[ ];
  30962. + StringLiteral;["baz"];
  30963. + Whitespace;[ ];
  30964. + RightBrace;[}];
  30965. + RightParenthesis;[)];
  30966. + Whitespace;[ ];
  30967. + LeftBrace;[{];
  30968. + NewLine;[LF];
  30969. + Whitespace;[ ];
  30970. + Identifier;[Debug];
  30971. + Dot;[.];
  30972. + Identifier;[WriteLine];
  30973. + LeftParenthesis;[(];
  30974. + StringLiteral;[@"foo } bar"];
  30975. + RightParenthesis;[)];
  30976. + Semicolon;[;];
  30977. + NewLine;[LF];
  30978. + RightBrace;[}];
  30979. + Whitespace;[ ];
  30980. + Keyword;[else];
  30981. + Whitespace;[ ];
  30982. + Keyword;[if];
  30983. + LeftParenthesis;[(];
  30984. + Keyword;[int];
  30985. + Whitespace;[ ];
  30986. + Identifier;[i];
  30987. + Whitespace;[ ];
  30988. + Assign;[=];
  30989. + Whitespace;[ ];
  30990. + IntegerLiteral;[0];
  30991. + Semicolon;[;];
  30992. + Whitespace;[ ];
  30993. + Identifier;[i];
  30994. + Whitespace;[ ];
  30995. + LessThan;[<];
  30996. + Whitespace;[ ];
  30997. + IntegerLiteral;[10];
  30998. + Semicolon;[;];
  30999. + Whitespace;[ ];
  31000. + Keyword;[new];
  31001. + Whitespace;[ ];
  31002. + Identifier;[Foo];
  31003. + Whitespace;[ ];
  31004. + LeftBrace;[{];
  31005. + Whitespace;[ ];
  31006. + Identifier;[Bar];
  31007. + Whitespace;[ ];
  31008. + Assign;[=];
  31009. + Whitespace;[ ];
  31010. + StringLiteral;["baz"];
  31011. + Whitespace;[ ];
  31012. + RightBrace;[}];
  31013. + RightParenthesis;[)];
  31014. + Whitespace;[ ];
  31015. + LeftBrace;[{];
  31016. + NewLine;[LF];
  31017. + Whitespace;[ ];
  31018. + Identifier;[Debug];
  31019. + Dot;[.];
  31020. + Identifier;[WriteLine];
  31021. + LeftParenthesis;[(];
  31022. + StringLiteral;[@"bar } baz"];
  31023. + RightParenthesis;[)];
  31024. + Semicolon;[;];
  31025. + NewLine;[LF];
  31026. + RightBrace;[}];
  31027. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesExpressionOnSwitchCharacterFollowedByIdentifierStart.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesExpressionOnSwitchCharacterFollowedByIdentifierStart.stree.txt
  31028. index 7e1f4a48555..ec306314ddd 100644
  31029. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesExpressionOnSwitchCharacterFollowedByIdentifierStart.stree.txt
  31030. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesExpressionOnSwitchCharacterFollowedByIdentifierStart.stree.txt
  31031. @@ -1,24 +1,29 @@
  31032. -Statement block - Gen<None> - 25 - (0:0,0)
  31033. - Code span - Gen<Stmt> - [if(foo) { ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:7
  31034. - SyntaxKind.Keyword;[if];
  31035. - SyntaxKind.LeftParenthesis;[(];
  31036. - SyntaxKind.Identifier;[foo];
  31037. - SyntaxKind.RightParenthesis;[)];
  31038. - SyntaxKind.Whitespace;[ ];
  31039. - SyntaxKind.LeftBrace;[{];
  31040. - SyntaxKind.Whitespace;[ ];
  31041. - Expression block - Gen<Expr> - 13 - (10:0,10)
  31042. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  31043. - SyntaxKind.Transition;[@];
  31044. - Code span - Gen<Expr> - [foo[4].bar()] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K14 - (11:0,11) - Tokens:8
  31045. - SyntaxKind.Identifier;[foo];
  31046. - SyntaxKind.LeftBracket;[[];
  31047. - SyntaxKind.IntegerLiteral;[4];
  31048. - SyntaxKind.RightBracket;[]];
  31049. - SyntaxKind.Dot;[.];
  31050. - SyntaxKind.Identifier;[bar];
  31051. - SyntaxKind.LeftParenthesis;[(];
  31052. - SyntaxKind.RightParenthesis;[)];
  31053. - Code span - Gen<Stmt> - [ }] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:2
  31054. - SyntaxKind.Whitespace;[ ];
  31055. - SyntaxKind.RightBrace;[}];
  31056. +CSharpCodeBlock - [0..25)::25 - [if(foo) { @foo[4].bar() }]
  31057. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  31058. + Transition;[<Missing>];
  31059. + CSharpStatementLiteral - [0..10)::10 - [if(foo) { ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  31060. + Keyword;[if];
  31061. + LeftParenthesis;[(];
  31062. + Identifier;[foo];
  31063. + RightParenthesis;[)];
  31064. + Whitespace;[ ];
  31065. + LeftBrace;[{];
  31066. + Whitespace;[ ];
  31067. + CSharpCodeBlock - [10..23)::13
  31068. + CSharpImplicitExpression - [10..23)::13
  31069. + CSharpTransition - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  31070. + Transition;[@];
  31071. + CSharpImplicitExpressionBody - [11..23)::12
  31072. + CSharpCodeBlock - [11..23)::12
  31073. + CSharpExpressionLiteral - [11..23)::12 - [foo[4].bar()] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K14
  31074. + Identifier;[foo];
  31075. + LeftBracket;[[];
  31076. + IntegerLiteral;[4];
  31077. + RightBracket;[]];
  31078. + Dot;[.];
  31079. + Identifier;[bar];
  31080. + LeftParenthesis;[(];
  31081. + RightParenthesis;[)];
  31082. + CSharpStatementLiteral - [23..25)::2 - [ }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  31083. + Whitespace;[ ];
  31084. + RightBrace;[}];
  31085. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesExpressionOnSwitchCharacterFollowedByOpenParen.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesExpressionOnSwitchCharacterFollowedByOpenParen.stree.txt
  31086. index 1bfc6b33f32..7a4de524bf9 100644
  31087. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesExpressionOnSwitchCharacterFollowedByOpenParen.stree.txt
  31088. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesExpressionOnSwitchCharacterFollowedByOpenParen.stree.txt
  31089. @@ -1,25 +1,30 @@
  31090. -Statement block - Gen<None> - 24 - (0:0,0)
  31091. - Code span - Gen<Stmt> - [if(foo) { ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:7
  31092. - SyntaxKind.Keyword;[if];
  31093. - SyntaxKind.LeftParenthesis;[(];
  31094. - SyntaxKind.Identifier;[foo];
  31095. - SyntaxKind.RightParenthesis;[)];
  31096. - SyntaxKind.Whitespace;[ ];
  31097. - SyntaxKind.LeftBrace;[{];
  31098. - SyntaxKind.Whitespace;[ ];
  31099. - Expression block - Gen<Expr> - 12 - (10:0,10)
  31100. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  31101. - SyntaxKind.Transition;[@];
  31102. - MetaCode span - Gen<None> - [(] - SpanEditHandler;Accepts:None - (11:0,11) - Tokens:1
  31103. - SyntaxKind.LeftParenthesis;[(];
  31104. - Code span - Gen<Expr> - [foo + bar] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:5
  31105. - SyntaxKind.Identifier;[foo];
  31106. - SyntaxKind.Whitespace;[ ];
  31107. - SyntaxKind.Plus;[+];
  31108. - SyntaxKind.Whitespace;[ ];
  31109. - SyntaxKind.Identifier;[bar];
  31110. - MetaCode span - Gen<None> - [)] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:1
  31111. - SyntaxKind.RightParenthesis;[)];
  31112. - Code span - Gen<Stmt> - [ }] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:2
  31113. - SyntaxKind.Whitespace;[ ];
  31114. - SyntaxKind.RightBrace;[}];
  31115. +CSharpCodeBlock - [0..24)::24 - [if(foo) { @(foo + bar) }]
  31116. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  31117. + Transition;[<Missing>];
  31118. + CSharpStatementLiteral - [0..10)::10 - [if(foo) { ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  31119. + Keyword;[if];
  31120. + LeftParenthesis;[(];
  31121. + Identifier;[foo];
  31122. + RightParenthesis;[)];
  31123. + Whitespace;[ ];
  31124. + LeftBrace;[{];
  31125. + Whitespace;[ ];
  31126. + CSharpCodeBlock - [10..22)::12
  31127. + CSharpExplicitExpression - [10..22)::12
  31128. + CSharpTransition - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  31129. + Transition;[@];
  31130. + CSharpExplicitExpressionBody - [11..22)::11
  31131. + RazorMetaCode - [11..12)::1 - Gen<None> - SpanEditHandler;Accepts:None
  31132. + LeftParenthesis;[(];
  31133. + CSharpCodeBlock - [12..21)::9
  31134. + CSharpExpressionLiteral - [12..21)::9 - [foo + bar] - Gen<Expr> - SpanEditHandler;Accepts:Any
  31135. + Identifier;[foo];
  31136. + Whitespace;[ ];
  31137. + Plus;[+];
  31138. + Whitespace;[ ];
  31139. + Identifier;[bar];
  31140. + RazorMetaCode - [21..22)::1 - Gen<None> - SpanEditHandler;Accepts:None
  31141. + RightParenthesis;[)];
  31142. + CSharpStatementLiteral - [22..24)::2 - [ }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  31143. + Whitespace;[ ];
  31144. + RightBrace;[}];
  31145. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesMultipleElseIfBranchesOfIfStatement.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesMultipleElseIfBranchesOfIfStatement.stree.txt
  31146. index cb4f3cd094d..752dcb2972f 100644
  31147. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesMultipleElseIfBranchesOfIfStatement.stree.txt
  31148. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesMultipleElseIfBranchesOfIfStatement.stree.txt
  31149. @@ -1,239 +1,241 @@
  31150. -Statement block - Gen<None> - 459 - (0:0,0)
  31151. - Code span - Gen<Stmt> - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"foo } bar");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF}] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:237
  31152. - SyntaxKind.Keyword;[if];
  31153. - SyntaxKind.LeftParenthesis;[(];
  31154. - SyntaxKind.Keyword;[int];
  31155. - SyntaxKind.Whitespace;[ ];
  31156. - SyntaxKind.Identifier;[i];
  31157. - SyntaxKind.Whitespace;[ ];
  31158. - SyntaxKind.Assign;[=];
  31159. - SyntaxKind.Whitespace;[ ];
  31160. - SyntaxKind.IntegerLiteral;[0];
  31161. - SyntaxKind.Semicolon;[;];
  31162. - SyntaxKind.Whitespace;[ ];
  31163. - SyntaxKind.Identifier;[i];
  31164. - SyntaxKind.Whitespace;[ ];
  31165. - SyntaxKind.LessThan;[<];
  31166. - SyntaxKind.Whitespace;[ ];
  31167. - SyntaxKind.IntegerLiteral;[10];
  31168. - SyntaxKind.Semicolon;[;];
  31169. - SyntaxKind.Whitespace;[ ];
  31170. - SyntaxKind.Keyword;[new];
  31171. - SyntaxKind.Whitespace;[ ];
  31172. - SyntaxKind.Identifier;[Foo];
  31173. - SyntaxKind.Whitespace;[ ];
  31174. - SyntaxKind.LeftBrace;[{];
  31175. - SyntaxKind.Whitespace;[ ];
  31176. - SyntaxKind.Identifier;[Bar];
  31177. - SyntaxKind.Whitespace;[ ];
  31178. - SyntaxKind.Assign;[=];
  31179. - SyntaxKind.Whitespace;[ ];
  31180. - SyntaxKind.StringLiteral;["baz"];
  31181. - SyntaxKind.Whitespace;[ ];
  31182. - SyntaxKind.RightBrace;[}];
  31183. - SyntaxKind.RightParenthesis;[)];
  31184. - SyntaxKind.Whitespace;[ ];
  31185. - SyntaxKind.LeftBrace;[{];
  31186. - SyntaxKind.NewLine;[LF];
  31187. - SyntaxKind.Whitespace;[ ];
  31188. - SyntaxKind.Identifier;[Debug];
  31189. - SyntaxKind.Dot;[.];
  31190. - SyntaxKind.Identifier;[WriteLine];
  31191. - SyntaxKind.LeftParenthesis;[(];
  31192. - SyntaxKind.StringLiteral;[@"foo } bar"];
  31193. - SyntaxKind.RightParenthesis;[)];
  31194. - SyntaxKind.Semicolon;[;];
  31195. - SyntaxKind.NewLine;[LF];
  31196. - SyntaxKind.RightBrace;[}];
  31197. - SyntaxKind.Whitespace;[ ];
  31198. - SyntaxKind.Keyword;[else];
  31199. - SyntaxKind.Whitespace;[ ];
  31200. - SyntaxKind.Keyword;[if];
  31201. - SyntaxKind.LeftParenthesis;[(];
  31202. - SyntaxKind.Keyword;[int];
  31203. - SyntaxKind.Whitespace;[ ];
  31204. - SyntaxKind.Identifier;[i];
  31205. - SyntaxKind.Whitespace;[ ];
  31206. - SyntaxKind.Assign;[=];
  31207. - SyntaxKind.Whitespace;[ ];
  31208. - SyntaxKind.IntegerLiteral;[0];
  31209. - SyntaxKind.Semicolon;[;];
  31210. - SyntaxKind.Whitespace;[ ];
  31211. - SyntaxKind.Identifier;[i];
  31212. - SyntaxKind.Whitespace;[ ];
  31213. - SyntaxKind.LessThan;[<];
  31214. - SyntaxKind.Whitespace;[ ];
  31215. - SyntaxKind.IntegerLiteral;[10];
  31216. - SyntaxKind.Semicolon;[;];
  31217. - SyntaxKind.Whitespace;[ ];
  31218. - SyntaxKind.Keyword;[new];
  31219. - SyntaxKind.Whitespace;[ ];
  31220. - SyntaxKind.Identifier;[Foo];
  31221. - SyntaxKind.Whitespace;[ ];
  31222. - SyntaxKind.LeftBrace;[{];
  31223. - SyntaxKind.Whitespace;[ ];
  31224. - SyntaxKind.Identifier;[Bar];
  31225. - SyntaxKind.Whitespace;[ ];
  31226. - SyntaxKind.Assign;[=];
  31227. - SyntaxKind.Whitespace;[ ];
  31228. - SyntaxKind.StringLiteral;["baz"];
  31229. - SyntaxKind.Whitespace;[ ];
  31230. - SyntaxKind.RightBrace;[}];
  31231. - SyntaxKind.RightParenthesis;[)];
  31232. - SyntaxKind.Whitespace;[ ];
  31233. - SyntaxKind.LeftBrace;[{];
  31234. - SyntaxKind.NewLine;[LF];
  31235. - SyntaxKind.Whitespace;[ ];
  31236. - SyntaxKind.Identifier;[Debug];
  31237. - SyntaxKind.Dot;[.];
  31238. - SyntaxKind.Identifier;[WriteLine];
  31239. - SyntaxKind.LeftParenthesis;[(];
  31240. - SyntaxKind.StringLiteral;[@"bar } baz"];
  31241. - SyntaxKind.RightParenthesis;[)];
  31242. - SyntaxKind.Semicolon;[;];
  31243. - SyntaxKind.NewLine;[LF];
  31244. - SyntaxKind.RightBrace;[}];
  31245. - SyntaxKind.Whitespace;[ ];
  31246. - SyntaxKind.Keyword;[else];
  31247. - SyntaxKind.Whitespace;[ ];
  31248. - SyntaxKind.Keyword;[if];
  31249. - SyntaxKind.LeftParenthesis;[(];
  31250. - SyntaxKind.Keyword;[int];
  31251. - SyntaxKind.Whitespace;[ ];
  31252. - SyntaxKind.Identifier;[i];
  31253. - SyntaxKind.Whitespace;[ ];
  31254. - SyntaxKind.Assign;[=];
  31255. - SyntaxKind.Whitespace;[ ];
  31256. - SyntaxKind.IntegerLiteral;[0];
  31257. - SyntaxKind.Semicolon;[;];
  31258. - SyntaxKind.Whitespace;[ ];
  31259. - SyntaxKind.Identifier;[i];
  31260. - SyntaxKind.Whitespace;[ ];
  31261. - SyntaxKind.LessThan;[<];
  31262. - SyntaxKind.Whitespace;[ ];
  31263. - SyntaxKind.IntegerLiteral;[10];
  31264. - SyntaxKind.Semicolon;[;];
  31265. - SyntaxKind.Whitespace;[ ];
  31266. - SyntaxKind.Keyword;[new];
  31267. - SyntaxKind.Whitespace;[ ];
  31268. - SyntaxKind.Identifier;[Foo];
  31269. - SyntaxKind.Whitespace;[ ];
  31270. - SyntaxKind.LeftBrace;[{];
  31271. - SyntaxKind.Whitespace;[ ];
  31272. - SyntaxKind.Identifier;[Bar];
  31273. - SyntaxKind.Whitespace;[ ];
  31274. - SyntaxKind.Assign;[=];
  31275. - SyntaxKind.Whitespace;[ ];
  31276. - SyntaxKind.StringLiteral;["baz"];
  31277. - SyntaxKind.Whitespace;[ ];
  31278. - SyntaxKind.RightBrace;[}];
  31279. - SyntaxKind.RightParenthesis;[)];
  31280. - SyntaxKind.Whitespace;[ ];
  31281. - SyntaxKind.LeftBrace;[{];
  31282. - SyntaxKind.NewLine;[LF];
  31283. - SyntaxKind.Whitespace;[ ];
  31284. - SyntaxKind.Identifier;[Debug];
  31285. - SyntaxKind.Dot;[.];
  31286. - SyntaxKind.Identifier;[WriteLine];
  31287. - SyntaxKind.LeftParenthesis;[(];
  31288. - SyntaxKind.StringLiteral;[@"bar } baz"];
  31289. - SyntaxKind.RightParenthesis;[)];
  31290. - SyntaxKind.Semicolon;[;];
  31291. - SyntaxKind.NewLine;[LF];
  31292. - SyntaxKind.RightBrace;[}];
  31293. - SyntaxKind.Whitespace;[ ];
  31294. - SyntaxKind.Keyword;[else];
  31295. - SyntaxKind.Whitespace;[ ];
  31296. - SyntaxKind.Keyword;[if];
  31297. - SyntaxKind.LeftParenthesis;[(];
  31298. - SyntaxKind.Keyword;[int];
  31299. - SyntaxKind.Whitespace;[ ];
  31300. - SyntaxKind.Identifier;[i];
  31301. - SyntaxKind.Whitespace;[ ];
  31302. - SyntaxKind.Assign;[=];
  31303. - SyntaxKind.Whitespace;[ ];
  31304. - SyntaxKind.IntegerLiteral;[0];
  31305. - SyntaxKind.Semicolon;[;];
  31306. - SyntaxKind.Whitespace;[ ];
  31307. - SyntaxKind.Identifier;[i];
  31308. - SyntaxKind.Whitespace;[ ];
  31309. - SyntaxKind.LessThan;[<];
  31310. - SyntaxKind.Whitespace;[ ];
  31311. - SyntaxKind.IntegerLiteral;[10];
  31312. - SyntaxKind.Semicolon;[;];
  31313. - SyntaxKind.Whitespace;[ ];
  31314. - SyntaxKind.Keyword;[new];
  31315. - SyntaxKind.Whitespace;[ ];
  31316. - SyntaxKind.Identifier;[Foo];
  31317. - SyntaxKind.Whitespace;[ ];
  31318. - SyntaxKind.LeftBrace;[{];
  31319. - SyntaxKind.Whitespace;[ ];
  31320. - SyntaxKind.Identifier;[Bar];
  31321. - SyntaxKind.Whitespace;[ ];
  31322. - SyntaxKind.Assign;[=];
  31323. - SyntaxKind.Whitespace;[ ];
  31324. - SyntaxKind.StringLiteral;["baz"];
  31325. - SyntaxKind.Whitespace;[ ];
  31326. - SyntaxKind.RightBrace;[}];
  31327. - SyntaxKind.RightParenthesis;[)];
  31328. - SyntaxKind.Whitespace;[ ];
  31329. - SyntaxKind.LeftBrace;[{];
  31330. - SyntaxKind.NewLine;[LF];
  31331. - SyntaxKind.Whitespace;[ ];
  31332. - SyntaxKind.Identifier;[Debug];
  31333. - SyntaxKind.Dot;[.];
  31334. - SyntaxKind.Identifier;[WriteLine];
  31335. - SyntaxKind.LeftParenthesis;[(];
  31336. - SyntaxKind.StringLiteral;[@"bar } baz"];
  31337. - SyntaxKind.RightParenthesis;[)];
  31338. - SyntaxKind.Semicolon;[;];
  31339. - SyntaxKind.NewLine;[LF];
  31340. - SyntaxKind.RightBrace;[}];
  31341. - SyntaxKind.Whitespace;[ ];
  31342. - SyntaxKind.Keyword;[else];
  31343. - SyntaxKind.Whitespace;[ ];
  31344. - SyntaxKind.Keyword;[if];
  31345. - SyntaxKind.LeftParenthesis;[(];
  31346. - SyntaxKind.Keyword;[int];
  31347. - SyntaxKind.Whitespace;[ ];
  31348. - SyntaxKind.Identifier;[i];
  31349. - SyntaxKind.Whitespace;[ ];
  31350. - SyntaxKind.Assign;[=];
  31351. - SyntaxKind.Whitespace;[ ];
  31352. - SyntaxKind.IntegerLiteral;[0];
  31353. - SyntaxKind.Semicolon;[;];
  31354. - SyntaxKind.Whitespace;[ ];
  31355. - SyntaxKind.Identifier;[i];
  31356. - SyntaxKind.Whitespace;[ ];
  31357. - SyntaxKind.LessThan;[<];
  31358. - SyntaxKind.Whitespace;[ ];
  31359. - SyntaxKind.IntegerLiteral;[10];
  31360. - SyntaxKind.Semicolon;[;];
  31361. - SyntaxKind.Whitespace;[ ];
  31362. - SyntaxKind.Keyword;[new];
  31363. - SyntaxKind.Whitespace;[ ];
  31364. - SyntaxKind.Identifier;[Foo];
  31365. - SyntaxKind.Whitespace;[ ];
  31366. - SyntaxKind.LeftBrace;[{];
  31367. - SyntaxKind.Whitespace;[ ];
  31368. - SyntaxKind.Identifier;[Bar];
  31369. - SyntaxKind.Whitespace;[ ];
  31370. - SyntaxKind.Assign;[=];
  31371. - SyntaxKind.Whitespace;[ ];
  31372. - SyntaxKind.StringLiteral;["baz"];
  31373. - SyntaxKind.Whitespace;[ ];
  31374. - SyntaxKind.RightBrace;[}];
  31375. - SyntaxKind.RightParenthesis;[)];
  31376. - SyntaxKind.Whitespace;[ ];
  31377. - SyntaxKind.LeftBrace;[{];
  31378. - SyntaxKind.NewLine;[LF];
  31379. - SyntaxKind.Whitespace;[ ];
  31380. - SyntaxKind.Identifier;[Debug];
  31381. - SyntaxKind.Dot;[.];
  31382. - SyntaxKind.Identifier;[WriteLine];
  31383. - SyntaxKind.LeftParenthesis;[(];
  31384. - SyntaxKind.StringLiteral;[@"bar } baz"];
  31385. - SyntaxKind.RightParenthesis;[)];
  31386. - SyntaxKind.Semicolon;[;];
  31387. - SyntaxKind.NewLine;[LF];
  31388. - SyntaxKind.RightBrace;[}];
  31389. +CSharpCodeBlock - [0..459)::459 - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"foo } bar");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF}]
  31390. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  31391. + Transition;[<Missing>];
  31392. + CSharpStatementLiteral - [0..459)::459 - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"foo } bar");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF}] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  31393. + Keyword;[if];
  31394. + LeftParenthesis;[(];
  31395. + Keyword;[int];
  31396. + Whitespace;[ ];
  31397. + Identifier;[i];
  31398. + Whitespace;[ ];
  31399. + Assign;[=];
  31400. + Whitespace;[ ];
  31401. + IntegerLiteral;[0];
  31402. + Semicolon;[;];
  31403. + Whitespace;[ ];
  31404. + Identifier;[i];
  31405. + Whitespace;[ ];
  31406. + LessThan;[<];
  31407. + Whitespace;[ ];
  31408. + IntegerLiteral;[10];
  31409. + Semicolon;[;];
  31410. + Whitespace;[ ];
  31411. + Keyword;[new];
  31412. + Whitespace;[ ];
  31413. + Identifier;[Foo];
  31414. + Whitespace;[ ];
  31415. + LeftBrace;[{];
  31416. + Whitespace;[ ];
  31417. + Identifier;[Bar];
  31418. + Whitespace;[ ];
  31419. + Assign;[=];
  31420. + Whitespace;[ ];
  31421. + StringLiteral;["baz"];
  31422. + Whitespace;[ ];
  31423. + RightBrace;[}];
  31424. + RightParenthesis;[)];
  31425. + Whitespace;[ ];
  31426. + LeftBrace;[{];
  31427. + NewLine;[LF];
  31428. + Whitespace;[ ];
  31429. + Identifier;[Debug];
  31430. + Dot;[.];
  31431. + Identifier;[WriteLine];
  31432. + LeftParenthesis;[(];
  31433. + StringLiteral;[@"foo } bar"];
  31434. + RightParenthesis;[)];
  31435. + Semicolon;[;];
  31436. + NewLine;[LF];
  31437. + RightBrace;[}];
  31438. + Whitespace;[ ];
  31439. + Keyword;[else];
  31440. + Whitespace;[ ];
  31441. + Keyword;[if];
  31442. + LeftParenthesis;[(];
  31443. + Keyword;[int];
  31444. + Whitespace;[ ];
  31445. + Identifier;[i];
  31446. + Whitespace;[ ];
  31447. + Assign;[=];
  31448. + Whitespace;[ ];
  31449. + IntegerLiteral;[0];
  31450. + Semicolon;[;];
  31451. + Whitespace;[ ];
  31452. + Identifier;[i];
  31453. + Whitespace;[ ];
  31454. + LessThan;[<];
  31455. + Whitespace;[ ];
  31456. + IntegerLiteral;[10];
  31457. + Semicolon;[;];
  31458. + Whitespace;[ ];
  31459. + Keyword;[new];
  31460. + Whitespace;[ ];
  31461. + Identifier;[Foo];
  31462. + Whitespace;[ ];
  31463. + LeftBrace;[{];
  31464. + Whitespace;[ ];
  31465. + Identifier;[Bar];
  31466. + Whitespace;[ ];
  31467. + Assign;[=];
  31468. + Whitespace;[ ];
  31469. + StringLiteral;["baz"];
  31470. + Whitespace;[ ];
  31471. + RightBrace;[}];
  31472. + RightParenthesis;[)];
  31473. + Whitespace;[ ];
  31474. + LeftBrace;[{];
  31475. + NewLine;[LF];
  31476. + Whitespace;[ ];
  31477. + Identifier;[Debug];
  31478. + Dot;[.];
  31479. + Identifier;[WriteLine];
  31480. + LeftParenthesis;[(];
  31481. + StringLiteral;[@"bar } baz"];
  31482. + RightParenthesis;[)];
  31483. + Semicolon;[;];
  31484. + NewLine;[LF];
  31485. + RightBrace;[}];
  31486. + Whitespace;[ ];
  31487. + Keyword;[else];
  31488. + Whitespace;[ ];
  31489. + Keyword;[if];
  31490. + LeftParenthesis;[(];
  31491. + Keyword;[int];
  31492. + Whitespace;[ ];
  31493. + Identifier;[i];
  31494. + Whitespace;[ ];
  31495. + Assign;[=];
  31496. + Whitespace;[ ];
  31497. + IntegerLiteral;[0];
  31498. + Semicolon;[;];
  31499. + Whitespace;[ ];
  31500. + Identifier;[i];
  31501. + Whitespace;[ ];
  31502. + LessThan;[<];
  31503. + Whitespace;[ ];
  31504. + IntegerLiteral;[10];
  31505. + Semicolon;[;];
  31506. + Whitespace;[ ];
  31507. + Keyword;[new];
  31508. + Whitespace;[ ];
  31509. + Identifier;[Foo];
  31510. + Whitespace;[ ];
  31511. + LeftBrace;[{];
  31512. + Whitespace;[ ];
  31513. + Identifier;[Bar];
  31514. + Whitespace;[ ];
  31515. + Assign;[=];
  31516. + Whitespace;[ ];
  31517. + StringLiteral;["baz"];
  31518. + Whitespace;[ ];
  31519. + RightBrace;[}];
  31520. + RightParenthesis;[)];
  31521. + Whitespace;[ ];
  31522. + LeftBrace;[{];
  31523. + NewLine;[LF];
  31524. + Whitespace;[ ];
  31525. + Identifier;[Debug];
  31526. + Dot;[.];
  31527. + Identifier;[WriteLine];
  31528. + LeftParenthesis;[(];
  31529. + StringLiteral;[@"bar } baz"];
  31530. + RightParenthesis;[)];
  31531. + Semicolon;[;];
  31532. + NewLine;[LF];
  31533. + RightBrace;[}];
  31534. + Whitespace;[ ];
  31535. + Keyword;[else];
  31536. + Whitespace;[ ];
  31537. + Keyword;[if];
  31538. + LeftParenthesis;[(];
  31539. + Keyword;[int];
  31540. + Whitespace;[ ];
  31541. + Identifier;[i];
  31542. + Whitespace;[ ];
  31543. + Assign;[=];
  31544. + Whitespace;[ ];
  31545. + IntegerLiteral;[0];
  31546. + Semicolon;[;];
  31547. + Whitespace;[ ];
  31548. + Identifier;[i];
  31549. + Whitespace;[ ];
  31550. + LessThan;[<];
  31551. + Whitespace;[ ];
  31552. + IntegerLiteral;[10];
  31553. + Semicolon;[;];
  31554. + Whitespace;[ ];
  31555. + Keyword;[new];
  31556. + Whitespace;[ ];
  31557. + Identifier;[Foo];
  31558. + Whitespace;[ ];
  31559. + LeftBrace;[{];
  31560. + Whitespace;[ ];
  31561. + Identifier;[Bar];
  31562. + Whitespace;[ ];
  31563. + Assign;[=];
  31564. + Whitespace;[ ];
  31565. + StringLiteral;["baz"];
  31566. + Whitespace;[ ];
  31567. + RightBrace;[}];
  31568. + RightParenthesis;[)];
  31569. + Whitespace;[ ];
  31570. + LeftBrace;[{];
  31571. + NewLine;[LF];
  31572. + Whitespace;[ ];
  31573. + Identifier;[Debug];
  31574. + Dot;[.];
  31575. + Identifier;[WriteLine];
  31576. + LeftParenthesis;[(];
  31577. + StringLiteral;[@"bar } baz"];
  31578. + RightParenthesis;[)];
  31579. + Semicolon;[;];
  31580. + NewLine;[LF];
  31581. + RightBrace;[}];
  31582. + Whitespace;[ ];
  31583. + Keyword;[else];
  31584. + Whitespace;[ ];
  31585. + Keyword;[if];
  31586. + LeftParenthesis;[(];
  31587. + Keyword;[int];
  31588. + Whitespace;[ ];
  31589. + Identifier;[i];
  31590. + Whitespace;[ ];
  31591. + Assign;[=];
  31592. + Whitespace;[ ];
  31593. + IntegerLiteral;[0];
  31594. + Semicolon;[;];
  31595. + Whitespace;[ ];
  31596. + Identifier;[i];
  31597. + Whitespace;[ ];
  31598. + LessThan;[<];
  31599. + Whitespace;[ ];
  31600. + IntegerLiteral;[10];
  31601. + Semicolon;[;];
  31602. + Whitespace;[ ];
  31603. + Keyword;[new];
  31604. + Whitespace;[ ];
  31605. + Identifier;[Foo];
  31606. + Whitespace;[ ];
  31607. + LeftBrace;[{];
  31608. + Whitespace;[ ];
  31609. + Identifier;[Bar];
  31610. + Whitespace;[ ];
  31611. + Assign;[=];
  31612. + Whitespace;[ ];
  31613. + StringLiteral;["baz"];
  31614. + Whitespace;[ ];
  31615. + RightBrace;[}];
  31616. + RightParenthesis;[)];
  31617. + Whitespace;[ ];
  31618. + LeftBrace;[{];
  31619. + NewLine;[LF];
  31620. + Whitespace;[ ];
  31621. + Identifier;[Debug];
  31622. + Dot;[.];
  31623. + Identifier;[WriteLine];
  31624. + LeftParenthesis;[(];
  31625. + StringLiteral;[@"bar } baz"];
  31626. + RightParenthesis;[)];
  31627. + Semicolon;[;];
  31628. + NewLine;[LF];
  31629. + RightBrace;[}];
  31630. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesMultipleElseIfBranchesOfIfStatementFollowedByOneElseBranch.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesMultipleElseIfBranchesOfIfStatementFollowedByOneElseBranch.stree.txt
  31631. index 62a654f7b78..7fb831fefca 100644
  31632. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesMultipleElseIfBranchesOfIfStatementFollowedByOneElseBranch.stree.txt
  31633. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesMultipleElseIfBranchesOfIfStatementFollowedByOneElseBranch.stree.txt
  31634. @@ -1,157 +1,159 @@
  31635. -Statement block - Gen<None> - 313 - (0:0,0)
  31636. - Code span - Gen<Stmt> - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"foo } bar");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF} else { Debug.WriteLine(@"bar } baz"); }] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:155
  31637. - SyntaxKind.Keyword;[if];
  31638. - SyntaxKind.LeftParenthesis;[(];
  31639. - SyntaxKind.Keyword;[int];
  31640. - SyntaxKind.Whitespace;[ ];
  31641. - SyntaxKind.Identifier;[i];
  31642. - SyntaxKind.Whitespace;[ ];
  31643. - SyntaxKind.Assign;[=];
  31644. - SyntaxKind.Whitespace;[ ];
  31645. - SyntaxKind.IntegerLiteral;[0];
  31646. - SyntaxKind.Semicolon;[;];
  31647. - SyntaxKind.Whitespace;[ ];
  31648. - SyntaxKind.Identifier;[i];
  31649. - SyntaxKind.Whitespace;[ ];
  31650. - SyntaxKind.LessThan;[<];
  31651. - SyntaxKind.Whitespace;[ ];
  31652. - SyntaxKind.IntegerLiteral;[10];
  31653. - SyntaxKind.Semicolon;[;];
  31654. - SyntaxKind.Whitespace;[ ];
  31655. - SyntaxKind.Keyword;[new];
  31656. - SyntaxKind.Whitespace;[ ];
  31657. - SyntaxKind.Identifier;[Foo];
  31658. - SyntaxKind.Whitespace;[ ];
  31659. - SyntaxKind.LeftBrace;[{];
  31660. - SyntaxKind.Whitespace;[ ];
  31661. - SyntaxKind.Identifier;[Bar];
  31662. - SyntaxKind.Whitespace;[ ];
  31663. - SyntaxKind.Assign;[=];
  31664. - SyntaxKind.Whitespace;[ ];
  31665. - SyntaxKind.StringLiteral;["baz"];
  31666. - SyntaxKind.Whitespace;[ ];
  31667. - SyntaxKind.RightBrace;[}];
  31668. - SyntaxKind.RightParenthesis;[)];
  31669. - SyntaxKind.Whitespace;[ ];
  31670. - SyntaxKind.LeftBrace;[{];
  31671. - SyntaxKind.NewLine;[LF];
  31672. - SyntaxKind.Whitespace;[ ];
  31673. - SyntaxKind.Identifier;[Debug];
  31674. - SyntaxKind.Dot;[.];
  31675. - SyntaxKind.Identifier;[WriteLine];
  31676. - SyntaxKind.LeftParenthesis;[(];
  31677. - SyntaxKind.StringLiteral;[@"foo } bar"];
  31678. - SyntaxKind.RightParenthesis;[)];
  31679. - SyntaxKind.Semicolon;[;];
  31680. - SyntaxKind.NewLine;[LF];
  31681. - SyntaxKind.RightBrace;[}];
  31682. - SyntaxKind.Whitespace;[ ];
  31683. - SyntaxKind.Keyword;[else];
  31684. - SyntaxKind.Whitespace;[ ];
  31685. - SyntaxKind.Keyword;[if];
  31686. - SyntaxKind.LeftParenthesis;[(];
  31687. - SyntaxKind.Keyword;[int];
  31688. - SyntaxKind.Whitespace;[ ];
  31689. - SyntaxKind.Identifier;[i];
  31690. - SyntaxKind.Whitespace;[ ];
  31691. - SyntaxKind.Assign;[=];
  31692. - SyntaxKind.Whitespace;[ ];
  31693. - SyntaxKind.IntegerLiteral;[0];
  31694. - SyntaxKind.Semicolon;[;];
  31695. - SyntaxKind.Whitespace;[ ];
  31696. - SyntaxKind.Identifier;[i];
  31697. - SyntaxKind.Whitespace;[ ];
  31698. - SyntaxKind.LessThan;[<];
  31699. - SyntaxKind.Whitespace;[ ];
  31700. - SyntaxKind.IntegerLiteral;[10];
  31701. - SyntaxKind.Semicolon;[;];
  31702. - SyntaxKind.Whitespace;[ ];
  31703. - SyntaxKind.Keyword;[new];
  31704. - SyntaxKind.Whitespace;[ ];
  31705. - SyntaxKind.Identifier;[Foo];
  31706. - SyntaxKind.Whitespace;[ ];
  31707. - SyntaxKind.LeftBrace;[{];
  31708. - SyntaxKind.Whitespace;[ ];
  31709. - SyntaxKind.Identifier;[Bar];
  31710. - SyntaxKind.Whitespace;[ ];
  31711. - SyntaxKind.Assign;[=];
  31712. - SyntaxKind.Whitespace;[ ];
  31713. - SyntaxKind.StringLiteral;["baz"];
  31714. - SyntaxKind.Whitespace;[ ];
  31715. - SyntaxKind.RightBrace;[}];
  31716. - SyntaxKind.RightParenthesis;[)];
  31717. - SyntaxKind.Whitespace;[ ];
  31718. - SyntaxKind.LeftBrace;[{];
  31719. - SyntaxKind.NewLine;[LF];
  31720. - SyntaxKind.Whitespace;[ ];
  31721. - SyntaxKind.Identifier;[Debug];
  31722. - SyntaxKind.Dot;[.];
  31723. - SyntaxKind.Identifier;[WriteLine];
  31724. - SyntaxKind.LeftParenthesis;[(];
  31725. - SyntaxKind.StringLiteral;[@"bar } baz"];
  31726. - SyntaxKind.RightParenthesis;[)];
  31727. - SyntaxKind.Semicolon;[;];
  31728. - SyntaxKind.NewLine;[LF];
  31729. - SyntaxKind.RightBrace;[}];
  31730. - SyntaxKind.Whitespace;[ ];
  31731. - SyntaxKind.Keyword;[else];
  31732. - SyntaxKind.Whitespace;[ ];
  31733. - SyntaxKind.Keyword;[if];
  31734. - SyntaxKind.LeftParenthesis;[(];
  31735. - SyntaxKind.Keyword;[int];
  31736. - SyntaxKind.Whitespace;[ ];
  31737. - SyntaxKind.Identifier;[i];
  31738. - SyntaxKind.Whitespace;[ ];
  31739. - SyntaxKind.Assign;[=];
  31740. - SyntaxKind.Whitespace;[ ];
  31741. - SyntaxKind.IntegerLiteral;[0];
  31742. - SyntaxKind.Semicolon;[;];
  31743. - SyntaxKind.Whitespace;[ ];
  31744. - SyntaxKind.Identifier;[i];
  31745. - SyntaxKind.Whitespace;[ ];
  31746. - SyntaxKind.LessThan;[<];
  31747. - SyntaxKind.Whitespace;[ ];
  31748. - SyntaxKind.IntegerLiteral;[10];
  31749. - SyntaxKind.Semicolon;[;];
  31750. - SyntaxKind.Whitespace;[ ];
  31751. - SyntaxKind.Keyword;[new];
  31752. - SyntaxKind.Whitespace;[ ];
  31753. - SyntaxKind.Identifier;[Foo];
  31754. - SyntaxKind.Whitespace;[ ];
  31755. - SyntaxKind.LeftBrace;[{];
  31756. - SyntaxKind.Whitespace;[ ];
  31757. - SyntaxKind.Identifier;[Bar];
  31758. - SyntaxKind.Whitespace;[ ];
  31759. - SyntaxKind.Assign;[=];
  31760. - SyntaxKind.Whitespace;[ ];
  31761. - SyntaxKind.StringLiteral;["baz"];
  31762. - SyntaxKind.Whitespace;[ ];
  31763. - SyntaxKind.RightBrace;[}];
  31764. - SyntaxKind.RightParenthesis;[)];
  31765. - SyntaxKind.Whitespace;[ ];
  31766. - SyntaxKind.LeftBrace;[{];
  31767. - SyntaxKind.NewLine;[LF];
  31768. - SyntaxKind.Whitespace;[ ];
  31769. - SyntaxKind.Identifier;[Debug];
  31770. - SyntaxKind.Dot;[.];
  31771. - SyntaxKind.Identifier;[WriteLine];
  31772. - SyntaxKind.LeftParenthesis;[(];
  31773. - SyntaxKind.StringLiteral;[@"bar } baz"];
  31774. - SyntaxKind.RightParenthesis;[)];
  31775. - SyntaxKind.Semicolon;[;];
  31776. - SyntaxKind.NewLine;[LF];
  31777. - SyntaxKind.RightBrace;[}];
  31778. - SyntaxKind.Whitespace;[ ];
  31779. - SyntaxKind.Keyword;[else];
  31780. - SyntaxKind.Whitespace;[ ];
  31781. - SyntaxKind.LeftBrace;[{];
  31782. - SyntaxKind.Whitespace;[ ];
  31783. - SyntaxKind.Identifier;[Debug];
  31784. - SyntaxKind.Dot;[.];
  31785. - SyntaxKind.Identifier;[WriteLine];
  31786. - SyntaxKind.LeftParenthesis;[(];
  31787. - SyntaxKind.StringLiteral;[@"bar } baz"];
  31788. - SyntaxKind.RightParenthesis;[)];
  31789. - SyntaxKind.Semicolon;[;];
  31790. - SyntaxKind.Whitespace;[ ];
  31791. - SyntaxKind.RightBrace;[}];
  31792. +CSharpCodeBlock - [0..313)::313 - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"foo } bar");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF} else { Debug.WriteLine(@"bar } baz"); }]
  31793. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  31794. + Transition;[<Missing>];
  31795. + CSharpStatementLiteral - [0..313)::313 - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"foo } bar");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF} else { Debug.WriteLine(@"bar } baz"); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  31796. + Keyword;[if];
  31797. + LeftParenthesis;[(];
  31798. + Keyword;[int];
  31799. + Whitespace;[ ];
  31800. + Identifier;[i];
  31801. + Whitespace;[ ];
  31802. + Assign;[=];
  31803. + Whitespace;[ ];
  31804. + IntegerLiteral;[0];
  31805. + Semicolon;[;];
  31806. + Whitespace;[ ];
  31807. + Identifier;[i];
  31808. + Whitespace;[ ];
  31809. + LessThan;[<];
  31810. + Whitespace;[ ];
  31811. + IntegerLiteral;[10];
  31812. + Semicolon;[;];
  31813. + Whitespace;[ ];
  31814. + Keyword;[new];
  31815. + Whitespace;[ ];
  31816. + Identifier;[Foo];
  31817. + Whitespace;[ ];
  31818. + LeftBrace;[{];
  31819. + Whitespace;[ ];
  31820. + Identifier;[Bar];
  31821. + Whitespace;[ ];
  31822. + Assign;[=];
  31823. + Whitespace;[ ];
  31824. + StringLiteral;["baz"];
  31825. + Whitespace;[ ];
  31826. + RightBrace;[}];
  31827. + RightParenthesis;[)];
  31828. + Whitespace;[ ];
  31829. + LeftBrace;[{];
  31830. + NewLine;[LF];
  31831. + Whitespace;[ ];
  31832. + Identifier;[Debug];
  31833. + Dot;[.];
  31834. + Identifier;[WriteLine];
  31835. + LeftParenthesis;[(];
  31836. + StringLiteral;[@"foo } bar"];
  31837. + RightParenthesis;[)];
  31838. + Semicolon;[;];
  31839. + NewLine;[LF];
  31840. + RightBrace;[}];
  31841. + Whitespace;[ ];
  31842. + Keyword;[else];
  31843. + Whitespace;[ ];
  31844. + Keyword;[if];
  31845. + LeftParenthesis;[(];
  31846. + Keyword;[int];
  31847. + Whitespace;[ ];
  31848. + Identifier;[i];
  31849. + Whitespace;[ ];
  31850. + Assign;[=];
  31851. + Whitespace;[ ];
  31852. + IntegerLiteral;[0];
  31853. + Semicolon;[;];
  31854. + Whitespace;[ ];
  31855. + Identifier;[i];
  31856. + Whitespace;[ ];
  31857. + LessThan;[<];
  31858. + Whitespace;[ ];
  31859. + IntegerLiteral;[10];
  31860. + Semicolon;[;];
  31861. + Whitespace;[ ];
  31862. + Keyword;[new];
  31863. + Whitespace;[ ];
  31864. + Identifier;[Foo];
  31865. + Whitespace;[ ];
  31866. + LeftBrace;[{];
  31867. + Whitespace;[ ];
  31868. + Identifier;[Bar];
  31869. + Whitespace;[ ];
  31870. + Assign;[=];
  31871. + Whitespace;[ ];
  31872. + StringLiteral;["baz"];
  31873. + Whitespace;[ ];
  31874. + RightBrace;[}];
  31875. + RightParenthesis;[)];
  31876. + Whitespace;[ ];
  31877. + LeftBrace;[{];
  31878. + NewLine;[LF];
  31879. + Whitespace;[ ];
  31880. + Identifier;[Debug];
  31881. + Dot;[.];
  31882. + Identifier;[WriteLine];
  31883. + LeftParenthesis;[(];
  31884. + StringLiteral;[@"bar } baz"];
  31885. + RightParenthesis;[)];
  31886. + Semicolon;[;];
  31887. + NewLine;[LF];
  31888. + RightBrace;[}];
  31889. + Whitespace;[ ];
  31890. + Keyword;[else];
  31891. + Whitespace;[ ];
  31892. + Keyword;[if];
  31893. + LeftParenthesis;[(];
  31894. + Keyword;[int];
  31895. + Whitespace;[ ];
  31896. + Identifier;[i];
  31897. + Whitespace;[ ];
  31898. + Assign;[=];
  31899. + Whitespace;[ ];
  31900. + IntegerLiteral;[0];
  31901. + Semicolon;[;];
  31902. + Whitespace;[ ];
  31903. + Identifier;[i];
  31904. + Whitespace;[ ];
  31905. + LessThan;[<];
  31906. + Whitespace;[ ];
  31907. + IntegerLiteral;[10];
  31908. + Semicolon;[;];
  31909. + Whitespace;[ ];
  31910. + Keyword;[new];
  31911. + Whitespace;[ ];
  31912. + Identifier;[Foo];
  31913. + Whitespace;[ ];
  31914. + LeftBrace;[{];
  31915. + Whitespace;[ ];
  31916. + Identifier;[Bar];
  31917. + Whitespace;[ ];
  31918. + Assign;[=];
  31919. + Whitespace;[ ];
  31920. + StringLiteral;["baz"];
  31921. + Whitespace;[ ];
  31922. + RightBrace;[}];
  31923. + RightParenthesis;[)];
  31924. + Whitespace;[ ];
  31925. + LeftBrace;[{];
  31926. + NewLine;[LF];
  31927. + Whitespace;[ ];
  31928. + Identifier;[Debug];
  31929. + Dot;[.];
  31930. + Identifier;[WriteLine];
  31931. + LeftParenthesis;[(];
  31932. + StringLiteral;[@"bar } baz"];
  31933. + RightParenthesis;[)];
  31934. + Semicolon;[;];
  31935. + NewLine;[LF];
  31936. + RightBrace;[}];
  31937. + Whitespace;[ ];
  31938. + Keyword;[else];
  31939. + Whitespace;[ ];
  31940. + LeftBrace;[{];
  31941. + Whitespace;[ ];
  31942. + Identifier;[Debug];
  31943. + Dot;[.];
  31944. + Identifier;[WriteLine];
  31945. + LeftParenthesis;[(];
  31946. + StringLiteral;[@"bar } baz"];
  31947. + RightParenthesis;[)];
  31948. + Semicolon;[;];
  31949. + Whitespace;[ ];
  31950. + RightBrace;[}];
  31951. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesNamespaceAliasWithSemicolonForUsingKeywordIfIsInValidFormat.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesNamespaceAliasWithSemicolonForUsingKeywordIfIsInValidFormat.stree.txt
  31952. index c6cb9e90a8c..103ef0ce0b2 100644
  31953. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesNamespaceAliasWithSemicolonForUsingKeywordIfIsInValidFormat.stree.txt
  31954. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesNamespaceAliasWithSemicolonForUsingKeywordIfIsInValidFormat.stree.txt
  31955. @@ -1,10 +1,14 @@
  31956. -Directive block - Gen<None> - 28 - (0:0,0)
  31957. - Code span - Gen<Import: FooBarBaz = FooBarBaz;> - [using FooBarBaz = FooBarBaz;] - SpanEditHandler;Accepts:AnyExceptNewline - (0:0,0) - Tokens:8
  31958. - SyntaxKind.Keyword;[using];
  31959. - SyntaxKind.Whitespace;[ ];
  31960. - SyntaxKind.Identifier;[FooBarBaz];
  31961. - SyntaxKind.Whitespace;[ ];
  31962. - SyntaxKind.Assign;[=];
  31963. - SyntaxKind.Whitespace;[ ];
  31964. - SyntaxKind.Identifier;[FooBarBaz];
  31965. - SyntaxKind.Semicolon;[;];
  31966. +CSharpCodeBlock - [0..28)::28 - [using FooBarBaz = FooBarBaz;]
  31967. + RazorDirective - [0..28)::28
  31968. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  31969. + Transition;[<Missing>];
  31970. + RazorDirectiveBody - [0..28)::28
  31971. + CSharpStatementLiteral - [0..28)::28 - [using FooBarBaz = FooBarBaz;] - Gen<Import: FooBarBaz = FooBarBaz;> - SpanEditHandler;Accepts:AnyExceptNewline
  31972. + Keyword;[using];
  31973. + Whitespace;[ ];
  31974. + Identifier;[FooBarBaz];
  31975. + Whitespace;[ ];
  31976. + Assign;[=];
  31977. + Whitespace;[ ];
  31978. + Identifier;[FooBarBaz];
  31979. + Semicolon;[;];
  31980. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesNamespaceImportWithSemicolonForUsingKeywordIfIsInValidFormat.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesNamespaceImportWithSemicolonForUsingKeywordIfIsInValidFormat.stree.txt
  31981. index 5fa73eb8f24..1884354be00 100644
  31982. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesNamespaceImportWithSemicolonForUsingKeywordIfIsInValidFormat.stree.txt
  31983. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParsesNamespaceImportWithSemicolonForUsingKeywordIfIsInValidFormat.stree.txt
  31984. @@ -1,10 +1,14 @@
  31985. -Directive block - Gen<None> - 18 - (0:0,0)
  31986. - Code span - Gen<Import: Foo.Bar.Baz;> - [using Foo.Bar.Baz;] - SpanEditHandler;Accepts:AnyExceptNewline - (0:0,0) - Tokens:8
  31987. - SyntaxKind.Keyword;[using];
  31988. - SyntaxKind.Whitespace;[ ];
  31989. - SyntaxKind.Identifier;[Foo];
  31990. - SyntaxKind.Dot;[.];
  31991. - SyntaxKind.Identifier;[Bar];
  31992. - SyntaxKind.Dot;[.];
  31993. - SyntaxKind.Identifier;[Baz];
  31994. - SyntaxKind.Semicolon;[;];
  31995. +CSharpCodeBlock - [0..18)::18 - [using Foo.Bar.Baz;]
  31996. + RazorDirective - [0..18)::18
  31997. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  31998. + Transition;[<Missing>];
  31999. + RazorDirectiveBody - [0..18)::18
  32000. + CSharpStatementLiteral - [0..18)::18 - [using Foo.Bar.Baz;] - Gen<Import: Foo.Bar.Baz;> - SpanEditHandler;Accepts:AnyExceptNewline
  32001. + Keyword;[using];
  32002. + Whitespace;[ ];
  32003. + Identifier;[Foo];
  32004. + Dot;[.];
  32005. + Identifier;[Bar];
  32006. + Dot;[.];
  32007. + Identifier;[Baz];
  32008. + Semicolon;[;];
  32009. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SkipsExprThenBalancesBracesIfFirstIdentifierIsForKeyword.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SkipsExprThenBalancesBracesIfFirstIdentifierIsForKeyword.stree.txt
  32010. index 9bd2fe906da..5e4de13330c 100644
  32011. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SkipsExprThenBalancesBracesIfFirstIdentifierIsForKeyword.stree.txt
  32012. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SkipsExprThenBalancesBracesIfFirstIdentifierIsForKeyword.stree.txt
  32013. @@ -1,46 +1,48 @@
  32014. -Statement block - Gen<None> - 82 - (0:0,0)
  32015. - Code span - Gen<Stmt> - [for(int i = 0; i < 10; new Foo { Bar = "baz" }) { Debug.WriteLine(@"foo } bar"); }] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:44
  32016. - SyntaxKind.Keyword;[for];
  32017. - SyntaxKind.LeftParenthesis;[(];
  32018. - SyntaxKind.Keyword;[int];
  32019. - SyntaxKind.Whitespace;[ ];
  32020. - SyntaxKind.Identifier;[i];
  32021. - SyntaxKind.Whitespace;[ ];
  32022. - SyntaxKind.Assign;[=];
  32023. - SyntaxKind.Whitespace;[ ];
  32024. - SyntaxKind.IntegerLiteral;[0];
  32025. - SyntaxKind.Semicolon;[;];
  32026. - SyntaxKind.Whitespace;[ ];
  32027. - SyntaxKind.Identifier;[i];
  32028. - SyntaxKind.Whitespace;[ ];
  32029. - SyntaxKind.LessThan;[<];
  32030. - SyntaxKind.Whitespace;[ ];
  32031. - SyntaxKind.IntegerLiteral;[10];
  32032. - SyntaxKind.Semicolon;[;];
  32033. - SyntaxKind.Whitespace;[ ];
  32034. - SyntaxKind.Keyword;[new];
  32035. - SyntaxKind.Whitespace;[ ];
  32036. - SyntaxKind.Identifier;[Foo];
  32037. - SyntaxKind.Whitespace;[ ];
  32038. - SyntaxKind.LeftBrace;[{];
  32039. - SyntaxKind.Whitespace;[ ];
  32040. - SyntaxKind.Identifier;[Bar];
  32041. - SyntaxKind.Whitespace;[ ];
  32042. - SyntaxKind.Assign;[=];
  32043. - SyntaxKind.Whitespace;[ ];
  32044. - SyntaxKind.StringLiteral;["baz"];
  32045. - SyntaxKind.Whitespace;[ ];
  32046. - SyntaxKind.RightBrace;[}];
  32047. - SyntaxKind.RightParenthesis;[)];
  32048. - SyntaxKind.Whitespace;[ ];
  32049. - SyntaxKind.LeftBrace;[{];
  32050. - SyntaxKind.Whitespace;[ ];
  32051. - SyntaxKind.Identifier;[Debug];
  32052. - SyntaxKind.Dot;[.];
  32053. - SyntaxKind.Identifier;[WriteLine];
  32054. - SyntaxKind.LeftParenthesis;[(];
  32055. - SyntaxKind.StringLiteral;[@"foo } bar"];
  32056. - SyntaxKind.RightParenthesis;[)];
  32057. - SyntaxKind.Semicolon;[;];
  32058. - SyntaxKind.Whitespace;[ ];
  32059. - SyntaxKind.RightBrace;[}];
  32060. +CSharpCodeBlock - [0..82)::82 - [for(int i = 0; i < 10; new Foo { Bar = "baz" }) { Debug.WriteLine(@"foo } bar"); }]
  32061. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  32062. + Transition;[<Missing>];
  32063. + CSharpStatementLiteral - [0..82)::82 - [for(int i = 0; i < 10; new Foo { Bar = "baz" }) { Debug.WriteLine(@"foo } bar"); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  32064. + Keyword;[for];
  32065. + LeftParenthesis;[(];
  32066. + Keyword;[int];
  32067. + Whitespace;[ ];
  32068. + Identifier;[i];
  32069. + Whitespace;[ ];
  32070. + Assign;[=];
  32071. + Whitespace;[ ];
  32072. + IntegerLiteral;[0];
  32073. + Semicolon;[;];
  32074. + Whitespace;[ ];
  32075. + Identifier;[i];
  32076. + Whitespace;[ ];
  32077. + LessThan;[<];
  32078. + Whitespace;[ ];
  32079. + IntegerLiteral;[10];
  32080. + Semicolon;[;];
  32081. + Whitespace;[ ];
  32082. + Keyword;[new];
  32083. + Whitespace;[ ];
  32084. + Identifier;[Foo];
  32085. + Whitespace;[ ];
  32086. + LeftBrace;[{];
  32087. + Whitespace;[ ];
  32088. + Identifier;[Bar];
  32089. + Whitespace;[ ];
  32090. + Assign;[=];
  32091. + Whitespace;[ ];
  32092. + StringLiteral;["baz"];
  32093. + Whitespace;[ ];
  32094. + RightBrace;[}];
  32095. + RightParenthesis;[)];
  32096. + Whitespace;[ ];
  32097. + LeftBrace;[{];
  32098. + Whitespace;[ ];
  32099. + Identifier;[Debug];
  32100. + Dot;[.];
  32101. + Identifier;[WriteLine];
  32102. + LeftParenthesis;[(];
  32103. + StringLiteral;[@"foo } bar"];
  32104. + RightParenthesis;[)];
  32105. + Semicolon;[;];
  32106. + Whitespace;[ ];
  32107. + RightBrace;[}];
  32108. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SkipsExprThenBalancesBracesIfFirstIdentifierIsForeachKeyword.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SkipsExprThenBalancesBracesIfFirstIdentifierIsForeachKeyword.stree.txt
  32109. index a6ba84a761f..7bed8c30f3a 100644
  32110. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SkipsExprThenBalancesBracesIfFirstIdentifierIsForeachKeyword.stree.txt
  32111. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SkipsExprThenBalancesBracesIfFirstIdentifierIsForeachKeyword.stree.txt
  32112. @@ -1,46 +1,48 @@
  32113. -Statement block - Gen<None> - 86 - (0:0,0)
  32114. - Code span - Gen<Stmt> - [foreach(int i = 0; i < 10; new Foo { Bar = "baz" }) { Debug.WriteLine(@"foo } bar"); }] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:44
  32115. - SyntaxKind.Keyword;[foreach];
  32116. - SyntaxKind.LeftParenthesis;[(];
  32117. - SyntaxKind.Keyword;[int];
  32118. - SyntaxKind.Whitespace;[ ];
  32119. - SyntaxKind.Identifier;[i];
  32120. - SyntaxKind.Whitespace;[ ];
  32121. - SyntaxKind.Assign;[=];
  32122. - SyntaxKind.Whitespace;[ ];
  32123. - SyntaxKind.IntegerLiteral;[0];
  32124. - SyntaxKind.Semicolon;[;];
  32125. - SyntaxKind.Whitespace;[ ];
  32126. - SyntaxKind.Identifier;[i];
  32127. - SyntaxKind.Whitespace;[ ];
  32128. - SyntaxKind.LessThan;[<];
  32129. - SyntaxKind.Whitespace;[ ];
  32130. - SyntaxKind.IntegerLiteral;[10];
  32131. - SyntaxKind.Semicolon;[;];
  32132. - SyntaxKind.Whitespace;[ ];
  32133. - SyntaxKind.Keyword;[new];
  32134. - SyntaxKind.Whitespace;[ ];
  32135. - SyntaxKind.Identifier;[Foo];
  32136. - SyntaxKind.Whitespace;[ ];
  32137. - SyntaxKind.LeftBrace;[{];
  32138. - SyntaxKind.Whitespace;[ ];
  32139. - SyntaxKind.Identifier;[Bar];
  32140. - SyntaxKind.Whitespace;[ ];
  32141. - SyntaxKind.Assign;[=];
  32142. - SyntaxKind.Whitespace;[ ];
  32143. - SyntaxKind.StringLiteral;["baz"];
  32144. - SyntaxKind.Whitespace;[ ];
  32145. - SyntaxKind.RightBrace;[}];
  32146. - SyntaxKind.RightParenthesis;[)];
  32147. - SyntaxKind.Whitespace;[ ];
  32148. - SyntaxKind.LeftBrace;[{];
  32149. - SyntaxKind.Whitespace;[ ];
  32150. - SyntaxKind.Identifier;[Debug];
  32151. - SyntaxKind.Dot;[.];
  32152. - SyntaxKind.Identifier;[WriteLine];
  32153. - SyntaxKind.LeftParenthesis;[(];
  32154. - SyntaxKind.StringLiteral;[@"foo } bar"];
  32155. - SyntaxKind.RightParenthesis;[)];
  32156. - SyntaxKind.Semicolon;[;];
  32157. - SyntaxKind.Whitespace;[ ];
  32158. - SyntaxKind.RightBrace;[}];
  32159. +CSharpCodeBlock - [0..86)::86 - [foreach(int i = 0; i < 10; new Foo { Bar = "baz" }) { Debug.WriteLine(@"foo } bar"); }]
  32160. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  32161. + Transition;[<Missing>];
  32162. + CSharpStatementLiteral - [0..86)::86 - [foreach(int i = 0; i < 10; new Foo { Bar = "baz" }) { Debug.WriteLine(@"foo } bar"); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  32163. + Keyword;[foreach];
  32164. + LeftParenthesis;[(];
  32165. + Keyword;[int];
  32166. + Whitespace;[ ];
  32167. + Identifier;[i];
  32168. + Whitespace;[ ];
  32169. + Assign;[=];
  32170. + Whitespace;[ ];
  32171. + IntegerLiteral;[0];
  32172. + Semicolon;[;];
  32173. + Whitespace;[ ];
  32174. + Identifier;[i];
  32175. + Whitespace;[ ];
  32176. + LessThan;[<];
  32177. + Whitespace;[ ];
  32178. + IntegerLiteral;[10];
  32179. + Semicolon;[;];
  32180. + Whitespace;[ ];
  32181. + Keyword;[new];
  32182. + Whitespace;[ ];
  32183. + Identifier;[Foo];
  32184. + Whitespace;[ ];
  32185. + LeftBrace;[{];
  32186. + Whitespace;[ ];
  32187. + Identifier;[Bar];
  32188. + Whitespace;[ ];
  32189. + Assign;[=];
  32190. + Whitespace;[ ];
  32191. + StringLiteral;["baz"];
  32192. + Whitespace;[ ];
  32193. + RightBrace;[}];
  32194. + RightParenthesis;[)];
  32195. + Whitespace;[ ];
  32196. + LeftBrace;[{];
  32197. + Whitespace;[ ];
  32198. + Identifier;[Debug];
  32199. + Dot;[.];
  32200. + Identifier;[WriteLine];
  32201. + LeftParenthesis;[(];
  32202. + StringLiteral;[@"foo } bar"];
  32203. + RightParenthesis;[)];
  32204. + Semicolon;[;];
  32205. + Whitespace;[ ];
  32206. + RightBrace;[}];
  32207. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SkipsExprThenBalancesBracesIfFirstIdentifierIsIfKeywordWithNoElseBranches.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SkipsExprThenBalancesBracesIfFirstIdentifierIsIfKeywordWithNoElseBranches.stree.txt
  32208. index 712f8110b97..f7f1f67c9ba 100644
  32209. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SkipsExprThenBalancesBracesIfFirstIdentifierIsIfKeywordWithNoElseBranches.stree.txt
  32210. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SkipsExprThenBalancesBracesIfFirstIdentifierIsIfKeywordWithNoElseBranches.stree.txt
  32211. @@ -1,46 +1,48 @@
  32212. -Statement block - Gen<None> - 81 - (0:0,0)
  32213. - Code span - Gen<Stmt> - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) { Debug.WriteLine(@"foo } bar"); }] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:44
  32214. - SyntaxKind.Keyword;[if];
  32215. - SyntaxKind.LeftParenthesis;[(];
  32216. - SyntaxKind.Keyword;[int];
  32217. - SyntaxKind.Whitespace;[ ];
  32218. - SyntaxKind.Identifier;[i];
  32219. - SyntaxKind.Whitespace;[ ];
  32220. - SyntaxKind.Assign;[=];
  32221. - SyntaxKind.Whitespace;[ ];
  32222. - SyntaxKind.IntegerLiteral;[0];
  32223. - SyntaxKind.Semicolon;[;];
  32224. - SyntaxKind.Whitespace;[ ];
  32225. - SyntaxKind.Identifier;[i];
  32226. - SyntaxKind.Whitespace;[ ];
  32227. - SyntaxKind.LessThan;[<];
  32228. - SyntaxKind.Whitespace;[ ];
  32229. - SyntaxKind.IntegerLiteral;[10];
  32230. - SyntaxKind.Semicolon;[;];
  32231. - SyntaxKind.Whitespace;[ ];
  32232. - SyntaxKind.Keyword;[new];
  32233. - SyntaxKind.Whitespace;[ ];
  32234. - SyntaxKind.Identifier;[Foo];
  32235. - SyntaxKind.Whitespace;[ ];
  32236. - SyntaxKind.LeftBrace;[{];
  32237. - SyntaxKind.Whitespace;[ ];
  32238. - SyntaxKind.Identifier;[Bar];
  32239. - SyntaxKind.Whitespace;[ ];
  32240. - SyntaxKind.Assign;[=];
  32241. - SyntaxKind.Whitespace;[ ];
  32242. - SyntaxKind.StringLiteral;["baz"];
  32243. - SyntaxKind.Whitespace;[ ];
  32244. - SyntaxKind.RightBrace;[}];
  32245. - SyntaxKind.RightParenthesis;[)];
  32246. - SyntaxKind.Whitespace;[ ];
  32247. - SyntaxKind.LeftBrace;[{];
  32248. - SyntaxKind.Whitespace;[ ];
  32249. - SyntaxKind.Identifier;[Debug];
  32250. - SyntaxKind.Dot;[.];
  32251. - SyntaxKind.Identifier;[WriteLine];
  32252. - SyntaxKind.LeftParenthesis;[(];
  32253. - SyntaxKind.StringLiteral;[@"foo } bar"];
  32254. - SyntaxKind.RightParenthesis;[)];
  32255. - SyntaxKind.Semicolon;[;];
  32256. - SyntaxKind.Whitespace;[ ];
  32257. - SyntaxKind.RightBrace;[}];
  32258. +CSharpCodeBlock - [0..81)::81 - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) { Debug.WriteLine(@"foo } bar"); }]
  32259. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  32260. + Transition;[<Missing>];
  32261. + CSharpStatementLiteral - [0..81)::81 - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) { Debug.WriteLine(@"foo } bar"); }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  32262. + Keyword;[if];
  32263. + LeftParenthesis;[(];
  32264. + Keyword;[int];
  32265. + Whitespace;[ ];
  32266. + Identifier;[i];
  32267. + Whitespace;[ ];
  32268. + Assign;[=];
  32269. + Whitespace;[ ];
  32270. + IntegerLiteral;[0];
  32271. + Semicolon;[;];
  32272. + Whitespace;[ ];
  32273. + Identifier;[i];
  32274. + Whitespace;[ ];
  32275. + LessThan;[<];
  32276. + Whitespace;[ ];
  32277. + IntegerLiteral;[10];
  32278. + Semicolon;[;];
  32279. + Whitespace;[ ];
  32280. + Keyword;[new];
  32281. + Whitespace;[ ];
  32282. + Identifier;[Foo];
  32283. + Whitespace;[ ];
  32284. + LeftBrace;[{];
  32285. + Whitespace;[ ];
  32286. + Identifier;[Bar];
  32287. + Whitespace;[ ];
  32288. + Assign;[=];
  32289. + Whitespace;[ ];
  32290. + StringLiteral;["baz"];
  32291. + Whitespace;[ ];
  32292. + RightBrace;[}];
  32293. + RightParenthesis;[)];
  32294. + Whitespace;[ ];
  32295. + LeftBrace;[{];
  32296. + Whitespace;[ ];
  32297. + Identifier;[Debug];
  32298. + Dot;[.];
  32299. + Identifier;[WriteLine];
  32300. + LeftParenthesis;[(];
  32301. + StringLiteral;[@"foo } bar"];
  32302. + RightParenthesis;[)];
  32303. + Semicolon;[;];
  32304. + Whitespace;[ ];
  32305. + RightBrace;[}];
  32306. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SkipsExprThenBalancesBracesIfFirstIdentifierIsSwitchKeyword.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SkipsExprThenBalancesBracesIfFirstIdentifierIsSwitchKeyword.stree.txt
  32307. index 23b29665eca..46890c79361 100644
  32308. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SkipsExprThenBalancesBracesIfFirstIdentifierIsSwitchKeyword.stree.txt
  32309. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SkipsExprThenBalancesBracesIfFirstIdentifierIsSwitchKeyword.stree.txt
  32310. @@ -1,54 +1,56 @@
  32311. -Statement block - Gen<None> - 161 - (0:0,0)
  32312. - Code span - Gen<Stmt> - [switch(foo) {LF case 0:LF break;LF case 1:LF {LF break;LF }LF case 2:LF return;LF default:LF return;LF}] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:52
  32313. - SyntaxKind.Keyword;[switch];
  32314. - SyntaxKind.LeftParenthesis;[(];
  32315. - SyntaxKind.Identifier;[foo];
  32316. - SyntaxKind.RightParenthesis;[)];
  32317. - SyntaxKind.Whitespace;[ ];
  32318. - SyntaxKind.LeftBrace;[{];
  32319. - SyntaxKind.NewLine;[LF];
  32320. - SyntaxKind.Whitespace;[ ];
  32321. - SyntaxKind.Keyword;[case];
  32322. - SyntaxKind.Whitespace;[ ];
  32323. - SyntaxKind.IntegerLiteral;[0];
  32324. - SyntaxKind.Colon;[:];
  32325. - SyntaxKind.NewLine;[LF];
  32326. - SyntaxKind.Whitespace;[ ];
  32327. - SyntaxKind.Keyword;[break];
  32328. - SyntaxKind.Semicolon;[;];
  32329. - SyntaxKind.NewLine;[LF];
  32330. - SyntaxKind.Whitespace;[ ];
  32331. - SyntaxKind.Keyword;[case];
  32332. - SyntaxKind.Whitespace;[ ];
  32333. - SyntaxKind.IntegerLiteral;[1];
  32334. - SyntaxKind.Colon;[:];
  32335. - SyntaxKind.NewLine;[LF];
  32336. - SyntaxKind.Whitespace;[ ];
  32337. - SyntaxKind.LeftBrace;[{];
  32338. - SyntaxKind.NewLine;[LF];
  32339. - SyntaxKind.Whitespace;[ ];
  32340. - SyntaxKind.Keyword;[break];
  32341. - SyntaxKind.Semicolon;[;];
  32342. - SyntaxKind.NewLine;[LF];
  32343. - SyntaxKind.Whitespace;[ ];
  32344. - SyntaxKind.RightBrace;[}];
  32345. - SyntaxKind.NewLine;[LF];
  32346. - SyntaxKind.Whitespace;[ ];
  32347. - SyntaxKind.Keyword;[case];
  32348. - SyntaxKind.Whitespace;[ ];
  32349. - SyntaxKind.IntegerLiteral;[2];
  32350. - SyntaxKind.Colon;[:];
  32351. - SyntaxKind.NewLine;[LF];
  32352. - SyntaxKind.Whitespace;[ ];
  32353. - SyntaxKind.Keyword;[return];
  32354. - SyntaxKind.Semicolon;[;];
  32355. - SyntaxKind.NewLine;[LF];
  32356. - SyntaxKind.Whitespace;[ ];
  32357. - SyntaxKind.Keyword;[default];
  32358. - SyntaxKind.Colon;[:];
  32359. - SyntaxKind.NewLine;[LF];
  32360. - SyntaxKind.Whitespace;[ ];
  32361. - SyntaxKind.Keyword;[return];
  32362. - SyntaxKind.Semicolon;[;];
  32363. - SyntaxKind.NewLine;[LF];
  32364. - SyntaxKind.RightBrace;[}];
  32365. +CSharpCodeBlock - [0..161)::161 - [switch(foo) {LF case 0:LF break;LF case 1:LF {LF break;LF }LF case 2:LF return;LF default:LF return;LF}]
  32366. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  32367. + Transition;[<Missing>];
  32368. + CSharpStatementLiteral - [0..161)::161 - [switch(foo) {LF case 0:LF break;LF case 1:LF {LF break;LF }LF case 2:LF return;LF default:LF return;LF}] - Gen<Stmt> - SpanEditHandler;Accepts:None
  32369. + Keyword;[switch];
  32370. + LeftParenthesis;[(];
  32371. + Identifier;[foo];
  32372. + RightParenthesis;[)];
  32373. + Whitespace;[ ];
  32374. + LeftBrace;[{];
  32375. + NewLine;[LF];
  32376. + Whitespace;[ ];
  32377. + Keyword;[case];
  32378. + Whitespace;[ ];
  32379. + IntegerLiteral;[0];
  32380. + Colon;[:];
  32381. + NewLine;[LF];
  32382. + Whitespace;[ ];
  32383. + Keyword;[break];
  32384. + Semicolon;[;];
  32385. + NewLine;[LF];
  32386. + Whitespace;[ ];
  32387. + Keyword;[case];
  32388. + Whitespace;[ ];
  32389. + IntegerLiteral;[1];
  32390. + Colon;[:];
  32391. + NewLine;[LF];
  32392. + Whitespace;[ ];
  32393. + LeftBrace;[{];
  32394. + NewLine;[LF];
  32395. + Whitespace;[ ];
  32396. + Keyword;[break];
  32397. + Semicolon;[;];
  32398. + NewLine;[LF];
  32399. + Whitespace;[ ];
  32400. + RightBrace;[}];
  32401. + NewLine;[LF];
  32402. + Whitespace;[ ];
  32403. + Keyword;[case];
  32404. + Whitespace;[ ];
  32405. + IntegerLiteral;[2];
  32406. + Colon;[:];
  32407. + NewLine;[LF];
  32408. + Whitespace;[ ];
  32409. + Keyword;[return];
  32410. + Semicolon;[;];
  32411. + NewLine;[LF];
  32412. + Whitespace;[ ];
  32413. + Keyword;[default];
  32414. + Colon;[:];
  32415. + NewLine;[LF];
  32416. + Whitespace;[ ];
  32417. + Keyword;[return];
  32418. + Semicolon;[;];
  32419. + NewLine;[LF];
  32420. + RightBrace;[}];
  32421. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SkipsExprThenBalancesBracesIfFirstIdentifierIsWhileKeyword.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SkipsExprThenBalancesBracesIfFirstIdentifierIsWhileKeyword.stree.txt
  32422. index 8867fa66fb9..2bb6e1023f5 100644
  32423. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SkipsExprThenBalancesBracesIfFirstIdentifierIsWhileKeyword.stree.txt
  32424. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SkipsExprThenBalancesBracesIfFirstIdentifierIsWhileKeyword.stree.txt
  32425. @@ -1,46 +1,48 @@
  32426. -Statement block - Gen<None> - 84 - (0:0,0)
  32427. - Code span - Gen<Stmt> - [while(int i = 0; i < 10; new Foo { Bar = "baz" }) { Debug.WriteLine(@"foo } bar"); }] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:44
  32428. - SyntaxKind.Keyword;[while];
  32429. - SyntaxKind.LeftParenthesis;[(];
  32430. - SyntaxKind.Keyword;[int];
  32431. - SyntaxKind.Whitespace;[ ];
  32432. - SyntaxKind.Identifier;[i];
  32433. - SyntaxKind.Whitespace;[ ];
  32434. - SyntaxKind.Assign;[=];
  32435. - SyntaxKind.Whitespace;[ ];
  32436. - SyntaxKind.IntegerLiteral;[0];
  32437. - SyntaxKind.Semicolon;[;];
  32438. - SyntaxKind.Whitespace;[ ];
  32439. - SyntaxKind.Identifier;[i];
  32440. - SyntaxKind.Whitespace;[ ];
  32441. - SyntaxKind.LessThan;[<];
  32442. - SyntaxKind.Whitespace;[ ];
  32443. - SyntaxKind.IntegerLiteral;[10];
  32444. - SyntaxKind.Semicolon;[;];
  32445. - SyntaxKind.Whitespace;[ ];
  32446. - SyntaxKind.Keyword;[new];
  32447. - SyntaxKind.Whitespace;[ ];
  32448. - SyntaxKind.Identifier;[Foo];
  32449. - SyntaxKind.Whitespace;[ ];
  32450. - SyntaxKind.LeftBrace;[{];
  32451. - SyntaxKind.Whitespace;[ ];
  32452. - SyntaxKind.Identifier;[Bar];
  32453. - SyntaxKind.Whitespace;[ ];
  32454. - SyntaxKind.Assign;[=];
  32455. - SyntaxKind.Whitespace;[ ];
  32456. - SyntaxKind.StringLiteral;["baz"];
  32457. - SyntaxKind.Whitespace;[ ];
  32458. - SyntaxKind.RightBrace;[}];
  32459. - SyntaxKind.RightParenthesis;[)];
  32460. - SyntaxKind.Whitespace;[ ];
  32461. - SyntaxKind.LeftBrace;[{];
  32462. - SyntaxKind.Whitespace;[ ];
  32463. - SyntaxKind.Identifier;[Debug];
  32464. - SyntaxKind.Dot;[.];
  32465. - SyntaxKind.Identifier;[WriteLine];
  32466. - SyntaxKind.LeftParenthesis;[(];
  32467. - SyntaxKind.StringLiteral;[@"foo } bar"];
  32468. - SyntaxKind.RightParenthesis;[)];
  32469. - SyntaxKind.Semicolon;[;];
  32470. - SyntaxKind.Whitespace;[ ];
  32471. - SyntaxKind.RightBrace;[}];
  32472. +CSharpCodeBlock - [0..84)::84 - [while(int i = 0; i < 10; new Foo { Bar = "baz" }) { Debug.WriteLine(@"foo } bar"); }]
  32473. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  32474. + Transition;[<Missing>];
  32475. + CSharpStatementLiteral - [0..84)::84 - [while(int i = 0; i < 10; new Foo { Bar = "baz" }) { Debug.WriteLine(@"foo } bar"); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  32476. + Keyword;[while];
  32477. + LeftParenthesis;[(];
  32478. + Keyword;[int];
  32479. + Whitespace;[ ];
  32480. + Identifier;[i];
  32481. + Whitespace;[ ];
  32482. + Assign;[=];
  32483. + Whitespace;[ ];
  32484. + IntegerLiteral;[0];
  32485. + Semicolon;[;];
  32486. + Whitespace;[ ];
  32487. + Identifier;[i];
  32488. + Whitespace;[ ];
  32489. + LessThan;[<];
  32490. + Whitespace;[ ];
  32491. + IntegerLiteral;[10];
  32492. + Semicolon;[;];
  32493. + Whitespace;[ ];
  32494. + Keyword;[new];
  32495. + Whitespace;[ ];
  32496. + Identifier;[Foo];
  32497. + Whitespace;[ ];
  32498. + LeftBrace;[{];
  32499. + Whitespace;[ ];
  32500. + Identifier;[Bar];
  32501. + Whitespace;[ ];
  32502. + Assign;[=];
  32503. + Whitespace;[ ];
  32504. + StringLiteral;["baz"];
  32505. + Whitespace;[ ];
  32506. + RightBrace;[}];
  32507. + RightParenthesis;[)];
  32508. + Whitespace;[ ];
  32509. + LeftBrace;[{];
  32510. + Whitespace;[ ];
  32511. + Identifier;[Debug];
  32512. + Dot;[.];
  32513. + Identifier;[WriteLine];
  32514. + LeftParenthesis;[(];
  32515. + StringLiteral;[@"foo } bar"];
  32516. + RightParenthesis;[)];
  32517. + Semicolon;[;];
  32518. + Whitespace;[ ];
  32519. + RightBrace;[}];
  32520. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SkipsExprThenBalancesIfFirstIdentifierIsUsingFollowedByParen.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SkipsExprThenBalancesIfFirstIdentifierIsUsingFollowedByParen.stree.txt
  32521. index 18268ec09d8..2a7208cd42e 100644
  32522. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SkipsExprThenBalancesIfFirstIdentifierIsUsingFollowedByParen.stree.txt
  32523. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SkipsExprThenBalancesIfFirstIdentifierIsUsingFollowedByParen.stree.txt
  32524. @@ -1,46 +1,48 @@
  32525. -Statement block - Gen<None> - 84 - (0:0,0)
  32526. - Code span - Gen<Stmt> - [using(int i = 0; i < 10; new Foo { Bar = "baz" }) { Debug.WriteLine(@"foo } bar"); }] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:44
  32527. - SyntaxKind.Keyword;[using];
  32528. - SyntaxKind.LeftParenthesis;[(];
  32529. - SyntaxKind.Keyword;[int];
  32530. - SyntaxKind.Whitespace;[ ];
  32531. - SyntaxKind.Identifier;[i];
  32532. - SyntaxKind.Whitespace;[ ];
  32533. - SyntaxKind.Assign;[=];
  32534. - SyntaxKind.Whitespace;[ ];
  32535. - SyntaxKind.IntegerLiteral;[0];
  32536. - SyntaxKind.Semicolon;[;];
  32537. - SyntaxKind.Whitespace;[ ];
  32538. - SyntaxKind.Identifier;[i];
  32539. - SyntaxKind.Whitespace;[ ];
  32540. - SyntaxKind.LessThan;[<];
  32541. - SyntaxKind.Whitespace;[ ];
  32542. - SyntaxKind.IntegerLiteral;[10];
  32543. - SyntaxKind.Semicolon;[;];
  32544. - SyntaxKind.Whitespace;[ ];
  32545. - SyntaxKind.Keyword;[new];
  32546. - SyntaxKind.Whitespace;[ ];
  32547. - SyntaxKind.Identifier;[Foo];
  32548. - SyntaxKind.Whitespace;[ ];
  32549. - SyntaxKind.LeftBrace;[{];
  32550. - SyntaxKind.Whitespace;[ ];
  32551. - SyntaxKind.Identifier;[Bar];
  32552. - SyntaxKind.Whitespace;[ ];
  32553. - SyntaxKind.Assign;[=];
  32554. - SyntaxKind.Whitespace;[ ];
  32555. - SyntaxKind.StringLiteral;["baz"];
  32556. - SyntaxKind.Whitespace;[ ];
  32557. - SyntaxKind.RightBrace;[}];
  32558. - SyntaxKind.RightParenthesis;[)];
  32559. - SyntaxKind.Whitespace;[ ];
  32560. - SyntaxKind.LeftBrace;[{];
  32561. - SyntaxKind.Whitespace;[ ];
  32562. - SyntaxKind.Identifier;[Debug];
  32563. - SyntaxKind.Dot;[.];
  32564. - SyntaxKind.Identifier;[WriteLine];
  32565. - SyntaxKind.LeftParenthesis;[(];
  32566. - SyntaxKind.StringLiteral;[@"foo } bar"];
  32567. - SyntaxKind.RightParenthesis;[)];
  32568. - SyntaxKind.Semicolon;[;];
  32569. - SyntaxKind.Whitespace;[ ];
  32570. - SyntaxKind.RightBrace;[}];
  32571. +CSharpCodeBlock - [0..84)::84 - [using(int i = 0; i < 10; new Foo { Bar = "baz" }) { Debug.WriteLine(@"foo } bar"); }]
  32572. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  32573. + Transition;[<Missing>];
  32574. + CSharpStatementLiteral - [0..84)::84 - [using(int i = 0; i < 10; new Foo { Bar = "baz" }) { Debug.WriteLine(@"foo } bar"); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  32575. + Keyword;[using];
  32576. + LeftParenthesis;[(];
  32577. + Keyword;[int];
  32578. + Whitespace;[ ];
  32579. + Identifier;[i];
  32580. + Whitespace;[ ];
  32581. + Assign;[=];
  32582. + Whitespace;[ ];
  32583. + IntegerLiteral;[0];
  32584. + Semicolon;[;];
  32585. + Whitespace;[ ];
  32586. + Identifier;[i];
  32587. + Whitespace;[ ];
  32588. + LessThan;[<];
  32589. + Whitespace;[ ];
  32590. + IntegerLiteral;[10];
  32591. + Semicolon;[;];
  32592. + Whitespace;[ ];
  32593. + Keyword;[new];
  32594. + Whitespace;[ ];
  32595. + Identifier;[Foo];
  32596. + Whitespace;[ ];
  32597. + LeftBrace;[{];
  32598. + Whitespace;[ ];
  32599. + Identifier;[Bar];
  32600. + Whitespace;[ ];
  32601. + Assign;[=];
  32602. + Whitespace;[ ];
  32603. + StringLiteral;["baz"];
  32604. + Whitespace;[ ];
  32605. + RightBrace;[}];
  32606. + RightParenthesis;[)];
  32607. + Whitespace;[ ];
  32608. + LeftBrace;[{];
  32609. + Whitespace;[ ];
  32610. + Identifier;[Debug];
  32611. + Dot;[.];
  32612. + Identifier;[WriteLine];
  32613. + LeftParenthesis;[(];
  32614. + StringLiteral;[@"foo } bar"];
  32615. + RightParenthesis;[)];
  32616. + Semicolon;[;];
  32617. + Whitespace;[ ];
  32618. + RightBrace;[}];
  32619. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/StopsParsingCatchClausesAfterFinallyBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/StopsParsingCatchClausesAfterFinallyBlock.stree.txt
  32620. index 8ae4de426a1..cb95bfbf577 100644
  32621. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/StopsParsingCatchClausesAfterFinallyBlock.stree.txt
  32622. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/StopsParsingCatchClausesAfterFinallyBlock.stree.txt
  32623. @@ -1,37 +1,39 @@
  32624. -Statement block - Gen<None> - 55 - (0:0,0)
  32625. - Code span - Gen<Stmt> - [try { var foo = new { } } finally { var foo = new { } }] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:35
  32626. - SyntaxKind.Keyword;[try];
  32627. - SyntaxKind.Whitespace;[ ];
  32628. - SyntaxKind.LeftBrace;[{];
  32629. - SyntaxKind.Whitespace;[ ];
  32630. - SyntaxKind.Identifier;[var];
  32631. - SyntaxKind.Whitespace;[ ];
  32632. - SyntaxKind.Identifier;[foo];
  32633. - SyntaxKind.Whitespace;[ ];
  32634. - SyntaxKind.Assign;[=];
  32635. - SyntaxKind.Whitespace;[ ];
  32636. - SyntaxKind.Keyword;[new];
  32637. - SyntaxKind.Whitespace;[ ];
  32638. - SyntaxKind.LeftBrace;[{];
  32639. - SyntaxKind.Whitespace;[ ];
  32640. - SyntaxKind.RightBrace;[}];
  32641. - SyntaxKind.Whitespace;[ ];
  32642. - SyntaxKind.RightBrace;[}];
  32643. - SyntaxKind.Whitespace;[ ];
  32644. - SyntaxKind.Keyword;[finally];
  32645. - SyntaxKind.Whitespace;[ ];
  32646. - SyntaxKind.LeftBrace;[{];
  32647. - SyntaxKind.Whitespace;[ ];
  32648. - SyntaxKind.Identifier;[var];
  32649. - SyntaxKind.Whitespace;[ ];
  32650. - SyntaxKind.Identifier;[foo];
  32651. - SyntaxKind.Whitespace;[ ];
  32652. - SyntaxKind.Assign;[=];
  32653. - SyntaxKind.Whitespace;[ ];
  32654. - SyntaxKind.Keyword;[new];
  32655. - SyntaxKind.Whitespace;[ ];
  32656. - SyntaxKind.LeftBrace;[{];
  32657. - SyntaxKind.Whitespace;[ ];
  32658. - SyntaxKind.RightBrace;[}];
  32659. - SyntaxKind.Whitespace;[ ];
  32660. - SyntaxKind.RightBrace;[}];
  32661. +CSharpCodeBlock - [0..55)::55 - [try { var foo = new { } } finally { var foo = new { } }]
  32662. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  32663. + Transition;[<Missing>];
  32664. + CSharpStatementLiteral - [0..55)::55 - [try { var foo = new { } } finally { var foo = new { } }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  32665. + Keyword;[try];
  32666. + Whitespace;[ ];
  32667. + LeftBrace;[{];
  32668. + Whitespace;[ ];
  32669. + Identifier;[var];
  32670. + Whitespace;[ ];
  32671. + Identifier;[foo];
  32672. + Whitespace;[ ];
  32673. + Assign;[=];
  32674. + Whitespace;[ ];
  32675. + Keyword;[new];
  32676. + Whitespace;[ ];
  32677. + LeftBrace;[{];
  32678. + Whitespace;[ ];
  32679. + RightBrace;[}];
  32680. + Whitespace;[ ];
  32681. + RightBrace;[}];
  32682. + Whitespace;[ ];
  32683. + Keyword;[finally];
  32684. + Whitespace;[ ];
  32685. + LeftBrace;[{];
  32686. + Whitespace;[ ];
  32687. + Identifier;[var];
  32688. + Whitespace;[ ];
  32689. + Identifier;[foo];
  32690. + Whitespace;[ ];
  32691. + Assign;[=];
  32692. + Whitespace;[ ];
  32693. + Keyword;[new];
  32694. + Whitespace;[ ];
  32695. + LeftBrace;[{];
  32696. + Whitespace;[ ];
  32697. + RightBrace;[}];
  32698. + Whitespace;[ ];
  32699. + RightBrace;[}];
  32700. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/StopsParsingCodeAfterElseBranch.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/StopsParsingCodeAfterElseBranch.stree.txt
  32701. index 7ed10712961..6f62c1d228c 100644
  32702. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/StopsParsingCodeAfterElseBranch.stree.txt
  32703. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/StopsParsingCodeAfterElseBranch.stree.txt
  32704. @@ -1,109 +1,111 @@
  32705. -Statement block - Gen<None> - 220 - (0:0,0)
  32706. - Code span - Gen<Stmt> - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"foo } bar");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF} else { Debug.WriteLine(@"bar } baz"); }] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:107
  32707. - SyntaxKind.Keyword;[if];
  32708. - SyntaxKind.LeftParenthesis;[(];
  32709. - SyntaxKind.Keyword;[int];
  32710. - SyntaxKind.Whitespace;[ ];
  32711. - SyntaxKind.Identifier;[i];
  32712. - SyntaxKind.Whitespace;[ ];
  32713. - SyntaxKind.Assign;[=];
  32714. - SyntaxKind.Whitespace;[ ];
  32715. - SyntaxKind.IntegerLiteral;[0];
  32716. - SyntaxKind.Semicolon;[;];
  32717. - SyntaxKind.Whitespace;[ ];
  32718. - SyntaxKind.Identifier;[i];
  32719. - SyntaxKind.Whitespace;[ ];
  32720. - SyntaxKind.LessThan;[<];
  32721. - SyntaxKind.Whitespace;[ ];
  32722. - SyntaxKind.IntegerLiteral;[10];
  32723. - SyntaxKind.Semicolon;[;];
  32724. - SyntaxKind.Whitespace;[ ];
  32725. - SyntaxKind.Keyword;[new];
  32726. - SyntaxKind.Whitespace;[ ];
  32727. - SyntaxKind.Identifier;[Foo];
  32728. - SyntaxKind.Whitespace;[ ];
  32729. - SyntaxKind.LeftBrace;[{];
  32730. - SyntaxKind.Whitespace;[ ];
  32731. - SyntaxKind.Identifier;[Bar];
  32732. - SyntaxKind.Whitespace;[ ];
  32733. - SyntaxKind.Assign;[=];
  32734. - SyntaxKind.Whitespace;[ ];
  32735. - SyntaxKind.StringLiteral;["baz"];
  32736. - SyntaxKind.Whitespace;[ ];
  32737. - SyntaxKind.RightBrace;[}];
  32738. - SyntaxKind.RightParenthesis;[)];
  32739. - SyntaxKind.Whitespace;[ ];
  32740. - SyntaxKind.LeftBrace;[{];
  32741. - SyntaxKind.NewLine;[LF];
  32742. - SyntaxKind.Whitespace;[ ];
  32743. - SyntaxKind.Identifier;[Debug];
  32744. - SyntaxKind.Dot;[.];
  32745. - SyntaxKind.Identifier;[WriteLine];
  32746. - SyntaxKind.LeftParenthesis;[(];
  32747. - SyntaxKind.StringLiteral;[@"foo } bar"];
  32748. - SyntaxKind.RightParenthesis;[)];
  32749. - SyntaxKind.Semicolon;[;];
  32750. - SyntaxKind.NewLine;[LF];
  32751. - SyntaxKind.RightBrace;[}];
  32752. - SyntaxKind.Whitespace;[ ];
  32753. - SyntaxKind.Keyword;[else];
  32754. - SyntaxKind.Whitespace;[ ];
  32755. - SyntaxKind.Keyword;[if];
  32756. - SyntaxKind.LeftParenthesis;[(];
  32757. - SyntaxKind.Keyword;[int];
  32758. - SyntaxKind.Whitespace;[ ];
  32759. - SyntaxKind.Identifier;[i];
  32760. - SyntaxKind.Whitespace;[ ];
  32761. - SyntaxKind.Assign;[=];
  32762. - SyntaxKind.Whitespace;[ ];
  32763. - SyntaxKind.IntegerLiteral;[0];
  32764. - SyntaxKind.Semicolon;[;];
  32765. - SyntaxKind.Whitespace;[ ];
  32766. - SyntaxKind.Identifier;[i];
  32767. - SyntaxKind.Whitespace;[ ];
  32768. - SyntaxKind.LessThan;[<];
  32769. - SyntaxKind.Whitespace;[ ];
  32770. - SyntaxKind.IntegerLiteral;[10];
  32771. - SyntaxKind.Semicolon;[;];
  32772. - SyntaxKind.Whitespace;[ ];
  32773. - SyntaxKind.Keyword;[new];
  32774. - SyntaxKind.Whitespace;[ ];
  32775. - SyntaxKind.Identifier;[Foo];
  32776. - SyntaxKind.Whitespace;[ ];
  32777. - SyntaxKind.LeftBrace;[{];
  32778. - SyntaxKind.Whitespace;[ ];
  32779. - SyntaxKind.Identifier;[Bar];
  32780. - SyntaxKind.Whitespace;[ ];
  32781. - SyntaxKind.Assign;[=];
  32782. - SyntaxKind.Whitespace;[ ];
  32783. - SyntaxKind.StringLiteral;["baz"];
  32784. - SyntaxKind.Whitespace;[ ];
  32785. - SyntaxKind.RightBrace;[}];
  32786. - SyntaxKind.RightParenthesis;[)];
  32787. - SyntaxKind.Whitespace;[ ];
  32788. - SyntaxKind.LeftBrace;[{];
  32789. - SyntaxKind.NewLine;[LF];
  32790. - SyntaxKind.Whitespace;[ ];
  32791. - SyntaxKind.Identifier;[Debug];
  32792. - SyntaxKind.Dot;[.];
  32793. - SyntaxKind.Identifier;[WriteLine];
  32794. - SyntaxKind.LeftParenthesis;[(];
  32795. - SyntaxKind.StringLiteral;[@"bar } baz"];
  32796. - SyntaxKind.RightParenthesis;[)];
  32797. - SyntaxKind.Semicolon;[;];
  32798. - SyntaxKind.NewLine;[LF];
  32799. - SyntaxKind.RightBrace;[}];
  32800. - SyntaxKind.Whitespace;[ ];
  32801. - SyntaxKind.Keyword;[else];
  32802. - SyntaxKind.Whitespace;[ ];
  32803. - SyntaxKind.LeftBrace;[{];
  32804. - SyntaxKind.Whitespace;[ ];
  32805. - SyntaxKind.Identifier;[Debug];
  32806. - SyntaxKind.Dot;[.];
  32807. - SyntaxKind.Identifier;[WriteLine];
  32808. - SyntaxKind.LeftParenthesis;[(];
  32809. - SyntaxKind.StringLiteral;[@"bar } baz"];
  32810. - SyntaxKind.RightParenthesis;[)];
  32811. - SyntaxKind.Semicolon;[;];
  32812. - SyntaxKind.Whitespace;[ ];
  32813. - SyntaxKind.RightBrace;[}];
  32814. +CSharpCodeBlock - [0..220)::220 - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"foo } bar");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF} else { Debug.WriteLine(@"bar } baz"); }]
  32815. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  32816. + Transition;[<Missing>];
  32817. + CSharpStatementLiteral - [0..220)::220 - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"foo } bar");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF} else { Debug.WriteLine(@"bar } baz"); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  32818. + Keyword;[if];
  32819. + LeftParenthesis;[(];
  32820. + Keyword;[int];
  32821. + Whitespace;[ ];
  32822. + Identifier;[i];
  32823. + Whitespace;[ ];
  32824. + Assign;[=];
  32825. + Whitespace;[ ];
  32826. + IntegerLiteral;[0];
  32827. + Semicolon;[;];
  32828. + Whitespace;[ ];
  32829. + Identifier;[i];
  32830. + Whitespace;[ ];
  32831. + LessThan;[<];
  32832. + Whitespace;[ ];
  32833. + IntegerLiteral;[10];
  32834. + Semicolon;[;];
  32835. + Whitespace;[ ];
  32836. + Keyword;[new];
  32837. + Whitespace;[ ];
  32838. + Identifier;[Foo];
  32839. + Whitespace;[ ];
  32840. + LeftBrace;[{];
  32841. + Whitespace;[ ];
  32842. + Identifier;[Bar];
  32843. + Whitespace;[ ];
  32844. + Assign;[=];
  32845. + Whitespace;[ ];
  32846. + StringLiteral;["baz"];
  32847. + Whitespace;[ ];
  32848. + RightBrace;[}];
  32849. + RightParenthesis;[)];
  32850. + Whitespace;[ ];
  32851. + LeftBrace;[{];
  32852. + NewLine;[LF];
  32853. + Whitespace;[ ];
  32854. + Identifier;[Debug];
  32855. + Dot;[.];
  32856. + Identifier;[WriteLine];
  32857. + LeftParenthesis;[(];
  32858. + StringLiteral;[@"foo } bar"];
  32859. + RightParenthesis;[)];
  32860. + Semicolon;[;];
  32861. + NewLine;[LF];
  32862. + RightBrace;[}];
  32863. + Whitespace;[ ];
  32864. + Keyword;[else];
  32865. + Whitespace;[ ];
  32866. + Keyword;[if];
  32867. + LeftParenthesis;[(];
  32868. + Keyword;[int];
  32869. + Whitespace;[ ];
  32870. + Identifier;[i];
  32871. + Whitespace;[ ];
  32872. + Assign;[=];
  32873. + Whitespace;[ ];
  32874. + IntegerLiteral;[0];
  32875. + Semicolon;[;];
  32876. + Whitespace;[ ];
  32877. + Identifier;[i];
  32878. + Whitespace;[ ];
  32879. + LessThan;[<];
  32880. + Whitespace;[ ];
  32881. + IntegerLiteral;[10];
  32882. + Semicolon;[;];
  32883. + Whitespace;[ ];
  32884. + Keyword;[new];
  32885. + Whitespace;[ ];
  32886. + Identifier;[Foo];
  32887. + Whitespace;[ ];
  32888. + LeftBrace;[{];
  32889. + Whitespace;[ ];
  32890. + Identifier;[Bar];
  32891. + Whitespace;[ ];
  32892. + Assign;[=];
  32893. + Whitespace;[ ];
  32894. + StringLiteral;["baz"];
  32895. + Whitespace;[ ];
  32896. + RightBrace;[}];
  32897. + RightParenthesis;[)];
  32898. + Whitespace;[ ];
  32899. + LeftBrace;[{];
  32900. + NewLine;[LF];
  32901. + Whitespace;[ ];
  32902. + Identifier;[Debug];
  32903. + Dot;[.];
  32904. + Identifier;[WriteLine];
  32905. + LeftParenthesis;[(];
  32906. + StringLiteral;[@"bar } baz"];
  32907. + RightParenthesis;[)];
  32908. + Semicolon;[;];
  32909. + NewLine;[LF];
  32910. + RightBrace;[}];
  32911. + Whitespace;[ ];
  32912. + Keyword;[else];
  32913. + Whitespace;[ ];
  32914. + LeftBrace;[{];
  32915. + Whitespace;[ ];
  32916. + Identifier;[Debug];
  32917. + Dot;[.];
  32918. + Identifier;[WriteLine];
  32919. + LeftParenthesis;[(];
  32920. + StringLiteral;[@"bar } baz"];
  32921. + RightParenthesis;[)];
  32922. + Semicolon;[;];
  32923. + Whitespace;[ ];
  32924. + RightBrace;[}];
  32925. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/StopsParsingIfIfStatementNotFollowedByElse.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/StopsParsingIfIfStatementNotFollowedByElse.stree.txt
  32926. index 66455be8228..87799cf41a6 100644
  32927. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/StopsParsingIfIfStatementNotFollowedByElse.stree.txt
  32928. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/StopsParsingIfIfStatementNotFollowedByElse.stree.txt
  32929. @@ -1,47 +1,49 @@
  32930. -Statement block - Gen<None> - 87 - (0:0,0)
  32931. - Code span - Gen<Stmt> - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"foo } bar");LF}] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:45
  32932. - SyntaxKind.Keyword;[if];
  32933. - SyntaxKind.LeftParenthesis;[(];
  32934. - SyntaxKind.Keyword;[int];
  32935. - SyntaxKind.Whitespace;[ ];
  32936. - SyntaxKind.Identifier;[i];
  32937. - SyntaxKind.Whitespace;[ ];
  32938. - SyntaxKind.Assign;[=];
  32939. - SyntaxKind.Whitespace;[ ];
  32940. - SyntaxKind.IntegerLiteral;[0];
  32941. - SyntaxKind.Semicolon;[;];
  32942. - SyntaxKind.Whitespace;[ ];
  32943. - SyntaxKind.Identifier;[i];
  32944. - SyntaxKind.Whitespace;[ ];
  32945. - SyntaxKind.LessThan;[<];
  32946. - SyntaxKind.Whitespace;[ ];
  32947. - SyntaxKind.IntegerLiteral;[10];
  32948. - SyntaxKind.Semicolon;[;];
  32949. - SyntaxKind.Whitespace;[ ];
  32950. - SyntaxKind.Keyword;[new];
  32951. - SyntaxKind.Whitespace;[ ];
  32952. - SyntaxKind.Identifier;[Foo];
  32953. - SyntaxKind.Whitespace;[ ];
  32954. - SyntaxKind.LeftBrace;[{];
  32955. - SyntaxKind.Whitespace;[ ];
  32956. - SyntaxKind.Identifier;[Bar];
  32957. - SyntaxKind.Whitespace;[ ];
  32958. - SyntaxKind.Assign;[=];
  32959. - SyntaxKind.Whitespace;[ ];
  32960. - SyntaxKind.StringLiteral;["baz"];
  32961. - SyntaxKind.Whitespace;[ ];
  32962. - SyntaxKind.RightBrace;[}];
  32963. - SyntaxKind.RightParenthesis;[)];
  32964. - SyntaxKind.Whitespace;[ ];
  32965. - SyntaxKind.LeftBrace;[{];
  32966. - SyntaxKind.NewLine;[LF];
  32967. - SyntaxKind.Whitespace;[ ];
  32968. - SyntaxKind.Identifier;[Debug];
  32969. - SyntaxKind.Dot;[.];
  32970. - SyntaxKind.Identifier;[WriteLine];
  32971. - SyntaxKind.LeftParenthesis;[(];
  32972. - SyntaxKind.StringLiteral;[@"foo } bar"];
  32973. - SyntaxKind.RightParenthesis;[)];
  32974. - SyntaxKind.Semicolon;[;];
  32975. - SyntaxKind.NewLine;[LF];
  32976. - SyntaxKind.RightBrace;[}];
  32977. +CSharpCodeBlock - [0..87)::87 - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"foo } bar");LF}]
  32978. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  32979. + Transition;[<Missing>];
  32980. + CSharpStatementLiteral - [0..87)::87 - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"foo } bar");LF}] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  32981. + Keyword;[if];
  32982. + LeftParenthesis;[(];
  32983. + Keyword;[int];
  32984. + Whitespace;[ ];
  32985. + Identifier;[i];
  32986. + Whitespace;[ ];
  32987. + Assign;[=];
  32988. + Whitespace;[ ];
  32989. + IntegerLiteral;[0];
  32990. + Semicolon;[;];
  32991. + Whitespace;[ ];
  32992. + Identifier;[i];
  32993. + Whitespace;[ ];
  32994. + LessThan;[<];
  32995. + Whitespace;[ ];
  32996. + IntegerLiteral;[10];
  32997. + Semicolon;[;];
  32998. + Whitespace;[ ];
  32999. + Keyword;[new];
  33000. + Whitespace;[ ];
  33001. + Identifier;[Foo];
  33002. + Whitespace;[ ];
  33003. + LeftBrace;[{];
  33004. + Whitespace;[ ];
  33005. + Identifier;[Bar];
  33006. + Whitespace;[ ];
  33007. + Assign;[=];
  33008. + Whitespace;[ ];
  33009. + StringLiteral;["baz"];
  33010. + Whitespace;[ ];
  33011. + RightBrace;[}];
  33012. + RightParenthesis;[)];
  33013. + Whitespace;[ ];
  33014. + LeftBrace;[{];
  33015. + NewLine;[LF];
  33016. + Whitespace;[ ];
  33017. + Identifier;[Debug];
  33018. + Dot;[.];
  33019. + Identifier;[WriteLine];
  33020. + LeftParenthesis;[(];
  33021. + StringLiteral;[@"foo } bar"];
  33022. + RightParenthesis;[)];
  33023. + Semicolon;[;];
  33024. + NewLine;[LF];
  33025. + RightBrace;[}];
  33026. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenCatchAndFinallyClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenCatchAndFinallyClause.stree.txt
  33027. index 73bc070d638..fed923fc3a3 100644
  33028. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenCatchAndFinallyClause.stree.txt
  33029. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenCatchAndFinallyClause.stree.txt
  33030. @@ -1,41 +1,43 @@
  33031. -Statement block - Gen<None> - 75 - (0:0,0)
  33032. - Code span - Gen<Stmt> - [try { bar(); } catch(bar) { baz(); } /* Foo */ /* Bar */ finally { biz(); }] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:39
  33033. - SyntaxKind.Keyword;[try];
  33034. - SyntaxKind.Whitespace;[ ];
  33035. - SyntaxKind.LeftBrace;[{];
  33036. - SyntaxKind.Whitespace;[ ];
  33037. - SyntaxKind.Identifier;[bar];
  33038. - SyntaxKind.LeftParenthesis;[(];
  33039. - SyntaxKind.RightParenthesis;[)];
  33040. - SyntaxKind.Semicolon;[;];
  33041. - SyntaxKind.Whitespace;[ ];
  33042. - SyntaxKind.RightBrace;[}];
  33043. - SyntaxKind.Whitespace;[ ];
  33044. - SyntaxKind.Keyword;[catch];
  33045. - SyntaxKind.LeftParenthesis;[(];
  33046. - SyntaxKind.Identifier;[bar];
  33047. - SyntaxKind.RightParenthesis;[)];
  33048. - SyntaxKind.Whitespace;[ ];
  33049. - SyntaxKind.LeftBrace;[{];
  33050. - SyntaxKind.Whitespace;[ ];
  33051. - SyntaxKind.Identifier;[baz];
  33052. - SyntaxKind.LeftParenthesis;[(];
  33053. - SyntaxKind.RightParenthesis;[)];
  33054. - SyntaxKind.Semicolon;[;];
  33055. - SyntaxKind.Whitespace;[ ];
  33056. - SyntaxKind.RightBrace;[}];
  33057. - SyntaxKind.Whitespace;[ ];
  33058. - SyntaxKind.CSharpComment;[/* Foo */];
  33059. - SyntaxKind.Whitespace;[ ];
  33060. - SyntaxKind.CSharpComment;[/* Bar */];
  33061. - SyntaxKind.Whitespace;[ ];
  33062. - SyntaxKind.Keyword;[finally];
  33063. - SyntaxKind.Whitespace;[ ];
  33064. - SyntaxKind.LeftBrace;[{];
  33065. - SyntaxKind.Whitespace;[ ];
  33066. - SyntaxKind.Identifier;[biz];
  33067. - SyntaxKind.LeftParenthesis;[(];
  33068. - SyntaxKind.RightParenthesis;[)];
  33069. - SyntaxKind.Semicolon;[;];
  33070. - SyntaxKind.Whitespace;[ ];
  33071. - SyntaxKind.RightBrace;[}];
  33072. +CSharpCodeBlock - [0..75)::75 - [try { bar(); } catch(bar) { baz(); } /* Foo */ /* Bar */ finally { biz(); }]
  33073. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  33074. + Transition;[<Missing>];
  33075. + CSharpStatementLiteral - [0..75)::75 - [try { bar(); } catch(bar) { baz(); } /* Foo */ /* Bar */ finally { biz(); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  33076. + Keyword;[try];
  33077. + Whitespace;[ ];
  33078. + LeftBrace;[{];
  33079. + Whitespace;[ ];
  33080. + Identifier;[bar];
  33081. + LeftParenthesis;[(];
  33082. + RightParenthesis;[)];
  33083. + Semicolon;[;];
  33084. + Whitespace;[ ];
  33085. + RightBrace;[}];
  33086. + Whitespace;[ ];
  33087. + Keyword;[catch];
  33088. + LeftParenthesis;[(];
  33089. + Identifier;[bar];
  33090. + RightParenthesis;[)];
  33091. + Whitespace;[ ];
  33092. + LeftBrace;[{];
  33093. + Whitespace;[ ];
  33094. + Identifier;[baz];
  33095. + LeftParenthesis;[(];
  33096. + RightParenthesis;[)];
  33097. + Semicolon;[;];
  33098. + Whitespace;[ ];
  33099. + RightBrace;[}];
  33100. + Whitespace;[ ];
  33101. + CSharpComment;[/* Foo */];
  33102. + Whitespace;[ ];
  33103. + CSharpComment;[/* Bar */];
  33104. + Whitespace;[ ];
  33105. + Keyword;[finally];
  33106. + Whitespace;[ ];
  33107. + LeftBrace;[{];
  33108. + Whitespace;[ ];
  33109. + Identifier;[biz];
  33110. + LeftParenthesis;[(];
  33111. + RightParenthesis;[)];
  33112. + Semicolon;[;];
  33113. + Whitespace;[ ];
  33114. + RightBrace;[}];
  33115. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenDoAndWhileClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenDoAndWhileClause.stree.txt
  33116. index 55417a8113c..3388a655672 100644
  33117. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenDoAndWhileClause.stree.txt
  33118. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenDoAndWhileClause.stree.txt
  33119. @@ -1,26 +1,28 @@
  33120. -Statement block - Gen<None> - 54 - (0:0,0)
  33121. - Code span - Gen<Stmt> - [do { var foo = bar; } /* Foo */ /* Bar */ while(true);] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:24
  33122. - SyntaxKind.Keyword;[do];
  33123. - SyntaxKind.Whitespace;[ ];
  33124. - SyntaxKind.LeftBrace;[{];
  33125. - SyntaxKind.Whitespace;[ ];
  33126. - SyntaxKind.Identifier;[var];
  33127. - SyntaxKind.Whitespace;[ ];
  33128. - SyntaxKind.Identifier;[foo];
  33129. - SyntaxKind.Whitespace;[ ];
  33130. - SyntaxKind.Assign;[=];
  33131. - SyntaxKind.Whitespace;[ ];
  33132. - SyntaxKind.Identifier;[bar];
  33133. - SyntaxKind.Semicolon;[;];
  33134. - SyntaxKind.Whitespace;[ ];
  33135. - SyntaxKind.RightBrace;[}];
  33136. - SyntaxKind.Whitespace;[ ];
  33137. - SyntaxKind.CSharpComment;[/* Foo */];
  33138. - SyntaxKind.Whitespace;[ ];
  33139. - SyntaxKind.CSharpComment;[/* Bar */];
  33140. - SyntaxKind.Whitespace;[ ];
  33141. - SyntaxKind.Keyword;[while];
  33142. - SyntaxKind.LeftParenthesis;[(];
  33143. - SyntaxKind.Keyword;[true];
  33144. - SyntaxKind.RightParenthesis;[)];
  33145. - SyntaxKind.Semicolon;[;];
  33146. +CSharpCodeBlock - [0..54)::54 - [do { var foo = bar; } /* Foo */ /* Bar */ while(true);]
  33147. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  33148. + Transition;[<Missing>];
  33149. + CSharpStatementLiteral - [0..54)::54 - [do { var foo = bar; } /* Foo */ /* Bar */ while(true);] - Gen<Stmt> - SpanEditHandler;Accepts:None
  33150. + Keyword;[do];
  33151. + Whitespace;[ ];
  33152. + LeftBrace;[{];
  33153. + Whitespace;[ ];
  33154. + Identifier;[var];
  33155. + Whitespace;[ ];
  33156. + Identifier;[foo];
  33157. + Whitespace;[ ];
  33158. + Assign;[=];
  33159. + Whitespace;[ ];
  33160. + Identifier;[bar];
  33161. + Semicolon;[;];
  33162. + Whitespace;[ ];
  33163. + RightBrace;[}];
  33164. + Whitespace;[ ];
  33165. + CSharpComment;[/* Foo */];
  33166. + Whitespace;[ ];
  33167. + CSharpComment;[/* Bar */];
  33168. + Whitespace;[ ];
  33169. + Keyword;[while];
  33170. + LeftParenthesis;[(];
  33171. + Keyword;[true];
  33172. + RightParenthesis;[)];
  33173. + Semicolon;[;];
  33174. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenElseIfAndElseClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenElseIfAndElseClause.stree.txt
  33175. index af30d4aa672..6bc688a4513 100644
  33176. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenElseIfAndElseClause.stree.txt
  33177. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenElseIfAndElseClause.stree.txt
  33178. @@ -1,46 +1,48 @@
  33179. -Statement block - Gen<None> - 78 - (0:0,0)
  33180. - Code span - Gen<Stmt> - [if(foo) { bar(); } else if(bar) { baz(); } /* Foo */ /* Bar */ else { biz(); }] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:44
  33181. - SyntaxKind.Keyword;[if];
  33182. - SyntaxKind.LeftParenthesis;[(];
  33183. - SyntaxKind.Identifier;[foo];
  33184. - SyntaxKind.RightParenthesis;[)];
  33185. - SyntaxKind.Whitespace;[ ];
  33186. - SyntaxKind.LeftBrace;[{];
  33187. - SyntaxKind.Whitespace;[ ];
  33188. - SyntaxKind.Identifier;[bar];
  33189. - SyntaxKind.LeftParenthesis;[(];
  33190. - SyntaxKind.RightParenthesis;[)];
  33191. - SyntaxKind.Semicolon;[;];
  33192. - SyntaxKind.Whitespace;[ ];
  33193. - SyntaxKind.RightBrace;[}];
  33194. - SyntaxKind.Whitespace;[ ];
  33195. - SyntaxKind.Keyword;[else];
  33196. - SyntaxKind.Whitespace;[ ];
  33197. - SyntaxKind.Keyword;[if];
  33198. - SyntaxKind.LeftParenthesis;[(];
  33199. - SyntaxKind.Identifier;[bar];
  33200. - SyntaxKind.RightParenthesis;[)];
  33201. - SyntaxKind.Whitespace;[ ];
  33202. - SyntaxKind.LeftBrace;[{];
  33203. - SyntaxKind.Whitespace;[ ];
  33204. - SyntaxKind.Identifier;[baz];
  33205. - SyntaxKind.LeftParenthesis;[(];
  33206. - SyntaxKind.RightParenthesis;[)];
  33207. - SyntaxKind.Semicolon;[;];
  33208. - SyntaxKind.Whitespace;[ ];
  33209. - SyntaxKind.RightBrace;[}];
  33210. - SyntaxKind.Whitespace;[ ];
  33211. - SyntaxKind.CSharpComment;[/* Foo */];
  33212. - SyntaxKind.Whitespace;[ ];
  33213. - SyntaxKind.CSharpComment;[/* Bar */];
  33214. - SyntaxKind.Whitespace;[ ];
  33215. - SyntaxKind.Keyword;[else];
  33216. - SyntaxKind.Whitespace;[ ];
  33217. - SyntaxKind.LeftBrace;[{];
  33218. - SyntaxKind.Whitespace;[ ];
  33219. - SyntaxKind.Identifier;[biz];
  33220. - SyntaxKind.LeftParenthesis;[(];
  33221. - SyntaxKind.RightParenthesis;[)];
  33222. - SyntaxKind.Semicolon;[;];
  33223. - SyntaxKind.Whitespace;[ ];
  33224. - SyntaxKind.RightBrace;[}];
  33225. +CSharpCodeBlock - [0..78)::78 - [if(foo) { bar(); } else if(bar) { baz(); } /* Foo */ /* Bar */ else { biz(); }]
  33226. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  33227. + Transition;[<Missing>];
  33228. + CSharpStatementLiteral - [0..78)::78 - [if(foo) { bar(); } else if(bar) { baz(); } /* Foo */ /* Bar */ else { biz(); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  33229. + Keyword;[if];
  33230. + LeftParenthesis;[(];
  33231. + Identifier;[foo];
  33232. + RightParenthesis;[)];
  33233. + Whitespace;[ ];
  33234. + LeftBrace;[{];
  33235. + Whitespace;[ ];
  33236. + Identifier;[bar];
  33237. + LeftParenthesis;[(];
  33238. + RightParenthesis;[)];
  33239. + Semicolon;[;];
  33240. + Whitespace;[ ];
  33241. + RightBrace;[}];
  33242. + Whitespace;[ ];
  33243. + Keyword;[else];
  33244. + Whitespace;[ ];
  33245. + Keyword;[if];
  33246. + LeftParenthesis;[(];
  33247. + Identifier;[bar];
  33248. + RightParenthesis;[)];
  33249. + Whitespace;[ ];
  33250. + LeftBrace;[{];
  33251. + Whitespace;[ ];
  33252. + Identifier;[baz];
  33253. + LeftParenthesis;[(];
  33254. + RightParenthesis;[)];
  33255. + Semicolon;[;];
  33256. + Whitespace;[ ];
  33257. + RightBrace;[}];
  33258. + Whitespace;[ ];
  33259. + CSharpComment;[/* Foo */];
  33260. + Whitespace;[ ];
  33261. + CSharpComment;[/* Bar */];
  33262. + Whitespace;[ ];
  33263. + Keyword;[else];
  33264. + Whitespace;[ ];
  33265. + LeftBrace;[{];
  33266. + Whitespace;[ ];
  33267. + Identifier;[biz];
  33268. + LeftParenthesis;[(];
  33269. + RightParenthesis;[)];
  33270. + Semicolon;[;];
  33271. + Whitespace;[ ];
  33272. + RightBrace;[}];
  33273. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenIfAndElseClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenIfAndElseClause.stree.txt
  33274. index 5c0454a7c63..53bf393628b 100644
  33275. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenIfAndElseClause.stree.txt
  33276. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenIfAndElseClause.stree.txt
  33277. @@ -1,30 +1,32 @@
  33278. -Statement block - Gen<None> - 54 - (0:0,0)
  33279. - Code span - Gen<Stmt> - [if(foo) { bar(); } /* Foo */ /* Bar */ else { baz(); }] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:28
  33280. - SyntaxKind.Keyword;[if];
  33281. - SyntaxKind.LeftParenthesis;[(];
  33282. - SyntaxKind.Identifier;[foo];
  33283. - SyntaxKind.RightParenthesis;[)];
  33284. - SyntaxKind.Whitespace;[ ];
  33285. - SyntaxKind.LeftBrace;[{];
  33286. - SyntaxKind.Whitespace;[ ];
  33287. - SyntaxKind.Identifier;[bar];
  33288. - SyntaxKind.LeftParenthesis;[(];
  33289. - SyntaxKind.RightParenthesis;[)];
  33290. - SyntaxKind.Semicolon;[;];
  33291. - SyntaxKind.Whitespace;[ ];
  33292. - SyntaxKind.RightBrace;[}];
  33293. - SyntaxKind.Whitespace;[ ];
  33294. - SyntaxKind.CSharpComment;[/* Foo */];
  33295. - SyntaxKind.Whitespace;[ ];
  33296. - SyntaxKind.CSharpComment;[/* Bar */];
  33297. - SyntaxKind.Whitespace;[ ];
  33298. - SyntaxKind.Keyword;[else];
  33299. - SyntaxKind.Whitespace;[ ];
  33300. - SyntaxKind.LeftBrace;[{];
  33301. - SyntaxKind.Whitespace;[ ];
  33302. - SyntaxKind.Identifier;[baz];
  33303. - SyntaxKind.LeftParenthesis;[(];
  33304. - SyntaxKind.RightParenthesis;[)];
  33305. - SyntaxKind.Semicolon;[;];
  33306. - SyntaxKind.Whitespace;[ ];
  33307. - SyntaxKind.RightBrace;[}];
  33308. +CSharpCodeBlock - [0..54)::54 - [if(foo) { bar(); } /* Foo */ /* Bar */ else { baz(); }]
  33309. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  33310. + Transition;[<Missing>];
  33311. + CSharpStatementLiteral - [0..54)::54 - [if(foo) { bar(); } /* Foo */ /* Bar */ else { baz(); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  33312. + Keyword;[if];
  33313. + LeftParenthesis;[(];
  33314. + Identifier;[foo];
  33315. + RightParenthesis;[)];
  33316. + Whitespace;[ ];
  33317. + LeftBrace;[{];
  33318. + Whitespace;[ ];
  33319. + Identifier;[bar];
  33320. + LeftParenthesis;[(];
  33321. + RightParenthesis;[)];
  33322. + Semicolon;[;];
  33323. + Whitespace;[ ];
  33324. + RightBrace;[}];
  33325. + Whitespace;[ ];
  33326. + CSharpComment;[/* Foo */];
  33327. + Whitespace;[ ];
  33328. + CSharpComment;[/* Bar */];
  33329. + Whitespace;[ ];
  33330. + Keyword;[else];
  33331. + Whitespace;[ ];
  33332. + LeftBrace;[{];
  33333. + Whitespace;[ ];
  33334. + Identifier;[baz];
  33335. + LeftParenthesis;[(];
  33336. + RightParenthesis;[)];
  33337. + Semicolon;[;];
  33338. + Whitespace;[ ];
  33339. + RightBrace;[}];
  33340. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenIfAndElseIfClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenIfAndElseIfClause.stree.txt
  33341. index 6d0d09b6b47..67306cce2d9 100644
  33342. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenIfAndElseIfClause.stree.txt
  33343. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenIfAndElseIfClause.stree.txt
  33344. @@ -1,35 +1,37 @@
  33345. -Statement block - Gen<None> - 62 - (0:0,0)
  33346. - Code span - Gen<Stmt> - [if(foo) { bar(); } /* Foo */ /* Bar */ else if(bar) { baz(); }] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:33
  33347. - SyntaxKind.Keyword;[if];
  33348. - SyntaxKind.LeftParenthesis;[(];
  33349. - SyntaxKind.Identifier;[foo];
  33350. - SyntaxKind.RightParenthesis;[)];
  33351. - SyntaxKind.Whitespace;[ ];
  33352. - SyntaxKind.LeftBrace;[{];
  33353. - SyntaxKind.Whitespace;[ ];
  33354. - SyntaxKind.Identifier;[bar];
  33355. - SyntaxKind.LeftParenthesis;[(];
  33356. - SyntaxKind.RightParenthesis;[)];
  33357. - SyntaxKind.Semicolon;[;];
  33358. - SyntaxKind.Whitespace;[ ];
  33359. - SyntaxKind.RightBrace;[}];
  33360. - SyntaxKind.Whitespace;[ ];
  33361. - SyntaxKind.CSharpComment;[/* Foo */];
  33362. - SyntaxKind.Whitespace;[ ];
  33363. - SyntaxKind.CSharpComment;[/* Bar */];
  33364. - SyntaxKind.Whitespace;[ ];
  33365. - SyntaxKind.Keyword;[else];
  33366. - SyntaxKind.Whitespace;[ ];
  33367. - SyntaxKind.Keyword;[if];
  33368. - SyntaxKind.LeftParenthesis;[(];
  33369. - SyntaxKind.Identifier;[bar];
  33370. - SyntaxKind.RightParenthesis;[)];
  33371. - SyntaxKind.Whitespace;[ ];
  33372. - SyntaxKind.LeftBrace;[{];
  33373. - SyntaxKind.Whitespace;[ ];
  33374. - SyntaxKind.Identifier;[baz];
  33375. - SyntaxKind.LeftParenthesis;[(];
  33376. - SyntaxKind.RightParenthesis;[)];
  33377. - SyntaxKind.Semicolon;[;];
  33378. - SyntaxKind.Whitespace;[ ];
  33379. - SyntaxKind.RightBrace;[}];
  33380. +CSharpCodeBlock - [0..62)::62 - [if(foo) { bar(); } /* Foo */ /* Bar */ else if(bar) { baz(); }]
  33381. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  33382. + Transition;[<Missing>];
  33383. + CSharpStatementLiteral - [0..62)::62 - [if(foo) { bar(); } /* Foo */ /* Bar */ else if(bar) { baz(); }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  33384. + Keyword;[if];
  33385. + LeftParenthesis;[(];
  33386. + Identifier;[foo];
  33387. + RightParenthesis;[)];
  33388. + Whitespace;[ ];
  33389. + LeftBrace;[{];
  33390. + Whitespace;[ ];
  33391. + Identifier;[bar];
  33392. + LeftParenthesis;[(];
  33393. + RightParenthesis;[)];
  33394. + Semicolon;[;];
  33395. + Whitespace;[ ];
  33396. + RightBrace;[}];
  33397. + Whitespace;[ ];
  33398. + CSharpComment;[/* Foo */];
  33399. + Whitespace;[ ];
  33400. + CSharpComment;[/* Bar */];
  33401. + Whitespace;[ ];
  33402. + Keyword;[else];
  33403. + Whitespace;[ ];
  33404. + Keyword;[if];
  33405. + LeftParenthesis;[(];
  33406. + Identifier;[bar];
  33407. + RightParenthesis;[)];
  33408. + Whitespace;[ ];
  33409. + LeftBrace;[{];
  33410. + Whitespace;[ ];
  33411. + Identifier;[baz];
  33412. + LeftParenthesis;[(];
  33413. + RightParenthesis;[)];
  33414. + Semicolon;[;];
  33415. + Whitespace;[ ];
  33416. + RightBrace;[}];
  33417. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenTryAndCatchClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenTryAndCatchClause.stree.txt
  33418. index 7d9cdf7fb9c..7aa27c66574 100644
  33419. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenTryAndCatchClause.stree.txt
  33420. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenTryAndCatchClause.stree.txt
  33421. @@ -1,30 +1,32 @@
  33422. -Statement block - Gen<None> - 56 - (0:0,0)
  33423. - Code span - Gen<Stmt> - [try { bar(); } /* Foo */ /* Bar */ catch(bar) { baz(); }] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:28
  33424. - SyntaxKind.Keyword;[try];
  33425. - SyntaxKind.Whitespace;[ ];
  33426. - SyntaxKind.LeftBrace;[{];
  33427. - SyntaxKind.Whitespace;[ ];
  33428. - SyntaxKind.Identifier;[bar];
  33429. - SyntaxKind.LeftParenthesis;[(];
  33430. - SyntaxKind.RightParenthesis;[)];
  33431. - SyntaxKind.Semicolon;[;];
  33432. - SyntaxKind.Whitespace;[ ];
  33433. - SyntaxKind.RightBrace;[}];
  33434. - SyntaxKind.Whitespace;[ ];
  33435. - SyntaxKind.CSharpComment;[/* Foo */];
  33436. - SyntaxKind.Whitespace;[ ];
  33437. - SyntaxKind.CSharpComment;[/* Bar */];
  33438. - SyntaxKind.Whitespace;[ ];
  33439. - SyntaxKind.Keyword;[catch];
  33440. - SyntaxKind.LeftParenthesis;[(];
  33441. - SyntaxKind.Identifier;[bar];
  33442. - SyntaxKind.RightParenthesis;[)];
  33443. - SyntaxKind.Whitespace;[ ];
  33444. - SyntaxKind.LeftBrace;[{];
  33445. - SyntaxKind.Whitespace;[ ];
  33446. - SyntaxKind.Identifier;[baz];
  33447. - SyntaxKind.LeftParenthesis;[(];
  33448. - SyntaxKind.RightParenthesis;[)];
  33449. - SyntaxKind.Semicolon;[;];
  33450. - SyntaxKind.Whitespace;[ ];
  33451. - SyntaxKind.RightBrace;[}];
  33452. +CSharpCodeBlock - [0..56)::56 - [try { bar(); } /* Foo */ /* Bar */ catch(bar) { baz(); }]
  33453. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  33454. + Transition;[<Missing>];
  33455. + CSharpStatementLiteral - [0..56)::56 - [try { bar(); } /* Foo */ /* Bar */ catch(bar) { baz(); }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  33456. + Keyword;[try];
  33457. + Whitespace;[ ];
  33458. + LeftBrace;[{];
  33459. + Whitespace;[ ];
  33460. + Identifier;[bar];
  33461. + LeftParenthesis;[(];
  33462. + RightParenthesis;[)];
  33463. + Semicolon;[;];
  33464. + Whitespace;[ ];
  33465. + RightBrace;[}];
  33466. + Whitespace;[ ];
  33467. + CSharpComment;[/* Foo */];
  33468. + Whitespace;[ ];
  33469. + CSharpComment;[/* Bar */];
  33470. + Whitespace;[ ];
  33471. + Keyword;[catch];
  33472. + LeftParenthesis;[(];
  33473. + Identifier;[bar];
  33474. + RightParenthesis;[)];
  33475. + Whitespace;[ ];
  33476. + LeftBrace;[{];
  33477. + Whitespace;[ ];
  33478. + Identifier;[baz];
  33479. + LeftParenthesis;[(];
  33480. + RightParenthesis;[)];
  33481. + Semicolon;[;];
  33482. + Whitespace;[ ];
  33483. + RightBrace;[}];
  33484. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenTryAndFinallyClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenTryAndFinallyClause.stree.txt
  33485. index fc6549a8d0d..5ceedb1a4c0 100644
  33486. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenTryAndFinallyClause.stree.txt
  33487. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsBlockCommentBetweenTryAndFinallyClause.stree.txt
  33488. @@ -1,27 +1,29 @@
  33489. -Statement block - Gen<None> - 53 - (0:0,0)
  33490. - Code span - Gen<Stmt> - [try { bar(); } /* Foo */ /* Bar */ finally { baz(); }] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:25
  33491. - SyntaxKind.Keyword;[try];
  33492. - SyntaxKind.Whitespace;[ ];
  33493. - SyntaxKind.LeftBrace;[{];
  33494. - SyntaxKind.Whitespace;[ ];
  33495. - SyntaxKind.Identifier;[bar];
  33496. - SyntaxKind.LeftParenthesis;[(];
  33497. - SyntaxKind.RightParenthesis;[)];
  33498. - SyntaxKind.Semicolon;[;];
  33499. - SyntaxKind.Whitespace;[ ];
  33500. - SyntaxKind.RightBrace;[}];
  33501. - SyntaxKind.Whitespace;[ ];
  33502. - SyntaxKind.CSharpComment;[/* Foo */];
  33503. - SyntaxKind.Whitespace;[ ];
  33504. - SyntaxKind.CSharpComment;[/* Bar */];
  33505. - SyntaxKind.Whitespace;[ ];
  33506. - SyntaxKind.Keyword;[finally];
  33507. - SyntaxKind.Whitespace;[ ];
  33508. - SyntaxKind.LeftBrace;[{];
  33509. - SyntaxKind.Whitespace;[ ];
  33510. - SyntaxKind.Identifier;[baz];
  33511. - SyntaxKind.LeftParenthesis;[(];
  33512. - SyntaxKind.RightParenthesis;[)];
  33513. - SyntaxKind.Semicolon;[;];
  33514. - SyntaxKind.Whitespace;[ ];
  33515. - SyntaxKind.RightBrace;[}];
  33516. +CSharpCodeBlock - [0..53)::53 - [try { bar(); } /* Foo */ /* Bar */ finally { baz(); }]
  33517. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  33518. + Transition;[<Missing>];
  33519. + CSharpStatementLiteral - [0..53)::53 - [try { bar(); } /* Foo */ /* Bar */ finally { baz(); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  33520. + Keyword;[try];
  33521. + Whitespace;[ ];
  33522. + LeftBrace;[{];
  33523. + Whitespace;[ ];
  33524. + Identifier;[bar];
  33525. + LeftParenthesis;[(];
  33526. + RightParenthesis;[)];
  33527. + Semicolon;[;];
  33528. + Whitespace;[ ];
  33529. + RightBrace;[}];
  33530. + Whitespace;[ ];
  33531. + CSharpComment;[/* Foo */];
  33532. + Whitespace;[ ];
  33533. + CSharpComment;[/* Bar */];
  33534. + Whitespace;[ ];
  33535. + Keyword;[finally];
  33536. + Whitespace;[ ];
  33537. + LeftBrace;[{];
  33538. + Whitespace;[ ];
  33539. + Identifier;[baz];
  33540. + LeftParenthesis;[(];
  33541. + RightParenthesis;[)];
  33542. + Semicolon;[;];
  33543. + Whitespace;[ ];
  33544. + RightBrace;[}];
  33545. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsExceptionLessCatchClauses.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsExceptionLessCatchClauses.stree.txt
  33546. index cfdfe103939..a201eec0760 100644
  33547. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsExceptionLessCatchClauses.stree.txt
  33548. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsExceptionLessCatchClauses.stree.txt
  33549. @@ -1,37 +1,39 @@
  33550. -Statement block - Gen<None> - 53 - (0:0,0)
  33551. - Code span - Gen<Stmt> - [try { var foo = new { } } catch { var foo = new { } }] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:35
  33552. - SyntaxKind.Keyword;[try];
  33553. - SyntaxKind.Whitespace;[ ];
  33554. - SyntaxKind.LeftBrace;[{];
  33555. - SyntaxKind.Whitespace;[ ];
  33556. - SyntaxKind.Identifier;[var];
  33557. - SyntaxKind.Whitespace;[ ];
  33558. - SyntaxKind.Identifier;[foo];
  33559. - SyntaxKind.Whitespace;[ ];
  33560. - SyntaxKind.Assign;[=];
  33561. - SyntaxKind.Whitespace;[ ];
  33562. - SyntaxKind.Keyword;[new];
  33563. - SyntaxKind.Whitespace;[ ];
  33564. - SyntaxKind.LeftBrace;[{];
  33565. - SyntaxKind.Whitespace;[ ];
  33566. - SyntaxKind.RightBrace;[}];
  33567. - SyntaxKind.Whitespace;[ ];
  33568. - SyntaxKind.RightBrace;[}];
  33569. - SyntaxKind.Whitespace;[ ];
  33570. - SyntaxKind.Keyword;[catch];
  33571. - SyntaxKind.Whitespace;[ ];
  33572. - SyntaxKind.LeftBrace;[{];
  33573. - SyntaxKind.Whitespace;[ ];
  33574. - SyntaxKind.Identifier;[var];
  33575. - SyntaxKind.Whitespace;[ ];
  33576. - SyntaxKind.Identifier;[foo];
  33577. - SyntaxKind.Whitespace;[ ];
  33578. - SyntaxKind.Assign;[=];
  33579. - SyntaxKind.Whitespace;[ ];
  33580. - SyntaxKind.Keyword;[new];
  33581. - SyntaxKind.Whitespace;[ ];
  33582. - SyntaxKind.LeftBrace;[{];
  33583. - SyntaxKind.Whitespace;[ ];
  33584. - SyntaxKind.RightBrace;[}];
  33585. - SyntaxKind.Whitespace;[ ];
  33586. - SyntaxKind.RightBrace;[}];
  33587. +CSharpCodeBlock - [0..53)::53 - [try { var foo = new { } } catch { var foo = new { } }]
  33588. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  33589. + Transition;[<Missing>];
  33590. + CSharpStatementLiteral - [0..53)::53 - [try { var foo = new { } } catch { var foo = new { } }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  33591. + Keyword;[try];
  33592. + Whitespace;[ ];
  33593. + LeftBrace;[{];
  33594. + Whitespace;[ ];
  33595. + Identifier;[var];
  33596. + Whitespace;[ ];
  33597. + Identifier;[foo];
  33598. + Whitespace;[ ];
  33599. + Assign;[=];
  33600. + Whitespace;[ ];
  33601. + Keyword;[new];
  33602. + Whitespace;[ ];
  33603. + LeftBrace;[{];
  33604. + Whitespace;[ ];
  33605. + RightBrace;[}];
  33606. + Whitespace;[ ];
  33607. + RightBrace;[}];
  33608. + Whitespace;[ ];
  33609. + Keyword;[catch];
  33610. + Whitespace;[ ];
  33611. + LeftBrace;[{];
  33612. + Whitespace;[ ];
  33613. + Identifier;[var];
  33614. + Whitespace;[ ];
  33615. + Identifier;[foo];
  33616. + Whitespace;[ ];
  33617. + Assign;[=];
  33618. + Whitespace;[ ];
  33619. + Keyword;[new];
  33620. + Whitespace;[ ];
  33621. + LeftBrace;[{];
  33622. + Whitespace;[ ];
  33623. + RightBrace;[}];
  33624. + Whitespace;[ ];
  33625. + RightBrace;[}];
  33626. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenCatchAndFinallyClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenCatchAndFinallyClause.stree.txt
  33627. index 1c1dd32483b..299be65937f 100644
  33628. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenCatchAndFinallyClause.stree.txt
  33629. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenCatchAndFinallyClause.stree.txt
  33630. @@ -1,41 +1,43 @@
  33631. -Statement block - Gen<None> - 72 - (0:0,0)
  33632. - Code span - Gen<Stmt> - [try { bar(); } catch(bar) { baz(); }LF// FooLF// BarLFfinally { biz(); }] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:39
  33633. - SyntaxKind.Keyword;[try];
  33634. - SyntaxKind.Whitespace;[ ];
  33635. - SyntaxKind.LeftBrace;[{];
  33636. - SyntaxKind.Whitespace;[ ];
  33637. - SyntaxKind.Identifier;[bar];
  33638. - SyntaxKind.LeftParenthesis;[(];
  33639. - SyntaxKind.RightParenthesis;[)];
  33640. - SyntaxKind.Semicolon;[;];
  33641. - SyntaxKind.Whitespace;[ ];
  33642. - SyntaxKind.RightBrace;[}];
  33643. - SyntaxKind.Whitespace;[ ];
  33644. - SyntaxKind.Keyword;[catch];
  33645. - SyntaxKind.LeftParenthesis;[(];
  33646. - SyntaxKind.Identifier;[bar];
  33647. - SyntaxKind.RightParenthesis;[)];
  33648. - SyntaxKind.Whitespace;[ ];
  33649. - SyntaxKind.LeftBrace;[{];
  33650. - SyntaxKind.Whitespace;[ ];
  33651. - SyntaxKind.Identifier;[baz];
  33652. - SyntaxKind.LeftParenthesis;[(];
  33653. - SyntaxKind.RightParenthesis;[)];
  33654. - SyntaxKind.Semicolon;[;];
  33655. - SyntaxKind.Whitespace;[ ];
  33656. - SyntaxKind.RightBrace;[}];
  33657. - SyntaxKind.NewLine;[LF];
  33658. - SyntaxKind.CSharpComment;[// Foo];
  33659. - SyntaxKind.NewLine;[LF];
  33660. - SyntaxKind.CSharpComment;[// Bar];
  33661. - SyntaxKind.NewLine;[LF];
  33662. - SyntaxKind.Keyword;[finally];
  33663. - SyntaxKind.Whitespace;[ ];
  33664. - SyntaxKind.LeftBrace;[{];
  33665. - SyntaxKind.Whitespace;[ ];
  33666. - SyntaxKind.Identifier;[biz];
  33667. - SyntaxKind.LeftParenthesis;[(];
  33668. - SyntaxKind.RightParenthesis;[)];
  33669. - SyntaxKind.Semicolon;[;];
  33670. - SyntaxKind.Whitespace;[ ];
  33671. - SyntaxKind.RightBrace;[}];
  33672. +CSharpCodeBlock - [0..72)::72 - [try { bar(); } catch(bar) { baz(); }LF// FooLF// BarLFfinally { biz(); }]
  33673. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  33674. + Transition;[<Missing>];
  33675. + CSharpStatementLiteral - [0..72)::72 - [try { bar(); } catch(bar) { baz(); }LF// FooLF// BarLFfinally { biz(); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  33676. + Keyword;[try];
  33677. + Whitespace;[ ];
  33678. + LeftBrace;[{];
  33679. + Whitespace;[ ];
  33680. + Identifier;[bar];
  33681. + LeftParenthesis;[(];
  33682. + RightParenthesis;[)];
  33683. + Semicolon;[;];
  33684. + Whitespace;[ ];
  33685. + RightBrace;[}];
  33686. + Whitespace;[ ];
  33687. + Keyword;[catch];
  33688. + LeftParenthesis;[(];
  33689. + Identifier;[bar];
  33690. + RightParenthesis;[)];
  33691. + Whitespace;[ ];
  33692. + LeftBrace;[{];
  33693. + Whitespace;[ ];
  33694. + Identifier;[baz];
  33695. + LeftParenthesis;[(];
  33696. + RightParenthesis;[)];
  33697. + Semicolon;[;];
  33698. + Whitespace;[ ];
  33699. + RightBrace;[}];
  33700. + NewLine;[LF];
  33701. + CSharpComment;[// Foo];
  33702. + NewLine;[LF];
  33703. + CSharpComment;[// Bar];
  33704. + NewLine;[LF];
  33705. + Keyword;[finally];
  33706. + Whitespace;[ ];
  33707. + LeftBrace;[{];
  33708. + Whitespace;[ ];
  33709. + Identifier;[biz];
  33710. + LeftParenthesis;[(];
  33711. + RightParenthesis;[)];
  33712. + Semicolon;[;];
  33713. + Whitespace;[ ];
  33714. + RightBrace;[}];
  33715. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenDoAndWhileClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenDoAndWhileClause.stree.txt
  33716. index 2882f0ab417..34203c8a112 100644
  33717. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenDoAndWhileClause.stree.txt
  33718. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenDoAndWhileClause.stree.txt
  33719. @@ -1,26 +1,28 @@
  33720. -Statement block - Gen<None> - 51 - (0:0,0)
  33721. - Code span - Gen<Stmt> - [do { var foo = bar; }LF// FooLF// BarLFwhile(true);] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:24
  33722. - SyntaxKind.Keyword;[do];
  33723. - SyntaxKind.Whitespace;[ ];
  33724. - SyntaxKind.LeftBrace;[{];
  33725. - SyntaxKind.Whitespace;[ ];
  33726. - SyntaxKind.Identifier;[var];
  33727. - SyntaxKind.Whitespace;[ ];
  33728. - SyntaxKind.Identifier;[foo];
  33729. - SyntaxKind.Whitespace;[ ];
  33730. - SyntaxKind.Assign;[=];
  33731. - SyntaxKind.Whitespace;[ ];
  33732. - SyntaxKind.Identifier;[bar];
  33733. - SyntaxKind.Semicolon;[;];
  33734. - SyntaxKind.Whitespace;[ ];
  33735. - SyntaxKind.RightBrace;[}];
  33736. - SyntaxKind.NewLine;[LF];
  33737. - SyntaxKind.CSharpComment;[// Foo];
  33738. - SyntaxKind.NewLine;[LF];
  33739. - SyntaxKind.CSharpComment;[// Bar];
  33740. - SyntaxKind.NewLine;[LF];
  33741. - SyntaxKind.Keyword;[while];
  33742. - SyntaxKind.LeftParenthesis;[(];
  33743. - SyntaxKind.Keyword;[true];
  33744. - SyntaxKind.RightParenthesis;[)];
  33745. - SyntaxKind.Semicolon;[;];
  33746. +CSharpCodeBlock - [0..51)::51 - [do { var foo = bar; }LF// FooLF// BarLFwhile(true);]
  33747. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  33748. + Transition;[<Missing>];
  33749. + CSharpStatementLiteral - [0..51)::51 - [do { var foo = bar; }LF// FooLF// BarLFwhile(true);] - Gen<Stmt> - SpanEditHandler;Accepts:None
  33750. + Keyword;[do];
  33751. + Whitespace;[ ];
  33752. + LeftBrace;[{];
  33753. + Whitespace;[ ];
  33754. + Identifier;[var];
  33755. + Whitespace;[ ];
  33756. + Identifier;[foo];
  33757. + Whitespace;[ ];
  33758. + Assign;[=];
  33759. + Whitespace;[ ];
  33760. + Identifier;[bar];
  33761. + Semicolon;[;];
  33762. + Whitespace;[ ];
  33763. + RightBrace;[}];
  33764. + NewLine;[LF];
  33765. + CSharpComment;[// Foo];
  33766. + NewLine;[LF];
  33767. + CSharpComment;[// Bar];
  33768. + NewLine;[LF];
  33769. + Keyword;[while];
  33770. + LeftParenthesis;[(];
  33771. + Keyword;[true];
  33772. + RightParenthesis;[)];
  33773. + Semicolon;[;];
  33774. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenElseIfAndElseClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenElseIfAndElseClause.stree.txt
  33775. index 0fc2eef2b15..9e4a455d647 100644
  33776. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenElseIfAndElseClause.stree.txt
  33777. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenElseIfAndElseClause.stree.txt
  33778. @@ -1,46 +1,48 @@
  33779. -Statement block - Gen<None> - 75 - (0:0,0)
  33780. - Code span - Gen<Stmt> - [if(foo) { bar(); } else if(bar) { baz(); }LF// FooLF// BarLFelse { biz(); }] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:44
  33781. - SyntaxKind.Keyword;[if];
  33782. - SyntaxKind.LeftParenthesis;[(];
  33783. - SyntaxKind.Identifier;[foo];
  33784. - SyntaxKind.RightParenthesis;[)];
  33785. - SyntaxKind.Whitespace;[ ];
  33786. - SyntaxKind.LeftBrace;[{];
  33787. - SyntaxKind.Whitespace;[ ];
  33788. - SyntaxKind.Identifier;[bar];
  33789. - SyntaxKind.LeftParenthesis;[(];
  33790. - SyntaxKind.RightParenthesis;[)];
  33791. - SyntaxKind.Semicolon;[;];
  33792. - SyntaxKind.Whitespace;[ ];
  33793. - SyntaxKind.RightBrace;[}];
  33794. - SyntaxKind.Whitespace;[ ];
  33795. - SyntaxKind.Keyword;[else];
  33796. - SyntaxKind.Whitespace;[ ];
  33797. - SyntaxKind.Keyword;[if];
  33798. - SyntaxKind.LeftParenthesis;[(];
  33799. - SyntaxKind.Identifier;[bar];
  33800. - SyntaxKind.RightParenthesis;[)];
  33801. - SyntaxKind.Whitespace;[ ];
  33802. - SyntaxKind.LeftBrace;[{];
  33803. - SyntaxKind.Whitespace;[ ];
  33804. - SyntaxKind.Identifier;[baz];
  33805. - SyntaxKind.LeftParenthesis;[(];
  33806. - SyntaxKind.RightParenthesis;[)];
  33807. - SyntaxKind.Semicolon;[;];
  33808. - SyntaxKind.Whitespace;[ ];
  33809. - SyntaxKind.RightBrace;[}];
  33810. - SyntaxKind.NewLine;[LF];
  33811. - SyntaxKind.CSharpComment;[// Foo];
  33812. - SyntaxKind.NewLine;[LF];
  33813. - SyntaxKind.CSharpComment;[// Bar];
  33814. - SyntaxKind.NewLine;[LF];
  33815. - SyntaxKind.Keyword;[else];
  33816. - SyntaxKind.Whitespace;[ ];
  33817. - SyntaxKind.LeftBrace;[{];
  33818. - SyntaxKind.Whitespace;[ ];
  33819. - SyntaxKind.Identifier;[biz];
  33820. - SyntaxKind.LeftParenthesis;[(];
  33821. - SyntaxKind.RightParenthesis;[)];
  33822. - SyntaxKind.Semicolon;[;];
  33823. - SyntaxKind.Whitespace;[ ];
  33824. - SyntaxKind.RightBrace;[}];
  33825. +CSharpCodeBlock - [0..75)::75 - [if(foo) { bar(); } else if(bar) { baz(); }LF// FooLF// BarLFelse { biz(); }]
  33826. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  33827. + Transition;[<Missing>];
  33828. + CSharpStatementLiteral - [0..75)::75 - [if(foo) { bar(); } else if(bar) { baz(); }LF// FooLF// BarLFelse { biz(); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  33829. + Keyword;[if];
  33830. + LeftParenthesis;[(];
  33831. + Identifier;[foo];
  33832. + RightParenthesis;[)];
  33833. + Whitespace;[ ];
  33834. + LeftBrace;[{];
  33835. + Whitespace;[ ];
  33836. + Identifier;[bar];
  33837. + LeftParenthesis;[(];
  33838. + RightParenthesis;[)];
  33839. + Semicolon;[;];
  33840. + Whitespace;[ ];
  33841. + RightBrace;[}];
  33842. + Whitespace;[ ];
  33843. + Keyword;[else];
  33844. + Whitespace;[ ];
  33845. + Keyword;[if];
  33846. + LeftParenthesis;[(];
  33847. + Identifier;[bar];
  33848. + RightParenthesis;[)];
  33849. + Whitespace;[ ];
  33850. + LeftBrace;[{];
  33851. + Whitespace;[ ];
  33852. + Identifier;[baz];
  33853. + LeftParenthesis;[(];
  33854. + RightParenthesis;[)];
  33855. + Semicolon;[;];
  33856. + Whitespace;[ ];
  33857. + RightBrace;[}];
  33858. + NewLine;[LF];
  33859. + CSharpComment;[// Foo];
  33860. + NewLine;[LF];
  33861. + CSharpComment;[// Bar];
  33862. + NewLine;[LF];
  33863. + Keyword;[else];
  33864. + Whitespace;[ ];
  33865. + LeftBrace;[{];
  33866. + Whitespace;[ ];
  33867. + Identifier;[biz];
  33868. + LeftParenthesis;[(];
  33869. + RightParenthesis;[)];
  33870. + Semicolon;[;];
  33871. + Whitespace;[ ];
  33872. + RightBrace;[}];
  33873. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenIfAndElseClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenIfAndElseClause.stree.txt
  33874. index ab73bc44460..b5623098dc9 100644
  33875. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenIfAndElseClause.stree.txt
  33876. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenIfAndElseClause.stree.txt
  33877. @@ -1,30 +1,32 @@
  33878. -Statement block - Gen<None> - 51 - (0:0,0)
  33879. - Code span - Gen<Stmt> - [if(foo) { bar(); }LF// FooLF// BarLFelse { baz(); }] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:28
  33880. - SyntaxKind.Keyword;[if];
  33881. - SyntaxKind.LeftParenthesis;[(];
  33882. - SyntaxKind.Identifier;[foo];
  33883. - SyntaxKind.RightParenthesis;[)];
  33884. - SyntaxKind.Whitespace;[ ];
  33885. - SyntaxKind.LeftBrace;[{];
  33886. - SyntaxKind.Whitespace;[ ];
  33887. - SyntaxKind.Identifier;[bar];
  33888. - SyntaxKind.LeftParenthesis;[(];
  33889. - SyntaxKind.RightParenthesis;[)];
  33890. - SyntaxKind.Semicolon;[;];
  33891. - SyntaxKind.Whitespace;[ ];
  33892. - SyntaxKind.RightBrace;[}];
  33893. - SyntaxKind.NewLine;[LF];
  33894. - SyntaxKind.CSharpComment;[// Foo];
  33895. - SyntaxKind.NewLine;[LF];
  33896. - SyntaxKind.CSharpComment;[// Bar];
  33897. - SyntaxKind.NewLine;[LF];
  33898. - SyntaxKind.Keyword;[else];
  33899. - SyntaxKind.Whitespace;[ ];
  33900. - SyntaxKind.LeftBrace;[{];
  33901. - SyntaxKind.Whitespace;[ ];
  33902. - SyntaxKind.Identifier;[baz];
  33903. - SyntaxKind.LeftParenthesis;[(];
  33904. - SyntaxKind.RightParenthesis;[)];
  33905. - SyntaxKind.Semicolon;[;];
  33906. - SyntaxKind.Whitespace;[ ];
  33907. - SyntaxKind.RightBrace;[}];
  33908. +CSharpCodeBlock - [0..51)::51 - [if(foo) { bar(); }LF// FooLF// BarLFelse { baz(); }]
  33909. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  33910. + Transition;[<Missing>];
  33911. + CSharpStatementLiteral - [0..51)::51 - [if(foo) { bar(); }LF// FooLF// BarLFelse { baz(); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  33912. + Keyword;[if];
  33913. + LeftParenthesis;[(];
  33914. + Identifier;[foo];
  33915. + RightParenthesis;[)];
  33916. + Whitespace;[ ];
  33917. + LeftBrace;[{];
  33918. + Whitespace;[ ];
  33919. + Identifier;[bar];
  33920. + LeftParenthesis;[(];
  33921. + RightParenthesis;[)];
  33922. + Semicolon;[;];
  33923. + Whitespace;[ ];
  33924. + RightBrace;[}];
  33925. + NewLine;[LF];
  33926. + CSharpComment;[// Foo];
  33927. + NewLine;[LF];
  33928. + CSharpComment;[// Bar];
  33929. + NewLine;[LF];
  33930. + Keyword;[else];
  33931. + Whitespace;[ ];
  33932. + LeftBrace;[{];
  33933. + Whitespace;[ ];
  33934. + Identifier;[baz];
  33935. + LeftParenthesis;[(];
  33936. + RightParenthesis;[)];
  33937. + Semicolon;[;];
  33938. + Whitespace;[ ];
  33939. + RightBrace;[}];
  33940. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenIfAndElseIfClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenIfAndElseIfClause.stree.txt
  33941. index a151fa562e8..3743f860943 100644
  33942. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenIfAndElseIfClause.stree.txt
  33943. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenIfAndElseIfClause.stree.txt
  33944. @@ -1,35 +1,37 @@
  33945. -Statement block - Gen<None> - 59 - (0:0,0)
  33946. - Code span - Gen<Stmt> - [if(foo) { bar(); }LF// FooLF// BarLFelse if(bar) { baz(); }] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:33
  33947. - SyntaxKind.Keyword;[if];
  33948. - SyntaxKind.LeftParenthesis;[(];
  33949. - SyntaxKind.Identifier;[foo];
  33950. - SyntaxKind.RightParenthesis;[)];
  33951. - SyntaxKind.Whitespace;[ ];
  33952. - SyntaxKind.LeftBrace;[{];
  33953. - SyntaxKind.Whitespace;[ ];
  33954. - SyntaxKind.Identifier;[bar];
  33955. - SyntaxKind.LeftParenthesis;[(];
  33956. - SyntaxKind.RightParenthesis;[)];
  33957. - SyntaxKind.Semicolon;[;];
  33958. - SyntaxKind.Whitespace;[ ];
  33959. - SyntaxKind.RightBrace;[}];
  33960. - SyntaxKind.NewLine;[LF];
  33961. - SyntaxKind.CSharpComment;[// Foo];
  33962. - SyntaxKind.NewLine;[LF];
  33963. - SyntaxKind.CSharpComment;[// Bar];
  33964. - SyntaxKind.NewLine;[LF];
  33965. - SyntaxKind.Keyword;[else];
  33966. - SyntaxKind.Whitespace;[ ];
  33967. - SyntaxKind.Keyword;[if];
  33968. - SyntaxKind.LeftParenthesis;[(];
  33969. - SyntaxKind.Identifier;[bar];
  33970. - SyntaxKind.RightParenthesis;[)];
  33971. - SyntaxKind.Whitespace;[ ];
  33972. - SyntaxKind.LeftBrace;[{];
  33973. - SyntaxKind.Whitespace;[ ];
  33974. - SyntaxKind.Identifier;[baz];
  33975. - SyntaxKind.LeftParenthesis;[(];
  33976. - SyntaxKind.RightParenthesis;[)];
  33977. - SyntaxKind.Semicolon;[;];
  33978. - SyntaxKind.Whitespace;[ ];
  33979. - SyntaxKind.RightBrace;[}];
  33980. +CSharpCodeBlock - [0..59)::59 - [if(foo) { bar(); }LF// FooLF// BarLFelse if(bar) { baz(); }]
  33981. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  33982. + Transition;[<Missing>];
  33983. + CSharpStatementLiteral - [0..59)::59 - [if(foo) { bar(); }LF// FooLF// BarLFelse if(bar) { baz(); }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  33984. + Keyword;[if];
  33985. + LeftParenthesis;[(];
  33986. + Identifier;[foo];
  33987. + RightParenthesis;[)];
  33988. + Whitespace;[ ];
  33989. + LeftBrace;[{];
  33990. + Whitespace;[ ];
  33991. + Identifier;[bar];
  33992. + LeftParenthesis;[(];
  33993. + RightParenthesis;[)];
  33994. + Semicolon;[;];
  33995. + Whitespace;[ ];
  33996. + RightBrace;[}];
  33997. + NewLine;[LF];
  33998. + CSharpComment;[// Foo];
  33999. + NewLine;[LF];
  34000. + CSharpComment;[// Bar];
  34001. + NewLine;[LF];
  34002. + Keyword;[else];
  34003. + Whitespace;[ ];
  34004. + Keyword;[if];
  34005. + LeftParenthesis;[(];
  34006. + Identifier;[bar];
  34007. + RightParenthesis;[)];
  34008. + Whitespace;[ ];
  34009. + LeftBrace;[{];
  34010. + Whitespace;[ ];
  34011. + Identifier;[baz];
  34012. + LeftParenthesis;[(];
  34013. + RightParenthesis;[)];
  34014. + Semicolon;[;];
  34015. + Whitespace;[ ];
  34016. + RightBrace;[}];
  34017. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenTryAndCatchClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenTryAndCatchClause.stree.txt
  34018. index 51faa5f9e73..efec2a57447 100644
  34019. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenTryAndCatchClause.stree.txt
  34020. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenTryAndCatchClause.stree.txt
  34021. @@ -1,30 +1,32 @@
  34022. -Statement block - Gen<None> - 53 - (0:0,0)
  34023. - Code span - Gen<Stmt> - [try { bar(); }LF// FooLF// BarLFcatch(bar) { baz(); }] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:28
  34024. - SyntaxKind.Keyword;[try];
  34025. - SyntaxKind.Whitespace;[ ];
  34026. - SyntaxKind.LeftBrace;[{];
  34027. - SyntaxKind.Whitespace;[ ];
  34028. - SyntaxKind.Identifier;[bar];
  34029. - SyntaxKind.LeftParenthesis;[(];
  34030. - SyntaxKind.RightParenthesis;[)];
  34031. - SyntaxKind.Semicolon;[;];
  34032. - SyntaxKind.Whitespace;[ ];
  34033. - SyntaxKind.RightBrace;[}];
  34034. - SyntaxKind.NewLine;[LF];
  34035. - SyntaxKind.CSharpComment;[// Foo];
  34036. - SyntaxKind.NewLine;[LF];
  34037. - SyntaxKind.CSharpComment;[// Bar];
  34038. - SyntaxKind.NewLine;[LF];
  34039. - SyntaxKind.Keyword;[catch];
  34040. - SyntaxKind.LeftParenthesis;[(];
  34041. - SyntaxKind.Identifier;[bar];
  34042. - SyntaxKind.RightParenthesis;[)];
  34043. - SyntaxKind.Whitespace;[ ];
  34044. - SyntaxKind.LeftBrace;[{];
  34045. - SyntaxKind.Whitespace;[ ];
  34046. - SyntaxKind.Identifier;[baz];
  34047. - SyntaxKind.LeftParenthesis;[(];
  34048. - SyntaxKind.RightParenthesis;[)];
  34049. - SyntaxKind.Semicolon;[;];
  34050. - SyntaxKind.Whitespace;[ ];
  34051. - SyntaxKind.RightBrace;[}];
  34052. +CSharpCodeBlock - [0..53)::53 - [try { bar(); }LF// FooLF// BarLFcatch(bar) { baz(); }]
  34053. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  34054. + Transition;[<Missing>];
  34055. + CSharpStatementLiteral - [0..53)::53 - [try { bar(); }LF// FooLF// BarLFcatch(bar) { baz(); }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  34056. + Keyword;[try];
  34057. + Whitespace;[ ];
  34058. + LeftBrace;[{];
  34059. + Whitespace;[ ];
  34060. + Identifier;[bar];
  34061. + LeftParenthesis;[(];
  34062. + RightParenthesis;[)];
  34063. + Semicolon;[;];
  34064. + Whitespace;[ ];
  34065. + RightBrace;[}];
  34066. + NewLine;[LF];
  34067. + CSharpComment;[// Foo];
  34068. + NewLine;[LF];
  34069. + CSharpComment;[// Bar];
  34070. + NewLine;[LF];
  34071. + Keyword;[catch];
  34072. + LeftParenthesis;[(];
  34073. + Identifier;[bar];
  34074. + RightParenthesis;[)];
  34075. + Whitespace;[ ];
  34076. + LeftBrace;[{];
  34077. + Whitespace;[ ];
  34078. + Identifier;[baz];
  34079. + LeftParenthesis;[(];
  34080. + RightParenthesis;[)];
  34081. + Semicolon;[;];
  34082. + Whitespace;[ ];
  34083. + RightBrace;[}];
  34084. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenTryAndFinallyClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenTryAndFinallyClause.stree.txt
  34085. index 1bdb46e8d97..ab272ae2fa1 100644
  34086. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenTryAndFinallyClause.stree.txt
  34087. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsLineCommentBetweenTryAndFinallyClause.stree.txt
  34088. @@ -1,27 +1,29 @@
  34089. -Statement block - Gen<None> - 50 - (0:0,0)
  34090. - Code span - Gen<Stmt> - [try { bar(); }LF// FooLF// BarLFfinally { baz(); }] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:25
  34091. - SyntaxKind.Keyword;[try];
  34092. - SyntaxKind.Whitespace;[ ];
  34093. - SyntaxKind.LeftBrace;[{];
  34094. - SyntaxKind.Whitespace;[ ];
  34095. - SyntaxKind.Identifier;[bar];
  34096. - SyntaxKind.LeftParenthesis;[(];
  34097. - SyntaxKind.RightParenthesis;[)];
  34098. - SyntaxKind.Semicolon;[;];
  34099. - SyntaxKind.Whitespace;[ ];
  34100. - SyntaxKind.RightBrace;[}];
  34101. - SyntaxKind.NewLine;[LF];
  34102. - SyntaxKind.CSharpComment;[// Foo];
  34103. - SyntaxKind.NewLine;[LF];
  34104. - SyntaxKind.CSharpComment;[// Bar];
  34105. - SyntaxKind.NewLine;[LF];
  34106. - SyntaxKind.Keyword;[finally];
  34107. - SyntaxKind.Whitespace;[ ];
  34108. - SyntaxKind.LeftBrace;[{];
  34109. - SyntaxKind.Whitespace;[ ];
  34110. - SyntaxKind.Identifier;[baz];
  34111. - SyntaxKind.LeftParenthesis;[(];
  34112. - SyntaxKind.RightParenthesis;[)];
  34113. - SyntaxKind.Semicolon;[;];
  34114. - SyntaxKind.Whitespace;[ ];
  34115. - SyntaxKind.RightBrace;[}];
  34116. +CSharpCodeBlock - [0..50)::50 - [try { bar(); }LF// FooLF// BarLFfinally { baz(); }]
  34117. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  34118. + Transition;[<Missing>];
  34119. + CSharpStatementLiteral - [0..50)::50 - [try { bar(); }LF// FooLF// BarLFfinally { baz(); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  34120. + Keyword;[try];
  34121. + Whitespace;[ ];
  34122. + LeftBrace;[{];
  34123. + Whitespace;[ ];
  34124. + Identifier;[bar];
  34125. + LeftParenthesis;[(];
  34126. + RightParenthesis;[)];
  34127. + Semicolon;[;];
  34128. + Whitespace;[ ];
  34129. + RightBrace;[}];
  34130. + NewLine;[LF];
  34131. + CSharpComment;[// Foo];
  34132. + NewLine;[LF];
  34133. + CSharpComment;[// Bar];
  34134. + NewLine;[LF];
  34135. + Keyword;[finally];
  34136. + Whitespace;[ ];
  34137. + LeftBrace;[{];
  34138. + Whitespace;[ ];
  34139. + Identifier;[baz];
  34140. + LeftParenthesis;[(];
  34141. + RightParenthesis;[)];
  34142. + Semicolon;[;];
  34143. + Whitespace;[ ];
  34144. + RightBrace;[}];
  34145. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsMarkupWithinAdditionalCatchClauses.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsMarkupWithinAdditionalCatchClauses.stree.txt
  34146. index f8e06150979..ba3619a3762 100644
  34147. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsMarkupWithinAdditionalCatchClauses.stree.txt
  34148. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsMarkupWithinAdditionalCatchClauses.stree.txt
  34149. @@ -1,100 +1,102 @@
  34150. -Statement block - Gen<None> - 141 - (0:0,0)
  34151. - Code span - Gen<Stmt> - [try { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } } catch(Foo Bar Baz) {] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:78
  34152. - SyntaxKind.Keyword;[try];
  34153. - SyntaxKind.Whitespace;[ ];
  34154. - SyntaxKind.LeftBrace;[{];
  34155. - SyntaxKind.Whitespace;[ ];
  34156. - SyntaxKind.Identifier;[var];
  34157. - SyntaxKind.Whitespace;[ ];
  34158. - SyntaxKind.Identifier;[foo];
  34159. - SyntaxKind.Whitespace;[ ];
  34160. - SyntaxKind.Assign;[=];
  34161. - SyntaxKind.Whitespace;[ ];
  34162. - SyntaxKind.Keyword;[new];
  34163. - SyntaxKind.Whitespace;[ ];
  34164. - SyntaxKind.LeftBrace;[{];
  34165. - SyntaxKind.Whitespace;[ ];
  34166. - SyntaxKind.RightBrace;[}];
  34167. - SyntaxKind.Whitespace;[ ];
  34168. - SyntaxKind.RightBrace;[}];
  34169. - SyntaxKind.Whitespace;[ ];
  34170. - SyntaxKind.Keyword;[catch];
  34171. - SyntaxKind.LeftParenthesis;[(];
  34172. - SyntaxKind.Identifier;[Foo];
  34173. - SyntaxKind.Whitespace;[ ];
  34174. - SyntaxKind.Identifier;[Bar];
  34175. - SyntaxKind.Whitespace;[ ];
  34176. - SyntaxKind.Identifier;[Baz];
  34177. - SyntaxKind.RightParenthesis;[)];
  34178. - SyntaxKind.Whitespace;[ ];
  34179. - SyntaxKind.LeftBrace;[{];
  34180. - SyntaxKind.Whitespace;[ ];
  34181. - SyntaxKind.Identifier;[var];
  34182. - SyntaxKind.Whitespace;[ ];
  34183. - SyntaxKind.Identifier;[foo];
  34184. - SyntaxKind.Whitespace;[ ];
  34185. - SyntaxKind.Assign;[=];
  34186. - SyntaxKind.Whitespace;[ ];
  34187. - SyntaxKind.Keyword;[new];
  34188. - SyntaxKind.Whitespace;[ ];
  34189. - SyntaxKind.LeftBrace;[{];
  34190. - SyntaxKind.Whitespace;[ ];
  34191. - SyntaxKind.RightBrace;[}];
  34192. - SyntaxKind.Whitespace;[ ];
  34193. - SyntaxKind.RightBrace;[}];
  34194. - SyntaxKind.Whitespace;[ ];
  34195. - SyntaxKind.Keyword;[catch];
  34196. - SyntaxKind.LeftParenthesis;[(];
  34197. - SyntaxKind.Identifier;[Foo];
  34198. - SyntaxKind.Whitespace;[ ];
  34199. - SyntaxKind.Identifier;[Bar];
  34200. - SyntaxKind.Whitespace;[ ];
  34201. - SyntaxKind.Identifier;[Baz];
  34202. - SyntaxKind.RightParenthesis;[)];
  34203. - SyntaxKind.Whitespace;[ ];
  34204. - SyntaxKind.LeftBrace;[{];
  34205. - SyntaxKind.Whitespace;[ ];
  34206. - SyntaxKind.Identifier;[var];
  34207. - SyntaxKind.Whitespace;[ ];
  34208. - SyntaxKind.Identifier;[foo];
  34209. - SyntaxKind.Whitespace;[ ];
  34210. - SyntaxKind.Assign;[=];
  34211. - SyntaxKind.Whitespace;[ ];
  34212. - SyntaxKind.Keyword;[new];
  34213. - SyntaxKind.Whitespace;[ ];
  34214. - SyntaxKind.LeftBrace;[{];
  34215. - SyntaxKind.Whitespace;[ ];
  34216. - SyntaxKind.RightBrace;[}];
  34217. - SyntaxKind.Whitespace;[ ];
  34218. - SyntaxKind.RightBrace;[}];
  34219. - SyntaxKind.Whitespace;[ ];
  34220. - SyntaxKind.Keyword;[catch];
  34221. - SyntaxKind.LeftParenthesis;[(];
  34222. - SyntaxKind.Identifier;[Foo];
  34223. - SyntaxKind.Whitespace;[ ];
  34224. - SyntaxKind.Identifier;[Bar];
  34225. - SyntaxKind.Whitespace;[ ];
  34226. - SyntaxKind.Identifier;[Baz];
  34227. - SyntaxKind.RightParenthesis;[)];
  34228. - SyntaxKind.Whitespace;[ ];
  34229. - SyntaxKind.LeftBrace;[{];
  34230. - Markup block - Gen<None> - 12 - (128:0,128)
  34231. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (128:0,128) - Tokens:1
  34232. - SyntaxKind.Whitespace;[ ];
  34233. - Tag block - Gen<None> - 3 - (129:0,129)
  34234. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (129:0,129) - Tokens:3
  34235. - SyntaxKind.OpenAngle;[<];
  34236. - SyntaxKind.Text;[p];
  34237. - SyntaxKind.CloseAngle;[>];
  34238. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:Any - (132:0,132) - Tokens:1
  34239. - SyntaxKind.Text;[Foo];
  34240. - Tag block - Gen<None> - 4 - (135:0,135)
  34241. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (135:0,135) - Tokens:4
  34242. - SyntaxKind.OpenAngle;[<];
  34243. - SyntaxKind.ForwardSlash;[/];
  34244. - SyntaxKind.Text;[p];
  34245. - SyntaxKind.CloseAngle;[>];
  34246. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (139:0,139) - Tokens:1
  34247. - SyntaxKind.Whitespace;[ ];
  34248. - Code span - Gen<Stmt> - [}] - SpanEditHandler;Accepts:Any - (140:0,140) - Tokens:1
  34249. - SyntaxKind.RightBrace;[}];
  34250. +CSharpCodeBlock - [0..141)::141 - [try { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } } catch(Foo Bar Baz) { <p>Foo</p> }]
  34251. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  34252. + Transition;[<Missing>];
  34253. + CSharpStatementLiteral - [0..128)::128 - [try { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } } catch(Foo Bar Baz) {] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  34254. + Keyword;[try];
  34255. + Whitespace;[ ];
  34256. + LeftBrace;[{];
  34257. + Whitespace;[ ];
  34258. + Identifier;[var];
  34259. + Whitespace;[ ];
  34260. + Identifier;[foo];
  34261. + Whitespace;[ ];
  34262. + Assign;[=];
  34263. + Whitespace;[ ];
  34264. + Keyword;[new];
  34265. + Whitespace;[ ];
  34266. + LeftBrace;[{];
  34267. + Whitespace;[ ];
  34268. + RightBrace;[}];
  34269. + Whitespace;[ ];
  34270. + RightBrace;[}];
  34271. + Whitespace;[ ];
  34272. + Keyword;[catch];
  34273. + LeftParenthesis;[(];
  34274. + Identifier;[Foo];
  34275. + Whitespace;[ ];
  34276. + Identifier;[Bar];
  34277. + Whitespace;[ ];
  34278. + Identifier;[Baz];
  34279. + RightParenthesis;[)];
  34280. + Whitespace;[ ];
  34281. + LeftBrace;[{];
  34282. + Whitespace;[ ];
  34283. + Identifier;[var];
  34284. + Whitespace;[ ];
  34285. + Identifier;[foo];
  34286. + Whitespace;[ ];
  34287. + Assign;[=];
  34288. + Whitespace;[ ];
  34289. + Keyword;[new];
  34290. + Whitespace;[ ];
  34291. + LeftBrace;[{];
  34292. + Whitespace;[ ];
  34293. + RightBrace;[}];
  34294. + Whitespace;[ ];
  34295. + RightBrace;[}];
  34296. + Whitespace;[ ];
  34297. + Keyword;[catch];
  34298. + LeftParenthesis;[(];
  34299. + Identifier;[Foo];
  34300. + Whitespace;[ ];
  34301. + Identifier;[Bar];
  34302. + Whitespace;[ ];
  34303. + Identifier;[Baz];
  34304. + RightParenthesis;[)];
  34305. + Whitespace;[ ];
  34306. + LeftBrace;[{];
  34307. + Whitespace;[ ];
  34308. + Identifier;[var];
  34309. + Whitespace;[ ];
  34310. + Identifier;[foo];
  34311. + Whitespace;[ ];
  34312. + Assign;[=];
  34313. + Whitespace;[ ];
  34314. + Keyword;[new];
  34315. + Whitespace;[ ];
  34316. + LeftBrace;[{];
  34317. + Whitespace;[ ];
  34318. + RightBrace;[}];
  34319. + Whitespace;[ ];
  34320. + RightBrace;[}];
  34321. + Whitespace;[ ];
  34322. + Keyword;[catch];
  34323. + LeftParenthesis;[(];
  34324. + Identifier;[Foo];
  34325. + Whitespace;[ ];
  34326. + Identifier;[Bar];
  34327. + Whitespace;[ ];
  34328. + Identifier;[Baz];
  34329. + RightParenthesis;[)];
  34330. + Whitespace;[ ];
  34331. + LeftBrace;[{];
  34332. + MarkupBlock - [128..140)::12
  34333. + MarkupTextLiteral - [128..129)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  34334. + Whitespace;[ ];
  34335. + MarkupTagBlock - [129..132)::3 - [<p>]
  34336. + MarkupTextLiteral - [129..132)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  34337. + OpenAngle;[<];
  34338. + Text;[p];
  34339. + CloseAngle;[>];
  34340. + MarkupTextLiteral - [132..135)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  34341. + Text;[Foo];
  34342. + MarkupTagBlock - [135..139)::4 - [</p>]
  34343. + MarkupTextLiteral - [135..139)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  34344. + OpenAngle;[<];
  34345. + ForwardSlash;[/];
  34346. + Text;[p];
  34347. + CloseAngle;[>];
  34348. + MarkupTextLiteral - [139..140)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  34349. + Whitespace;[ ];
  34350. + CSharpStatementLiteral - [140..141)::1 - [}] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  34351. + RightBrace;[}];
  34352. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsMarkupWithinCatchClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsMarkupWithinCatchClause.stree.txt
  34353. index f2a74e5ca4b..e7083ce8a74 100644
  34354. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsMarkupWithinCatchClause.stree.txt
  34355. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsMarkupWithinCatchClause.stree.txt
  34356. @@ -1,50 +1,52 @@
  34357. -Statement block - Gen<None> - 59 - (0:0,0)
  34358. - Code span - Gen<Stmt> - [try { var foo = new { } } catch(Foo Bar Baz) {] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:28
  34359. - SyntaxKind.Keyword;[try];
  34360. - SyntaxKind.Whitespace;[ ];
  34361. - SyntaxKind.LeftBrace;[{];
  34362. - SyntaxKind.Whitespace;[ ];
  34363. - SyntaxKind.Identifier;[var];
  34364. - SyntaxKind.Whitespace;[ ];
  34365. - SyntaxKind.Identifier;[foo];
  34366. - SyntaxKind.Whitespace;[ ];
  34367. - SyntaxKind.Assign;[=];
  34368. - SyntaxKind.Whitespace;[ ];
  34369. - SyntaxKind.Keyword;[new];
  34370. - SyntaxKind.Whitespace;[ ];
  34371. - SyntaxKind.LeftBrace;[{];
  34372. - SyntaxKind.Whitespace;[ ];
  34373. - SyntaxKind.RightBrace;[}];
  34374. - SyntaxKind.Whitespace;[ ];
  34375. - SyntaxKind.RightBrace;[}];
  34376. - SyntaxKind.Whitespace;[ ];
  34377. - SyntaxKind.Keyword;[catch];
  34378. - SyntaxKind.LeftParenthesis;[(];
  34379. - SyntaxKind.Identifier;[Foo];
  34380. - SyntaxKind.Whitespace;[ ];
  34381. - SyntaxKind.Identifier;[Bar];
  34382. - SyntaxKind.Whitespace;[ ];
  34383. - SyntaxKind.Identifier;[Baz];
  34384. - SyntaxKind.RightParenthesis;[)];
  34385. - SyntaxKind.Whitespace;[ ];
  34386. - SyntaxKind.LeftBrace;[{];
  34387. - Markup block - Gen<None> - 12 - (46:0,46)
  34388. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (46:0,46) - Tokens:1
  34389. - SyntaxKind.Whitespace;[ ];
  34390. - Tag block - Gen<None> - 3 - (47:0,47)
  34391. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (47:0,47) - Tokens:3
  34392. - SyntaxKind.OpenAngle;[<];
  34393. - SyntaxKind.Text;[p];
  34394. - SyntaxKind.CloseAngle;[>];
  34395. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:Any - (50:0,50) - Tokens:1
  34396. - SyntaxKind.Text;[Foo];
  34397. - Tag block - Gen<None> - 4 - (53:0,53)
  34398. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (53:0,53) - Tokens:4
  34399. - SyntaxKind.OpenAngle;[<];
  34400. - SyntaxKind.ForwardSlash;[/];
  34401. - SyntaxKind.Text;[p];
  34402. - SyntaxKind.CloseAngle;[>];
  34403. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (57:0,57) - Tokens:1
  34404. - SyntaxKind.Whitespace;[ ];
  34405. - Code span - Gen<Stmt> - [}] - SpanEditHandler;Accepts:Any - (58:0,58) - Tokens:1
  34406. - SyntaxKind.RightBrace;[}];
  34407. +CSharpCodeBlock - [0..59)::59 - [try { var foo = new { } } catch(Foo Bar Baz) { <p>Foo</p> }]
  34408. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  34409. + Transition;[<Missing>];
  34410. + CSharpStatementLiteral - [0..46)::46 - [try { var foo = new { } } catch(Foo Bar Baz) {] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  34411. + Keyword;[try];
  34412. + Whitespace;[ ];
  34413. + LeftBrace;[{];
  34414. + Whitespace;[ ];
  34415. + Identifier;[var];
  34416. + Whitespace;[ ];
  34417. + Identifier;[foo];
  34418. + Whitespace;[ ];
  34419. + Assign;[=];
  34420. + Whitespace;[ ];
  34421. + Keyword;[new];
  34422. + Whitespace;[ ];
  34423. + LeftBrace;[{];
  34424. + Whitespace;[ ];
  34425. + RightBrace;[}];
  34426. + Whitespace;[ ];
  34427. + RightBrace;[}];
  34428. + Whitespace;[ ];
  34429. + Keyword;[catch];
  34430. + LeftParenthesis;[(];
  34431. + Identifier;[Foo];
  34432. + Whitespace;[ ];
  34433. + Identifier;[Bar];
  34434. + Whitespace;[ ];
  34435. + Identifier;[Baz];
  34436. + RightParenthesis;[)];
  34437. + Whitespace;[ ];
  34438. + LeftBrace;[{];
  34439. + MarkupBlock - [46..58)::12
  34440. + MarkupTextLiteral - [46..47)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  34441. + Whitespace;[ ];
  34442. + MarkupTagBlock - [47..50)::3 - [<p>]
  34443. + MarkupTextLiteral - [47..50)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  34444. + OpenAngle;[<];
  34445. + Text;[p];
  34446. + CloseAngle;[>];
  34447. + MarkupTextLiteral - [50..53)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  34448. + Text;[Foo];
  34449. + MarkupTagBlock - [53..57)::4 - [</p>]
  34450. + MarkupTextLiteral - [53..57)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  34451. + OpenAngle;[<];
  34452. + ForwardSlash;[/];
  34453. + Text;[p];
  34454. + CloseAngle;[>];
  34455. + MarkupTextLiteral - [57..58)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  34456. + Whitespace;[ ];
  34457. + CSharpStatementLiteral - [58..59)::1 - [}] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  34458. + RightBrace;[}];
  34459. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsMarkupWithinFinallyClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsMarkupWithinFinallyClause.stree.txt
  34460. index 4e7e1826a6f..eff329eb336 100644
  34461. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsMarkupWithinFinallyClause.stree.txt
  34462. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsMarkupWithinFinallyClause.stree.txt
  34463. @@ -1,43 +1,45 @@
  34464. -Statement block - Gen<None> - 48 - (0:0,0)
  34465. - Code span - Gen<Stmt> - [try { var foo = new { } } finally {] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:21
  34466. - SyntaxKind.Keyword;[try];
  34467. - SyntaxKind.Whitespace;[ ];
  34468. - SyntaxKind.LeftBrace;[{];
  34469. - SyntaxKind.Whitespace;[ ];
  34470. - SyntaxKind.Identifier;[var];
  34471. - SyntaxKind.Whitespace;[ ];
  34472. - SyntaxKind.Identifier;[foo];
  34473. - SyntaxKind.Whitespace;[ ];
  34474. - SyntaxKind.Assign;[=];
  34475. - SyntaxKind.Whitespace;[ ];
  34476. - SyntaxKind.Keyword;[new];
  34477. - SyntaxKind.Whitespace;[ ];
  34478. - SyntaxKind.LeftBrace;[{];
  34479. - SyntaxKind.Whitespace;[ ];
  34480. - SyntaxKind.RightBrace;[}];
  34481. - SyntaxKind.Whitespace;[ ];
  34482. - SyntaxKind.RightBrace;[}];
  34483. - SyntaxKind.Whitespace;[ ];
  34484. - SyntaxKind.Keyword;[finally];
  34485. - SyntaxKind.Whitespace;[ ];
  34486. - SyntaxKind.LeftBrace;[{];
  34487. - Markup block - Gen<None> - 12 - (35:0,35)
  34488. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (35:0,35) - Tokens:1
  34489. - SyntaxKind.Whitespace;[ ];
  34490. - Tag block - Gen<None> - 3 - (36:0,36)
  34491. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (36:0,36) - Tokens:3
  34492. - SyntaxKind.OpenAngle;[<];
  34493. - SyntaxKind.Text;[p];
  34494. - SyntaxKind.CloseAngle;[>];
  34495. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:Any - (39:0,39) - Tokens:1
  34496. - SyntaxKind.Text;[Foo];
  34497. - Tag block - Gen<None> - 4 - (42:0,42)
  34498. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (42:0,42) - Tokens:4
  34499. - SyntaxKind.OpenAngle;[<];
  34500. - SyntaxKind.ForwardSlash;[/];
  34501. - SyntaxKind.Text;[p];
  34502. - SyntaxKind.CloseAngle;[>];
  34503. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (46:0,46) - Tokens:1
  34504. - SyntaxKind.Whitespace;[ ];
  34505. - Code span - Gen<Stmt> - [}] - SpanEditHandler;Accepts:None - (47:0,47) - Tokens:1
  34506. - SyntaxKind.RightBrace;[}];
  34507. +CSharpCodeBlock - [0..48)::48 - [try { var foo = new { } } finally { <p>Foo</p> }]
  34508. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  34509. + Transition;[<Missing>];
  34510. + CSharpStatementLiteral - [0..35)::35 - [try { var foo = new { } } finally {] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  34511. + Keyword;[try];
  34512. + Whitespace;[ ];
  34513. + LeftBrace;[{];
  34514. + Whitespace;[ ];
  34515. + Identifier;[var];
  34516. + Whitespace;[ ];
  34517. + Identifier;[foo];
  34518. + Whitespace;[ ];
  34519. + Assign;[=];
  34520. + Whitespace;[ ];
  34521. + Keyword;[new];
  34522. + Whitespace;[ ];
  34523. + LeftBrace;[{];
  34524. + Whitespace;[ ];
  34525. + RightBrace;[}];
  34526. + Whitespace;[ ];
  34527. + RightBrace;[}];
  34528. + Whitespace;[ ];
  34529. + Keyword;[finally];
  34530. + Whitespace;[ ];
  34531. + LeftBrace;[{];
  34532. + MarkupBlock - [35..47)::12
  34533. + MarkupTextLiteral - [35..36)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  34534. + Whitespace;[ ];
  34535. + MarkupTagBlock - [36..39)::3 - [<p>]
  34536. + MarkupTextLiteral - [36..39)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  34537. + OpenAngle;[<];
  34538. + Text;[p];
  34539. + CloseAngle;[>];
  34540. + MarkupTextLiteral - [39..42)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  34541. + Text;[Foo];
  34542. + MarkupTagBlock - [42..46)::4 - [</p>]
  34543. + MarkupTextLiteral - [42..46)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  34544. + OpenAngle;[<];
  34545. + ForwardSlash;[/];
  34546. + Text;[p];
  34547. + CloseAngle;[>];
  34548. + MarkupTextLiteral - [46..47)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  34549. + Whitespace;[ ];
  34550. + CSharpStatementLiteral - [47..48)::1 - [}] - Gen<Stmt> - SpanEditHandler;Accepts:None
  34551. + RightBrace;[}];
  34552. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsMarkupWithinTryClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsMarkupWithinTryClause.stree.txt
  34553. index 83fa9cdbc13..48537be7369 100644
  34554. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsMarkupWithinTryClause.stree.txt
  34555. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsMarkupWithinTryClause.stree.txt
  34556. @@ -1,25 +1,27 @@
  34557. -Statement block - Gen<None> - 18 - (0:0,0)
  34558. - Code span - Gen<Stmt> - [try {] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  34559. - SyntaxKind.Keyword;[try];
  34560. - SyntaxKind.Whitespace;[ ];
  34561. - SyntaxKind.LeftBrace;[{];
  34562. - Markup block - Gen<None> - 12 - (5:0,5)
  34563. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:1
  34564. - SyntaxKind.Whitespace;[ ];
  34565. - Tag block - Gen<None> - 3 - (6:0,6)
  34566. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (6:0,6) - Tokens:3
  34567. - SyntaxKind.OpenAngle;[<];
  34568. - SyntaxKind.Text;[p];
  34569. - SyntaxKind.CloseAngle;[>];
  34570. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:1
  34571. - SyntaxKind.Text;[Foo];
  34572. - Tag block - Gen<None> - 4 - (12:0,12)
  34573. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:4
  34574. - SyntaxKind.OpenAngle;[<];
  34575. - SyntaxKind.ForwardSlash;[/];
  34576. - SyntaxKind.Text;[p];
  34577. - SyntaxKind.CloseAngle;[>];
  34578. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  34579. - SyntaxKind.Whitespace;[ ];
  34580. - Code span - Gen<Stmt> - [}] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:1
  34581. - SyntaxKind.RightBrace;[}];
  34582. +CSharpCodeBlock - [0..18)::18 - [try { <p>Foo</p> }]
  34583. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  34584. + Transition;[<Missing>];
  34585. + CSharpStatementLiteral - [0..5)::5 - [try {] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  34586. + Keyword;[try];
  34587. + Whitespace;[ ];
  34588. + LeftBrace;[{];
  34589. + MarkupBlock - [5..17)::12
  34590. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  34591. + Whitespace;[ ];
  34592. + MarkupTagBlock - [6..9)::3 - [<p>]
  34593. + MarkupTextLiteral - [6..9)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  34594. + OpenAngle;[<];
  34595. + Text;[p];
  34596. + CloseAngle;[>];
  34597. + MarkupTextLiteral - [9..12)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  34598. + Text;[Foo];
  34599. + MarkupTagBlock - [12..16)::4 - [</p>]
  34600. + MarkupTextLiteral - [12..16)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  34601. + OpenAngle;[<];
  34602. + ForwardSlash;[/];
  34603. + Text;[p];
  34604. + CloseAngle;[>];
  34605. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  34606. + Whitespace;[ ];
  34607. + CSharpStatementLiteral - [17..18)::1 - [}] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  34608. + RightBrace;[}];
  34609. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenCatchAndFinallyClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenCatchAndFinallyClause.stree.txt
  34610. index 0c589bfbe6a..5d8c7b08ae8 100644
  34611. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenCatchAndFinallyClause.stree.txt
  34612. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenCatchAndFinallyClause.stree.txt
  34613. @@ -1,63 +1,55 @@
  34614. -Statement block - Gen<None> - 75 - (0:0,0)
  34615. - Code span - Gen<Stmt> - [try { bar(); } catch(bar) { baz(); } ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:25
  34616. - SyntaxKind.Keyword;[try];
  34617. - SyntaxKind.Whitespace;[ ];
  34618. - SyntaxKind.LeftBrace;[{];
  34619. - SyntaxKind.Whitespace;[ ];
  34620. - SyntaxKind.Identifier;[bar];
  34621. - SyntaxKind.LeftParenthesis;[(];
  34622. - SyntaxKind.RightParenthesis;[)];
  34623. - SyntaxKind.Semicolon;[;];
  34624. - SyntaxKind.Whitespace;[ ];
  34625. - SyntaxKind.RightBrace;[}];
  34626. - SyntaxKind.Whitespace;[ ];
  34627. - SyntaxKind.Keyword;[catch];
  34628. - SyntaxKind.LeftParenthesis;[(];
  34629. - SyntaxKind.Identifier;[bar];
  34630. - SyntaxKind.RightParenthesis;[)];
  34631. - SyntaxKind.Whitespace;[ ];
  34632. - SyntaxKind.LeftBrace;[{];
  34633. - SyntaxKind.Whitespace;[ ];
  34634. - SyntaxKind.Identifier;[baz];
  34635. - SyntaxKind.LeftParenthesis;[(];
  34636. - SyntaxKind.RightParenthesis;[)];
  34637. - SyntaxKind.Semicolon;[;];
  34638. - SyntaxKind.Whitespace;[ ];
  34639. - SyntaxKind.RightBrace;[}];
  34640. - SyntaxKind.Whitespace;[ ];
  34641. - Comment block - Gen<RazorComment> - 9 - (37:0,37)
  34642. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (37:0,37) - Tokens:1
  34643. - SyntaxKind.RazorCommentTransition;[@];
  34644. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (38:0,38) - Tokens:1
  34645. - SyntaxKind.RazorCommentStar;[*];
  34646. - Comment span - Gen<None> - [ Foo ] - SpanEditHandler;Accepts:Any - (39:0,39) - Tokens:1
  34647. - SyntaxKind.RazorCommentLiteral;[ Foo ];
  34648. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (44:0,44) - Tokens:1
  34649. - SyntaxKind.RazorCommentStar;[*];
  34650. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (45:0,45) - Tokens:1
  34651. - SyntaxKind.RazorCommentTransition;[@];
  34652. - Code span - Gen<Stmt> - [ ] - SpanEditHandler;Accepts:Any - (46:0,46) - Tokens:1
  34653. - SyntaxKind.Whitespace;[ ];
  34654. - Comment block - Gen<RazorComment> - 9 - (47:0,47)
  34655. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (47:0,47) - Tokens:1
  34656. - SyntaxKind.RazorCommentTransition;[@];
  34657. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (48:0,48) - Tokens:1
  34658. - SyntaxKind.RazorCommentStar;[*];
  34659. - Comment span - Gen<None> - [ Bar ] - SpanEditHandler;Accepts:Any - (49:0,49) - Tokens:1
  34660. - SyntaxKind.RazorCommentLiteral;[ Bar ];
  34661. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (54:0,54) - Tokens:1
  34662. - SyntaxKind.RazorCommentStar;[*];
  34663. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (55:0,55) - Tokens:1
  34664. - SyntaxKind.RazorCommentTransition;[@];
  34665. - Code span - Gen<Stmt> - [ finally { biz(); }] - SpanEditHandler;Accepts:None - (56:0,56) - Tokens:11
  34666. - SyntaxKind.Whitespace;[ ];
  34667. - SyntaxKind.Keyword;[finally];
  34668. - SyntaxKind.Whitespace;[ ];
  34669. - SyntaxKind.LeftBrace;[{];
  34670. - SyntaxKind.Whitespace;[ ];
  34671. - SyntaxKind.Identifier;[biz];
  34672. - SyntaxKind.LeftParenthesis;[(];
  34673. - SyntaxKind.RightParenthesis;[)];
  34674. - SyntaxKind.Semicolon;[;];
  34675. - SyntaxKind.Whitespace;[ ];
  34676. - SyntaxKind.RightBrace;[}];
  34677. +CSharpCodeBlock - [0..75)::75 - [try { bar(); } catch(bar) { baz(); } @* Foo *@ @* Bar *@ finally { biz(); }]
  34678. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  34679. + Transition;[<Missing>];
  34680. + CSharpStatementLiteral - [0..37)::37 - [try { bar(); } catch(bar) { baz(); } ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  34681. + Keyword;[try];
  34682. + Whitespace;[ ];
  34683. + LeftBrace;[{];
  34684. + Whitespace;[ ];
  34685. + Identifier;[bar];
  34686. + LeftParenthesis;[(];
  34687. + RightParenthesis;[)];
  34688. + Semicolon;[;];
  34689. + Whitespace;[ ];
  34690. + RightBrace;[}];
  34691. + Whitespace;[ ];
  34692. + Keyword;[catch];
  34693. + LeftParenthesis;[(];
  34694. + Identifier;[bar];
  34695. + RightParenthesis;[)];
  34696. + Whitespace;[ ];
  34697. + LeftBrace;[{];
  34698. + Whitespace;[ ];
  34699. + Identifier;[baz];
  34700. + LeftParenthesis;[(];
  34701. + RightParenthesis;[)];
  34702. + Semicolon;[;];
  34703. + Whitespace;[ ];
  34704. + RightBrace;[}];
  34705. + Whitespace;[ ];
  34706. + RazorComment - [37..46)::9
  34707. + RazorCommentTransition;[@];
  34708. + RazorCommentStar;[*];
  34709. + RazorCommentLiteral;[ Foo ];
  34710. + RazorCommentStar;[*];
  34711. + RazorCommentTransition;[@];
  34712. + CSharpStatementLiteral - [46..47)::1 - [ ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  34713. + Whitespace;[ ];
  34714. + RazorComment - [47..56)::9
  34715. + RazorCommentTransition;[@];
  34716. + RazorCommentStar;[*];
  34717. + RazorCommentLiteral;[ Bar ];
  34718. + RazorCommentStar;[*];
  34719. + RazorCommentTransition;[@];
  34720. + CSharpStatementLiteral - [56..75)::19 - [ finally { biz(); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  34721. + Whitespace;[ ];
  34722. + Keyword;[finally];
  34723. + Whitespace;[ ];
  34724. + LeftBrace;[{];
  34725. + Whitespace;[ ];
  34726. + Identifier;[biz];
  34727. + LeftParenthesis;[(];
  34728. + RightParenthesis;[)];
  34729. + Semicolon;[;];
  34730. + Whitespace;[ ];
  34731. + RightBrace;[}];
  34732. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenDoAndWhileClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenDoAndWhileClause.stree.txt
  34733. index 3c23c80fade..71b8b166ef3 100644
  34734. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenDoAndWhileClause.stree.txt
  34735. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenDoAndWhileClause.stree.txt
  34736. @@ -1,48 +1,40 @@
  34737. -Statement block - Gen<None> - 54 - (0:0,0)
  34738. - Code span - Gen<Stmt> - [do { var foo = bar; } ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:15
  34739. - SyntaxKind.Keyword;[do];
  34740. - SyntaxKind.Whitespace;[ ];
  34741. - SyntaxKind.LeftBrace;[{];
  34742. - SyntaxKind.Whitespace;[ ];
  34743. - SyntaxKind.Identifier;[var];
  34744. - SyntaxKind.Whitespace;[ ];
  34745. - SyntaxKind.Identifier;[foo];
  34746. - SyntaxKind.Whitespace;[ ];
  34747. - SyntaxKind.Assign;[=];
  34748. - SyntaxKind.Whitespace;[ ];
  34749. - SyntaxKind.Identifier;[bar];
  34750. - SyntaxKind.Semicolon;[;];
  34751. - SyntaxKind.Whitespace;[ ];
  34752. - SyntaxKind.RightBrace;[}];
  34753. - SyntaxKind.Whitespace;[ ];
  34754. - Comment block - Gen<RazorComment> - 9 - (22:0,22)
  34755. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (22:0,22) - Tokens:1
  34756. - SyntaxKind.RazorCommentTransition;[@];
  34757. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (23:0,23) - Tokens:1
  34758. - SyntaxKind.RazorCommentStar;[*];
  34759. - Comment span - Gen<None> - [ Foo ] - SpanEditHandler;Accepts:Any - (24:0,24) - Tokens:1
  34760. - SyntaxKind.RazorCommentLiteral;[ Foo ];
  34761. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (29:0,29) - Tokens:1
  34762. - SyntaxKind.RazorCommentStar;[*];
  34763. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (30:0,30) - Tokens:1
  34764. - SyntaxKind.RazorCommentTransition;[@];
  34765. - Code span - Gen<Stmt> - [ ] - SpanEditHandler;Accepts:Any - (31:0,31) - Tokens:1
  34766. - SyntaxKind.Whitespace;[ ];
  34767. - Comment block - Gen<RazorComment> - 9 - (32:0,32)
  34768. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (32:0,32) - Tokens:1
  34769. - SyntaxKind.RazorCommentTransition;[@];
  34770. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (33:0,33) - Tokens:1
  34771. - SyntaxKind.RazorCommentStar;[*];
  34772. - Comment span - Gen<None> - [ Bar ] - SpanEditHandler;Accepts:Any - (34:0,34) - Tokens:1
  34773. - SyntaxKind.RazorCommentLiteral;[ Bar ];
  34774. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (39:0,39) - Tokens:1
  34775. - SyntaxKind.RazorCommentStar;[*];
  34776. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (40:0,40) - Tokens:1
  34777. - SyntaxKind.RazorCommentTransition;[@];
  34778. - Code span - Gen<Stmt> - [ while(true);] - SpanEditHandler;Accepts:None - (41:0,41) - Tokens:6
  34779. - SyntaxKind.Whitespace;[ ];
  34780. - SyntaxKind.Keyword;[while];
  34781. - SyntaxKind.LeftParenthesis;[(];
  34782. - SyntaxKind.Keyword;[true];
  34783. - SyntaxKind.RightParenthesis;[)];
  34784. - SyntaxKind.Semicolon;[;];
  34785. +CSharpCodeBlock - [0..54)::54 - [do { var foo = bar; } @* Foo *@ @* Bar *@ while(true);]
  34786. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  34787. + Transition;[<Missing>];
  34788. + CSharpStatementLiteral - [0..22)::22 - [do { var foo = bar; } ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  34789. + Keyword;[do];
  34790. + Whitespace;[ ];
  34791. + LeftBrace;[{];
  34792. + Whitespace;[ ];
  34793. + Identifier;[var];
  34794. + Whitespace;[ ];
  34795. + Identifier;[foo];
  34796. + Whitespace;[ ];
  34797. + Assign;[=];
  34798. + Whitespace;[ ];
  34799. + Identifier;[bar];
  34800. + Semicolon;[;];
  34801. + Whitespace;[ ];
  34802. + RightBrace;[}];
  34803. + Whitespace;[ ];
  34804. + RazorComment - [22..31)::9
  34805. + RazorCommentTransition;[@];
  34806. + RazorCommentStar;[*];
  34807. + RazorCommentLiteral;[ Foo ];
  34808. + RazorCommentStar;[*];
  34809. + RazorCommentTransition;[@];
  34810. + CSharpStatementLiteral - [31..32)::1 - [ ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  34811. + Whitespace;[ ];
  34812. + RazorComment - [32..41)::9
  34813. + RazorCommentTransition;[@];
  34814. + RazorCommentStar;[*];
  34815. + RazorCommentLiteral;[ Bar ];
  34816. + RazorCommentStar;[*];
  34817. + RazorCommentTransition;[@];
  34818. + CSharpStatementLiteral - [41..54)::13 - [ while(true);] - Gen<Stmt> - SpanEditHandler;Accepts:None
  34819. + Whitespace;[ ];
  34820. + Keyword;[while];
  34821. + LeftParenthesis;[(];
  34822. + Keyword;[true];
  34823. + RightParenthesis;[)];
  34824. + Semicolon;[;];
  34825. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenElseIfAndElseClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenElseIfAndElseClause.stree.txt
  34826. index b6367f8a36e..5d70ae76c12 100644
  34827. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenElseIfAndElseClause.stree.txt
  34828. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenElseIfAndElseClause.stree.txt
  34829. @@ -1,68 +1,60 @@
  34830. -Statement block - Gen<None> - 78 - (0:0,0)
  34831. - Code span - Gen<Stmt> - [if(foo) { bar(); } else if(bar) { baz(); } ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:30
  34832. - SyntaxKind.Keyword;[if];
  34833. - SyntaxKind.LeftParenthesis;[(];
  34834. - SyntaxKind.Identifier;[foo];
  34835. - SyntaxKind.RightParenthesis;[)];
  34836. - SyntaxKind.Whitespace;[ ];
  34837. - SyntaxKind.LeftBrace;[{];
  34838. - SyntaxKind.Whitespace;[ ];
  34839. - SyntaxKind.Identifier;[bar];
  34840. - SyntaxKind.LeftParenthesis;[(];
  34841. - SyntaxKind.RightParenthesis;[)];
  34842. - SyntaxKind.Semicolon;[;];
  34843. - SyntaxKind.Whitespace;[ ];
  34844. - SyntaxKind.RightBrace;[}];
  34845. - SyntaxKind.Whitespace;[ ];
  34846. - SyntaxKind.Keyword;[else];
  34847. - SyntaxKind.Whitespace;[ ];
  34848. - SyntaxKind.Keyword;[if];
  34849. - SyntaxKind.LeftParenthesis;[(];
  34850. - SyntaxKind.Identifier;[bar];
  34851. - SyntaxKind.RightParenthesis;[)];
  34852. - SyntaxKind.Whitespace;[ ];
  34853. - SyntaxKind.LeftBrace;[{];
  34854. - SyntaxKind.Whitespace;[ ];
  34855. - SyntaxKind.Identifier;[baz];
  34856. - SyntaxKind.LeftParenthesis;[(];
  34857. - SyntaxKind.RightParenthesis;[)];
  34858. - SyntaxKind.Semicolon;[;];
  34859. - SyntaxKind.Whitespace;[ ];
  34860. - SyntaxKind.RightBrace;[}];
  34861. - SyntaxKind.Whitespace;[ ];
  34862. - Comment block - Gen<RazorComment> - 9 - (43:0,43)
  34863. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (43:0,43) - Tokens:1
  34864. - SyntaxKind.RazorCommentTransition;[@];
  34865. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (44:0,44) - Tokens:1
  34866. - SyntaxKind.RazorCommentStar;[*];
  34867. - Comment span - Gen<None> - [ Foo ] - SpanEditHandler;Accepts:Any - (45:0,45) - Tokens:1
  34868. - SyntaxKind.RazorCommentLiteral;[ Foo ];
  34869. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (50:0,50) - Tokens:1
  34870. - SyntaxKind.RazorCommentStar;[*];
  34871. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (51:0,51) - Tokens:1
  34872. - SyntaxKind.RazorCommentTransition;[@];
  34873. - Code span - Gen<Stmt> - [ ] - SpanEditHandler;Accepts:Any - (52:0,52) - Tokens:1
  34874. - SyntaxKind.Whitespace;[ ];
  34875. - Comment block - Gen<RazorComment> - 9 - (53:0,53)
  34876. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (53:0,53) - Tokens:1
  34877. - SyntaxKind.RazorCommentTransition;[@];
  34878. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (54:0,54) - Tokens:1
  34879. - SyntaxKind.RazorCommentStar;[*];
  34880. - Comment span - Gen<None> - [ Bar ] - SpanEditHandler;Accepts:Any - (55:0,55) - Tokens:1
  34881. - SyntaxKind.RazorCommentLiteral;[ Bar ];
  34882. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (60:0,60) - Tokens:1
  34883. - SyntaxKind.RazorCommentStar;[*];
  34884. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (61:0,61) - Tokens:1
  34885. - SyntaxKind.RazorCommentTransition;[@];
  34886. - Code span - Gen<Stmt> - [ else { baz(); }] - SpanEditHandler;Accepts:None - (62:0,62) - Tokens:11
  34887. - SyntaxKind.Whitespace;[ ];
  34888. - SyntaxKind.Keyword;[else];
  34889. - SyntaxKind.Whitespace;[ ];
  34890. - SyntaxKind.LeftBrace;[{];
  34891. - SyntaxKind.Whitespace;[ ];
  34892. - SyntaxKind.Identifier;[baz];
  34893. - SyntaxKind.LeftParenthesis;[(];
  34894. - SyntaxKind.RightParenthesis;[)];
  34895. - SyntaxKind.Semicolon;[;];
  34896. - SyntaxKind.Whitespace;[ ];
  34897. - SyntaxKind.RightBrace;[}];
  34898. +CSharpCodeBlock - [0..78)::78 - [if(foo) { bar(); } else if(bar) { baz(); } @* Foo *@ @* Bar *@ else { baz(); }]
  34899. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  34900. + Transition;[<Missing>];
  34901. + CSharpStatementLiteral - [0..43)::43 - [if(foo) { bar(); } else if(bar) { baz(); } ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  34902. + Keyword;[if];
  34903. + LeftParenthesis;[(];
  34904. + Identifier;[foo];
  34905. + RightParenthesis;[)];
  34906. + Whitespace;[ ];
  34907. + LeftBrace;[{];
  34908. + Whitespace;[ ];
  34909. + Identifier;[bar];
  34910. + LeftParenthesis;[(];
  34911. + RightParenthesis;[)];
  34912. + Semicolon;[;];
  34913. + Whitespace;[ ];
  34914. + RightBrace;[}];
  34915. + Whitespace;[ ];
  34916. + Keyword;[else];
  34917. + Whitespace;[ ];
  34918. + Keyword;[if];
  34919. + LeftParenthesis;[(];
  34920. + Identifier;[bar];
  34921. + RightParenthesis;[)];
  34922. + Whitespace;[ ];
  34923. + LeftBrace;[{];
  34924. + Whitespace;[ ];
  34925. + Identifier;[baz];
  34926. + LeftParenthesis;[(];
  34927. + RightParenthesis;[)];
  34928. + Semicolon;[;];
  34929. + Whitespace;[ ];
  34930. + RightBrace;[}];
  34931. + Whitespace;[ ];
  34932. + RazorComment - [43..52)::9
  34933. + RazorCommentTransition;[@];
  34934. + RazorCommentStar;[*];
  34935. + RazorCommentLiteral;[ Foo ];
  34936. + RazorCommentStar;[*];
  34937. + RazorCommentTransition;[@];
  34938. + CSharpStatementLiteral - [52..53)::1 - [ ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  34939. + Whitespace;[ ];
  34940. + RazorComment - [53..62)::9
  34941. + RazorCommentTransition;[@];
  34942. + RazorCommentStar;[*];
  34943. + RazorCommentLiteral;[ Bar ];
  34944. + RazorCommentStar;[*];
  34945. + RazorCommentTransition;[@];
  34946. + CSharpStatementLiteral - [62..78)::16 - [ else { baz(); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  34947. + Whitespace;[ ];
  34948. + Keyword;[else];
  34949. + Whitespace;[ ];
  34950. + LeftBrace;[{];
  34951. + Whitespace;[ ];
  34952. + Identifier;[baz];
  34953. + LeftParenthesis;[(];
  34954. + RightParenthesis;[)];
  34955. + Semicolon;[;];
  34956. + Whitespace;[ ];
  34957. + RightBrace;[}];
  34958. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenIfAndElseClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenIfAndElseClause.stree.txt
  34959. index 24f5021c5f3..fa6d7871f2b 100644
  34960. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenIfAndElseClause.stree.txt
  34961. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenIfAndElseClause.stree.txt
  34962. @@ -1,52 +1,44 @@
  34963. -Statement block - Gen<None> - 54 - (0:0,0)
  34964. - Code span - Gen<Stmt> - [if(foo) { bar(); } ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:14
  34965. - SyntaxKind.Keyword;[if];
  34966. - SyntaxKind.LeftParenthesis;[(];
  34967. - SyntaxKind.Identifier;[foo];
  34968. - SyntaxKind.RightParenthesis;[)];
  34969. - SyntaxKind.Whitespace;[ ];
  34970. - SyntaxKind.LeftBrace;[{];
  34971. - SyntaxKind.Whitespace;[ ];
  34972. - SyntaxKind.Identifier;[bar];
  34973. - SyntaxKind.LeftParenthesis;[(];
  34974. - SyntaxKind.RightParenthesis;[)];
  34975. - SyntaxKind.Semicolon;[;];
  34976. - SyntaxKind.Whitespace;[ ];
  34977. - SyntaxKind.RightBrace;[}];
  34978. - SyntaxKind.Whitespace;[ ];
  34979. - Comment block - Gen<RazorComment> - 9 - (19:0,19)
  34980. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (19:0,19) - Tokens:1
  34981. - SyntaxKind.RazorCommentTransition;[@];
  34982. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (20:0,20) - Tokens:1
  34983. - SyntaxKind.RazorCommentStar;[*];
  34984. - Comment span - Gen<None> - [ Foo ] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:1
  34985. - SyntaxKind.RazorCommentLiteral;[ Foo ];
  34986. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (26:0,26) - Tokens:1
  34987. - SyntaxKind.RazorCommentStar;[*];
  34988. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (27:0,27) - Tokens:1
  34989. - SyntaxKind.RazorCommentTransition;[@];
  34990. - Code span - Gen<Stmt> - [ ] - SpanEditHandler;Accepts:Any - (28:0,28) - Tokens:1
  34991. - SyntaxKind.Whitespace;[ ];
  34992. - Comment block - Gen<RazorComment> - 9 - (29:0,29)
  34993. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (29:0,29) - Tokens:1
  34994. - SyntaxKind.RazorCommentTransition;[@];
  34995. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (30:0,30) - Tokens:1
  34996. - SyntaxKind.RazorCommentStar;[*];
  34997. - Comment span - Gen<None> - [ Bar ] - SpanEditHandler;Accepts:Any - (31:0,31) - Tokens:1
  34998. - SyntaxKind.RazorCommentLiteral;[ Bar ];
  34999. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (36:0,36) - Tokens:1
  35000. - SyntaxKind.RazorCommentStar;[*];
  35001. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (37:0,37) - Tokens:1
  35002. - SyntaxKind.RazorCommentTransition;[@];
  35003. - Code span - Gen<Stmt> - [ else { baz(); }] - SpanEditHandler;Accepts:None - (38:0,38) - Tokens:11
  35004. - SyntaxKind.Whitespace;[ ];
  35005. - SyntaxKind.Keyword;[else];
  35006. - SyntaxKind.Whitespace;[ ];
  35007. - SyntaxKind.LeftBrace;[{];
  35008. - SyntaxKind.Whitespace;[ ];
  35009. - SyntaxKind.Identifier;[baz];
  35010. - SyntaxKind.LeftParenthesis;[(];
  35011. - SyntaxKind.RightParenthesis;[)];
  35012. - SyntaxKind.Semicolon;[;];
  35013. - SyntaxKind.Whitespace;[ ];
  35014. - SyntaxKind.RightBrace;[}];
  35015. +CSharpCodeBlock - [0..54)::54 - [if(foo) { bar(); } @* Foo *@ @* Bar *@ else { baz(); }]
  35016. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  35017. + Transition;[<Missing>];
  35018. + CSharpStatementLiteral - [0..19)::19 - [if(foo) { bar(); } ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  35019. + Keyword;[if];
  35020. + LeftParenthesis;[(];
  35021. + Identifier;[foo];
  35022. + RightParenthesis;[)];
  35023. + Whitespace;[ ];
  35024. + LeftBrace;[{];
  35025. + Whitespace;[ ];
  35026. + Identifier;[bar];
  35027. + LeftParenthesis;[(];
  35028. + RightParenthesis;[)];
  35029. + Semicolon;[;];
  35030. + Whitespace;[ ];
  35031. + RightBrace;[}];
  35032. + Whitespace;[ ];
  35033. + RazorComment - [19..28)::9
  35034. + RazorCommentTransition;[@];
  35035. + RazorCommentStar;[*];
  35036. + RazorCommentLiteral;[ Foo ];
  35037. + RazorCommentStar;[*];
  35038. + RazorCommentTransition;[@];
  35039. + CSharpStatementLiteral - [28..29)::1 - [ ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  35040. + Whitespace;[ ];
  35041. + RazorComment - [29..38)::9
  35042. + RazorCommentTransition;[@];
  35043. + RazorCommentStar;[*];
  35044. + RazorCommentLiteral;[ Bar ];
  35045. + RazorCommentStar;[*];
  35046. + RazorCommentTransition;[@];
  35047. + CSharpStatementLiteral - [38..54)::16 - [ else { baz(); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  35048. + Whitespace;[ ];
  35049. + Keyword;[else];
  35050. + Whitespace;[ ];
  35051. + LeftBrace;[{];
  35052. + Whitespace;[ ];
  35053. + Identifier;[baz];
  35054. + LeftParenthesis;[(];
  35055. + RightParenthesis;[)];
  35056. + Semicolon;[;];
  35057. + Whitespace;[ ];
  35058. + RightBrace;[}];
  35059. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenIfAndElseIfClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenIfAndElseIfClause.stree.txt
  35060. index 868fb9cd86e..e16b61a5dfd 100644
  35061. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenIfAndElseIfClause.stree.txt
  35062. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenIfAndElseIfClause.stree.txt
  35063. @@ -1,57 +1,49 @@
  35064. -Statement block - Gen<None> - 62 - (0:0,0)
  35065. - Code span - Gen<Stmt> - [if(foo) { bar(); } ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:14
  35066. - SyntaxKind.Keyword;[if];
  35067. - SyntaxKind.LeftParenthesis;[(];
  35068. - SyntaxKind.Identifier;[foo];
  35069. - SyntaxKind.RightParenthesis;[)];
  35070. - SyntaxKind.Whitespace;[ ];
  35071. - SyntaxKind.LeftBrace;[{];
  35072. - SyntaxKind.Whitespace;[ ];
  35073. - SyntaxKind.Identifier;[bar];
  35074. - SyntaxKind.LeftParenthesis;[(];
  35075. - SyntaxKind.RightParenthesis;[)];
  35076. - SyntaxKind.Semicolon;[;];
  35077. - SyntaxKind.Whitespace;[ ];
  35078. - SyntaxKind.RightBrace;[}];
  35079. - SyntaxKind.Whitespace;[ ];
  35080. - Comment block - Gen<RazorComment> - 9 - (19:0,19)
  35081. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (19:0,19) - Tokens:1
  35082. - SyntaxKind.RazorCommentTransition;[@];
  35083. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (20:0,20) - Tokens:1
  35084. - SyntaxKind.RazorCommentStar;[*];
  35085. - Comment span - Gen<None> - [ Foo ] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:1
  35086. - SyntaxKind.RazorCommentLiteral;[ Foo ];
  35087. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (26:0,26) - Tokens:1
  35088. - SyntaxKind.RazorCommentStar;[*];
  35089. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (27:0,27) - Tokens:1
  35090. - SyntaxKind.RazorCommentTransition;[@];
  35091. - Code span - Gen<Stmt> - [ ] - SpanEditHandler;Accepts:Any - (28:0,28) - Tokens:1
  35092. - SyntaxKind.Whitespace;[ ];
  35093. - Comment block - Gen<RazorComment> - 9 - (29:0,29)
  35094. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (29:0,29) - Tokens:1
  35095. - SyntaxKind.RazorCommentTransition;[@];
  35096. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (30:0,30) - Tokens:1
  35097. - SyntaxKind.RazorCommentStar;[*];
  35098. - Comment span - Gen<None> - [ Bar ] - SpanEditHandler;Accepts:Any - (31:0,31) - Tokens:1
  35099. - SyntaxKind.RazorCommentLiteral;[ Bar ];
  35100. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (36:0,36) - Tokens:1
  35101. - SyntaxKind.RazorCommentStar;[*];
  35102. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (37:0,37) - Tokens:1
  35103. - SyntaxKind.RazorCommentTransition;[@];
  35104. - Code span - Gen<Stmt> - [ else if(bar) { baz(); }] - SpanEditHandler;Accepts:Any - (38:0,38) - Tokens:16
  35105. - SyntaxKind.Whitespace;[ ];
  35106. - SyntaxKind.Keyword;[else];
  35107. - SyntaxKind.Whitespace;[ ];
  35108. - SyntaxKind.Keyword;[if];
  35109. - SyntaxKind.LeftParenthesis;[(];
  35110. - SyntaxKind.Identifier;[bar];
  35111. - SyntaxKind.RightParenthesis;[)];
  35112. - SyntaxKind.Whitespace;[ ];
  35113. - SyntaxKind.LeftBrace;[{];
  35114. - SyntaxKind.Whitespace;[ ];
  35115. - SyntaxKind.Identifier;[baz];
  35116. - SyntaxKind.LeftParenthesis;[(];
  35117. - SyntaxKind.RightParenthesis;[)];
  35118. - SyntaxKind.Semicolon;[;];
  35119. - SyntaxKind.Whitespace;[ ];
  35120. - SyntaxKind.RightBrace;[}];
  35121. +CSharpCodeBlock - [0..62)::62 - [if(foo) { bar(); } @* Foo *@ @* Bar *@ else if(bar) { baz(); }]
  35122. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  35123. + Transition;[<Missing>];
  35124. + CSharpStatementLiteral - [0..19)::19 - [if(foo) { bar(); } ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  35125. + Keyword;[if];
  35126. + LeftParenthesis;[(];
  35127. + Identifier;[foo];
  35128. + RightParenthesis;[)];
  35129. + Whitespace;[ ];
  35130. + LeftBrace;[{];
  35131. + Whitespace;[ ];
  35132. + Identifier;[bar];
  35133. + LeftParenthesis;[(];
  35134. + RightParenthesis;[)];
  35135. + Semicolon;[;];
  35136. + Whitespace;[ ];
  35137. + RightBrace;[}];
  35138. + Whitespace;[ ];
  35139. + RazorComment - [19..28)::9
  35140. + RazorCommentTransition;[@];
  35141. + RazorCommentStar;[*];
  35142. + RazorCommentLiteral;[ Foo ];
  35143. + RazorCommentStar;[*];
  35144. + RazorCommentTransition;[@];
  35145. + CSharpStatementLiteral - [28..29)::1 - [ ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  35146. + Whitespace;[ ];
  35147. + RazorComment - [29..38)::9
  35148. + RazorCommentTransition;[@];
  35149. + RazorCommentStar;[*];
  35150. + RazorCommentLiteral;[ Bar ];
  35151. + RazorCommentStar;[*];
  35152. + RazorCommentTransition;[@];
  35153. + CSharpStatementLiteral - [38..62)::24 - [ else if(bar) { baz(); }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  35154. + Whitespace;[ ];
  35155. + Keyword;[else];
  35156. + Whitespace;[ ];
  35157. + Keyword;[if];
  35158. + LeftParenthesis;[(];
  35159. + Identifier;[bar];
  35160. + RightParenthesis;[)];
  35161. + Whitespace;[ ];
  35162. + LeftBrace;[{];
  35163. + Whitespace;[ ];
  35164. + Identifier;[baz];
  35165. + LeftParenthesis;[(];
  35166. + RightParenthesis;[)];
  35167. + Semicolon;[;];
  35168. + Whitespace;[ ];
  35169. + RightBrace;[}];
  35170. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenTryAndCatchClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenTryAndCatchClause.stree.txt
  35171. index 465652cc21d..d9cccdcf46f 100644
  35172. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenTryAndCatchClause.stree.txt
  35173. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenTryAndCatchClause.stree.txt
  35174. @@ -1,51 +1,43 @@
  35175. -Statement block - Gen<None> - 55 - (0:0,0)
  35176. - Code span - Gen<Stmt> - [try { bar(); }] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:10
  35177. - SyntaxKind.Keyword;[try];
  35178. - SyntaxKind.Whitespace;[ ];
  35179. - SyntaxKind.LeftBrace;[{];
  35180. - SyntaxKind.Whitespace;[ ];
  35181. - SyntaxKind.Identifier;[bar];
  35182. - SyntaxKind.LeftParenthesis;[(];
  35183. - SyntaxKind.RightParenthesis;[)];
  35184. - SyntaxKind.Semicolon;[;];
  35185. - SyntaxKind.Whitespace;[ ];
  35186. - SyntaxKind.RightBrace;[}];
  35187. - Comment block - Gen<RazorComment> - 9 - (14:0,14)
  35188. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (14:0,14) - Tokens:1
  35189. - SyntaxKind.RazorCommentTransition;[@];
  35190. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:1
  35191. - SyntaxKind.RazorCommentStar;[*];
  35192. - Comment span - Gen<None> - [ Foo ] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  35193. - SyntaxKind.RazorCommentLiteral;[ Foo ];
  35194. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:1
  35195. - SyntaxKind.RazorCommentStar;[*];
  35196. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (22:0,22) - Tokens:1
  35197. - SyntaxKind.RazorCommentTransition;[@];
  35198. - Code span - Gen<Stmt> - [ ] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:1
  35199. - SyntaxKind.Whitespace;[ ];
  35200. - Comment block - Gen<RazorComment> - 9 - (24:0,24)
  35201. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (24:0,24) - Tokens:1
  35202. - SyntaxKind.RazorCommentTransition;[@];
  35203. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (25:0,25) - Tokens:1
  35204. - SyntaxKind.RazorCommentStar;[*];
  35205. - Comment span - Gen<None> - [ Bar ] - SpanEditHandler;Accepts:Any - (26:0,26) - Tokens:1
  35206. - SyntaxKind.RazorCommentLiteral;[ Bar ];
  35207. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (31:0,31) - Tokens:1
  35208. - SyntaxKind.RazorCommentStar;[*];
  35209. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (32:0,32) - Tokens:1
  35210. - SyntaxKind.RazorCommentTransition;[@];
  35211. - Code span - Gen<Stmt> - [ catch(bar) { baz(); }] - SpanEditHandler;Accepts:Any - (33:0,33) - Tokens:14
  35212. - SyntaxKind.Whitespace;[ ];
  35213. - SyntaxKind.Keyword;[catch];
  35214. - SyntaxKind.LeftParenthesis;[(];
  35215. - SyntaxKind.Identifier;[bar];
  35216. - SyntaxKind.RightParenthesis;[)];
  35217. - SyntaxKind.Whitespace;[ ];
  35218. - SyntaxKind.LeftBrace;[{];
  35219. - SyntaxKind.Whitespace;[ ];
  35220. - SyntaxKind.Identifier;[baz];
  35221. - SyntaxKind.LeftParenthesis;[(];
  35222. - SyntaxKind.RightParenthesis;[)];
  35223. - SyntaxKind.Semicolon;[;];
  35224. - SyntaxKind.Whitespace;[ ];
  35225. - SyntaxKind.RightBrace;[}];
  35226. +CSharpCodeBlock - [0..55)::55 - [try { bar(); }@* Foo *@ @* Bar *@ catch(bar) { baz(); }]
  35227. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  35228. + Transition;[<Missing>];
  35229. + CSharpStatementLiteral - [0..14)::14 - [try { bar(); }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  35230. + Keyword;[try];
  35231. + Whitespace;[ ];
  35232. + LeftBrace;[{];
  35233. + Whitespace;[ ];
  35234. + Identifier;[bar];
  35235. + LeftParenthesis;[(];
  35236. + RightParenthesis;[)];
  35237. + Semicolon;[;];
  35238. + Whitespace;[ ];
  35239. + RightBrace;[}];
  35240. + RazorComment - [14..23)::9
  35241. + RazorCommentTransition;[@];
  35242. + RazorCommentStar;[*];
  35243. + RazorCommentLiteral;[ Foo ];
  35244. + RazorCommentStar;[*];
  35245. + RazorCommentTransition;[@];
  35246. + CSharpStatementLiteral - [23..24)::1 - [ ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  35247. + Whitespace;[ ];
  35248. + RazorComment - [24..33)::9
  35249. + RazorCommentTransition;[@];
  35250. + RazorCommentStar;[*];
  35251. + RazorCommentLiteral;[ Bar ];
  35252. + RazorCommentStar;[*];
  35253. + RazorCommentTransition;[@];
  35254. + CSharpStatementLiteral - [33..55)::22 - [ catch(bar) { baz(); }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  35255. + Whitespace;[ ];
  35256. + Keyword;[catch];
  35257. + LeftParenthesis;[(];
  35258. + Identifier;[bar];
  35259. + RightParenthesis;[)];
  35260. + Whitespace;[ ];
  35261. + LeftBrace;[{];
  35262. + Whitespace;[ ];
  35263. + Identifier;[baz];
  35264. + LeftParenthesis;[(];
  35265. + RightParenthesis;[)];
  35266. + Semicolon;[;];
  35267. + Whitespace;[ ];
  35268. + RightBrace;[}];
  35269. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenTryAndFinallyClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenTryAndFinallyClause.stree.txt
  35270. index 82faa128c9f..c491cbcce0f 100644
  35271. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenTryAndFinallyClause.stree.txt
  35272. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsRazorCommentBetweenTryAndFinallyClause.stree.txt
  35273. @@ -1,49 +1,41 @@
  35274. -Statement block - Gen<None> - 53 - (0:0,0)
  35275. - Code span - Gen<Stmt> - [try { bar(); } ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:11
  35276. - SyntaxKind.Keyword;[try];
  35277. - SyntaxKind.Whitespace;[ ];
  35278. - SyntaxKind.LeftBrace;[{];
  35279. - SyntaxKind.Whitespace;[ ];
  35280. - SyntaxKind.Identifier;[bar];
  35281. - SyntaxKind.LeftParenthesis;[(];
  35282. - SyntaxKind.RightParenthesis;[)];
  35283. - SyntaxKind.Semicolon;[;];
  35284. - SyntaxKind.Whitespace;[ ];
  35285. - SyntaxKind.RightBrace;[}];
  35286. - SyntaxKind.Whitespace;[ ];
  35287. - Comment block - Gen<RazorComment> - 9 - (15:0,15)
  35288. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:1
  35289. - SyntaxKind.RazorCommentTransition;[@];
  35290. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  35291. - SyntaxKind.RazorCommentStar;[*];
  35292. - Comment span - Gen<None> - [ Foo ] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:1
  35293. - SyntaxKind.RazorCommentLiteral;[ Foo ];
  35294. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (22:0,22) - Tokens:1
  35295. - SyntaxKind.RazorCommentStar;[*];
  35296. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (23:0,23) - Tokens:1
  35297. - SyntaxKind.RazorCommentTransition;[@];
  35298. - Code span - Gen<Stmt> - [ ] - SpanEditHandler;Accepts:Any - (24:0,24) - Tokens:1
  35299. - SyntaxKind.Whitespace;[ ];
  35300. - Comment block - Gen<RazorComment> - 9 - (25:0,25)
  35301. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (25:0,25) - Tokens:1
  35302. - SyntaxKind.RazorCommentTransition;[@];
  35303. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (26:0,26) - Tokens:1
  35304. - SyntaxKind.RazorCommentStar;[*];
  35305. - Comment span - Gen<None> - [ Bar ] - SpanEditHandler;Accepts:Any - (27:0,27) - Tokens:1
  35306. - SyntaxKind.RazorCommentLiteral;[ Bar ];
  35307. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (32:0,32) - Tokens:1
  35308. - SyntaxKind.RazorCommentStar;[*];
  35309. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (33:0,33) - Tokens:1
  35310. - SyntaxKind.RazorCommentTransition;[@];
  35311. - Code span - Gen<Stmt> - [ finally { biz(); }] - SpanEditHandler;Accepts:None - (34:0,34) - Tokens:11
  35312. - SyntaxKind.Whitespace;[ ];
  35313. - SyntaxKind.Keyword;[finally];
  35314. - SyntaxKind.Whitespace;[ ];
  35315. - SyntaxKind.LeftBrace;[{];
  35316. - SyntaxKind.Whitespace;[ ];
  35317. - SyntaxKind.Identifier;[biz];
  35318. - SyntaxKind.LeftParenthesis;[(];
  35319. - SyntaxKind.RightParenthesis;[)];
  35320. - SyntaxKind.Semicolon;[;];
  35321. - SyntaxKind.Whitespace;[ ];
  35322. - SyntaxKind.RightBrace;[}];
  35323. +CSharpCodeBlock - [0..53)::53 - [try { bar(); } @* Foo *@ @* Bar *@ finally { biz(); }]
  35324. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  35325. + Transition;[<Missing>];
  35326. + CSharpStatementLiteral - [0..15)::15 - [try { bar(); } ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  35327. + Keyword;[try];
  35328. + Whitespace;[ ];
  35329. + LeftBrace;[{];
  35330. + Whitespace;[ ];
  35331. + Identifier;[bar];
  35332. + LeftParenthesis;[(];
  35333. + RightParenthesis;[)];
  35334. + Semicolon;[;];
  35335. + Whitespace;[ ];
  35336. + RightBrace;[}];
  35337. + Whitespace;[ ];
  35338. + RazorComment - [15..24)::9
  35339. + RazorCommentTransition;[@];
  35340. + RazorCommentStar;[*];
  35341. + RazorCommentLiteral;[ Foo ];
  35342. + RazorCommentStar;[*];
  35343. + RazorCommentTransition;[@];
  35344. + CSharpStatementLiteral - [24..25)::1 - [ ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  35345. + Whitespace;[ ];
  35346. + RazorComment - [25..34)::9
  35347. + RazorCommentTransition;[@];
  35348. + RazorCommentStar;[*];
  35349. + RazorCommentLiteral;[ Bar ];
  35350. + RazorCommentStar;[*];
  35351. + RazorCommentTransition;[@];
  35352. + CSharpStatementLiteral - [34..53)::19 - [ finally { biz(); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  35353. + Whitespace;[ ];
  35354. + Keyword;[finally];
  35355. + Whitespace;[ ];
  35356. + LeftBrace;[{];
  35357. + Whitespace;[ ];
  35358. + Identifier;[biz];
  35359. + LeftParenthesis;[(];
  35360. + RightParenthesis;[)];
  35361. + Semicolon;[;];
  35362. + Whitespace;[ ];
  35363. + RightBrace;[}];
  35364. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsTryStatementWithFinallyClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsTryStatementWithFinallyClause.stree.txt
  35365. index 8ae4de426a1..cb95bfbf577 100644
  35366. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsTryStatementWithFinallyClause.stree.txt
  35367. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsTryStatementWithFinallyClause.stree.txt
  35368. @@ -1,37 +1,39 @@
  35369. -Statement block - Gen<None> - 55 - (0:0,0)
  35370. - Code span - Gen<Stmt> - [try { var foo = new { } } finally { var foo = new { } }] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:35
  35371. - SyntaxKind.Keyword;[try];
  35372. - SyntaxKind.Whitespace;[ ];
  35373. - SyntaxKind.LeftBrace;[{];
  35374. - SyntaxKind.Whitespace;[ ];
  35375. - SyntaxKind.Identifier;[var];
  35376. - SyntaxKind.Whitespace;[ ];
  35377. - SyntaxKind.Identifier;[foo];
  35378. - SyntaxKind.Whitespace;[ ];
  35379. - SyntaxKind.Assign;[=];
  35380. - SyntaxKind.Whitespace;[ ];
  35381. - SyntaxKind.Keyword;[new];
  35382. - SyntaxKind.Whitespace;[ ];
  35383. - SyntaxKind.LeftBrace;[{];
  35384. - SyntaxKind.Whitespace;[ ];
  35385. - SyntaxKind.RightBrace;[}];
  35386. - SyntaxKind.Whitespace;[ ];
  35387. - SyntaxKind.RightBrace;[}];
  35388. - SyntaxKind.Whitespace;[ ];
  35389. - SyntaxKind.Keyword;[finally];
  35390. - SyntaxKind.Whitespace;[ ];
  35391. - SyntaxKind.LeftBrace;[{];
  35392. - SyntaxKind.Whitespace;[ ];
  35393. - SyntaxKind.Identifier;[var];
  35394. - SyntaxKind.Whitespace;[ ];
  35395. - SyntaxKind.Identifier;[foo];
  35396. - SyntaxKind.Whitespace;[ ];
  35397. - SyntaxKind.Assign;[=];
  35398. - SyntaxKind.Whitespace;[ ];
  35399. - SyntaxKind.Keyword;[new];
  35400. - SyntaxKind.Whitespace;[ ];
  35401. - SyntaxKind.LeftBrace;[{];
  35402. - SyntaxKind.Whitespace;[ ];
  35403. - SyntaxKind.RightBrace;[}];
  35404. - SyntaxKind.Whitespace;[ ];
  35405. - SyntaxKind.RightBrace;[}];
  35406. +CSharpCodeBlock - [0..55)::55 - [try { var foo = new { } } finally { var foo = new { } }]
  35407. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  35408. + Transition;[<Missing>];
  35409. + CSharpStatementLiteral - [0..55)::55 - [try { var foo = new { } } finally { var foo = new { } }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  35410. + Keyword;[try];
  35411. + Whitespace;[ ];
  35412. + LeftBrace;[{];
  35413. + Whitespace;[ ];
  35414. + Identifier;[var];
  35415. + Whitespace;[ ];
  35416. + Identifier;[foo];
  35417. + Whitespace;[ ];
  35418. + Assign;[=];
  35419. + Whitespace;[ ];
  35420. + Keyword;[new];
  35421. + Whitespace;[ ];
  35422. + LeftBrace;[{];
  35423. + Whitespace;[ ];
  35424. + RightBrace;[}];
  35425. + Whitespace;[ ];
  35426. + RightBrace;[}];
  35427. + Whitespace;[ ];
  35428. + Keyword;[finally];
  35429. + Whitespace;[ ];
  35430. + LeftBrace;[{];
  35431. + Whitespace;[ ];
  35432. + Identifier;[var];
  35433. + Whitespace;[ ];
  35434. + Identifier;[foo];
  35435. + Whitespace;[ ];
  35436. + Assign;[=];
  35437. + Whitespace;[ ];
  35438. + Keyword;[new];
  35439. + Whitespace;[ ];
  35440. + LeftBrace;[{];
  35441. + Whitespace;[ ];
  35442. + RightBrace;[}];
  35443. + Whitespace;[ ];
  35444. + RightBrace;[}];
  35445. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsTryStatementWithMultipleCatchClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsTryStatementWithMultipleCatchClause.stree.txt
  35446. index 46447b2fe97..15d720a6d84 100644
  35447. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsTryStatementWithMultipleCatchClause.stree.txt
  35448. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsTryStatementWithMultipleCatchClause.stree.txt
  35449. @@ -1,94 +1,96 @@
  35450. -Statement block - Gen<None> - 148 - (0:0,0)
  35451. - Code span - Gen<Stmt> - [try { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } }] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:92
  35452. - SyntaxKind.Keyword;[try];
  35453. - SyntaxKind.Whitespace;[ ];
  35454. - SyntaxKind.LeftBrace;[{];
  35455. - SyntaxKind.Whitespace;[ ];
  35456. - SyntaxKind.Identifier;[var];
  35457. - SyntaxKind.Whitespace;[ ];
  35458. - SyntaxKind.Identifier;[foo];
  35459. - SyntaxKind.Whitespace;[ ];
  35460. - SyntaxKind.Assign;[=];
  35461. - SyntaxKind.Whitespace;[ ];
  35462. - SyntaxKind.Keyword;[new];
  35463. - SyntaxKind.Whitespace;[ ];
  35464. - SyntaxKind.LeftBrace;[{];
  35465. - SyntaxKind.Whitespace;[ ];
  35466. - SyntaxKind.RightBrace;[}];
  35467. - SyntaxKind.Whitespace;[ ];
  35468. - SyntaxKind.RightBrace;[}];
  35469. - SyntaxKind.Whitespace;[ ];
  35470. - SyntaxKind.Keyword;[catch];
  35471. - SyntaxKind.LeftParenthesis;[(];
  35472. - SyntaxKind.Identifier;[Foo];
  35473. - SyntaxKind.Whitespace;[ ];
  35474. - SyntaxKind.Identifier;[Bar];
  35475. - SyntaxKind.Whitespace;[ ];
  35476. - SyntaxKind.Identifier;[Baz];
  35477. - SyntaxKind.RightParenthesis;[)];
  35478. - SyntaxKind.Whitespace;[ ];
  35479. - SyntaxKind.LeftBrace;[{];
  35480. - SyntaxKind.Whitespace;[ ];
  35481. - SyntaxKind.Identifier;[var];
  35482. - SyntaxKind.Whitespace;[ ];
  35483. - SyntaxKind.Identifier;[foo];
  35484. - SyntaxKind.Whitespace;[ ];
  35485. - SyntaxKind.Assign;[=];
  35486. - SyntaxKind.Whitespace;[ ];
  35487. - SyntaxKind.Keyword;[new];
  35488. - SyntaxKind.Whitespace;[ ];
  35489. - SyntaxKind.LeftBrace;[{];
  35490. - SyntaxKind.Whitespace;[ ];
  35491. - SyntaxKind.RightBrace;[}];
  35492. - SyntaxKind.Whitespace;[ ];
  35493. - SyntaxKind.RightBrace;[}];
  35494. - SyntaxKind.Whitespace;[ ];
  35495. - SyntaxKind.Keyword;[catch];
  35496. - SyntaxKind.LeftParenthesis;[(];
  35497. - SyntaxKind.Identifier;[Foo];
  35498. - SyntaxKind.Whitespace;[ ];
  35499. - SyntaxKind.Identifier;[Bar];
  35500. - SyntaxKind.Whitespace;[ ];
  35501. - SyntaxKind.Identifier;[Baz];
  35502. - SyntaxKind.RightParenthesis;[)];
  35503. - SyntaxKind.Whitespace;[ ];
  35504. - SyntaxKind.LeftBrace;[{];
  35505. - SyntaxKind.Whitespace;[ ];
  35506. - SyntaxKind.Identifier;[var];
  35507. - SyntaxKind.Whitespace;[ ];
  35508. - SyntaxKind.Identifier;[foo];
  35509. - SyntaxKind.Whitespace;[ ];
  35510. - SyntaxKind.Assign;[=];
  35511. - SyntaxKind.Whitespace;[ ];
  35512. - SyntaxKind.Keyword;[new];
  35513. - SyntaxKind.Whitespace;[ ];
  35514. - SyntaxKind.LeftBrace;[{];
  35515. - SyntaxKind.Whitespace;[ ];
  35516. - SyntaxKind.RightBrace;[}];
  35517. - SyntaxKind.Whitespace;[ ];
  35518. - SyntaxKind.RightBrace;[}];
  35519. - SyntaxKind.Whitespace;[ ];
  35520. - SyntaxKind.Keyword;[catch];
  35521. - SyntaxKind.LeftParenthesis;[(];
  35522. - SyntaxKind.Identifier;[Foo];
  35523. - SyntaxKind.Whitespace;[ ];
  35524. - SyntaxKind.Identifier;[Bar];
  35525. - SyntaxKind.Whitespace;[ ];
  35526. - SyntaxKind.Identifier;[Baz];
  35527. - SyntaxKind.RightParenthesis;[)];
  35528. - SyntaxKind.Whitespace;[ ];
  35529. - SyntaxKind.LeftBrace;[{];
  35530. - SyntaxKind.Whitespace;[ ];
  35531. - SyntaxKind.Identifier;[var];
  35532. - SyntaxKind.Whitespace;[ ];
  35533. - SyntaxKind.Identifier;[foo];
  35534. - SyntaxKind.Whitespace;[ ];
  35535. - SyntaxKind.Assign;[=];
  35536. - SyntaxKind.Whitespace;[ ];
  35537. - SyntaxKind.Keyword;[new];
  35538. - SyntaxKind.Whitespace;[ ];
  35539. - SyntaxKind.LeftBrace;[{];
  35540. - SyntaxKind.Whitespace;[ ];
  35541. - SyntaxKind.RightBrace;[}];
  35542. - SyntaxKind.Whitespace;[ ];
  35543. - SyntaxKind.RightBrace;[}];
  35544. +CSharpCodeBlock - [0..148)::148 - [try { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } }]
  35545. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  35546. + Transition;[<Missing>];
  35547. + CSharpStatementLiteral - [0..148)::148 - [try { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  35548. + Keyword;[try];
  35549. + Whitespace;[ ];
  35550. + LeftBrace;[{];
  35551. + Whitespace;[ ];
  35552. + Identifier;[var];
  35553. + Whitespace;[ ];
  35554. + Identifier;[foo];
  35555. + Whitespace;[ ];
  35556. + Assign;[=];
  35557. + Whitespace;[ ];
  35558. + Keyword;[new];
  35559. + Whitespace;[ ];
  35560. + LeftBrace;[{];
  35561. + Whitespace;[ ];
  35562. + RightBrace;[}];
  35563. + Whitespace;[ ];
  35564. + RightBrace;[}];
  35565. + Whitespace;[ ];
  35566. + Keyword;[catch];
  35567. + LeftParenthesis;[(];
  35568. + Identifier;[Foo];
  35569. + Whitespace;[ ];
  35570. + Identifier;[Bar];
  35571. + Whitespace;[ ];
  35572. + Identifier;[Baz];
  35573. + RightParenthesis;[)];
  35574. + Whitespace;[ ];
  35575. + LeftBrace;[{];
  35576. + Whitespace;[ ];
  35577. + Identifier;[var];
  35578. + Whitespace;[ ];
  35579. + Identifier;[foo];
  35580. + Whitespace;[ ];
  35581. + Assign;[=];
  35582. + Whitespace;[ ];
  35583. + Keyword;[new];
  35584. + Whitespace;[ ];
  35585. + LeftBrace;[{];
  35586. + Whitespace;[ ];
  35587. + RightBrace;[}];
  35588. + Whitespace;[ ];
  35589. + RightBrace;[}];
  35590. + Whitespace;[ ];
  35591. + Keyword;[catch];
  35592. + LeftParenthesis;[(];
  35593. + Identifier;[Foo];
  35594. + Whitespace;[ ];
  35595. + Identifier;[Bar];
  35596. + Whitespace;[ ];
  35597. + Identifier;[Baz];
  35598. + RightParenthesis;[)];
  35599. + Whitespace;[ ];
  35600. + LeftBrace;[{];
  35601. + Whitespace;[ ];
  35602. + Identifier;[var];
  35603. + Whitespace;[ ];
  35604. + Identifier;[foo];
  35605. + Whitespace;[ ];
  35606. + Assign;[=];
  35607. + Whitespace;[ ];
  35608. + Keyword;[new];
  35609. + Whitespace;[ ];
  35610. + LeftBrace;[{];
  35611. + Whitespace;[ ];
  35612. + RightBrace;[}];
  35613. + Whitespace;[ ];
  35614. + RightBrace;[}];
  35615. + Whitespace;[ ];
  35616. + Keyword;[catch];
  35617. + LeftParenthesis;[(];
  35618. + Identifier;[Foo];
  35619. + Whitespace;[ ];
  35620. + Identifier;[Bar];
  35621. + Whitespace;[ ];
  35622. + Identifier;[Baz];
  35623. + RightParenthesis;[)];
  35624. + Whitespace;[ ];
  35625. + LeftBrace;[{];
  35626. + Whitespace;[ ];
  35627. + Identifier;[var];
  35628. + Whitespace;[ ];
  35629. + Identifier;[foo];
  35630. + Whitespace;[ ];
  35631. + Assign;[=];
  35632. + Whitespace;[ ];
  35633. + Keyword;[new];
  35634. + Whitespace;[ ];
  35635. + LeftBrace;[{];
  35636. + Whitespace;[ ];
  35637. + RightBrace;[}];
  35638. + Whitespace;[ ];
  35639. + RightBrace;[}];
  35640. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsTryStatementWithNoAdditionalClauses.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsTryStatementWithNoAdditionalClauses.stree.txt
  35641. index 8a1d739940e..f31f9f22ae5 100644
  35642. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsTryStatementWithNoAdditionalClauses.stree.txt
  35643. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsTryStatementWithNoAdditionalClauses.stree.txt
  35644. @@ -1,19 +1,21 @@
  35645. -Statement block - Gen<None> - 25 - (0:0,0)
  35646. - Code span - Gen<Stmt> - [try { var foo = new { } }] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:17
  35647. - SyntaxKind.Keyword;[try];
  35648. - SyntaxKind.Whitespace;[ ];
  35649. - SyntaxKind.LeftBrace;[{];
  35650. - SyntaxKind.Whitespace;[ ];
  35651. - SyntaxKind.Identifier;[var];
  35652. - SyntaxKind.Whitespace;[ ];
  35653. - SyntaxKind.Identifier;[foo];
  35654. - SyntaxKind.Whitespace;[ ];
  35655. - SyntaxKind.Assign;[=];
  35656. - SyntaxKind.Whitespace;[ ];
  35657. - SyntaxKind.Keyword;[new];
  35658. - SyntaxKind.Whitespace;[ ];
  35659. - SyntaxKind.LeftBrace;[{];
  35660. - SyntaxKind.Whitespace;[ ];
  35661. - SyntaxKind.RightBrace;[}];
  35662. - SyntaxKind.Whitespace;[ ];
  35663. - SyntaxKind.RightBrace;[}];
  35664. +CSharpCodeBlock - [0..25)::25 - [try { var foo = new { } }]
  35665. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  35666. + Transition;[<Missing>];
  35667. + CSharpStatementLiteral - [0..25)::25 - [try { var foo = new { } }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  35668. + Keyword;[try];
  35669. + Whitespace;[ ];
  35670. + LeftBrace;[{];
  35671. + Whitespace;[ ];
  35672. + Identifier;[var];
  35673. + Whitespace;[ ];
  35674. + Identifier;[foo];
  35675. + Whitespace;[ ];
  35676. + Assign;[=];
  35677. + Whitespace;[ ];
  35678. + Keyword;[new];
  35679. + Whitespace;[ ];
  35680. + LeftBrace;[{];
  35681. + Whitespace;[ ];
  35682. + RightBrace;[}];
  35683. + Whitespace;[ ];
  35684. + RightBrace;[}];
  35685. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsTryStatementWithOneCatchClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsTryStatementWithOneCatchClause.stree.txt
  35686. index 54e15301819..ff07101530a 100644
  35687. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsTryStatementWithOneCatchClause.stree.txt
  35688. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsTryStatementWithOneCatchClause.stree.txt
  35689. @@ -1,44 +1,46 @@
  35690. -Statement block - Gen<None> - 66 - (0:0,0)
  35691. - Code span - Gen<Stmt> - [try { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } }] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:42
  35692. - SyntaxKind.Keyword;[try];
  35693. - SyntaxKind.Whitespace;[ ];
  35694. - SyntaxKind.LeftBrace;[{];
  35695. - SyntaxKind.Whitespace;[ ];
  35696. - SyntaxKind.Identifier;[var];
  35697. - SyntaxKind.Whitespace;[ ];
  35698. - SyntaxKind.Identifier;[foo];
  35699. - SyntaxKind.Whitespace;[ ];
  35700. - SyntaxKind.Assign;[=];
  35701. - SyntaxKind.Whitespace;[ ];
  35702. - SyntaxKind.Keyword;[new];
  35703. - SyntaxKind.Whitespace;[ ];
  35704. - SyntaxKind.LeftBrace;[{];
  35705. - SyntaxKind.Whitespace;[ ];
  35706. - SyntaxKind.RightBrace;[}];
  35707. - SyntaxKind.Whitespace;[ ];
  35708. - SyntaxKind.RightBrace;[}];
  35709. - SyntaxKind.Whitespace;[ ];
  35710. - SyntaxKind.Keyword;[catch];
  35711. - SyntaxKind.LeftParenthesis;[(];
  35712. - SyntaxKind.Identifier;[Foo];
  35713. - SyntaxKind.Whitespace;[ ];
  35714. - SyntaxKind.Identifier;[Bar];
  35715. - SyntaxKind.Whitespace;[ ];
  35716. - SyntaxKind.Identifier;[Baz];
  35717. - SyntaxKind.RightParenthesis;[)];
  35718. - SyntaxKind.Whitespace;[ ];
  35719. - SyntaxKind.LeftBrace;[{];
  35720. - SyntaxKind.Whitespace;[ ];
  35721. - SyntaxKind.Identifier;[var];
  35722. - SyntaxKind.Whitespace;[ ];
  35723. - SyntaxKind.Identifier;[foo];
  35724. - SyntaxKind.Whitespace;[ ];
  35725. - SyntaxKind.Assign;[=];
  35726. - SyntaxKind.Whitespace;[ ];
  35727. - SyntaxKind.Keyword;[new];
  35728. - SyntaxKind.Whitespace;[ ];
  35729. - SyntaxKind.LeftBrace;[{];
  35730. - SyntaxKind.Whitespace;[ ];
  35731. - SyntaxKind.RightBrace;[}];
  35732. - SyntaxKind.Whitespace;[ ];
  35733. - SyntaxKind.RightBrace;[}];
  35734. +CSharpCodeBlock - [0..66)::66 - [try { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } }]
  35735. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  35736. + Transition;[<Missing>];
  35737. + CSharpStatementLiteral - [0..66)::66 - [try { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  35738. + Keyword;[try];
  35739. + Whitespace;[ ];
  35740. + LeftBrace;[{];
  35741. + Whitespace;[ ];
  35742. + Identifier;[var];
  35743. + Whitespace;[ ];
  35744. + Identifier;[foo];
  35745. + Whitespace;[ ];
  35746. + Assign;[=];
  35747. + Whitespace;[ ];
  35748. + Keyword;[new];
  35749. + Whitespace;[ ];
  35750. + LeftBrace;[{];
  35751. + Whitespace;[ ];
  35752. + RightBrace;[}];
  35753. + Whitespace;[ ];
  35754. + RightBrace;[}];
  35755. + Whitespace;[ ];
  35756. + Keyword;[catch];
  35757. + LeftParenthesis;[(];
  35758. + Identifier;[Foo];
  35759. + Whitespace;[ ];
  35760. + Identifier;[Bar];
  35761. + Whitespace;[ ];
  35762. + Identifier;[Baz];
  35763. + RightParenthesis;[)];
  35764. + Whitespace;[ ];
  35765. + LeftBrace;[{];
  35766. + Whitespace;[ ];
  35767. + Identifier;[var];
  35768. + Whitespace;[ ];
  35769. + Identifier;[foo];
  35770. + Whitespace;[ ];
  35771. + Assign;[=];
  35772. + Whitespace;[ ];
  35773. + Keyword;[new];
  35774. + Whitespace;[ ];
  35775. + LeftBrace;[{];
  35776. + Whitespace;[ ];
  35777. + RightBrace;[}];
  35778. + Whitespace;[ ];
  35779. + RightBrace;[}];
  35780. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsUsingsNestedWithinOtherBlocks.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsUsingsNestedWithinOtherBlocks.stree.txt
  35781. index 429b126cbdb..867e696b2df 100644
  35782. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsUsingsNestedWithinOtherBlocks.stree.txt
  35783. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/SupportsUsingsNestedWithinOtherBlocks.stree.txt
  35784. @@ -1,55 +1,57 @@
  35785. -Statement block - Gen<None> - 96 - (0:0,0)
  35786. - Code span - Gen<Stmt> - [if(foo) { using(int i = 0; i < 10; new Foo { Bar = "baz" }) { Debug.WriteLine(@"foo } bar"); } }] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:53
  35787. - SyntaxKind.Keyword;[if];
  35788. - SyntaxKind.LeftParenthesis;[(];
  35789. - SyntaxKind.Identifier;[foo];
  35790. - SyntaxKind.RightParenthesis;[)];
  35791. - SyntaxKind.Whitespace;[ ];
  35792. - SyntaxKind.LeftBrace;[{];
  35793. - SyntaxKind.Whitespace;[ ];
  35794. - SyntaxKind.Keyword;[using];
  35795. - SyntaxKind.LeftParenthesis;[(];
  35796. - SyntaxKind.Keyword;[int];
  35797. - SyntaxKind.Whitespace;[ ];
  35798. - SyntaxKind.Identifier;[i];
  35799. - SyntaxKind.Whitespace;[ ];
  35800. - SyntaxKind.Assign;[=];
  35801. - SyntaxKind.Whitespace;[ ];
  35802. - SyntaxKind.IntegerLiteral;[0];
  35803. - SyntaxKind.Semicolon;[;];
  35804. - SyntaxKind.Whitespace;[ ];
  35805. - SyntaxKind.Identifier;[i];
  35806. - SyntaxKind.Whitespace;[ ];
  35807. - SyntaxKind.LessThan;[<];
  35808. - SyntaxKind.Whitespace;[ ];
  35809. - SyntaxKind.IntegerLiteral;[10];
  35810. - SyntaxKind.Semicolon;[;];
  35811. - SyntaxKind.Whitespace;[ ];
  35812. - SyntaxKind.Keyword;[new];
  35813. - SyntaxKind.Whitespace;[ ];
  35814. - SyntaxKind.Identifier;[Foo];
  35815. - SyntaxKind.Whitespace;[ ];
  35816. - SyntaxKind.LeftBrace;[{];
  35817. - SyntaxKind.Whitespace;[ ];
  35818. - SyntaxKind.Identifier;[Bar];
  35819. - SyntaxKind.Whitespace;[ ];
  35820. - SyntaxKind.Assign;[=];
  35821. - SyntaxKind.Whitespace;[ ];
  35822. - SyntaxKind.StringLiteral;["baz"];
  35823. - SyntaxKind.Whitespace;[ ];
  35824. - SyntaxKind.RightBrace;[}];
  35825. - SyntaxKind.RightParenthesis;[)];
  35826. - SyntaxKind.Whitespace;[ ];
  35827. - SyntaxKind.LeftBrace;[{];
  35828. - SyntaxKind.Whitespace;[ ];
  35829. - SyntaxKind.Identifier;[Debug];
  35830. - SyntaxKind.Dot;[.];
  35831. - SyntaxKind.Identifier;[WriteLine];
  35832. - SyntaxKind.LeftParenthesis;[(];
  35833. - SyntaxKind.StringLiteral;[@"foo } bar"];
  35834. - SyntaxKind.RightParenthesis;[)];
  35835. - SyntaxKind.Semicolon;[;];
  35836. - SyntaxKind.Whitespace;[ ];
  35837. - SyntaxKind.RightBrace;[}];
  35838. - SyntaxKind.Whitespace;[ ];
  35839. - SyntaxKind.RightBrace;[}];
  35840. +CSharpCodeBlock - [0..96)::96 - [if(foo) { using(int i = 0; i < 10; new Foo { Bar = "baz" }) { Debug.WriteLine(@"foo } bar"); } }]
  35841. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  35842. + Transition;[<Missing>];
  35843. + CSharpStatementLiteral - [0..96)::96 - [if(foo) { using(int i = 0; i < 10; new Foo { Bar = "baz" }) { Debug.WriteLine(@"foo } bar"); } }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  35844. + Keyword;[if];
  35845. + LeftParenthesis;[(];
  35846. + Identifier;[foo];
  35847. + RightParenthesis;[)];
  35848. + Whitespace;[ ];
  35849. + LeftBrace;[{];
  35850. + Whitespace;[ ];
  35851. + Keyword;[using];
  35852. + LeftParenthesis;[(];
  35853. + Keyword;[int];
  35854. + Whitespace;[ ];
  35855. + Identifier;[i];
  35856. + Whitespace;[ ];
  35857. + Assign;[=];
  35858. + Whitespace;[ ];
  35859. + IntegerLiteral;[0];
  35860. + Semicolon;[;];
  35861. + Whitespace;[ ];
  35862. + Identifier;[i];
  35863. + Whitespace;[ ];
  35864. + LessThan;[<];
  35865. + Whitespace;[ ];
  35866. + IntegerLiteral;[10];
  35867. + Semicolon;[;];
  35868. + Whitespace;[ ];
  35869. + Keyword;[new];
  35870. + Whitespace;[ ];
  35871. + Identifier;[Foo];
  35872. + Whitespace;[ ];
  35873. + LeftBrace;[{];
  35874. + Whitespace;[ ];
  35875. + Identifier;[Bar];
  35876. + Whitespace;[ ];
  35877. + Assign;[=];
  35878. + Whitespace;[ ];
  35879. + StringLiteral;["baz"];
  35880. + Whitespace;[ ];
  35881. + RightBrace;[}];
  35882. + RightParenthesis;[)];
  35883. + Whitespace;[ ];
  35884. + LeftBrace;[{];
  35885. + Whitespace;[ ];
  35886. + Identifier;[Debug];
  35887. + Dot;[.];
  35888. + Identifier;[WriteLine];
  35889. + LeftParenthesis;[(];
  35890. + StringLiteral;[@"foo } bar"];
  35891. + RightParenthesis;[)];
  35892. + Semicolon;[;];
  35893. + Whitespace;[ ];
  35894. + RightBrace;[}];
  35895. + Whitespace;[ ];
  35896. + RightBrace;[}];
  35897. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TerminatesBlockCommentAtEndOfFile.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TerminatesBlockCommentAtEndOfFile.stree.txt
  35898. index ea93ea30db9..43cd0d98f6a 100644
  35899. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TerminatesBlockCommentAtEndOfFile.stree.txt
  35900. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TerminatesBlockCommentAtEndOfFile.stree.txt
  35901. @@ -1,16 +1,18 @@
  35902. -Statement block - Gen<None> - 38 - (0:0,0)
  35903. - Code span - Gen<Stmt> - [foreach(var f in Foo) { /* foo bar baz] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:14
  35904. - SyntaxKind.Keyword;[foreach];
  35905. - SyntaxKind.LeftParenthesis;[(];
  35906. - SyntaxKind.Identifier;[var];
  35907. - SyntaxKind.Whitespace;[ ];
  35908. - SyntaxKind.Identifier;[f];
  35909. - SyntaxKind.Whitespace;[ ];
  35910. - SyntaxKind.Keyword;[in];
  35911. - SyntaxKind.Whitespace;[ ];
  35912. - SyntaxKind.Identifier;[Foo];
  35913. - SyntaxKind.RightParenthesis;[)];
  35914. - SyntaxKind.Whitespace;[ ];
  35915. - SyntaxKind.LeftBrace;[{];
  35916. - SyntaxKind.Whitespace;[ ];
  35917. - SyntaxKind.CSharpComment;[/* foo bar baz];RZ1001(24:0,24 [1] )
  35918. +CSharpCodeBlock - [0..38)::38 - [foreach(var f in Foo) { /* foo bar baz]
  35919. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  35920. + Transition;[<Missing>];
  35921. + CSharpStatementLiteral - [0..38)::38 - [foreach(var f in Foo) { /* foo bar baz] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  35922. + Keyword;[foreach];
  35923. + LeftParenthesis;[(];
  35924. + Identifier;[var];
  35925. + Whitespace;[ ];
  35926. + Identifier;[f];
  35927. + Whitespace;[ ];
  35928. + Keyword;[in];
  35929. + Whitespace;[ ];
  35930. + Identifier;[Foo];
  35931. + RightParenthesis;[)];
  35932. + Whitespace;[ ];
  35933. + LeftBrace;[{];
  35934. + Whitespace;[ ];
  35935. + CSharpComment;[/* foo bar baz];RZ1001(24:0,24 [1] )
  35936. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TerminatesParenBalancingAtEOF.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TerminatesParenBalancingAtEOF.stree.txt
  35937. index 9f50f958945..1b96a793034 100644
  35938. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TerminatesParenBalancingAtEOF.stree.txt
  35939. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TerminatesParenBalancingAtEOF.stree.txt
  35940. @@ -1,11 +1,14 @@
  35941. -Expression block - Gen<Expr> - 15 - (0:0,0)
  35942. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  35943. - SyntaxKind.Transition;[@];
  35944. - Code span - Gen<Expr> - [Html.En(code()] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:7
  35945. - SyntaxKind.Identifier;[Html];
  35946. - SyntaxKind.Dot;[.];
  35947. - SyntaxKind.Identifier;[En];
  35948. - SyntaxKind.LeftParenthesis;[(];
  35949. - SyntaxKind.Identifier;[code];
  35950. - SyntaxKind.LeftParenthesis;[(];
  35951. - SyntaxKind.RightParenthesis;[)];
  35952. +CSharpCodeBlock - [0..15)::15 - [@Html.En(code()]
  35953. + CSharpImplicitExpression - [0..15)::15
  35954. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  35955. + Transition;[@];
  35956. + CSharpImplicitExpressionBody - [1..15)::14
  35957. + CSharpCodeBlock - [1..15)::14
  35958. + CSharpExpressionLiteral - [1..15)::14 - [Html.En(code()] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14
  35959. + Identifier;[Html];
  35960. + Dot;[.];
  35961. + Identifier;[En];
  35962. + LeftParenthesis;[(];
  35963. + Identifier;[code];
  35964. + LeftParenthesis;[(];
  35965. + RightParenthesis;[)];
  35966. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TerminatesSingleLineCommentAtEndOfFile.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TerminatesSingleLineCommentAtEndOfFile.stree.txt
  35967. index 61516390774..51347e9a020 100644
  35968. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TerminatesSingleLineCommentAtEndOfFile.stree.txt
  35969. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TerminatesSingleLineCommentAtEndOfFile.stree.txt
  35970. @@ -1,16 +1,18 @@
  35971. -Statement block - Gen<None> - 38 - (0:0,0)
  35972. - Code span - Gen<Stmt> - [foreach(var f in Foo) { // foo bar baz] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:14
  35973. - SyntaxKind.Keyword;[foreach];
  35974. - SyntaxKind.LeftParenthesis;[(];
  35975. - SyntaxKind.Identifier;[var];
  35976. - SyntaxKind.Whitespace;[ ];
  35977. - SyntaxKind.Identifier;[f];
  35978. - SyntaxKind.Whitespace;[ ];
  35979. - SyntaxKind.Keyword;[in];
  35980. - SyntaxKind.Whitespace;[ ];
  35981. - SyntaxKind.Identifier;[Foo];
  35982. - SyntaxKind.RightParenthesis;[)];
  35983. - SyntaxKind.Whitespace;[ ];
  35984. - SyntaxKind.LeftBrace;[{];
  35985. - SyntaxKind.Whitespace;[ ];
  35986. - SyntaxKind.CSharpComment;[// foo bar baz];
  35987. +CSharpCodeBlock - [0..38)::38 - [foreach(var f in Foo) { // foo bar baz]
  35988. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  35989. + Transition;[<Missing>];
  35990. + CSharpStatementLiteral - [0..38)::38 - [foreach(var f in Foo) { // foo bar baz] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  35991. + Keyword;[foreach];
  35992. + LeftParenthesis;[(];
  35993. + Identifier;[var];
  35994. + Whitespace;[ ];
  35995. + Identifier;[f];
  35996. + Whitespace;[ ];
  35997. + Keyword;[in];
  35998. + Whitespace;[ ];
  35999. + Identifier;[Foo];
  36000. + RightParenthesis;[)];
  36001. + Whitespace;[ ];
  36002. + LeftBrace;[{];
  36003. + Whitespace;[ ];
  36004. + CSharpComment;[// foo bar baz];
  36005. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TerminatesSingleSlashAtEndOfFile.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TerminatesSingleSlashAtEndOfFile.stree.txt
  36006. index f2643653cd3..5fbe108031a 100644
  36007. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TerminatesSingleSlashAtEndOfFile.stree.txt
  36008. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TerminatesSingleSlashAtEndOfFile.stree.txt
  36009. @@ -1,22 +1,24 @@
  36010. -Statement block - Gen<None> - 37 - (0:0,0)
  36011. - Code span - Gen<Stmt> - [foreach(var f in Foo) { / foo bar baz] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:20
  36012. - SyntaxKind.Keyword;[foreach];
  36013. - SyntaxKind.LeftParenthesis;[(];
  36014. - SyntaxKind.Identifier;[var];
  36015. - SyntaxKind.Whitespace;[ ];
  36016. - SyntaxKind.Identifier;[f];
  36017. - SyntaxKind.Whitespace;[ ];
  36018. - SyntaxKind.Keyword;[in];
  36019. - SyntaxKind.Whitespace;[ ];
  36020. - SyntaxKind.Identifier;[Foo];
  36021. - SyntaxKind.RightParenthesis;[)];
  36022. - SyntaxKind.Whitespace;[ ];
  36023. - SyntaxKind.LeftBrace;[{];
  36024. - SyntaxKind.Whitespace;[ ];
  36025. - SyntaxKind.Slash;[/];
  36026. - SyntaxKind.Whitespace;[ ];
  36027. - SyntaxKind.Identifier;[foo];
  36028. - SyntaxKind.Whitespace;[ ];
  36029. - SyntaxKind.Identifier;[bar];
  36030. - SyntaxKind.Whitespace;[ ];
  36031. - SyntaxKind.Identifier;[baz];
  36032. +CSharpCodeBlock - [0..37)::37 - [foreach(var f in Foo) { / foo bar baz]
  36033. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  36034. + Transition;[<Missing>];
  36035. + CSharpStatementLiteral - [0..37)::37 - [foreach(var f in Foo) { / foo bar baz] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  36036. + Keyword;[foreach];
  36037. + LeftParenthesis;[(];
  36038. + Identifier;[var];
  36039. + Whitespace;[ ];
  36040. + Identifier;[f];
  36041. + Whitespace;[ ];
  36042. + Keyword;[in];
  36043. + Whitespace;[ ];
  36044. + Identifier;[Foo];
  36045. + RightParenthesis;[)];
  36046. + Whitespace;[ ];
  36047. + LeftBrace;[{];
  36048. + Whitespace;[ ];
  36049. + Slash;[/];
  36050. + Whitespace;[ ];
  36051. + Identifier;[foo];
  36052. + Whitespace;[ ];
  36053. + Identifier;[bar];
  36054. + Whitespace;[ ];
  36055. + Identifier;[baz];
  36056. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TerminatesUsingKeywordAtEOFAndOutputsFileCodeBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TerminatesUsingKeywordAtEOFAndOutputsFileCodeBlock.stree.txt
  36057. index b0fd67916fc..0880fd7ca37 100644
  36058. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TerminatesUsingKeywordAtEOFAndOutputsFileCodeBlock.stree.txt
  36059. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TerminatesUsingKeywordAtEOFAndOutputsFileCodeBlock.stree.txt
  36060. @@ -1,4 +1,4 @@
  36061. -Statement block - Gen<None> - 25 - (0:0,0)
  36062. - Code span - Gen<Stmt> - [using ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  36063. - SyntaxKind.Keyword;[using];
  36064. - SyntaxKind.Whitespace;[ ];
  36065. +CSharpCodeBlock - [0..25)::25 - [using ]
  36066. + CSharpStatementLiteral - [0..25)::25 - [using ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  36067. + Keyword;[using];
  36068. + Whitespace;[ ];
  36069. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ThenBalancesBracesIfFirstIdentifierIsLockKeyword.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ThenBalancesBracesIfFirstIdentifierIsLockKeyword.stree.txt
  36070. index 7d68d60c186..31249b0f212 100644
  36071. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ThenBalancesBracesIfFirstIdentifierIsLockKeyword.stree.txt
  36072. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ThenBalancesBracesIfFirstIdentifierIsLockKeyword.stree.txt
  36073. @@ -1,18 +1,20 @@
  36074. -Statement block - Gen<None> - 44 - (0:0,0)
  36075. - Code span - Gen<Stmt> - [lock(foo) { Debug.WriteLine(@"foo } bar"); }] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:16
  36076. - SyntaxKind.Keyword;[lock];
  36077. - SyntaxKind.LeftParenthesis;[(];
  36078. - SyntaxKind.Identifier;[foo];
  36079. - SyntaxKind.RightParenthesis;[)];
  36080. - SyntaxKind.Whitespace;[ ];
  36081. - SyntaxKind.LeftBrace;[{];
  36082. - SyntaxKind.Whitespace;[ ];
  36083. - SyntaxKind.Identifier;[Debug];
  36084. - SyntaxKind.Dot;[.];
  36085. - SyntaxKind.Identifier;[WriteLine];
  36086. - SyntaxKind.LeftParenthesis;[(];
  36087. - SyntaxKind.StringLiteral;[@"foo } bar"];
  36088. - SyntaxKind.RightParenthesis;[)];
  36089. - SyntaxKind.Semicolon;[;];
  36090. - SyntaxKind.Whitespace;[ ];
  36091. - SyntaxKind.RightBrace;[}];
  36092. +CSharpCodeBlock - [0..44)::44 - [lock(foo) { Debug.WriteLine(@"foo } bar"); }]
  36093. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  36094. + Transition;[<Missing>];
  36095. + CSharpStatementLiteral - [0..44)::44 - [lock(foo) { Debug.WriteLine(@"foo } bar"); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  36096. + Keyword;[lock];
  36097. + LeftParenthesis;[(];
  36098. + Identifier;[foo];
  36099. + RightParenthesis;[)];
  36100. + Whitespace;[ ];
  36101. + LeftBrace;[{];
  36102. + Whitespace;[ ];
  36103. + Identifier;[Debug];
  36104. + Dot;[.];
  36105. + Identifier;[WriteLine];
  36106. + LeftParenthesis;[(];
  36107. + StringLiteral;[@"foo } bar"];
  36108. + RightParenthesis;[)];
  36109. + Semicolon;[;];
  36110. + Whitespace;[ ];
  36111. + RightBrace;[}];
  36112. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TreatsAtSignsAfterFirstPairAsPartOfCSharpStatement.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TreatsAtSignsAfterFirstPairAsPartOfCSharpStatement.stree.txt
  36113. index 83909c4da09..87ffa57e547 100644
  36114. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TreatsAtSignsAfterFirstPairAsPartOfCSharpStatement.stree.txt
  36115. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TreatsAtSignsAfterFirstPairAsPartOfCSharpStatement.stree.txt
  36116. @@ -1,22 +1,24 @@
  36117. -Statement block - Gen<None> - 27 - (0:0,0)
  36118. - Code span - Gen<Stmt> - [if(foo) { ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:7
  36119. - SyntaxKind.Keyword;[if];
  36120. - SyntaxKind.LeftParenthesis;[(];
  36121. - SyntaxKind.Identifier;[foo];
  36122. - SyntaxKind.RightParenthesis;[)];
  36123. - SyntaxKind.Whitespace;[ ];
  36124. - SyntaxKind.LeftBrace;[{];
  36125. - SyntaxKind.Whitespace;[ ];
  36126. - Code span - Gen<None> - [@] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  36127. - SyntaxKind.Transition;[@];
  36128. - Code span - Gen<Stmt> - [@@@class.Foo() }] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:10
  36129. - SyntaxKind.Transition;[@];
  36130. - SyntaxKind.Transition;[@];
  36131. - SyntaxKind.Transition;[@];
  36132. - SyntaxKind.Keyword;[class];
  36133. - SyntaxKind.Dot;[.];
  36134. - SyntaxKind.Identifier;[Foo];
  36135. - SyntaxKind.LeftParenthesis;[(];
  36136. - SyntaxKind.RightParenthesis;[)];
  36137. - SyntaxKind.Whitespace;[ ];
  36138. - SyntaxKind.RightBrace;[}];
  36139. +CSharpCodeBlock - [0..27)::27 - [if(foo) { @@@@class.Foo() }]
  36140. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  36141. + Transition;[<Missing>];
  36142. + CSharpStatementLiteral - [0..10)::10 - [if(foo) { ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  36143. + Keyword;[if];
  36144. + LeftParenthesis;[(];
  36145. + Identifier;[foo];
  36146. + RightParenthesis;[)];
  36147. + Whitespace;[ ];
  36148. + LeftBrace;[{];
  36149. + Whitespace;[ ];
  36150. + CSharpEphemeralTextLiteral - [10..11)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:Any
  36151. + Transition;[@];
  36152. + CSharpStatementLiteral - [11..27)::16 - [@@@class.Foo() }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  36153. + Transition;[@];
  36154. + Transition;[@];
  36155. + Transition;[@];
  36156. + Keyword;[class];
  36157. + Dot;[.];
  36158. + Identifier;[Foo];
  36159. + LeftParenthesis;[(];
  36160. + RightParenthesis;[)];
  36161. + Whitespace;[ ];
  36162. + RightBrace;[}];
  36163. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TreatsDoubleAtSignAsEscapeSequenceIfAtStatementStart.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TreatsDoubleAtSignAsEscapeSequenceIfAtStatementStart.stree.txt
  36164. index cfd3620a03d..a2b3f220c29 100644
  36165. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TreatsDoubleAtSignAsEscapeSequenceIfAtStatementStart.stree.txt
  36166. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/TreatsDoubleAtSignAsEscapeSequenceIfAtStatementStart.stree.txt
  36167. @@ -1,20 +1,22 @@
  36168. -Statement block - Gen<None> - 25 - (0:0,0)
  36169. - Code span - Gen<Stmt> - [if(foo) { ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:7
  36170. - SyntaxKind.Keyword;[if];
  36171. - SyntaxKind.LeftParenthesis;[(];
  36172. - SyntaxKind.Identifier;[foo];
  36173. - SyntaxKind.RightParenthesis;[)];
  36174. - SyntaxKind.Whitespace;[ ];
  36175. - SyntaxKind.LeftBrace;[{];
  36176. - SyntaxKind.Whitespace;[ ];
  36177. - Code span - Gen<None> - [@] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  36178. - SyntaxKind.Transition;[@];
  36179. - Code span - Gen<Stmt> - [@class.Foo() }] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:8
  36180. - SyntaxKind.Transition;[@];
  36181. - SyntaxKind.Keyword;[class];
  36182. - SyntaxKind.Dot;[.];
  36183. - SyntaxKind.Identifier;[Foo];
  36184. - SyntaxKind.LeftParenthesis;[(];
  36185. - SyntaxKind.RightParenthesis;[)];
  36186. - SyntaxKind.Whitespace;[ ];
  36187. - SyntaxKind.RightBrace;[}];
  36188. +CSharpCodeBlock - [0..25)::25 - [if(foo) { @@class.Foo() }]
  36189. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  36190. + Transition;[<Missing>];
  36191. + CSharpStatementLiteral - [0..10)::10 - [if(foo) { ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  36192. + Keyword;[if];
  36193. + LeftParenthesis;[(];
  36194. + Identifier;[foo];
  36195. + RightParenthesis;[)];
  36196. + Whitespace;[ ];
  36197. + LeftBrace;[{];
  36198. + Whitespace;[ ];
  36199. + CSharpEphemeralTextLiteral - [10..11)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:Any
  36200. + Transition;[@];
  36201. + CSharpStatementLiteral - [11..25)::14 - [@class.Foo() }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  36202. + Transition;[@];
  36203. + Keyword;[class];
  36204. + Dot;[.];
  36205. + Identifier;[Foo];
  36206. + LeftParenthesis;[(];
  36207. + RightParenthesis;[)];
  36208. + Whitespace;[ ];
  36209. + RightBrace;[}];
  36210. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionAtBeginningOfAttributeValue_DoesNotThrow.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionAtBeginningOfAttributeValue_DoesNotThrow.stree.txt
  36211. index ce9722564dc..b7ffda307f3 100644
  36212. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionAtBeginningOfAttributeValue_DoesNotThrow.stree.txt
  36213. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionAtBeginningOfAttributeValue_DoesNotThrow.stree.txt
  36214. @@ -1,31 +1,40 @@
  36215. -Statement block - Gen<None> - 22 - (0:0,0)
  36216. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  36217. - SyntaxKind.LeftBrace;[{];
  36218. - Markup block - Gen<None> - 20 - (1:0,1)
  36219. - Tag block - Gen<None> - 20 - (1:0,1)
  36220. - Markup span - Gen<Markup> - [<span] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:2
  36221. - SyntaxKind.OpenAngle;[<];
  36222. - SyntaxKind.Text;[span];
  36223. - Markup block - Gen<Attr:foo, foo='@(6:0,6),'@(17:0,17)> - 12 - (6:0,6)
  36224. - Markup span - Gen<None> - [ foo='] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:4
  36225. - SyntaxKind.Whitespace;[ ];
  36226. - SyntaxKind.Text;[foo];
  36227. - SyntaxKind.Equals;[=];
  36228. - SyntaxKind.SingleQuote;['];
  36229. - Markup block - Gen<None> - 2 - (12:0,12)
  36230. - Markup span - Gen<LitAttr:@(12:0,12)> - [@] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:1
  36231. - SyntaxKind.Transition;[@];
  36232. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:1
  36233. - SyntaxKind.Transition;[@];
  36234. - Markup span - Gen<LitAttr:@(14:0,14)> - [def] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  36235. - SyntaxKind.Text;[def];
  36236. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:1
  36237. - SyntaxKind.SingleQuote;['];
  36238. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (18:0,18) - Tokens:3
  36239. - SyntaxKind.Whitespace;[ ];
  36240. - SyntaxKind.ForwardSlash;[/];
  36241. - SyntaxKind.CloseAngle;[>];
  36242. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:1
  36243. - SyntaxKind.Unknown;[];
  36244. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:1
  36245. - SyntaxKind.RightBrace;[}];
  36246. +CSharpCodeBlock - [0..22)::22 - [{<span foo='@@def' />}]
  36247. + CSharpStatement - [0..22)::22
  36248. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  36249. + Transition;[<Missing>];
  36250. + CSharpStatementBody - [0..22)::22
  36251. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  36252. + LeftBrace;[{];
  36253. + CSharpCodeBlock - [1..21)::20
  36254. + MarkupBlock - [1..21)::20
  36255. + MarkupTagBlock - [1..21)::20 - [<span foo='@@def' />]
  36256. + MarkupTextLiteral - [1..6)::5 - [<span] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36257. + OpenAngle;[<];
  36258. + Text;[span];
  36259. + MarkupAttributeBlock - [6..18)::12 - [ foo='@@def']
  36260. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36261. + Whitespace;[ ];
  36262. + MarkupTextLiteral - [7..10)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36263. + Text;[foo];
  36264. + Equals;[=];
  36265. + MarkupTextLiteral - [11..12)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  36266. + SingleQuote;['];
  36267. + GenericBlock - [12..17)::5
  36268. + MarkupBlock - [12..14)::2
  36269. + MarkupTextLiteral - [12..13)::1 - [@] - Gen<LitAttr:@(12:0,12)> - SpanEditHandler;Accepts:None
  36270. + Transition;[@];
  36271. + MarkupEphemeralTextLiteral - [13..14)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  36272. + Transition;[@];
  36273. + MarkupLiteralAttributeValue - [14..17)::3 - [def]
  36274. + MarkupTextLiteral - [14..17)::3 - [def] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36275. + Text;[def];
  36276. + MarkupTextLiteral - [17..18)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  36277. + SingleQuote;['];
  36278. + MarkupTextLiteral - [18..21)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  36279. + Whitespace;[ ];
  36280. + ForwardSlash;[/];
  36281. + CloseAngle;[>];
  36282. + CSharpStatementLiteral - [21..21)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  36283. + Marker;[];
  36284. + RazorMetaCode - [21..22)::1 - Gen<None> - SpanEditHandler;Accepts:None
  36285. + RightBrace;[}];
  36286. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionAtEndOfAttributeValue_DoesNotThrow.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionAtEndOfAttributeValue_DoesNotThrow.stree.txt
  36287. index 6fdd6731065..277f2e6290b 100644
  36288. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionAtEndOfAttributeValue_DoesNotThrow.stree.txt
  36289. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionAtEndOfAttributeValue_DoesNotThrow.stree.txt
  36290. @@ -1,31 +1,40 @@
  36291. -Statement block - Gen<None> - 22 - (0:0,0)
  36292. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  36293. - SyntaxKind.LeftBrace;[{];
  36294. - Markup block - Gen<None> - 20 - (1:0,1)
  36295. - Tag block - Gen<None> - 20 - (1:0,1)
  36296. - Markup span - Gen<Markup> - [<span] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:2
  36297. - SyntaxKind.OpenAngle;[<];
  36298. - SyntaxKind.Text;[span];
  36299. - Markup block - Gen<Attr:foo, foo='@(6:0,6),'@(17:0,17)> - 12 - (6:0,6)
  36300. - Markup span - Gen<None> - [ foo='] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:4
  36301. - SyntaxKind.Whitespace;[ ];
  36302. - SyntaxKind.Text;[foo];
  36303. - SyntaxKind.Equals;[=];
  36304. - SyntaxKind.SingleQuote;['];
  36305. - Markup span - Gen<LitAttr:@(12:0,12)> - [abc] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:1
  36306. - SyntaxKind.Text;[abc];
  36307. - Markup block - Gen<None> - 2 - (15:0,15)
  36308. - Markup span - Gen<LitAttr:@(15:0,15)> - [@] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:1
  36309. - SyntaxKind.Transition;[@];
  36310. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  36311. - SyntaxKind.Transition;[@];
  36312. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:1
  36313. - SyntaxKind.SingleQuote;['];
  36314. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (18:0,18) - Tokens:3
  36315. - SyntaxKind.Whitespace;[ ];
  36316. - SyntaxKind.ForwardSlash;[/];
  36317. - SyntaxKind.CloseAngle;[>];
  36318. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:1
  36319. - SyntaxKind.Unknown;[];
  36320. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:1
  36321. - SyntaxKind.RightBrace;[}];
  36322. +CSharpCodeBlock - [0..22)::22 - [{<span foo='abc@@' />}]
  36323. + CSharpStatement - [0..22)::22
  36324. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  36325. + Transition;[<Missing>];
  36326. + CSharpStatementBody - [0..22)::22
  36327. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  36328. + LeftBrace;[{];
  36329. + CSharpCodeBlock - [1..21)::20
  36330. + MarkupBlock - [1..21)::20
  36331. + MarkupTagBlock - [1..21)::20 - [<span foo='abc@@' />]
  36332. + MarkupTextLiteral - [1..6)::5 - [<span] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36333. + OpenAngle;[<];
  36334. + Text;[span];
  36335. + MarkupAttributeBlock - [6..18)::12 - [ foo='abc@@']
  36336. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36337. + Whitespace;[ ];
  36338. + MarkupTextLiteral - [7..10)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36339. + Text;[foo];
  36340. + Equals;[=];
  36341. + MarkupTextLiteral - [11..12)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  36342. + SingleQuote;['];
  36343. + GenericBlock - [12..17)::5
  36344. + MarkupLiteralAttributeValue - [12..15)::3 - [abc]
  36345. + MarkupTextLiteral - [12..15)::3 - [abc] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36346. + Text;[abc];
  36347. + MarkupBlock - [15..17)::2
  36348. + MarkupTextLiteral - [15..16)::1 - [@] - Gen<LitAttr:@(15:0,15)> - SpanEditHandler;Accepts:None
  36349. + Transition;[@];
  36350. + MarkupEphemeralTextLiteral - [16..17)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  36351. + Transition;[@];
  36352. + MarkupTextLiteral - [17..18)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  36353. + SingleQuote;['];
  36354. + MarkupTextLiteral - [18..21)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  36355. + Whitespace;[ ];
  36356. + ForwardSlash;[/];
  36357. + CloseAngle;[>];
  36358. + CSharpStatementLiteral - [21..21)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  36359. + Marker;[];
  36360. + RazorMetaCode - [21..22)::1 - Gen<None> - SpanEditHandler;Accepts:None
  36361. + RightBrace;[}];
  36362. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionBetweenAttributeValue_DoesNotThrow.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionBetweenAttributeValue_DoesNotThrow.stree.txt
  36363. index 028b870a53b..196257f350e 100644
  36364. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionBetweenAttributeValue_DoesNotThrow.stree.txt
  36365. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionBetweenAttributeValue_DoesNotThrow.stree.txt
  36366. @@ -1,35 +1,46 @@
  36367. -Statement block - Gen<None> - 27 - (0:0,0)
  36368. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  36369. - SyntaxKind.LeftBrace;[{];
  36370. - Markup block - Gen<None> - 25 - (1:0,1)
  36371. - Tag block - Gen<None> - 25 - (1:0,1)
  36372. - Markup span - Gen<Markup> - [<span] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:2
  36373. - SyntaxKind.OpenAngle;[<];
  36374. - SyntaxKind.Text;[span];
  36375. - Markup block - Gen<Attr:foo, foo='@(6:0,6),'@(22:0,22)> - 17 - (6:0,6)
  36376. - Markup span - Gen<None> - [ foo='] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:4
  36377. - SyntaxKind.Whitespace;[ ];
  36378. - SyntaxKind.Text;[foo];
  36379. - SyntaxKind.Equals;[=];
  36380. - SyntaxKind.SingleQuote;['];
  36381. - Markup span - Gen<LitAttr:@(12:0,12)> - [abc] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:1
  36382. - SyntaxKind.Text;[abc];
  36383. - Markup block - Gen<None> - 3 - (15:0,15)
  36384. - Markup span - Gen<LitAttr: @(15:0,15)> - [ @] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:2
  36385. - SyntaxKind.Whitespace;[ ];
  36386. - SyntaxKind.Transition;[@];
  36387. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (17:0,17) - Tokens:1
  36388. - SyntaxKind.Transition;[@];
  36389. - Markup span - Gen<LitAttr: @(18:0,18)> - [ def] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:2
  36390. - SyntaxKind.Whitespace;[ ];
  36391. - SyntaxKind.Text;[def];
  36392. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:1
  36393. - SyntaxKind.SingleQuote;['];
  36394. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (23:0,23) - Tokens:3
  36395. - SyntaxKind.Whitespace;[ ];
  36396. - SyntaxKind.ForwardSlash;[/];
  36397. - SyntaxKind.CloseAngle;[>];
  36398. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (26:0,26) - Tokens:1
  36399. - SyntaxKind.Unknown;[];
  36400. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (26:0,26) - Tokens:1
  36401. - SyntaxKind.RightBrace;[}];
  36402. +CSharpCodeBlock - [0..27)::27 - [{<span foo='abc @@ def' />}]
  36403. + CSharpStatement - [0..27)::27
  36404. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  36405. + Transition;[<Missing>];
  36406. + CSharpStatementBody - [0..27)::27
  36407. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  36408. + LeftBrace;[{];
  36409. + CSharpCodeBlock - [1..26)::25
  36410. + MarkupBlock - [1..26)::25
  36411. + MarkupTagBlock - [1..26)::25 - [<span foo='abc @@ def' />]
  36412. + MarkupTextLiteral - [1..6)::5 - [<span] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36413. + OpenAngle;[<];
  36414. + Text;[span];
  36415. + MarkupAttributeBlock - [6..23)::17 - [ foo='abc @@ def']
  36416. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36417. + Whitespace;[ ];
  36418. + MarkupTextLiteral - [7..10)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36419. + Text;[foo];
  36420. + Equals;[=];
  36421. + MarkupTextLiteral - [11..12)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  36422. + SingleQuote;['];
  36423. + GenericBlock - [12..22)::10
  36424. + MarkupLiteralAttributeValue - [12..15)::3 - [abc]
  36425. + MarkupTextLiteral - [12..15)::3 - [abc] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36426. + Text;[abc];
  36427. + MarkupBlock - [15..18)::3
  36428. + MarkupTextLiteral - [15..17)::2 - [ @] - Gen<LitAttr: @(15:0,15)> - SpanEditHandler;Accepts:None
  36429. + Whitespace;[ ];
  36430. + Transition;[@];
  36431. + MarkupEphemeralTextLiteral - [17..18)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  36432. + Transition;[@];
  36433. + MarkupLiteralAttributeValue - [18..22)::4 - [ def]
  36434. + MarkupTextLiteral - [18..19)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36435. + Whitespace;[ ];
  36436. + MarkupTextLiteral - [19..22)::3 - [def] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36437. + Text;[def];
  36438. + MarkupTextLiteral - [22..23)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  36439. + SingleQuote;['];
  36440. + MarkupTextLiteral - [23..26)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  36441. + Whitespace;[ ];
  36442. + ForwardSlash;[/];
  36443. + CloseAngle;[>];
  36444. + CSharpStatementLiteral - [26..26)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  36445. + Marker;[];
  36446. + RazorMetaCode - [26..27)::1 - Gen<None> - SpanEditHandler;Accepts:None
  36447. + RightBrace;[}];
  36448. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionInAttributeValue_DoesNotThrow.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionInAttributeValue_DoesNotThrow.stree.txt
  36449. index b979bc36451..38ffb3ab75d 100644
  36450. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionInAttributeValue_DoesNotThrow.stree.txt
  36451. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionInAttributeValue_DoesNotThrow.stree.txt
  36452. @@ -1,29 +1,37 @@
  36453. -Statement block - Gen<None> - 19 - (0:0,0)
  36454. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  36455. - SyntaxKind.LeftBrace;[{];
  36456. - Markup block - Gen<None> - 17 - (1:0,1)
  36457. - Tag block - Gen<None> - 17 - (1:0,1)
  36458. - Markup span - Gen<Markup> - [<span] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:2
  36459. - SyntaxKind.OpenAngle;[<];
  36460. - SyntaxKind.Text;[span];
  36461. - Markup block - Gen<Attr:foo, foo='@(6:0,6),'@(14:0,14)> - 9 - (6:0,6)
  36462. - Markup span - Gen<None> - [ foo='] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:4
  36463. - SyntaxKind.Whitespace;[ ];
  36464. - SyntaxKind.Text;[foo];
  36465. - SyntaxKind.Equals;[=];
  36466. - SyntaxKind.SingleQuote;['];
  36467. - Markup block - Gen<None> - 2 - (12:0,12)
  36468. - Markup span - Gen<LitAttr:@(12:0,12)> - [@] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:1
  36469. - SyntaxKind.Transition;[@];
  36470. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:1
  36471. - SyntaxKind.Transition;[@];
  36472. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  36473. - SyntaxKind.SingleQuote;['];
  36474. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:3
  36475. - SyntaxKind.Whitespace;[ ];
  36476. - SyntaxKind.ForwardSlash;[/];
  36477. - SyntaxKind.CloseAngle;[>];
  36478. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:1
  36479. - SyntaxKind.Unknown;[];
  36480. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (18:0,18) - Tokens:1
  36481. - SyntaxKind.RightBrace;[}];
  36482. +CSharpCodeBlock - [0..19)::19 - [{<span foo='@@' />}]
  36483. + CSharpStatement - [0..19)::19
  36484. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  36485. + Transition;[<Missing>];
  36486. + CSharpStatementBody - [0..19)::19
  36487. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  36488. + LeftBrace;[{];
  36489. + CSharpCodeBlock - [1..18)::17
  36490. + MarkupBlock - [1..18)::17
  36491. + MarkupTagBlock - [1..18)::17 - [<span foo='@@' />]
  36492. + MarkupTextLiteral - [1..6)::5 - [<span] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36493. + OpenAngle;[<];
  36494. + Text;[span];
  36495. + MarkupAttributeBlock - [6..15)::9 - [ foo='@@']
  36496. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36497. + Whitespace;[ ];
  36498. + MarkupTextLiteral - [7..10)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36499. + Text;[foo];
  36500. + Equals;[=];
  36501. + MarkupTextLiteral - [11..12)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  36502. + SingleQuote;['];
  36503. + GenericBlock - [12..14)::2
  36504. + MarkupBlock - [12..14)::2
  36505. + MarkupTextLiteral - [12..13)::1 - [@] - Gen<LitAttr:@(12:0,12)> - SpanEditHandler;Accepts:None
  36506. + Transition;[@];
  36507. + MarkupEphemeralTextLiteral - [13..14)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  36508. + Transition;[@];
  36509. + MarkupTextLiteral - [14..15)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  36510. + SingleQuote;['];
  36511. + MarkupTextLiteral - [15..18)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  36512. + Whitespace;[ ];
  36513. + ForwardSlash;[/];
  36514. + CloseAngle;[>];
  36515. + CSharpStatementLiteral - [18..18)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  36516. + Marker;[];
  36517. + RazorMetaCode - [18..19)::1 - Gen<None> - SpanEditHandler;Accepts:None
  36518. + RightBrace;[}];
  36519. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionInEmail_DoesNotThrow.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionInEmail_DoesNotThrow.stree.txt
  36520. index 1d16ff79f2d..01cbcf60274 100644
  36521. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionInEmail_DoesNotThrow.stree.txt
  36522. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionInEmail_DoesNotThrow.stree.txt
  36523. @@ -1,42 +1,54 @@
  36524. -Statement block - Gen<None> - 44 - (0:0,0)
  36525. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  36526. - SyntaxKind.LeftBrace;[{];
  36527. - Markup block - Gen<None> - 42 - (1:0,1)
  36528. - Tag block - Gen<None> - 42 - (1:0,1)
  36529. - Markup span - Gen<Markup> - [<span] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:2
  36530. - SyntaxKind.OpenAngle;[<];
  36531. - SyntaxKind.Text;[span];
  36532. - Markup block - Gen<Attr:foo, foo='@(6:0,6),'@(39:0,39)> - 34 - (6:0,6)
  36533. - Markup span - Gen<None> - [ foo='] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:4
  36534. - SyntaxKind.Whitespace;[ ];
  36535. - SyntaxKind.Text;[foo];
  36536. - SyntaxKind.Equals;[=];
  36537. - SyntaxKind.SingleQuote;['];
  36538. - Markup span - Gen<LitAttr:@(12:0,12)> - [[email protected]] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:1
  36539. - SyntaxKind.Text;[[email protected]];
  36540. - Markup span - Gen<LitAttr: @(23:0,23)> - [ abc] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:2
  36541. - SyntaxKind.Whitespace;[ ];
  36542. - SyntaxKind.Text;[abc];
  36543. - Markup block - Gen<None> - 2 - (27:0,27)
  36544. - Markup span - Gen<LitAttr:@(27:0,27)> - [@] - SpanEditHandler;Accepts:None - (27:0,27) - Tokens:1
  36545. - SyntaxKind.Transition;[@];
  36546. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (28:0,28) - Tokens:1
  36547. - SyntaxKind.Transition;[@];
  36548. - Markup span - Gen<LitAttr:@(29:0,29)> - [def.com] - SpanEditHandler;Accepts:Any - (29:0,29) - Tokens:1
  36549. - SyntaxKind.Text;[def.com];
  36550. - Markup block - Gen<None> - 3 - (36:0,36)
  36551. - Markup span - Gen<LitAttr: @(36:0,36)> - [ @] - SpanEditHandler;Accepts:None - (36:0,36) - Tokens:2
  36552. - SyntaxKind.Whitespace;[ ];
  36553. - SyntaxKind.Transition;[@];
  36554. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (38:0,38) - Tokens:1
  36555. - SyntaxKind.Transition;[@];
  36556. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (39:0,39) - Tokens:1
  36557. - SyntaxKind.SingleQuote;['];
  36558. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (40:0,40) - Tokens:3
  36559. - SyntaxKind.Whitespace;[ ];
  36560. - SyntaxKind.ForwardSlash;[/];
  36561. - SyntaxKind.CloseAngle;[>];
  36562. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (43:0,43) - Tokens:1
  36563. - SyntaxKind.Unknown;[];
  36564. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (43:0,43) - Tokens:1
  36565. - SyntaxKind.RightBrace;[}];
  36566. +CSharpCodeBlock - [0..44)::44 - [{<span foo='[email protected] abc@@def.com @@' />}]
  36567. + CSharpStatement - [0..44)::44
  36568. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  36569. + Transition;[<Missing>];
  36570. + CSharpStatementBody - [0..44)::44
  36571. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  36572. + LeftBrace;[{];
  36573. + CSharpCodeBlock - [1..43)::42
  36574. + MarkupBlock - [1..43)::42
  36575. + MarkupTagBlock - [1..43)::42 - [<span foo='[email protected] abc@@def.com @@' />]
  36576. + MarkupTextLiteral - [1..6)::5 - [<span] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36577. + OpenAngle;[<];
  36578. + Text;[span];
  36579. + MarkupAttributeBlock - [6..40)::34 - [ foo='[email protected] abc@@def.com @@']
  36580. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36581. + Whitespace;[ ];
  36582. + MarkupTextLiteral - [7..10)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36583. + Text;[foo];
  36584. + Equals;[=];
  36585. + MarkupTextLiteral - [11..12)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  36586. + SingleQuote;['];
  36587. + GenericBlock - [12..39)::27
  36588. + MarkupLiteralAttributeValue - [12..23)::11 - [[email protected]]
  36589. + MarkupTextLiteral - [12..23)::11 - [[email protected]] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36590. + Text;[[email protected]];
  36591. + MarkupLiteralAttributeValue - [23..27)::4 - [ abc]
  36592. + MarkupTextLiteral - [23..24)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36593. + Whitespace;[ ];
  36594. + MarkupTextLiteral - [24..27)::3 - [abc] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36595. + Text;[abc];
  36596. + MarkupBlock - [27..29)::2
  36597. + MarkupTextLiteral - [27..28)::1 - [@] - Gen<LitAttr:@(27:0,27)> - SpanEditHandler;Accepts:None
  36598. + Transition;[@];
  36599. + MarkupEphemeralTextLiteral - [28..29)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  36600. + Transition;[@];
  36601. + MarkupLiteralAttributeValue - [29..36)::7 - [def.com]
  36602. + MarkupTextLiteral - [29..36)::7 - [def.com] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36603. + Text;[def.com];
  36604. + MarkupBlock - [36..39)::3
  36605. + MarkupTextLiteral - [36..38)::2 - [ @] - Gen<LitAttr: @(36:0,36)> - SpanEditHandler;Accepts:None
  36606. + Whitespace;[ ];
  36607. + Transition;[@];
  36608. + MarkupEphemeralTextLiteral - [38..39)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  36609. + Transition;[@];
  36610. + MarkupTextLiteral - [39..40)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  36611. + SingleQuote;['];
  36612. + MarkupTextLiteral - [40..43)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  36613. + Whitespace;[ ];
  36614. + ForwardSlash;[/];
  36615. + CloseAngle;[>];
  36616. + CSharpStatementLiteral - [43..43)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  36617. + Marker;[];
  36618. + RazorMetaCode - [43..44)::1 - Gen<None> - SpanEditHandler;Accepts:None
  36619. + RightBrace;[}];
  36620. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionInRegex_DoesNotThrow.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionInRegex_DoesNotThrow.stree.txt
  36621. index 759fea4f4a5..b98a56dae81 100644
  36622. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionInRegex_DoesNotThrow.stree.txt
  36623. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionInRegex_DoesNotThrow.stree.txt
  36624. @@ -1,75 +1,85 @@
  36625. -Statement block - Gen<None> - 117 - (0:0,0)
  36626. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  36627. - SyntaxKind.LeftBrace;[{];
  36628. - Markup block - Gen<None> - 115 - (1:0,1)
  36629. - Tag block - Gen<None> - 115 - (1:0,1)
  36630. - Markup span - Gen<Markup> - [<span] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:2
  36631. - SyntaxKind.OpenAngle;[<];
  36632. - SyntaxKind.Text;[span];
  36633. - Markup block - Gen<Attr:foo, foo="@(6:0,6),"@(112:0,112)> - 107 - (6:0,6)
  36634. - Markup span - Gen<None> - [ foo="] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:4
  36635. - SyntaxKind.Whitespace;[ ];
  36636. - SyntaxKind.Text;[foo];
  36637. - SyntaxKind.Equals;[=];
  36638. - SyntaxKind.DoubleQuote;["];
  36639. - Markup span - Gen<LitAttr:@(12:0,12)> - [/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:14
  36640. - SyntaxKind.ForwardSlash;[/];
  36641. - SyntaxKind.Text;[^];
  36642. - SyntaxKind.LeftBracket;[[];
  36643. - SyntaxKind.Text;[a-z0-9];
  36644. - SyntaxKind.Bang;[!];
  36645. - SyntaxKind.Text;[#$%&];
  36646. - SyntaxKind.SingleQuote;['];
  36647. - SyntaxKind.Text;[*+\];
  36648. - SyntaxKind.ForwardSlash;[/];
  36649. - SyntaxKind.Equals;[=];
  36650. - SyntaxKind.QuestionMark;[?];
  36651. - SyntaxKind.Text;[^_`{|}~.-];
  36652. - SyntaxKind.RightBracket;[]];
  36653. - SyntaxKind.Text;[+];
  36654. - Markup block - Gen<None> - 2 - (44:0,44)
  36655. - Markup span - Gen<LitAttr:@(44:0,44)> - [@] - SpanEditHandler;Accepts:None - (44:0,44) - Tokens:1
  36656. - SyntaxKind.Transition;[@];
  36657. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (45:0,45) - Tokens:1
  36658. - SyntaxKind.Transition;[@];
  36659. - Markup span - Gen<LitAttr:@(46:0,46)> - [[a-z0-9]([a-z0-9-]*[a-z0-9])?\.([a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i] - SpanEditHandler;Accepts:Any - (46:0,46) - Tokens:30
  36660. - SyntaxKind.LeftBracket;[[];
  36661. - SyntaxKind.Text;[a-z0-9];
  36662. - SyntaxKind.RightBracket;[]];
  36663. - SyntaxKind.Text;[(];
  36664. - SyntaxKind.LeftBracket;[[];
  36665. - SyntaxKind.Text;[a-z0-9-];
  36666. - SyntaxKind.RightBracket;[]];
  36667. - SyntaxKind.Text;[*];
  36668. - SyntaxKind.LeftBracket;[[];
  36669. - SyntaxKind.Text;[a-z0-9];
  36670. - SyntaxKind.RightBracket;[]];
  36671. - SyntaxKind.Text;[)];
  36672. - SyntaxKind.QuestionMark;[?];
  36673. - SyntaxKind.Text;[\.(];
  36674. - SyntaxKind.LeftBracket;[[];
  36675. - SyntaxKind.Text;[a-z0-9];
  36676. - SyntaxKind.RightBracket;[]];
  36677. - SyntaxKind.Text;[(];
  36678. - SyntaxKind.LeftBracket;[[];
  36679. - SyntaxKind.Text;[a-z0-9-];
  36680. - SyntaxKind.RightBracket;[]];
  36681. - SyntaxKind.Text;[*];
  36682. - SyntaxKind.LeftBracket;[[];
  36683. - SyntaxKind.Text;[a-z0-9];
  36684. - SyntaxKind.RightBracket;[]];
  36685. - SyntaxKind.Text;[)];
  36686. - SyntaxKind.QuestionMark;[?];
  36687. - SyntaxKind.Text;[)*$];
  36688. - SyntaxKind.ForwardSlash;[/];
  36689. - SyntaxKind.Text;[i];
  36690. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (112:0,112) - Tokens:1
  36691. - SyntaxKind.DoubleQuote;["];
  36692. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (113:0,113) - Tokens:3
  36693. - SyntaxKind.Whitespace;[ ];
  36694. - SyntaxKind.ForwardSlash;[/];
  36695. - SyntaxKind.CloseAngle;[>];
  36696. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (116:0,116) - Tokens:1
  36697. - SyntaxKind.Unknown;[];
  36698. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (116:0,116) - Tokens:1
  36699. - SyntaxKind.RightBrace;[}];
  36700. +CSharpCodeBlock - [0..117)::117 - [{<span foo="/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@@[a-z0-9]([a-z0-9-]*[a-z0-9])?\.([a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i" />}]
  36701. + CSharpStatement - [0..117)::117
  36702. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  36703. + Transition;[<Missing>];
  36704. + CSharpStatementBody - [0..117)::117
  36705. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  36706. + LeftBrace;[{];
  36707. + CSharpCodeBlock - [1..116)::115
  36708. + MarkupBlock - [1..116)::115
  36709. + MarkupTagBlock - [1..116)::115 - [<span foo="/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@@[a-z0-9]([a-z0-9-]*[a-z0-9])?\.([a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i" />]
  36710. + MarkupTextLiteral - [1..6)::5 - [<span] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36711. + OpenAngle;[<];
  36712. + Text;[span];
  36713. + MarkupAttributeBlock - [6..113)::107 - [ foo="/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@@[a-z0-9]([a-z0-9-]*[a-z0-9])?\.([a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i"]
  36714. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36715. + Whitespace;[ ];
  36716. + MarkupTextLiteral - [7..10)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36717. + Text;[foo];
  36718. + Equals;[=];
  36719. + MarkupTextLiteral - [11..12)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  36720. + DoubleQuote;["];
  36721. + GenericBlock - [12..112)::100
  36722. + MarkupLiteralAttributeValue - [12..44)::32 - [/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+]
  36723. + MarkupTextLiteral - [12..44)::32 - [/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36724. + ForwardSlash;[/];
  36725. + Text;[^];
  36726. + LeftBracket;[[];
  36727. + Text;[a-z0-9];
  36728. + Bang;[!];
  36729. + Text;[#$%&];
  36730. + SingleQuote;['];
  36731. + Text;[*+\];
  36732. + ForwardSlash;[/];
  36733. + Equals;[=];
  36734. + QuestionMark;[?];
  36735. + Text;[^_`{|}~.-];
  36736. + RightBracket;[]];
  36737. + Text;[+];
  36738. + MarkupBlock - [44..46)::2
  36739. + MarkupTextLiteral - [44..45)::1 - [@] - Gen<LitAttr:@(44:0,44)> - SpanEditHandler;Accepts:None
  36740. + Transition;[@];
  36741. + MarkupEphemeralTextLiteral - [45..46)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  36742. + Transition;[@];
  36743. + MarkupLiteralAttributeValue - [46..112)::66 - [[a-z0-9]([a-z0-9-]*[a-z0-9])?\.([a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i]
  36744. + MarkupTextLiteral - [46..112)::66 - [[a-z0-9]([a-z0-9-]*[a-z0-9])?\.([a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36745. + LeftBracket;[[];
  36746. + Text;[a-z0-9];
  36747. + RightBracket;[]];
  36748. + Text;[(];
  36749. + LeftBracket;[[];
  36750. + Text;[a-z0-9-];
  36751. + RightBracket;[]];
  36752. + Text;[*];
  36753. + LeftBracket;[[];
  36754. + Text;[a-z0-9];
  36755. + RightBracket;[]];
  36756. + Text;[)];
  36757. + QuestionMark;[?];
  36758. + Text;[\.(];
  36759. + LeftBracket;[[];
  36760. + Text;[a-z0-9];
  36761. + RightBracket;[]];
  36762. + Text;[(];
  36763. + LeftBracket;[[];
  36764. + Text;[a-z0-9-];
  36765. + RightBracket;[]];
  36766. + Text;[*];
  36767. + LeftBracket;[[];
  36768. + Text;[a-z0-9];
  36769. + RightBracket;[]];
  36770. + Text;[)];
  36771. + QuestionMark;[?];
  36772. + Text;[)*$];
  36773. + ForwardSlash;[/];
  36774. + Text;[i];
  36775. + MarkupTextLiteral - [112..113)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  36776. + DoubleQuote;["];
  36777. + MarkupTextLiteral - [113..116)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  36778. + Whitespace;[ ];
  36779. + ForwardSlash;[/];
  36780. + CloseAngle;[>];
  36781. + CSharpStatementLiteral - [116..116)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  36782. + Marker;[];
  36783. + RazorMetaCode - [116..117)::1 - Gen<None> - SpanEditHandler;Accepts:None
  36784. + RightBrace;[}];
  36785. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionWithExpressionBlock_DoesNotThrow.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionWithExpressionBlock_DoesNotThrow.stree.txt
  36786. index a01eb4cccd8..6415ccab3a6 100644
  36787. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionWithExpressionBlock_DoesNotThrow.stree.txt
  36788. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransitionWithExpressionBlock_DoesNotThrow.stree.txt
  36789. @@ -1,144 +1,188 @@
  36790. -Statement block - Gen<None> - 120 - (0:0,0)
  36791. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  36792. - SyntaxKind.LeftBrace;[{];
  36793. - Markup block - Gen<None> - 118 - (1:0,1)
  36794. - Tag block - Gen<None> - 118 - (1:0,1)
  36795. - Markup span - Gen<Markup> - [<span] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:2
  36796. - SyntaxKind.OpenAngle;[<];
  36797. - SyntaxKind.Text;[span];
  36798. - Markup block - Gen<Attr:foo, foo='@(6:0,6),'@(20:0,20)> - 15 - (6:0,6)
  36799. - Markup span - Gen<None> - [ foo='] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:4
  36800. - SyntaxKind.Whitespace;[ ];
  36801. - SyntaxKind.Text;[foo];
  36802. - SyntaxKind.Equals;[=];
  36803. - SyntaxKind.SingleQuote;['];
  36804. - Markup block - Gen<None> - 2 - (12:0,12)
  36805. - Markup span - Gen<LitAttr:@(12:0,12)> - [@] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:1
  36806. - SyntaxKind.Transition;[@];
  36807. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:1
  36808. - SyntaxKind.Transition;[@];
  36809. - Markup block - Gen<DynAttr:@(14:0,14)> - 6 - (14:0,14)
  36810. - Markup span - Gen<None> - [] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  36811. - SyntaxKind.Unknown;[];
  36812. - Expression block - Gen<Expr> - 6 - (14:0,14)
  36813. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (14:0,14) - Tokens:1
  36814. - SyntaxKind.Transition;[@];
  36815. - MetaCode span - Gen<None> - [(] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:1
  36816. - SyntaxKind.LeftParenthesis;[(];
  36817. - Code span - Gen<Expr> - [2+3] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:3
  36818. - SyntaxKind.IntegerLiteral;[2];
  36819. - SyntaxKind.Plus;[+];
  36820. - SyntaxKind.IntegerLiteral;[3];
  36821. - MetaCode span - Gen<None> - [)] - SpanEditHandler;Accepts:None - (19:0,19) - Tokens:1
  36822. - SyntaxKind.RightParenthesis;[)];
  36823. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:1
  36824. - SyntaxKind.SingleQuote;['];
  36825. - Markup block - Gen<Attr:bar, bar='@(21:0,21),'@(48:0,48)> - 28 - (21:0,21)
  36826. - Markup span - Gen<None> - [ bar='] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:4
  36827. - SyntaxKind.Whitespace;[ ];
  36828. - SyntaxKind.Text;[bar];
  36829. - SyntaxKind.Equals;[=];
  36830. - SyntaxKind.SingleQuote;['];
  36831. - Markup block - Gen<DynAttr:@(27:0,27)> - 6 - (27:0,27)
  36832. - Expression block - Gen<Expr> - 6 - (27:0,27)
  36833. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (27:0,27) - Tokens:1
  36834. - SyntaxKind.Transition;[@];
  36835. - MetaCode span - Gen<None> - [(] - SpanEditHandler;Accepts:None - (28:0,28) - Tokens:1
  36836. - SyntaxKind.LeftParenthesis;[(];
  36837. - Code span - Gen<Expr> - [2+3] - SpanEditHandler;Accepts:Any - (29:0,29) - Tokens:3
  36838. - SyntaxKind.IntegerLiteral;[2];
  36839. - SyntaxKind.Plus;[+];
  36840. - SyntaxKind.IntegerLiteral;[3];
  36841. - MetaCode span - Gen<None> - [)] - SpanEditHandler;Accepts:None - (32:0,32) - Tokens:1
  36842. - SyntaxKind.RightParenthesis;[)];
  36843. - Markup block - Gen<None> - 2 - (33:0,33)
  36844. - Markup span - Gen<LitAttr:@(33:0,33)> - [@] - SpanEditHandler;Accepts:None - (33:0,33) - Tokens:1
  36845. - SyntaxKind.Transition;[@];
  36846. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (34:0,34) - Tokens:1
  36847. - SyntaxKind.Transition;[@];
  36848. - Markup block - Gen<DynAttr:@(35:0,35)> - 13 - (35:0,35)
  36849. - Markup span - Gen<None> - [] - SpanEditHandler;Accepts:Any - (35:0,35) - Tokens:1
  36850. - SyntaxKind.Unknown;[];
  36851. - Expression block - Gen<Expr> - 13 - (35:0,35)
  36852. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (35:0,35) - Tokens:1
  36853. - SyntaxKind.Transition;[@];
  36854. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (36:0,36) - Tokens:3
  36855. - SyntaxKind.Identifier;[DateTime];
  36856. - SyntaxKind.Dot;[.];
  36857. - SyntaxKind.Identifier;[Now];
  36858. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (48:0,48) - Tokens:1
  36859. - SyntaxKind.SingleQuote;['];
  36860. - Markup block - Gen<Attr:baz, baz='@(49:0,49),'@(70:0,70)> - 22 - (49:0,49)
  36861. - Markup span - Gen<None> - [ baz='] - SpanEditHandler;Accepts:Any - (49:0,49) - Tokens:4
  36862. - SyntaxKind.Whitespace;[ ];
  36863. - SyntaxKind.Text;[baz];
  36864. - SyntaxKind.Equals;[=];
  36865. - SyntaxKind.SingleQuote;['];
  36866. - Markup block - Gen<DynAttr:@(55:0,55)> - 13 - (55:0,55)
  36867. - Expression block - Gen<Expr> - 13 - (55:0,55)
  36868. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (55:0,55) - Tokens:1
  36869. - SyntaxKind.Transition;[@];
  36870. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (56:0,56) - Tokens:3
  36871. - SyntaxKind.Identifier;[DateTime];
  36872. - SyntaxKind.Dot;[.];
  36873. - SyntaxKind.Identifier;[Now];
  36874. - Markup block - Gen<None> - 2 - (68:0,68)
  36875. - Markup span - Gen<LitAttr:@(68:0,68)> - [@] - SpanEditHandler;Accepts:None - (68:0,68) - Tokens:1
  36876. - SyntaxKind.Transition;[@];
  36877. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (69:0,69) - Tokens:1
  36878. - SyntaxKind.Transition;[@];
  36879. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (70:0,70) - Tokens:1
  36880. - SyntaxKind.SingleQuote;['];
  36881. - Markup block - Gen<Attr:bat, bat='@(71:0,71),'@(93:0,93)> - 23 - (71:0,71)
  36882. - Markup span - Gen<None> - [ bat='] - SpanEditHandler;Accepts:Any - (71:0,71) - Tokens:4
  36883. - SyntaxKind.Whitespace;[ ];
  36884. - SyntaxKind.Text;[bat];
  36885. - SyntaxKind.Equals;[=];
  36886. - SyntaxKind.SingleQuote;['];
  36887. - Markup block - Gen<DynAttr:@(77:0,77)> - 13 - (77:0,77)
  36888. - Expression block - Gen<Expr> - 13 - (77:0,77)
  36889. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (77:0,77) - Tokens:1
  36890. - SyntaxKind.Transition;[@];
  36891. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (78:0,78) - Tokens:3
  36892. - SyntaxKind.Identifier;[DateTime];
  36893. - SyntaxKind.Dot;[.];
  36894. - SyntaxKind.Identifier;[Now];
  36895. - Markup block - Gen<None> - 3 - (90:0,90)
  36896. - Markup span - Gen<LitAttr: @(90:0,90)> - [ @] - SpanEditHandler;Accepts:None - (90:0,90) - Tokens:2
  36897. - SyntaxKind.Whitespace;[ ];
  36898. - SyntaxKind.Transition;[@];
  36899. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (92:0,92) - Tokens:1
  36900. - SyntaxKind.Transition;[@];
  36901. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (93:0,93) - Tokens:1
  36902. - SyntaxKind.SingleQuote;['];
  36903. - Markup block - Gen<Attr:zoo, zoo='@(94:0,94),'@(115:0,115)> - 22 - (94:0,94)
  36904. - Markup span - Gen<None> - [ zoo='] - SpanEditHandler;Accepts:Any - (94:0,94) - Tokens:4
  36905. - SyntaxKind.Whitespace;[ ];
  36906. - SyntaxKind.Text;[zoo];
  36907. - SyntaxKind.Equals;[=];
  36908. - SyntaxKind.SingleQuote;['];
  36909. - Markup block - Gen<None> - 2 - (100:0,100)
  36910. - Markup span - Gen<LitAttr:@(100:0,100)> - [@] - SpanEditHandler;Accepts:None - (100:0,100) - Tokens:1
  36911. - SyntaxKind.Transition;[@];
  36912. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (101:0,101) - Tokens:1
  36913. - SyntaxKind.Transition;[@];
  36914. - Markup block - Gen<DynAttr:@(102:0,102)> - 13 - (102:0,102)
  36915. - Markup span - Gen<None> - [] - SpanEditHandler;Accepts:Any - (102:0,102) - Tokens:1
  36916. - SyntaxKind.Unknown;[];
  36917. - Expression block - Gen<Expr> - 13 - (102:0,102)
  36918. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (102:0,102) - Tokens:1
  36919. - SyntaxKind.Transition;[@];
  36920. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (103:0,103) - Tokens:3
  36921. - SyntaxKind.Identifier;[DateTime];
  36922. - SyntaxKind.Dot;[.];
  36923. - SyntaxKind.Identifier;[Now];
  36924. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (115:0,115) - Tokens:1
  36925. - SyntaxKind.SingleQuote;['];
  36926. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (116:0,116) - Tokens:3
  36927. - SyntaxKind.Whitespace;[ ];
  36928. - SyntaxKind.ForwardSlash;[/];
  36929. - SyntaxKind.CloseAngle;[>];
  36930. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (119:0,119) - Tokens:1
  36931. - SyntaxKind.Unknown;[];
  36932. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (119:0,119) - Tokens:1
  36933. - SyntaxKind.RightBrace;[}];
  36934. +CSharpCodeBlock - [0..120)::120 - [{<span foo='@@@(2+3)' bar='@(2+3)@@@DateTime.Now' baz='@DateTime.Now@@' bat='@DateTime.Now @@' zoo='@@@DateTime.Now' />}]
  36935. + CSharpStatement - [0..120)::120
  36936. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  36937. + Transition;[<Missing>];
  36938. + CSharpStatementBody - [0..120)::120
  36939. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  36940. + LeftBrace;[{];
  36941. + CSharpCodeBlock - [1..119)::118
  36942. + MarkupBlock - [1..119)::118
  36943. + MarkupTagBlock - [1..119)::118 - [<span foo='@@@(2+3)' bar='@(2+3)@@@DateTime.Now' baz='@DateTime.Now@@' bat='@DateTime.Now @@' zoo='@@@DateTime.Now' />]
  36944. + MarkupTextLiteral - [1..6)::5 - [<span] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36945. + OpenAngle;[<];
  36946. + Text;[span];
  36947. + MarkupAttributeBlock - [6..21)::15 - [ foo='@@@(2+3)']
  36948. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36949. + Whitespace;[ ];
  36950. + MarkupTextLiteral - [7..10)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36951. + Text;[foo];
  36952. + Equals;[=];
  36953. + MarkupTextLiteral - [11..12)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  36954. + SingleQuote;['];
  36955. + GenericBlock - [12..20)::8
  36956. + MarkupBlock - [12..14)::2
  36957. + MarkupTextLiteral - [12..13)::1 - [@] - Gen<LitAttr:@(12:0,12)> - SpanEditHandler;Accepts:None
  36958. + Transition;[@];
  36959. + MarkupEphemeralTextLiteral - [13..14)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  36960. + Transition;[@];
  36961. + MarkupDynamicAttributeValue - [14..20)::6 - [@(2+3)]
  36962. + GenericBlock - [14..20)::6
  36963. + MarkupTextLiteral - [14..14)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36964. + Marker;[];
  36965. + CSharpCodeBlock - [14..20)::6
  36966. + CSharpExplicitExpression - [14..20)::6
  36967. + CSharpTransition - [14..15)::1 - Gen<None> - SpanEditHandler;Accepts:None
  36968. + Transition;[@];
  36969. + CSharpExplicitExpressionBody - [15..20)::5
  36970. + RazorMetaCode - [15..16)::1 - Gen<None> - SpanEditHandler;Accepts:None
  36971. + LeftParenthesis;[(];
  36972. + CSharpCodeBlock - [16..19)::3
  36973. + CSharpExpressionLiteral - [16..19)::3 - [2+3] - Gen<Expr> - SpanEditHandler;Accepts:Any
  36974. + IntegerLiteral;[2];
  36975. + Plus;[+];
  36976. + IntegerLiteral;[3];
  36977. + RazorMetaCode - [19..20)::1 - Gen<None> - SpanEditHandler;Accepts:None
  36978. + RightParenthesis;[)];
  36979. + MarkupTextLiteral - [20..21)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  36980. + SingleQuote;['];
  36981. + MarkupAttributeBlock - [21..49)::28 - [ bar='@(2+3)@@@DateTime.Now']
  36982. + MarkupTextLiteral - [21..22)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36983. + Whitespace;[ ];
  36984. + MarkupTextLiteral - [22..25)::3 - [bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  36985. + Text;[bar];
  36986. + Equals;[=];
  36987. + MarkupTextLiteral - [26..27)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  36988. + SingleQuote;['];
  36989. + GenericBlock - [27..48)::21
  36990. + MarkupDynamicAttributeValue - [27..33)::6 - [@(2+3)]
  36991. + GenericBlock - [27..33)::6
  36992. + CSharpCodeBlock - [27..33)::6
  36993. + CSharpExplicitExpression - [27..33)::6
  36994. + CSharpTransition - [27..28)::1 - Gen<None> - SpanEditHandler;Accepts:None
  36995. + Transition;[@];
  36996. + CSharpExplicitExpressionBody - [28..33)::5
  36997. + RazorMetaCode - [28..29)::1 - Gen<None> - SpanEditHandler;Accepts:None
  36998. + LeftParenthesis;[(];
  36999. + CSharpCodeBlock - [29..32)::3
  37000. + CSharpExpressionLiteral - [29..32)::3 - [2+3] - Gen<Expr> - SpanEditHandler;Accepts:Any
  37001. + IntegerLiteral;[2];
  37002. + Plus;[+];
  37003. + IntegerLiteral;[3];
  37004. + RazorMetaCode - [32..33)::1 - Gen<None> - SpanEditHandler;Accepts:None
  37005. + RightParenthesis;[)];
  37006. + MarkupBlock - [33..35)::2
  37007. + MarkupTextLiteral - [33..34)::1 - [@] - Gen<LitAttr:@(33:0,33)> - SpanEditHandler;Accepts:None
  37008. + Transition;[@];
  37009. + MarkupEphemeralTextLiteral - [34..35)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  37010. + Transition;[@];
  37011. + MarkupDynamicAttributeValue - [35..48)::13 - [@DateTime.Now]
  37012. + GenericBlock - [35..48)::13
  37013. + MarkupTextLiteral - [35..35)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  37014. + Marker;[];
  37015. + CSharpCodeBlock - [35..48)::13
  37016. + CSharpImplicitExpression - [35..48)::13
  37017. + CSharpTransition - [35..36)::1 - Gen<None> - SpanEditHandler;Accepts:None
  37018. + Transition;[@];
  37019. + CSharpImplicitExpressionBody - [36..48)::12
  37020. + CSharpCodeBlock - [36..48)::12
  37021. + CSharpExpressionLiteral - [36..48)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  37022. + Identifier;[DateTime];
  37023. + Dot;[.];
  37024. + Identifier;[Now];
  37025. + MarkupTextLiteral - [48..49)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  37026. + SingleQuote;['];
  37027. + MarkupAttributeBlock - [49..71)::22 - [ baz='@DateTime.Now@@']
  37028. + MarkupTextLiteral - [49..50)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  37029. + Whitespace;[ ];
  37030. + MarkupTextLiteral - [50..53)::3 - [baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  37031. + Text;[baz];
  37032. + Equals;[=];
  37033. + MarkupTextLiteral - [54..55)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  37034. + SingleQuote;['];
  37035. + GenericBlock - [55..70)::15
  37036. + MarkupDynamicAttributeValue - [55..68)::13 - [@DateTime.Now]
  37037. + GenericBlock - [55..68)::13
  37038. + CSharpCodeBlock - [55..68)::13
  37039. + CSharpImplicitExpression - [55..68)::13
  37040. + CSharpTransition - [55..56)::1 - Gen<None> - SpanEditHandler;Accepts:None
  37041. + Transition;[@];
  37042. + CSharpImplicitExpressionBody - [56..68)::12
  37043. + CSharpCodeBlock - [56..68)::12
  37044. + CSharpExpressionLiteral - [56..68)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  37045. + Identifier;[DateTime];
  37046. + Dot;[.];
  37047. + Identifier;[Now];
  37048. + MarkupBlock - [68..70)::2
  37049. + MarkupTextLiteral - [68..69)::1 - [@] - Gen<LitAttr:@(68:0,68)> - SpanEditHandler;Accepts:None
  37050. + Transition;[@];
  37051. + MarkupEphemeralTextLiteral - [69..70)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  37052. + Transition;[@];
  37053. + MarkupTextLiteral - [70..71)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  37054. + SingleQuote;['];
  37055. + MarkupAttributeBlock - [71..94)::23 - [ bat='@DateTime.Now @@']
  37056. + MarkupTextLiteral - [71..72)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  37057. + Whitespace;[ ];
  37058. + MarkupTextLiteral - [72..75)::3 - [bat] - Gen<Markup> - SpanEditHandler;Accepts:Any
  37059. + Text;[bat];
  37060. + Equals;[=];
  37061. + MarkupTextLiteral - [76..77)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  37062. + SingleQuote;['];
  37063. + GenericBlock - [77..93)::16
  37064. + MarkupDynamicAttributeValue - [77..90)::13 - [@DateTime.Now]
  37065. + GenericBlock - [77..90)::13
  37066. + CSharpCodeBlock - [77..90)::13
  37067. + CSharpImplicitExpression - [77..90)::13
  37068. + CSharpTransition - [77..78)::1 - Gen<None> - SpanEditHandler;Accepts:None
  37069. + Transition;[@];
  37070. + CSharpImplicitExpressionBody - [78..90)::12
  37071. + CSharpCodeBlock - [78..90)::12
  37072. + CSharpExpressionLiteral - [78..90)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  37073. + Identifier;[DateTime];
  37074. + Dot;[.];
  37075. + Identifier;[Now];
  37076. + MarkupBlock - [90..93)::3
  37077. + MarkupTextLiteral - [90..92)::2 - [ @] - Gen<LitAttr: @(90:0,90)> - SpanEditHandler;Accepts:None
  37078. + Whitespace;[ ];
  37079. + Transition;[@];
  37080. + MarkupEphemeralTextLiteral - [92..93)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  37081. + Transition;[@];
  37082. + MarkupTextLiteral - [93..94)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  37083. + SingleQuote;['];
  37084. + MarkupAttributeBlock - [94..116)::22 - [ zoo='@@@DateTime.Now']
  37085. + MarkupTextLiteral - [94..95)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  37086. + Whitespace;[ ];
  37087. + MarkupTextLiteral - [95..98)::3 - [zoo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  37088. + Text;[zoo];
  37089. + Equals;[=];
  37090. + MarkupTextLiteral - [99..100)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  37091. + SingleQuote;['];
  37092. + GenericBlock - [100..115)::15
  37093. + MarkupBlock - [100..102)::2
  37094. + MarkupTextLiteral - [100..101)::1 - [@] - Gen<LitAttr:@(100:0,100)> - SpanEditHandler;Accepts:None
  37095. + Transition;[@];
  37096. + MarkupEphemeralTextLiteral - [101..102)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  37097. + Transition;[@];
  37098. + MarkupDynamicAttributeValue - [102..115)::13 - [@DateTime.Now]
  37099. + GenericBlock - [102..115)::13
  37100. + MarkupTextLiteral - [102..102)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  37101. + Marker;[];
  37102. + CSharpCodeBlock - [102..115)::13
  37103. + CSharpImplicitExpression - [102..115)::13
  37104. + CSharpTransition - [102..103)::1 - Gen<None> - SpanEditHandler;Accepts:None
  37105. + Transition;[@];
  37106. + CSharpImplicitExpressionBody - [103..115)::12
  37107. + CSharpCodeBlock - [103..115)::12
  37108. + CSharpExpressionLiteral - [103..115)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  37109. + Identifier;[DateTime];
  37110. + Dot;[.];
  37111. + Identifier;[Now];
  37112. + MarkupTextLiteral - [115..116)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  37113. + SingleQuote;['];
  37114. + MarkupTextLiteral - [116..119)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  37115. + Whitespace;[ ];
  37116. + ForwardSlash;[/];
  37117. + CloseAngle;[>];
  37118. + CSharpStatementLiteral - [119..119)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  37119. + Marker;[];
  37120. + RazorMetaCode - [119..120)::1 - Gen<None> - SpanEditHandler;Accepts:None
  37121. + RightBrace;[}];
  37122. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransition_EndOfFile_Throws.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransition_EndOfFile_Throws.stree.txt
  37123. index f37297146ba..d9a8d250fa1 100644
  37124. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransition_EndOfFile_Throws.stree.txt
  37125. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithDoubleTransition_EndOfFile_Throws.stree.txt
  37126. @@ -1,21 +1,31 @@
  37127. -Statement block - Gen<None> - 14 - (0:0,0)
  37128. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  37129. - SyntaxKind.LeftBrace;[{];
  37130. - Markup block - Gen<None> - 13 - (1:0,1)
  37131. - Tag block - Gen<None> - 13 - (1:0,1)
  37132. - Markup span - Gen<Markup> - [<span] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:2
  37133. - SyntaxKind.OpenAngle;[<];
  37134. - SyntaxKind.Text;[span];
  37135. - Markup block - Gen<Attr:foo, foo='@(6:0,6),@(14:0,14)> - 8 - (6:0,6)
  37136. - Markup span - Gen<None> - [ foo='] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:4
  37137. - SyntaxKind.Whitespace;[ ];
  37138. - SyntaxKind.Text;[foo];
  37139. - SyntaxKind.Equals;[=];
  37140. - SyntaxKind.SingleQuote;['];
  37141. - Markup block - Gen<None> - 2 - (12:0,12)
  37142. - Markup span - Gen<LitAttr:@(12:0,12)> - [@] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:1
  37143. - SyntaxKind.Transition;[@];
  37144. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:1
  37145. - SyntaxKind.Transition;[@];
  37146. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  37147. - SyntaxKind.Unknown;[];
  37148. +CSharpCodeBlock - [0..14)::14 - [{<span foo='@@]
  37149. + CSharpStatement - [0..14)::14
  37150. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  37151. + Transition;[<Missing>];
  37152. + CSharpStatementBody - [0..14)::14
  37153. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  37154. + LeftBrace;[{];
  37155. + CSharpCodeBlock - [1..14)::13
  37156. + MarkupBlock - [1..14)::13
  37157. + MarkupTagBlock - [1..14)::13 - [<span foo='@@]
  37158. + MarkupTextLiteral - [1..6)::5 - [<span] - Gen<Markup> - SpanEditHandler;Accepts:Any
  37159. + OpenAngle;[<];
  37160. + Text;[span];
  37161. + MarkupAttributeBlock - [6..14)::8 - [ foo='@@]
  37162. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  37163. + Whitespace;[ ];
  37164. + MarkupTextLiteral - [7..10)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  37165. + Text;[foo];
  37166. + Equals;[=];
  37167. + MarkupTextLiteral - [11..12)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  37168. + SingleQuote;['];
  37169. + GenericBlock - [12..14)::2
  37170. + MarkupBlock - [12..14)::2
  37171. + MarkupTextLiteral - [12..13)::1 - [@] - Gen<LitAttr:@(12:0,12)> - SpanEditHandler;Accepts:None
  37172. + Transition;[@];
  37173. + MarkupEphemeralTextLiteral - [13..14)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  37174. + Transition;[@];
  37175. + MarkupTextLiteral - [14..14)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  37176. + Marker;[];
  37177. + RazorMetaCode - [14..14)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  37178. + RightBrace;[<Missing>];
  37179. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithUnexpectedTransitionsInAttributeValue_Throws.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithUnexpectedTransitionsInAttributeValue_Throws.stree.txt
  37180. index 7ba02237164..a9904ed71d0 100644
  37181. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithUnexpectedTransitionsInAttributeValue_Throws.stree.txt
  37182. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/WithUnexpectedTransitionsInAttributeValue_Throws.stree.txt
  37183. @@ -1,38 +1,54 @@
  37184. -Statement block - Gen<None> - 20 - (0:0,0)
  37185. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  37186. - SyntaxKind.LeftBrace;[{];
  37187. - Markup block - Gen<None> - 18 - (1:0,1)
  37188. - Tag block - Gen<None> - 18 - (1:0,1)
  37189. - Markup span - Gen<Markup> - [<span] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:2
  37190. - SyntaxKind.OpenAngle;[<];
  37191. - SyntaxKind.Text;[span];
  37192. - Markup block - Gen<Attr:foo, foo='@(6:0,6),'@(15:0,15)> - 10 - (6:0,6)
  37193. - Markup span - Gen<None> - [ foo='] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:4
  37194. - SyntaxKind.Whitespace;[ ];
  37195. - SyntaxKind.Text;[foo];
  37196. - SyntaxKind.Equals;[=];
  37197. - SyntaxKind.SingleQuote;['];
  37198. - Markup block - Gen<DynAttr:@(12:0,12)> - 1 - (12:0,12)
  37199. - Expression block - Gen<Expr> - 1 - (12:0,12)
  37200. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:1
  37201. - SyntaxKind.Transition;[@];
  37202. - Code span - Gen<Expr> - [] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (13:0,13) - Tokens:1
  37203. - SyntaxKind.Unknown;[];
  37204. - Markup block - Gen<DynAttr: @(13:0,13)> - 2 - (13:0,13)
  37205. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:1
  37206. - SyntaxKind.Whitespace;[ ];
  37207. - Expression block - Gen<Expr> - 1 - (14:0,14)
  37208. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (14:0,14) - Tokens:1
  37209. - SyntaxKind.Transition;[@];
  37210. - Code span - Gen<Expr> - [] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (15:0,15) - Tokens:1
  37211. - SyntaxKind.Unknown;[];
  37212. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:1
  37213. - SyntaxKind.SingleQuote;['];
  37214. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:3
  37215. - SyntaxKind.Whitespace;[ ];
  37216. - SyntaxKind.ForwardSlash;[/];
  37217. - SyntaxKind.CloseAngle;[>];
  37218. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:1
  37219. - SyntaxKind.Unknown;[];
  37220. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (19:0,19) - Tokens:1
  37221. - SyntaxKind.RightBrace;[}];
  37222. +CSharpCodeBlock - [0..20)::20 - [{<span foo='@ @' />}]
  37223. + CSharpStatement - [0..20)::20
  37224. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  37225. + Transition;[<Missing>];
  37226. + CSharpStatementBody - [0..20)::20
  37227. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  37228. + LeftBrace;[{];
  37229. + CSharpCodeBlock - [1..19)::18
  37230. + MarkupBlock - [1..19)::18
  37231. + MarkupTagBlock - [1..19)::18 - [<span foo='@ @' />]
  37232. + MarkupTextLiteral - [1..6)::5 - [<span] - Gen<Markup> - SpanEditHandler;Accepts:Any
  37233. + OpenAngle;[<];
  37234. + Text;[span];
  37235. + MarkupAttributeBlock - [6..16)::10 - [ foo='@ @']
  37236. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  37237. + Whitespace;[ ];
  37238. + MarkupTextLiteral - [7..10)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  37239. + Text;[foo];
  37240. + Equals;[=];
  37241. + MarkupTextLiteral - [11..12)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  37242. + SingleQuote;['];
  37243. + GenericBlock - [12..15)::3
  37244. + MarkupDynamicAttributeValue - [12..13)::1 - [@]
  37245. + GenericBlock - [12..13)::1
  37246. + CSharpCodeBlock - [12..13)::1
  37247. + CSharpImplicitExpression - [12..13)::1
  37248. + CSharpTransition - [12..13)::1 - Gen<None> - SpanEditHandler;Accepts:None
  37249. + Transition;[@];
  37250. + CSharpImplicitExpressionBody - [13..13)::0
  37251. + CSharpCodeBlock - [13..13)::0
  37252. + CSharpExpressionLiteral - [13..13)::0 - [] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  37253. + Marker;[];
  37254. + MarkupDynamicAttributeValue - [13..15)::2 - [ @]
  37255. + MarkupTextLiteral - [13..14)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  37256. + Whitespace;[ ];
  37257. + GenericBlock - [14..15)::1
  37258. + CSharpCodeBlock - [14..15)::1
  37259. + CSharpImplicitExpression - [14..15)::1
  37260. + CSharpTransition - [14..15)::1 - Gen<None> - SpanEditHandler;Accepts:None
  37261. + Transition;[@];
  37262. + CSharpImplicitExpressionBody - [15..15)::0
  37263. + CSharpCodeBlock - [15..15)::0
  37264. + CSharpExpressionLiteral - [15..15)::0 - [] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  37265. + Marker;[];
  37266. + MarkupTextLiteral - [15..16)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  37267. + SingleQuote;['];
  37268. + MarkupTextLiteral - [16..19)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  37269. + Whitespace;[ ];
  37270. + ForwardSlash;[/];
  37271. + CloseAngle;[>];
  37272. + CSharpStatementLiteral - [19..19)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  37273. + Marker;[];
  37274. + RazorMetaCode - [19..20)::1 - Gen<None> - SpanEditHandler;Accepts:None
  37275. + RightBrace;[}];
  37276. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_EndQuoteRequiresDoubleQuotesAroundValue.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_EndQuoteRequiresDoubleQuotesAroundValue.stree.txt
  37277. deleted file mode 100644
  37278. index bc7be6b7393..00000000000
  37279. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_EndQuoteRequiresDoubleQuotesAroundValue.stree.txt
  37280. +++ /dev/null
  37281. @@ -1,15 +0,0 @@
  37282. -Markup block - Gen<None> - 18 - (0:0,0)
  37283. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  37284. - SyntaxKind.Unknown;[];
  37285. - Directive block - Gen<None> - 18 - (0:0,0)
  37286. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  37287. - SyntaxKind.Transition;[@];
  37288. - MetaCode span - Gen<None> - [addTagHelper] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  37289. - SyntaxKind.Identifier;[addTagHelper];
  37290. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:1
  37291. - SyntaxKind.Whitespace;[ ];
  37292. - Code span - Gen<AddTagHelper:{Foo";Foo";;} [RZ1000(17:0,17 [1] ), RZ1019(14:0,14 [4] ), RZ1036(14:0,14 [4] )]> - [Foo"] - SpanEditHandler;Accepts:AnyExceptNewline - (14:0,14) - Tokens:2
  37293. - SyntaxKind.Identifier;[Foo];
  37294. - SyntaxKind.StringLiteral;["];RZ1000(17:0,17 [1] )
  37295. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:1
  37296. - SyntaxKind.Unknown;[];
  37297. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_InvalidLookupText_AddsError.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_InvalidLookupText_AddsError.stree.txt
  37298. deleted file mode 100644
  37299. index 7eca7544035..00000000000
  37300. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_InvalidLookupText_AddsError.stree.txt
  37301. +++ /dev/null
  37302. @@ -1,14 +0,0 @@
  37303. -Markup block - Gen<None> - 17 - (0:0,0)
  37304. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  37305. - SyntaxKind.Unknown;[];
  37306. - Directive block - Gen<None> - 17 - (0:0,0)
  37307. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  37308. - SyntaxKind.Transition;[@];
  37309. - MetaCode span - Gen<None> - [addTagHelper] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  37310. - SyntaxKind.Identifier;[addTagHelper];
  37311. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:1
  37312. - SyntaxKind.Whitespace;[ ];
  37313. - Code span - Gen<AddTagHelper:{Foo;Foo;;} [RZ1036(14:0,14 [3] )]> - [Foo] - SpanEditHandler;Accepts:AnyExceptNewline - (14:0,14) - Tokens:1
  37314. - SyntaxKind.Identifier;[Foo];
  37315. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:1
  37316. - SyntaxKind.Unknown;[];
  37317. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_NoValue_Invalid.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_NoValue_Invalid.stree.txt
  37318. deleted file mode 100644
  37319. index 4673d994f83..00000000000
  37320. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_NoValue_Invalid.stree.txt
  37321. +++ /dev/null
  37322. @@ -1,14 +0,0 @@
  37323. -Markup block - Gen<None> - 16 - (0:0,0)
  37324. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  37325. - SyntaxKind.Unknown;[];
  37326. - Directive block - Gen<None> - 16 - (0:0,0)
  37327. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  37328. - SyntaxKind.Transition;[@];
  37329. - MetaCode span - Gen<None> - [addTagHelper] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  37330. - SyntaxKind.Identifier;[addTagHelper];
  37331. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:1
  37332. - SyntaxKind.Whitespace;[ ];
  37333. - Code span - Gen<AddTagHelper:{"";;;} [RZ1036(15:0,15 [1] )]> - [""] - SpanEditHandler;Accepts:AnyExceptNewline - (14:0,14) - Tokens:1
  37334. - SyntaxKind.StringLiteral;[""];
  37335. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  37336. - SyntaxKind.Unknown;[];
  37337. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_RequiresValue.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_RequiresValue.stree.txt
  37338. deleted file mode 100644
  37339. index 70e94ca3767..00000000000
  37340. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_RequiresValue.stree.txt
  37341. +++ /dev/null
  37342. @@ -1,14 +0,0 @@
  37343. -Markup block - Gen<None> - 14 - (0:0,0)
  37344. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  37345. - SyntaxKind.Unknown;[];
  37346. - Directive block - Gen<None> - 14 - (0:0,0)
  37347. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  37348. - SyntaxKind.Transition;[@];
  37349. - MetaCode span - Gen<None> - [addTagHelper] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  37350. - SyntaxKind.Identifier;[addTagHelper];
  37351. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:1
  37352. - SyntaxKind.Whitespace;[ ];
  37353. - Code span - Gen<AddTagHelper:{;;;} [RZ1018(1:0,1 [12] ), RZ1036(14:0,14 [1] )]> - [] - SpanEditHandler;Accepts:AnyExceptNewline - (14:0,14) - Tokens:1
  37354. - SyntaxKind.Unknown;[];
  37355. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  37356. - SyntaxKind.Unknown;[];
  37357. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_SingleQuotes_AddsError.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_SingleQuotes_AddsError.stree.txt
  37358. deleted file mode 100644
  37359. index ac39681366d..00000000000
  37360. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_SingleQuotes_AddsError.stree.txt
  37361. +++ /dev/null
  37362. @@ -1,14 +0,0 @@
  37363. -Markup block - Gen<None> - 22 - (0:0,0)
  37364. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  37365. - SyntaxKind.Unknown;[];
  37366. - Directive block - Gen<None> - 22 - (0:0,0)
  37367. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  37368. - SyntaxKind.Transition;[@];
  37369. - MetaCode span - Gen<None> - [addTagHelper] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  37370. - SyntaxKind.Identifier;[addTagHelper];
  37371. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:1
  37372. - SyntaxKind.Whitespace;[ ];
  37373. - Code span - Gen<AddTagHelper:{'*, Foo';'*, Foo';;} [RZ1036(14:0,14 [8] )]> - ['*, Foo'] - SpanEditHandler;Accepts:AnyExceptNewline - (14:0,14) - Tokens:1
  37374. - SyntaxKind.CharacterLiteral;['*, Foo'];
  37375. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:1
  37376. - SyntaxKind.Unknown;[];
  37377. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_StartQuoteRequiresDoubleQuotesAroundValue.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_StartQuoteRequiresDoubleQuotesAroundValue.stree.txt
  37378. deleted file mode 100644
  37379. index d135d7804e4..00000000000
  37380. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_StartQuoteRequiresDoubleQuotesAroundValue.stree.txt
  37381. +++ /dev/null
  37382. @@ -1,14 +0,0 @@
  37383. -Markup block - Gen<None> - 18 - (0:0,0)
  37384. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  37385. - SyntaxKind.Unknown;[];
  37386. - Directive block - Gen<None> - 18 - (0:0,0)
  37387. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  37388. - SyntaxKind.Transition;[@];
  37389. - MetaCode span - Gen<None> - [addTagHelper] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  37390. - SyntaxKind.Identifier;[addTagHelper];
  37391. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:1
  37392. - SyntaxKind.Whitespace;[ ];
  37393. - Code span - Gen<AddTagHelper:{"Foo;"Foo;;} [RZ1000(14:0,14 [1] ), RZ1019(14:0,14 [4] ), RZ1036(14:0,14 [4] )]> - ["Foo] - SpanEditHandler;Accepts:AnyExceptNewline - (14:0,14) - Tokens:1
  37394. - SyntaxKind.StringLiteral;["Foo];RZ1000(14:0,14 [1] )
  37395. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:1
  37396. - SyntaxKind.Unknown;[];
  37397. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_SupportsSpaces.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_SupportsSpaces.stree.txt
  37398. deleted file mode 100644
  37399. index 2d2db1bc472..00000000000
  37400. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_SupportsSpaces.stree.txt
  37401. +++ /dev/null
  37402. @@ -1,18 +0,0 @@
  37403. -Markup block - Gen<None> - 32 - (0:0,0)
  37404. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  37405. - SyntaxKind.Unknown;[];
  37406. - Directive block - Gen<None> - 32 - (0:0,0)
  37407. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  37408. - SyntaxKind.Transition;[@];
  37409. - MetaCode span - Gen<None> - [addTagHelper] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  37410. - SyntaxKind.Identifier;[addTagHelper];
  37411. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:1
  37412. - SyntaxKind.Whitespace;[ ];
  37413. - Code span - Gen<AddTagHelper:{Foo, Bar;Foo, Bar;Foo;Bar}> - [Foo, Bar ] - SpanEditHandler;Accepts:AnyExceptNewline - (18:0,18) - Tokens:5
  37414. - SyntaxKind.Identifier;[Foo];
  37415. - SyntaxKind.Comma;[,];
  37416. - SyntaxKind.Whitespace;[ ];
  37417. - SyntaxKind.Identifier;[Bar];
  37418. - SyntaxKind.Whitespace;[ ];
  37419. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (32:0,32) - Tokens:1
  37420. - SyntaxKind.Unknown;[];
  37421. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_WithQuotes_InvalidLookupText_AddsError.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_WithQuotes_InvalidLookupText_AddsError.stree.txt
  37422. deleted file mode 100644
  37423. index cfe643e1d3c..00000000000
  37424. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_WithQuotes_InvalidLookupText_AddsError.stree.txt
  37425. +++ /dev/null
  37426. @@ -1,14 +0,0 @@
  37427. -Markup block - Gen<None> - 19 - (0:0,0)
  37428. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  37429. - SyntaxKind.Unknown;[];
  37430. - Directive block - Gen<None> - 19 - (0:0,0)
  37431. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  37432. - SyntaxKind.Transition;[@];
  37433. - MetaCode span - Gen<None> - [addTagHelper] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  37434. - SyntaxKind.Identifier;[addTagHelper];
  37435. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:1
  37436. - SyntaxKind.Whitespace;[ ];
  37437. - Code span - Gen<AddTagHelper:{"Foo";Foo;;} [RZ1036(15:0,15 [3] )]> - ["Foo"] - SpanEditHandler;Accepts:AnyExceptNewline - (14:0,14) - Tokens:1
  37438. - SyntaxKind.StringLiteral;["Foo"];
  37439. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:1
  37440. - SyntaxKind.Unknown;[];
  37441. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/BuiltInDirectiveDoesNotErorrIfNotAtStartOfLineBecauseOfWhitespace.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/BuiltInDirectiveDoesNotErorrIfNotAtStartOfLineBecauseOfWhitespace.stree.txt
  37442. deleted file mode 100644
  37443. index 2e4413ce6d0..00000000000
  37444. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/BuiltInDirectiveDoesNotErorrIfNotAtStartOfLineBecauseOfWhitespace.stree.txt
  37445. +++ /dev/null
  37446. @@ -1,16 +0,0 @@
  37447. -Markup block - Gen<None> - 26 - (0:0,0)
  37448. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  37449. - SyntaxKind.NewLine;[LF];
  37450. - Directive block - Gen<None> - 24 - (2:1,0)
  37451. - Code span - Gen<Stmt> - [ ] - SpanEditHandler;Accepts:Any - (2:1,0) - Tokens:1
  37452. - SyntaxKind.Whitespace;[ ];
  37453. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (4:1,2) - Tokens:1
  37454. - SyntaxKind.Transition;[@];
  37455. - MetaCode span - Gen<None> - [addTagHelper] - SpanEditHandler;Accepts:None - (5:1,3) - Tokens:1
  37456. - SyntaxKind.Identifier;[addTagHelper];
  37457. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:None - (17:1,15) - Tokens:1
  37458. - SyntaxKind.Whitespace;[ ];
  37459. - Code span - Gen<AddTagHelper:{"*, Foo";*, Foo;*;Foo}> - ["*, Foo"] - SpanEditHandler;Accepts:AnyExceptNewline - (18:1,16) - Tokens:1
  37460. - SyntaxKind.StringLiteral;["*, Foo"];
  37461. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (26:1,24) - Tokens:1
  37462. - SyntaxKind.Unknown;[];
  37463. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/BuiltInDirectiveErrorsIfNotAtStartOfLine.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/BuiltInDirectiveErrorsIfNotAtStartOfLine.stree.txt
  37464. deleted file mode 100644
  37465. index 6c90f6f4667..00000000000
  37466. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/BuiltInDirectiveErrorsIfNotAtStartOfLine.stree.txt
  37467. +++ /dev/null
  37468. @@ -1,16 +0,0 @@
  37469. -Markup block - Gen<None> - 28 - (0:0,0)
  37470. - Markup span - Gen<Markup> - [{ ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  37471. - SyntaxKind.Text;[{];
  37472. - SyntaxKind.Whitespace;[ ];
  37473. - Directive block - Gen<None> - 24 - (3:0,3)
  37474. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  37475. - SyntaxKind.Transition;[@];
  37476. - MetaCode span - Gen<None> - [addTagHelper] - SpanEditHandler;Accepts:None - (4:0,4) - Tokens:1
  37477. - SyntaxKind.Identifier;[addTagHelper];
  37478. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  37479. - SyntaxKind.Whitespace;[ ];
  37480. - Code span - Gen<AddTagHelper:{"*, Foo";*, Foo;*;Foo} [RZ2005(4:0,4 [12] )]> - ["*, Foo"LF] - SpanEditHandler;Accepts:AnyExceptNewline - (17:0,17) - Tokens:2
  37481. - SyntaxKind.StringLiteral;["*, Foo"];
  37482. - SyntaxKind.NewLine;[LF];
  37483. - Markup span - Gen<Markup> - [}] - SpanEditHandler;Accepts:Any - (27:1,0) - Tokens:1
  37484. - SyntaxKind.Text;[}];
  37485. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_AllowsNullableTypes.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_AllowsNullableTypes.stree.txt
  37486. deleted file mode 100644
  37487. index 6a9b54398ad..00000000000
  37488. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_AllowsNullableTypes.stree.txt
  37489. +++ /dev/null
  37490. @@ -1,76 +0,0 @@
  37491. -Markup block - Gen<None> - 176 - (0:0,0)
  37492. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  37493. - SyntaxKind.Unknown;[];
  37494. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted}> - 176 - (0:0,0)
  37495. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  37496. - SyntaxKind.Transition;[@];
  37497. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  37498. - SyntaxKind.Identifier;[custom];
  37499. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  37500. - SyntaxKind.Whitespace;[ ];
  37501. - Code span - Gen<DirectiveToken {;Type;Opt:False}> - [string?] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (8:0,8) - Tokens:2
  37502. - SyntaxKind.Keyword;[string];
  37503. - SyntaxKind.QuestionMark;[?];
  37504. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (15:0,15) - Tokens:1
  37505. - SyntaxKind.Whitespace;[ ];
  37506. - Code span - Gen<DirectiveToken {;Type;Opt:False}> - [string?[]] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (16:0,16) - Tokens:4
  37507. - SyntaxKind.Keyword;[string];
  37508. - SyntaxKind.QuestionMark;[?];
  37509. - SyntaxKind.LeftBracket;[[];
  37510. - SyntaxKind.RightBracket;[]];
  37511. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (25:0,25) - Tokens:1
  37512. - SyntaxKind.Whitespace;[ ];
  37513. - Code span - Gen<DirectiveToken {;Type;Opt:False}> - [global::System.Int32?] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (26:0,26) - Tokens:6
  37514. - SyntaxKind.Identifier;[global];
  37515. - SyntaxKind.DoubleColon;[::];
  37516. - SyntaxKind.Identifier;[System];
  37517. - SyntaxKind.Dot;[.];
  37518. - SyntaxKind.Identifier;[Int32];
  37519. - SyntaxKind.QuestionMark;[?];
  37520. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (47:0,47) - Tokens:1
  37521. - SyntaxKind.Whitespace;[ ];
  37522. - Code span - Gen<DirectiveToken {;Type;Opt:False}> - [KeyValuePair<string, string>?] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (48:0,48) - Tokens:8
  37523. - SyntaxKind.Identifier;[KeyValuePair];
  37524. - SyntaxKind.LessThan;[<];
  37525. - SyntaxKind.Keyword;[string];
  37526. - SyntaxKind.Comma;[,];
  37527. - SyntaxKind.Whitespace;[ ];
  37528. - SyntaxKind.Keyword;[string];
  37529. - SyntaxKind.GreaterThan;[>];
  37530. - SyntaxKind.QuestionMark;[?];
  37531. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (77:0,77) - Tokens:1
  37532. - SyntaxKind.Whitespace;[ ];
  37533. - Code span - Gen<DirectiveToken {;Type;Opt:False}> - [KeyValuePair<string, string>?[]] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (78:0,78) - Tokens:10
  37534. - SyntaxKind.Identifier;[KeyValuePair];
  37535. - SyntaxKind.LessThan;[<];
  37536. - SyntaxKind.Keyword;[string];
  37537. - SyntaxKind.Comma;[,];
  37538. - SyntaxKind.Whitespace;[ ];
  37539. - SyntaxKind.Keyword;[string];
  37540. - SyntaxKind.GreaterThan;[>];
  37541. - SyntaxKind.QuestionMark;[?];
  37542. - SyntaxKind.LeftBracket;[[];
  37543. - SyntaxKind.RightBracket;[]];
  37544. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (109:0,109) - Tokens:1
  37545. - SyntaxKind.Whitespace;[ ];
  37546. - Code span - Gen<DirectiveToken {;Type;Opt:False}> - [global::System.Collections.Generic.KeyValuePair<string, string>?[]] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (110:0,110) - Tokens:18
  37547. - SyntaxKind.Identifier;[global];
  37548. - SyntaxKind.DoubleColon;[::];
  37549. - SyntaxKind.Identifier;[System];
  37550. - SyntaxKind.Dot;[.];
  37551. - SyntaxKind.Identifier;[Collections];
  37552. - SyntaxKind.Dot;[.];
  37553. - SyntaxKind.Identifier;[Generic];
  37554. - SyntaxKind.Dot;[.];
  37555. - SyntaxKind.Identifier;[KeyValuePair];
  37556. - SyntaxKind.LessThan;[<];
  37557. - SyntaxKind.Keyword;[string];
  37558. - SyntaxKind.Comma;[,];
  37559. - SyntaxKind.Whitespace;[ ];
  37560. - SyntaxKind.Keyword;[string];
  37561. - SyntaxKind.GreaterThan;[>];
  37562. - SyntaxKind.QuestionMark;[?];
  37563. - SyntaxKind.LeftBracket;[[];
  37564. - SyntaxKind.RightBracket;[]];
  37565. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (176:0,176) - Tokens:1
  37566. - SyntaxKind.Unknown;[];
  37567. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_AllowsTupleTypes.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_AllowsTupleTypes.stree.txt
  37568. deleted file mode 100644
  37569. index 1fca727de11..00000000000
  37570. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_AllowsTupleTypes.stree.txt
  37571. +++ /dev/null
  37572. @@ -1,160 +0,0 @@
  37573. -Markup block - Gen<None> - 246 - (0:0,0)
  37574. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  37575. - SyntaxKind.Unknown;[];
  37576. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted}> - 246 - (0:0,0)
  37577. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  37578. - SyntaxKind.Transition;[@];
  37579. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  37580. - SyntaxKind.Identifier;[custom];
  37581. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  37582. - SyntaxKind.Whitespace;[ ];
  37583. - Code span - Gen<DirectiveToken {;Type;Opt:False}> - [(bool, int)] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (8:0,8) - Tokens:6
  37584. - SyntaxKind.LeftParenthesis;[(];
  37585. - SyntaxKind.Keyword;[bool];
  37586. - SyntaxKind.Comma;[,];
  37587. - SyntaxKind.Whitespace;[ ];
  37588. - SyntaxKind.Keyword;[int];
  37589. - SyntaxKind.RightParenthesis;[)];
  37590. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (19:0,19) - Tokens:1
  37591. - SyntaxKind.Whitespace;[ ];
  37592. - Code span - Gen<DirectiveToken {;Type;Opt:False}> - [(int aa, string bb)?] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (20:0,20) - Tokens:11
  37593. - SyntaxKind.LeftParenthesis;[(];
  37594. - SyntaxKind.Keyword;[int];
  37595. - SyntaxKind.Whitespace;[ ];
  37596. - SyntaxKind.Identifier;[aa];
  37597. - SyntaxKind.Comma;[,];
  37598. - SyntaxKind.Whitespace;[ ];
  37599. - SyntaxKind.Keyword;[string];
  37600. - SyntaxKind.Whitespace;[ ];
  37601. - SyntaxKind.Identifier;[bb];
  37602. - SyntaxKind.RightParenthesis;[)];
  37603. - SyntaxKind.QuestionMark;[?];
  37604. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (40:0,40) - Tokens:1
  37605. - SyntaxKind.Whitespace;[ ];
  37606. - Code span - Gen<DirectiveToken {;Type;Opt:False}> - [( int? q , bool w )] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (41:0,41) - Tokens:14
  37607. - SyntaxKind.LeftParenthesis;[(];
  37608. - SyntaxKind.Whitespace;[ ];
  37609. - SyntaxKind.Keyword;[int];
  37610. - SyntaxKind.QuestionMark;[?];
  37611. - SyntaxKind.Whitespace;[ ];
  37612. - SyntaxKind.Identifier;[q];
  37613. - SyntaxKind.Whitespace;[ ];
  37614. - SyntaxKind.Comma;[,];
  37615. - SyntaxKind.Whitespace;[ ];
  37616. - SyntaxKind.Keyword;[bool];
  37617. - SyntaxKind.Whitespace;[ ];
  37618. - SyntaxKind.Identifier;[w];
  37619. - SyntaxKind.Whitespace;[ ];
  37620. - SyntaxKind.RightParenthesis;[)];
  37621. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (70:0,70) - Tokens:1
  37622. - SyntaxKind.Whitespace;[ ];
  37623. - Code span - Gen<DirectiveToken {;Type;Opt:False}> - [( int ? q, bool ?w ,(long ? [])) ?] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (71:0,71) - Tokens:26
  37624. - SyntaxKind.LeftParenthesis;[(];
  37625. - SyntaxKind.Whitespace;[ ];
  37626. - SyntaxKind.Keyword;[int];
  37627. - SyntaxKind.Whitespace;[ ];
  37628. - SyntaxKind.QuestionMark;[?];
  37629. - SyntaxKind.Whitespace;[ ];
  37630. - SyntaxKind.Identifier;[q];
  37631. - SyntaxKind.Comma;[,];
  37632. - SyntaxKind.Whitespace;[ ];
  37633. - SyntaxKind.Keyword;[bool];
  37634. - SyntaxKind.Whitespace;[ ];
  37635. - SyntaxKind.QuestionMark;[?];
  37636. - SyntaxKind.Identifier;[w];
  37637. - SyntaxKind.Whitespace;[ ];
  37638. - SyntaxKind.Comma;[,];
  37639. - SyntaxKind.LeftParenthesis;[(];
  37640. - SyntaxKind.Keyword;[long];
  37641. - SyntaxKind.Whitespace;[ ];
  37642. - SyntaxKind.QuestionMark;[?];
  37643. - SyntaxKind.Whitespace;[ ];
  37644. - SyntaxKind.LeftBracket;[[];
  37645. - SyntaxKind.RightBracket;[]];
  37646. - SyntaxKind.RightParenthesis;[)];
  37647. - SyntaxKind.RightParenthesis;[)];
  37648. - SyntaxKind.Whitespace;[ ];
  37649. - SyntaxKind.QuestionMark;[?];
  37650. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (108:0,108) - Tokens:1
  37651. - SyntaxKind.Whitespace;[ ];
  37652. - Code span - Gen<DirectiveToken {;Type;Opt:False}> - [(List<(int, string)?> aa, string bb)] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (109:0,109) - Tokens:19
  37653. - SyntaxKind.LeftParenthesis;[(];
  37654. - SyntaxKind.Identifier;[List];
  37655. - SyntaxKind.LessThan;[<];
  37656. - SyntaxKind.LeftParenthesis;[(];
  37657. - SyntaxKind.Keyword;[int];
  37658. - SyntaxKind.Comma;[,];
  37659. - SyntaxKind.Whitespace;[ ];
  37660. - SyntaxKind.Keyword;[string];
  37661. - SyntaxKind.RightParenthesis;[)];
  37662. - SyntaxKind.QuestionMark;[?];
  37663. - SyntaxKind.GreaterThan;[>];
  37664. - SyntaxKind.Whitespace;[ ];
  37665. - SyntaxKind.Identifier;[aa];
  37666. - SyntaxKind.Comma;[,];
  37667. - SyntaxKind.Whitespace;[ ];
  37668. - SyntaxKind.Keyword;[string];
  37669. - SyntaxKind.Whitespace;[ ];
  37670. - SyntaxKind.Identifier;[bb];
  37671. - SyntaxKind.RightParenthesis;[)];
  37672. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (145:0,145) - Tokens:1
  37673. - SyntaxKind.Whitespace;[ ];
  37674. - Code span - Gen<DirectiveToken {;Type;Opt:False}> - [(string ss, (int u, List<(string, int)> k, (Char c, bool b, List<int> l)), global::System.Int32[] a)] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (146:0,146) - Tokens:56
  37675. - SyntaxKind.LeftParenthesis;[(];
  37676. - SyntaxKind.Keyword;[string];
  37677. - SyntaxKind.Whitespace;[ ];
  37678. - SyntaxKind.Identifier;[ss];
  37679. - SyntaxKind.Comma;[,];
  37680. - SyntaxKind.Whitespace;[ ];
  37681. - SyntaxKind.LeftParenthesis;[(];
  37682. - SyntaxKind.Keyword;[int];
  37683. - SyntaxKind.Whitespace;[ ];
  37684. - SyntaxKind.Identifier;[u];
  37685. - SyntaxKind.Comma;[,];
  37686. - SyntaxKind.Whitespace;[ ];
  37687. - SyntaxKind.Identifier;[List];
  37688. - SyntaxKind.LessThan;[<];
  37689. - SyntaxKind.LeftParenthesis;[(];
  37690. - SyntaxKind.Keyword;[string];
  37691. - SyntaxKind.Comma;[,];
  37692. - SyntaxKind.Whitespace;[ ];
  37693. - SyntaxKind.Keyword;[int];
  37694. - SyntaxKind.RightParenthesis;[)];
  37695. - SyntaxKind.GreaterThan;[>];
  37696. - SyntaxKind.Whitespace;[ ];
  37697. - SyntaxKind.Identifier;[k];
  37698. - SyntaxKind.Comma;[,];
  37699. - SyntaxKind.Whitespace;[ ];
  37700. - SyntaxKind.LeftParenthesis;[(];
  37701. - SyntaxKind.Identifier;[Char];
  37702. - SyntaxKind.Whitespace;[ ];
  37703. - SyntaxKind.Identifier;[c];
  37704. - SyntaxKind.Comma;[,];
  37705. - SyntaxKind.Whitespace;[ ];
  37706. - SyntaxKind.Keyword;[bool];
  37707. - SyntaxKind.Whitespace;[ ];
  37708. - SyntaxKind.Identifier;[b];
  37709. - SyntaxKind.Comma;[,];
  37710. - SyntaxKind.Whitespace;[ ];
  37711. - SyntaxKind.Identifier;[List];
  37712. - SyntaxKind.LessThan;[<];
  37713. - SyntaxKind.Keyword;[int];
  37714. - SyntaxKind.GreaterThan;[>];
  37715. - SyntaxKind.Whitespace;[ ];
  37716. - SyntaxKind.Identifier;[l];
  37717. - SyntaxKind.RightParenthesis;[)];
  37718. - SyntaxKind.RightParenthesis;[)];
  37719. - SyntaxKind.Comma;[,];
  37720. - SyntaxKind.Whitespace;[ ];
  37721. - SyntaxKind.Identifier;[global];
  37722. - SyntaxKind.DoubleColon;[::];
  37723. - SyntaxKind.Identifier;[System];
  37724. - SyntaxKind.Dot;[.];
  37725. - SyntaxKind.Identifier;[Int32];
  37726. - SyntaxKind.LeftBracket;[[];
  37727. - SyntaxKind.RightBracket;[]];
  37728. - SyntaxKind.Whitespace;[ ];
  37729. - SyntaxKind.Identifier;[a];
  37730. - SyntaxKind.RightParenthesis;[)];
  37731. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (246:0,246) - Tokens:1
  37732. - SyntaxKind.Unknown;[];
  37733. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_AllowsTupleTypes_IgnoresTrailingWhitespace.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_AllowsTupleTypes_IgnoresTrailingWhitespace.stree.txt
  37734. deleted file mode 100644
  37735. index 36eac56a6c9..00000000000
  37736. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_AllowsTupleTypes_IgnoresTrailingWhitespace.stree.txt
  37737. +++ /dev/null
  37738. @@ -1,22 +0,0 @@
  37739. -Markup block - Gen<None> - 23 - (0:0,0)
  37740. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  37741. - SyntaxKind.Unknown;[];
  37742. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted}> - 23 - (0:0,0)
  37743. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  37744. - SyntaxKind.Transition;[@];
  37745. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  37746. - SyntaxKind.Identifier;[custom];
  37747. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  37748. - SyntaxKind.Whitespace;[ ];
  37749. - Code span - Gen<DirectiveToken {;Type;Opt:False}> - [(bool, int?)] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (8:0,8) - Tokens:7
  37750. - SyntaxKind.LeftParenthesis;[(];
  37751. - SyntaxKind.Keyword;[bool];
  37752. - SyntaxKind.Comma;[,];
  37753. - SyntaxKind.Whitespace;[ ];
  37754. - SyntaxKind.Keyword;[int];
  37755. - SyntaxKind.QuestionMark;[?];
  37756. - SyntaxKind.RightParenthesis;[)];
  37757. - None span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (20:0,20) - Tokens:1
  37758. - SyntaxKind.Whitespace;[ ];
  37759. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:1
  37760. - SyntaxKind.Unknown;[];
  37761. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_AllowsWhiteSpaceAroundTokens.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_AllowsWhiteSpaceAroundTokens.stree.txt
  37762. deleted file mode 100644
  37763. index 5ffe9978bb5..00000000000
  37764. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_AllowsWhiteSpaceAroundTokens.stree.txt
  37765. +++ /dev/null
  37766. @@ -1,26 +0,0 @@
  37767. -Markup block - Gen<None> - 67 - (0:0,0)
  37768. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  37769. - SyntaxKind.Unknown;[];
  37770. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted}> - 67 - (0:0,0)
  37771. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  37772. - SyntaxKind.Transition;[@];
  37773. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  37774. - SyntaxKind.Identifier;[custom];
  37775. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  37776. - SyntaxKind.Whitespace;[ ];
  37777. - Code span - Gen<DirectiveToken {;Type;Opt:False}> - [System.Text.Encoding.ASCIIEncoding] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (11:0,11) - Tokens:7
  37778. - SyntaxKind.Identifier;[System];
  37779. - SyntaxKind.Dot;[.];
  37780. - SyntaxKind.Identifier;[Text];
  37781. - SyntaxKind.Dot;[.];
  37782. - SyntaxKind.Identifier;[Encoding];
  37783. - SyntaxKind.Dot;[.];
  37784. - SyntaxKind.Identifier;[ASCIIEncoding];
  37785. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (45:0,45) - Tokens:1
  37786. - SyntaxKind.Whitespace;[ ];
  37787. - Code span - Gen<DirectiveToken {;Member;Opt:False}> - [Some_Member] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (52:0,52) - Tokens:1
  37788. - SyntaxKind.Identifier;[Some_Member];
  37789. - None span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (63:0,63) - Tokens:1
  37790. - SyntaxKind.Whitespace;[ ];
  37791. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (67:0,67) - Tokens:1
  37792. - SyntaxKind.Unknown;[];
  37793. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_CanHandleEOFIncompleteNamespaceTokens.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_CanHandleEOFIncompleteNamespaceTokens.stree.txt
  37794. deleted file mode 100644
  37795. index ee74b316d31..00000000000
  37796. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_CanHandleEOFIncompleteNamespaceTokens.stree.txt
  37797. +++ /dev/null
  37798. @@ -1,12 +0,0 @@
  37799. -Markup block - Gen<None> - 15 - (0:0,0)
  37800. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  37801. - SyntaxKind.Unknown;[];
  37802. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted} [RZ1014(8:0,8 [7] )]> - 8 - (0:0,0)
  37803. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  37804. - SyntaxKind.Transition;[@];
  37805. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  37806. - SyntaxKind.Identifier;[custom];
  37807. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  37808. - SyntaxKind.Whitespace;[ ];
  37809. - Markup span - Gen<Markup> - [System.] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:1
  37810. - SyntaxKind.Text;[System.];
  37811. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_CanHandleEOFInvalidNamespaceTokens.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_CanHandleEOFInvalidNamespaceTokens.stree.txt
  37812. deleted file mode 100644
  37813. index 5ab7bd2176a..00000000000
  37814. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_CanHandleEOFInvalidNamespaceTokens.stree.txt
  37815. +++ /dev/null
  37816. @@ -1,15 +0,0 @@
  37817. -Markup block - Gen<None> - 15 - (0:0,0)
  37818. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  37819. - SyntaxKind.Unknown;[];
  37820. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted} [RZ1014(8:0,8 [7] )]> - 8 - (0:0,0)
  37821. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  37822. - SyntaxKind.Transition;[@];
  37823. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  37824. - SyntaxKind.Identifier;[custom];
  37825. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  37826. - SyntaxKind.Whitespace;[ ];
  37827. - Markup span - Gen<Markup> - [System] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:1
  37828. - SyntaxKind.Text;[System];
  37829. - Tag block - Gen<None> - 1 - (14:0,14)
  37830. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  37831. - SyntaxKind.OpenAngle;[<];
  37832. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_CanHandleIncompleteNamespaceTokens.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_CanHandleIncompleteNamespaceTokens.stree.txt
  37833. deleted file mode 100644
  37834. index 5bc8e3d8b27..00000000000
  37835. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_CanHandleIncompleteNamespaceTokens.stree.txt
  37836. +++ /dev/null
  37837. @@ -1,13 +0,0 @@
  37838. -Markup block - Gen<None> - 17 - (0:0,0)
  37839. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  37840. - SyntaxKind.Unknown;[];
  37841. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted} [RZ1014(8:0,8 [7] )]> - 8 - (0:0,0)
  37842. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  37843. - SyntaxKind.Transition;[@];
  37844. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  37845. - SyntaxKind.Identifier;[custom];
  37846. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  37847. - SyntaxKind.Whitespace;[ ];
  37848. - Markup span - Gen<Markup> - [System.LF] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:2
  37849. - SyntaxKind.Text;[System.];
  37850. - SyntaxKind.NewLine;[LF];
  37851. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_CanHandleInvalidNamespaceTokens.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_CanHandleInvalidNamespaceTokens.stree.txt
  37852. deleted file mode 100644
  37853. index 11bce545230..00000000000
  37854. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_CanHandleInvalidNamespaceTokens.stree.txt
  37855. +++ /dev/null
  37856. @@ -1,16 +0,0 @@
  37857. -Markup block - Gen<None> - 17 - (0:0,0)
  37858. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  37859. - SyntaxKind.Unknown;[];
  37860. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted} [RZ1014(8:0,8 [7] )]> - 8 - (0:0,0)
  37861. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  37862. - SyntaxKind.Transition;[@];
  37863. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  37864. - SyntaxKind.Identifier;[custom];
  37865. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  37866. - SyntaxKind.Whitespace;[ ];
  37867. - Markup span - Gen<Markup> - [System] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:1
  37868. - SyntaxKind.Text;[System];
  37869. - Tag block - Gen<None> - 3 - (14:0,14)
  37870. - Markup span - Gen<Markup> - [<LF] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:2
  37871. - SyntaxKind.OpenAngle;[<];
  37872. - SyntaxKind.NewLine;[LF];
  37873. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_ErrorsExtraContentAfterDirective.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_ErrorsExtraContentAfterDirective.stree.txt
  37874. deleted file mode 100644
  37875. index 3383379ab63..00000000000
  37876. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_ErrorsExtraContentAfterDirective.stree.txt
  37877. +++ /dev/null
  37878. @@ -1,18 +0,0 @@
  37879. -Markup block - Gen<None> - 23 - (0:0,0)
  37880. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  37881. - SyntaxKind.Unknown;[];
  37882. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted} [RZ1017(16:0,16 [7] )]> - 16 - (0:0,0)
  37883. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  37884. - SyntaxKind.Transition;[@];
  37885. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  37886. - SyntaxKind.Identifier;[custom];
  37887. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  37888. - SyntaxKind.Whitespace;[ ];
  37889. - Code span - Gen<DirectiveToken {;String;Opt:False}> - ["hello"] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (8:0,8) - Tokens:1
  37890. - SyntaxKind.StringLiteral;["hello"];
  37891. - None span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (15:0,15) - Tokens:1
  37892. - SyntaxKind.Whitespace;[ ];
  37893. - Markup span - Gen<Markup> - ["world"] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:3
  37894. - SyntaxKind.DoubleQuote;["];
  37895. - SyntaxKind.Text;[world];
  37896. - SyntaxKind.DoubleQuote;["];
  37897. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_ErrorsForInvalidMemberTokens.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_ErrorsForInvalidMemberTokens.stree.txt
  37898. deleted file mode 100644
  37899. index e80139ceb42..00000000000
  37900. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_ErrorsForInvalidMemberTokens.stree.txt
  37901. +++ /dev/null
  37902. @@ -1,12 +0,0 @@
  37903. -Markup block - Gen<None> - 20 - (0:0,0)
  37904. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  37905. - SyntaxKind.Unknown;[];
  37906. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted} [RZ1015(8:0,8 [1] )]> - 8 - (0:0,0)
  37907. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  37908. - SyntaxKind.Transition;[@];
  37909. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  37910. - SyntaxKind.Identifier;[custom];
  37911. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  37912. - SyntaxKind.Whitespace;[ ];
  37913. - Markup span - Gen<Markup> - [-Some_Member] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:1
  37914. - SyntaxKind.Text;[-Some_Member];
  37915. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_ErrorsWhenEOFBeforeDirectiveBlockStart.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_ErrorsWhenEOFBeforeDirectiveBlockStart.stree.txt
  37916. deleted file mode 100644
  37917. index 8e0af839b9f..00000000000
  37918. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_ErrorsWhenEOFBeforeDirectiveBlockStart.stree.txt
  37919. +++ /dev/null
  37920. @@ -1,14 +0,0 @@
  37921. -Markup block - Gen<None> - 15 - (0:0,0)
  37922. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  37923. - SyntaxKind.Unknown;[];
  37924. - Directive block - Gen<Directive:{custom;CodeBlock;Unrestricted} [RZ1012(15:0,15 [1] )]> - 15 - (0:0,0)
  37925. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  37926. - SyntaxKind.Transition;[@];
  37927. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  37928. - SyntaxKind.Identifier;[custom];
  37929. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  37930. - SyntaxKind.Whitespace;[ ];
  37931. - Code span - Gen<DirectiveToken {;String;Opt:False}> - ["Hello"] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (8:0,8) - Tokens:1
  37932. - SyntaxKind.StringLiteral;["Hello"];
  37933. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:1
  37934. - SyntaxKind.Unknown;[];
  37935. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_ErrorsWhenExtraContentBeforeBlockStart.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_ErrorsWhenExtraContentBeforeBlockStart.stree.txt
  37936. deleted file mode 100644
  37937. index 421836eef57..00000000000
  37938. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_ErrorsWhenExtraContentBeforeBlockStart.stree.txt
  37939. +++ /dev/null
  37940. @@ -1,24 +0,0 @@
  37941. -Markup block - Gen<None> - 39 - (0:0,0)
  37942. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  37943. - SyntaxKind.Unknown;[];
  37944. - Directive block - Gen<Directive:{custom;CodeBlock;Unrestricted} [RZ1017(16:0,16 [5] )]> - 16 - (0:0,0)
  37945. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  37946. - SyntaxKind.Transition;[@];
  37947. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  37948. - SyntaxKind.Identifier;[custom];
  37949. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  37950. - SyntaxKind.Whitespace;[ ];
  37951. - Code span - Gen<DirectiveToken {;String;Opt:False}> - ["Hello"] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (8:0,8) - Tokens:1
  37952. - SyntaxKind.StringLiteral;["Hello"];
  37953. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (15:0,15) - Tokens:1
  37954. - SyntaxKind.Whitespace;[ ];
  37955. - Markup span - Gen<Markup> - [World { foo(); bar(); }] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:9
  37956. - SyntaxKind.Text;[World];
  37957. - SyntaxKind.Whitespace;[ ];
  37958. - SyntaxKind.Text;[{];
  37959. - SyntaxKind.Whitespace;[ ];
  37960. - SyntaxKind.Text;[foo();];
  37961. - SyntaxKind.Whitespace;[ ];
  37962. - SyntaxKind.Text;[bar();];
  37963. - SyntaxKind.Whitespace;[ ];
  37964. - SyntaxKind.Text;[}];
  37965. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_ErrorsWhenMissingEndBrace.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_ErrorsWhenMissingEndBrace.stree.txt
  37966. deleted file mode 100644
  37967. index fdf4b27ff0d..00000000000
  37968. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_ErrorsWhenMissingEndBrace.stree.txt
  37969. +++ /dev/null
  37970. @@ -1,18 +0,0 @@
  37971. -Markup block - Gen<None> - 17 - (0:0,0)
  37972. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  37973. - SyntaxKind.Unknown;[];
  37974. - Directive block - Gen<Directive:{custom;CodeBlock;Unrestricted} [RZ1006(16:0,16 [1] )]> - 17 - (0:0,0)
  37975. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  37976. - SyntaxKind.Transition;[@];
  37977. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  37978. - SyntaxKind.Identifier;[custom];
  37979. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  37980. - SyntaxKind.Whitespace;[ ];
  37981. - Code span - Gen<DirectiveToken {;String;Opt:False}> - ["Hello"] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (8:0,8) - Tokens:1
  37982. - SyntaxKind.StringLiteral;["Hello"];
  37983. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (15:0,15) - Tokens:1
  37984. - SyntaxKind.Whitespace;[ ];
  37985. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd - (16:0,16) - Tokens:1
  37986. - SyntaxKind.LeftBrace;[{];
  37987. - Code span - Gen<Stmt> - [] - CodeBlockEditHandler;Accepts:Any;CodeBlock - (17:0,17) - Tokens:1
  37988. - SyntaxKind.Unknown;[];
  37989. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_FileScopedMultipleOccurring_CanHaveDuplicates.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_FileScopedMultipleOccurring_CanHaveDuplicates.stree.txt
  37990. deleted file mode 100644
  37991. index 6c9bc613ccd..00000000000
  37992. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_FileScopedMultipleOccurring_CanHaveDuplicates.stree.txt
  37993. +++ /dev/null
  37994. @@ -1,39 +0,0 @@
  37995. -Markup block - Gen<None> - 85 - (0:0,0)
  37996. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  37997. - SyntaxKind.Unknown;[];
  37998. - Directive block - Gen<Directive:{custom;SingleLine;FileScopedMultipleOccurring}> - 44 - (0:0,0)
  37999. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38000. - SyntaxKind.Transition;[@];
  38001. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38002. - SyntaxKind.Identifier;[custom];
  38003. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  38004. - SyntaxKind.Whitespace;[ ];
  38005. - Code span - Gen<DirectiveToken {;Type;Opt:False}> - [System.Text.Encoding.ASCIIEncoding] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (8:0,8) - Tokens:7
  38006. - SyntaxKind.Identifier;[System];
  38007. - SyntaxKind.Dot;[.];
  38008. - SyntaxKind.Identifier;[Text];
  38009. - SyntaxKind.Dot;[.];
  38010. - SyntaxKind.Identifier;[Encoding];
  38011. - SyntaxKind.Dot;[.];
  38012. - SyntaxKind.Identifier;[ASCIIEncoding];
  38013. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Whitespace - (42:0,42) - Tokens:1
  38014. - SyntaxKind.NewLine;[LF];
  38015. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (44:1,0) - Tokens:1
  38016. - SyntaxKind.Unknown;[];
  38017. - Directive block - Gen<Directive:{custom;SingleLine;FileScopedMultipleOccurring}> - 41 - (44:1,0)
  38018. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (44:1,0) - Tokens:1
  38019. - SyntaxKind.Transition;[@];
  38020. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (45:1,1) - Tokens:1
  38021. - SyntaxKind.Identifier;[custom];
  38022. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (51:1,7) - Tokens:1
  38023. - SyntaxKind.Whitespace;[ ];
  38024. - Code span - Gen<DirectiveToken {;Type;Opt:False}> - [System.Text.Encoding.UTF8Encoding] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (52:1,8) - Tokens:7
  38025. - SyntaxKind.Identifier;[System];
  38026. - SyntaxKind.Dot;[.];
  38027. - SyntaxKind.Identifier;[Text];
  38028. - SyntaxKind.Dot;[.];
  38029. - SyntaxKind.Identifier;[Encoding];
  38030. - SyntaxKind.Dot;[.];
  38031. - SyntaxKind.Identifier;[UTF8Encoding];
  38032. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (85:1,41) - Tokens:1
  38033. - SyntaxKind.Unknown;[];
  38034. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_FileScopedSinglyOccurring_ErrorsIfDuplicate.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_FileScopedSinglyOccurring_ErrorsIfDuplicate.stree.txt
  38035. deleted file mode 100644
  38036. index b24cfe0182c..00000000000
  38037. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_FileScopedSinglyOccurring_ErrorsIfDuplicate.stree.txt
  38038. +++ /dev/null
  38039. @@ -1,39 +0,0 @@
  38040. -Markup block - Gen<None> - 85 - (0:0,0)
  38041. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38042. - SyntaxKind.Unknown;[];
  38043. - Directive block - Gen<Directive:{custom;SingleLine;FileScopedSinglyOccurring}> - 44 - (0:0,0)
  38044. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38045. - SyntaxKind.Transition;[@];
  38046. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38047. - SyntaxKind.Identifier;[custom];
  38048. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  38049. - SyntaxKind.Whitespace;[ ];
  38050. - Code span - Gen<DirectiveToken {;Type;Opt:False}> - [System.Text.Encoding.ASCIIEncoding] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (8:0,8) - Tokens:7
  38051. - SyntaxKind.Identifier;[System];
  38052. - SyntaxKind.Dot;[.];
  38053. - SyntaxKind.Identifier;[Text];
  38054. - SyntaxKind.Dot;[.];
  38055. - SyntaxKind.Identifier;[Encoding];
  38056. - SyntaxKind.Dot;[.];
  38057. - SyntaxKind.Identifier;[ASCIIEncoding];
  38058. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Whitespace - (42:0,42) - Tokens:1
  38059. - SyntaxKind.NewLine;[LF];
  38060. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (44:1,0) - Tokens:1
  38061. - SyntaxKind.Unknown;[];
  38062. - Directive block - Gen<Directive:{custom;SingleLine;FileScopedSinglyOccurring} [RZ2001(44:1,0 [7] )]> - 41 - (44:1,0)
  38063. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (44:1,0) - Tokens:1
  38064. - SyntaxKind.Transition;[@];
  38065. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (45:1,1) - Tokens:1
  38066. - SyntaxKind.Identifier;[custom];
  38067. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (51:1,7) - Tokens:1
  38068. - SyntaxKind.Whitespace;[ ];
  38069. - Code span - Gen<DirectiveToken {;Type;Opt:False}> - [System.Text.Encoding.UTF8Encoding] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (52:1,8) - Tokens:7
  38070. - SyntaxKind.Identifier;[System];
  38071. - SyntaxKind.Dot;[.];
  38072. - SyntaxKind.Identifier;[Text];
  38073. - SyntaxKind.Dot;[.];
  38074. - SyntaxKind.Identifier;[Encoding];
  38075. - SyntaxKind.Dot;[.];
  38076. - SyntaxKind.Identifier;[UTF8Encoding];
  38077. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (85:1,41) - Tokens:1
  38078. - SyntaxKind.Unknown;[];
  38079. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_FileScoped_CanBeBeneathOtherDirectives.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_FileScoped_CanBeBeneathOtherDirectives.stree.txt
  38080. deleted file mode 100644
  38081. index 50c499246fe..00000000000
  38082. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_FileScoped_CanBeBeneathOtherDirectives.stree.txt
  38083. +++ /dev/null
  38084. @@ -1,33 +0,0 @@
  38085. -Markup block - Gen<None> - 59 - (0:0,0)
  38086. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38087. - SyntaxKind.Unknown;[];
  38088. - Directive block - Gen<Directive:{custom;SingleLine;FileScopedSinglyOccurring}> - 44 - (0:0,0)
  38089. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38090. - SyntaxKind.Transition;[@];
  38091. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38092. - SyntaxKind.Identifier;[custom];
  38093. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  38094. - SyntaxKind.Whitespace;[ ];
  38095. - Code span - Gen<DirectiveToken {;Type;Opt:False}> - [System.Text.Encoding.ASCIIEncoding] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (8:0,8) - Tokens:7
  38096. - SyntaxKind.Identifier;[System];
  38097. - SyntaxKind.Dot;[.];
  38098. - SyntaxKind.Identifier;[Text];
  38099. - SyntaxKind.Dot;[.];
  38100. - SyntaxKind.Identifier;[Encoding];
  38101. - SyntaxKind.Dot;[.];
  38102. - SyntaxKind.Identifier;[ASCIIEncoding];
  38103. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Whitespace - (42:0,42) - Tokens:1
  38104. - SyntaxKind.NewLine;[LF];
  38105. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (44:1,0) - Tokens:1
  38106. - SyntaxKind.Unknown;[];
  38107. - Directive block - Gen<Directive:{something;SingleLine;FileScopedMultipleOccurring}> - 15 - (44:1,0)
  38108. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (44:1,0) - Tokens:1
  38109. - SyntaxKind.Transition;[@];
  38110. - MetaCode span - Gen<None> - [something] - SpanEditHandler;Accepts:None - (45:1,1) - Tokens:1
  38111. - SyntaxKind.Identifier;[something];
  38112. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (54:1,10) - Tokens:1
  38113. - SyntaxKind.Whitespace;[ ];
  38114. - Code span - Gen<DirectiveToken {;Member;Opt:False}> - [Else] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (55:1,11) - Tokens:1
  38115. - SyntaxKind.Identifier;[Else];
  38116. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (59:1,15) - Tokens:1
  38117. - SyntaxKind.Unknown;[];
  38118. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_FileScoped_CanBeBeneathOtherWhiteSpaceCommentsAndDirectives.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_FileScoped_CanBeBeneathOtherWhiteSpaceCommentsAndDirectives.stree.txt
  38119. deleted file mode 100644
  38120. index 52ce2467765..00000000000
  38121. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_FileScoped_CanBeBeneathOtherWhiteSpaceCommentsAndDirectives.stree.txt
  38122. +++ /dev/null
  38123. @@ -1,66 +0,0 @@
  38124. -Markup block - Gen<None> - 130 - (0:0,0)
  38125. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38126. - SyntaxKind.Unknown;[];
  38127. - Comment block - Gen<RazorComment> - 43 - (0:0,0)
  38128. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38129. - SyntaxKind.RazorCommentTransition;[@];
  38130. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38131. - SyntaxKind.RazorCommentStar;[*];
  38132. - Comment span - Gen<None> - [ There are two directives beneath this ] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  38133. - SyntaxKind.RazorCommentLiteral;[ There are two directives beneath this ];
  38134. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (41:0,41) - Tokens:1
  38135. - SyntaxKind.RazorCommentStar;[*];
  38136. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (42:0,42) - Tokens:1
  38137. - SyntaxKind.RazorCommentTransition;[@];
  38138. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:Any - (43:0,43) - Tokens:1
  38139. - SyntaxKind.NewLine;[LF];
  38140. - Directive block - Gen<Directive:{custom;SingleLine;FileScopedSinglyOccurring}> - 44 - (45:1,0)
  38141. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (45:1,0) - Tokens:1
  38142. - SyntaxKind.Transition;[@];
  38143. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (46:1,1) - Tokens:1
  38144. - SyntaxKind.Identifier;[custom];
  38145. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (52:1,7) - Tokens:1
  38146. - SyntaxKind.Whitespace;[ ];
  38147. - Code span - Gen<DirectiveToken {;Type;Opt:False}> - [System.Text.Encoding.ASCIIEncoding] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (53:1,8) - Tokens:7
  38148. - SyntaxKind.Identifier;[System];
  38149. - SyntaxKind.Dot;[.];
  38150. - SyntaxKind.Identifier;[Text];
  38151. - SyntaxKind.Dot;[.];
  38152. - SyntaxKind.Identifier;[Encoding];
  38153. - SyntaxKind.Dot;[.];
  38154. - SyntaxKind.Identifier;[ASCIIEncoding];
  38155. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Whitespace - (87:1,42) - Tokens:1
  38156. - SyntaxKind.NewLine;[LF];
  38157. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:Any - (89:2,0) - Tokens:1
  38158. - SyntaxKind.NewLine;[LF];
  38159. - Directive block - Gen<Directive:{something;SingleLine;FileScopedMultipleOccurring}> - 17 - (91:3,0)
  38160. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (91:3,0) - Tokens:1
  38161. - SyntaxKind.Transition;[@];
  38162. - MetaCode span - Gen<None> - [something] - SpanEditHandler;Accepts:None - (92:3,1) - Tokens:1
  38163. - SyntaxKind.Identifier;[something];
  38164. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (101:3,10) - Tokens:1
  38165. - SyntaxKind.Whitespace;[ ];
  38166. - Code span - Gen<DirectiveToken {;Member;Opt:False}> - [Else] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (102:3,11) - Tokens:1
  38167. - SyntaxKind.Identifier;[Else];
  38168. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Whitespace - (106:3,15) - Tokens:1
  38169. - SyntaxKind.NewLine;[LF];
  38170. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:Any - (108:4,0) - Tokens:1
  38171. - SyntaxKind.NewLine;[LF];
  38172. - Tag block - Gen<None> - 3 - (110:5,0)
  38173. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (110:5,0) - Tokens:3
  38174. - SyntaxKind.OpenAngle;[<];
  38175. - SyntaxKind.Text;[p];
  38176. - SyntaxKind.CloseAngle;[>];
  38177. - SyntaxKind.HtmlTextLiteral - [This is extra] - [113..126) - FullWidth: 13 - Slots: 1
  38178. - SyntaxKind.List - [This is extra] - [113..126) - FullWidth: 13 - Slots: 5
  38179. - SyntaxKind.Text;[This];
  38180. - SyntaxKind.Whitespace;[ ];
  38181. - SyntaxKind.Text;[is];
  38182. - SyntaxKind.Whitespace;[ ];
  38183. - SyntaxKind.Text;[extra];
  38184. - Tag block - Gen<None> - 4 - (126:5,16)
  38185. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (126:5,16) - Tokens:4
  38186. - SyntaxKind.OpenAngle;[<];
  38187. - SyntaxKind.ForwardSlash;[/];
  38188. - SyntaxKind.Text;[p];
  38189. - SyntaxKind.CloseAngle;[>];
  38190. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_NoErrorsSemicolonAfterDirective.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_NoErrorsSemicolonAfterDirective.stree.txt
  38191. deleted file mode 100644
  38192. index 686fa9221b6..00000000000
  38193. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_NoErrorsSemicolonAfterDirective.stree.txt
  38194. +++ /dev/null
  38195. @@ -1,20 +0,0 @@
  38196. -Markup block - Gen<None> - 19 - (0:0,0)
  38197. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38198. - SyntaxKind.Unknown;[];
  38199. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted}> - 19 - (0:0,0)
  38200. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38201. - SyntaxKind.Transition;[@];
  38202. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38203. - SyntaxKind.Identifier;[custom];
  38204. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  38205. - SyntaxKind.Whitespace;[ ];
  38206. - Code span - Gen<DirectiveToken {;String;Opt:False}> - ["hello"] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (8:0,8) - Tokens:1
  38207. - SyntaxKind.StringLiteral;["hello"];
  38208. - None span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (15:0,15) - Tokens:1
  38209. - SyntaxKind.Whitespace;[ ];
  38210. - MetaCode span - Gen<None> - [;] - SpanEditHandler;Accepts:Whitespace - (16:0,16) - Tokens:1
  38211. - SyntaxKind.Semicolon;[;];
  38212. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (17:0,17) - Tokens:1
  38213. - SyntaxKind.Whitespace;[ ];
  38214. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:1
  38215. - SyntaxKind.Unknown;[];
  38216. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForNonStringValue.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForNonStringValue.stree.txt
  38217. deleted file mode 100644
  38218. index 154f851b00e..00000000000
  38219. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForNonStringValue.stree.txt
  38220. +++ /dev/null
  38221. @@ -1,14 +0,0 @@
  38222. -Markup block - Gen<None> - 14 - (0:0,0)
  38223. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38224. - SyntaxKind.Unknown;[];
  38225. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted} [RZ1016(8:0,8 [1] )]> - 8 - (0:0,0)
  38226. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38227. - SyntaxKind.Transition;[@];
  38228. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38229. - SyntaxKind.Identifier;[custom];
  38230. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  38231. - SyntaxKind.Whitespace;[ ];
  38232. - Markup span - Gen<Markup> - [{foo?}] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:3
  38233. - SyntaxKind.Text;[{foo];
  38234. - SyntaxKind.QuestionMark;[?];
  38235. - SyntaxKind.Text;[}];
  38236. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForPartialQuotedValue.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForPartialQuotedValue.stree.txt
  38237. deleted file mode 100644
  38238. index e5ebe493a70..00000000000
  38239. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForPartialQuotedValue.stree.txt
  38240. +++ /dev/null
  38241. @@ -1,13 +0,0 @@
  38242. -Markup block - Gen<None> - 16 - (0:0,0)
  38243. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38244. - SyntaxKind.Unknown;[];
  38245. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted} [RZ1016(8:0,8 [7] )]> - 8 - (0:0,0)
  38246. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38247. - SyntaxKind.Transition;[@];
  38248. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38249. - SyntaxKind.Identifier;[custom];
  38250. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  38251. - SyntaxKind.Whitespace;[ ];
  38252. - Markup span - Gen<Markup> - [AString"] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:2
  38253. - SyntaxKind.Text;[AString];
  38254. - SyntaxKind.DoubleQuote;["];
  38255. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForSingleQuotedValue.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForSingleQuotedValue.stree.txt
  38256. deleted file mode 100644
  38257. index 32b2606e4b3..00000000000
  38258. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForSingleQuotedValue.stree.txt
  38259. +++ /dev/null
  38260. @@ -1,14 +0,0 @@
  38261. -Markup block - Gen<None> - 17 - (0:0,0)
  38262. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38263. - SyntaxKind.Unknown;[];
  38264. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted} [RZ1016(8:0,8 [9] )]> - 8 - (0:0,0)
  38265. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38266. - SyntaxKind.Transition;[@];
  38267. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38268. - SyntaxKind.Identifier;[custom];
  38269. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  38270. - SyntaxKind.Whitespace;[ ];
  38271. - Markup span - Gen<Markup> - ['AString'] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:3
  38272. - SyntaxKind.SingleQuote;['];
  38273. - SyntaxKind.Text;[AString];
  38274. - SyntaxKind.SingleQuote;['];
  38275. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForUnquotedValue.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForUnquotedValue.stree.txt
  38276. deleted file mode 100644
  38277. index 64f9b87bb30..00000000000
  38278. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForUnquotedValue.stree.txt
  38279. +++ /dev/null
  38280. @@ -1,12 +0,0 @@
  38281. -Markup block - Gen<None> - 15 - (0:0,0)
  38282. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38283. - SyntaxKind.Unknown;[];
  38284. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted} [RZ1016(8:0,8 [7] )]> - 8 - (0:0,0)
  38285. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38286. - SyntaxKind.Transition;[@];
  38287. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38288. - SyntaxKind.Identifier;[custom];
  38289. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  38290. - SyntaxKind.Whitespace;[ ];
  38291. - Markup span - Gen<Markup> - [AString] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:1
  38292. - SyntaxKind.Text;[AString];
  38293. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_TokensMustBeSeparatedBySpace.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_TokensMustBeSeparatedBySpace.stree.txt
  38294. deleted file mode 100644
  38295. index 337552e7eac..00000000000
  38296. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_TokensMustBeSeparatedBySpace.stree.txt
  38297. +++ /dev/null
  38298. @@ -1,16 +0,0 @@
  38299. -Markup block - Gen<None> - 26 - (0:0,0)
  38300. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38301. - SyntaxKind.Unknown;[];
  38302. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted} [RZ1011(17:0,17 [9] )]> - 17 - (0:0,0)
  38303. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38304. - SyntaxKind.Transition;[@];
  38305. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38306. - SyntaxKind.Identifier;[custom];
  38307. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  38308. - SyntaxKind.Whitespace;[ ];
  38309. - Code span - Gen<DirectiveToken {;String;Opt:False}> - ["string1"] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (8:0,8) - Tokens:1
  38310. - SyntaxKind.StringLiteral;["string1"];
  38311. - Markup span - Gen<Markup> - ["string2"] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:3
  38312. - SyntaxKind.DoubleQuote;["];
  38313. - SyntaxKind.Text;[string2];
  38314. - SyntaxKind.DoubleQuote;["];
  38315. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsCodeBlocks.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsCodeBlocks.stree.txt
  38316. deleted file mode 100644
  38317. index 4f7ff6b7499..00000000000
  38318. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsCodeBlocks.stree.txt
  38319. +++ /dev/null
  38320. @@ -1,32 +0,0 @@
  38321. -Markup block - Gen<None> - 32 - (0:0,0)
  38322. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38323. - SyntaxKind.Unknown;[];
  38324. - Directive block - Gen<Directive:{custom;CodeBlock;Unrestricted}> - 32 - (0:0,0)
  38325. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38326. - SyntaxKind.Transition;[@];
  38327. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38328. - SyntaxKind.Identifier;[custom];
  38329. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  38330. - SyntaxKind.Whitespace;[ ];
  38331. - Code span - Gen<DirectiveToken {;String;Opt:False}> - ["Name"] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (8:0,8) - Tokens:1
  38332. - SyntaxKind.StringLiteral;["Name"];
  38333. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (14:0,14) - Tokens:1
  38334. - SyntaxKind.Whitespace;[ ];
  38335. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd - (15:0,15) - Tokens:1
  38336. - SyntaxKind.LeftBrace;[{];
  38337. - Code span - Gen<Stmt> - [ foo(); bar(); ] - CodeBlockEditHandler;Accepts:Any;CodeBlock - (16:0,16) - Tokens:11
  38338. - SyntaxKind.Whitespace;[ ];
  38339. - SyntaxKind.Identifier;[foo];
  38340. - SyntaxKind.LeftParenthesis;[(];
  38341. - SyntaxKind.RightParenthesis;[)];
  38342. - SyntaxKind.Semicolon;[;];
  38343. - SyntaxKind.Whitespace;[ ];
  38344. - SyntaxKind.Identifier;[bar];
  38345. - SyntaxKind.LeftParenthesis;[(];
  38346. - SyntaxKind.RightParenthesis;[)];
  38347. - SyntaxKind.Semicolon;[;];
  38348. - SyntaxKind.Whitespace;[ ];
  38349. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (31:0,31) - Tokens:1
  38350. - SyntaxKind.RightBrace;[}];
  38351. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (32:0,32) - Tokens:1
  38352. - SyntaxKind.Unknown;[];
  38353. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsMemberTokens.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsMemberTokens.stree.txt
  38354. deleted file mode 100644
  38355. index 8c7fd5ccac2..00000000000
  38356. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsMemberTokens.stree.txt
  38357. +++ /dev/null
  38358. @@ -1,14 +0,0 @@
  38359. -Markup block - Gen<None> - 19 - (0:0,0)
  38360. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38361. - SyntaxKind.Unknown;[];
  38362. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted}> - 19 - (0:0,0)
  38363. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38364. - SyntaxKind.Transition;[@];
  38365. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38366. - SyntaxKind.Identifier;[custom];
  38367. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  38368. - SyntaxKind.Whitespace;[ ];
  38369. - Code span - Gen<DirectiveToken {;Member;Opt:False}> - [Some_Member] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (8:0,8) - Tokens:1
  38370. - SyntaxKind.Identifier;[Some_Member];
  38371. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:1
  38372. - SyntaxKind.Unknown;[];
  38373. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsMultipleTokens.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsMultipleTokens.stree.txt
  38374. deleted file mode 100644
  38375. index c42a4546256..00000000000
  38376. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsMultipleTokens.stree.txt
  38377. +++ /dev/null
  38378. @@ -1,28 +0,0 @@
  38379. -Markup block - Gen<None> - 64 - (0:0,0)
  38380. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38381. - SyntaxKind.Unknown;[];
  38382. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted}> - 64 - (0:0,0)
  38383. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38384. - SyntaxKind.Transition;[@];
  38385. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38386. - SyntaxKind.Identifier;[custom];
  38387. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  38388. - SyntaxKind.Whitespace;[ ];
  38389. - Code span - Gen<DirectiveToken {;Type;Opt:False}> - [System.Text.Encoding.ASCIIEncoding] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (8:0,8) - Tokens:7
  38390. - SyntaxKind.Identifier;[System];
  38391. - SyntaxKind.Dot;[.];
  38392. - SyntaxKind.Identifier;[Text];
  38393. - SyntaxKind.Dot;[.];
  38394. - SyntaxKind.Identifier;[Encoding];
  38395. - SyntaxKind.Dot;[.];
  38396. - SyntaxKind.Identifier;[ASCIIEncoding];
  38397. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (42:0,42) - Tokens:1
  38398. - SyntaxKind.Whitespace;[ ];
  38399. - Code span - Gen<DirectiveToken {;Member;Opt:False}> - [Some_Member] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (43:0,43) - Tokens:1
  38400. - SyntaxKind.Identifier;[Some_Member];
  38401. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (54:0,54) - Tokens:1
  38402. - SyntaxKind.Whitespace;[ ];
  38403. - Code span - Gen<DirectiveToken {;String;Opt:False}> - ["AString"] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (55:0,55) - Tokens:1
  38404. - SyntaxKind.StringLiteral;["AString"];
  38405. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (64:0,64) - Tokens:1
  38406. - SyntaxKind.Unknown;[];
  38407. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsRazorBlocks.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsRazorBlocks.stree.txt
  38408. deleted file mode 100644
  38409. index 13a0b22a667..00000000000
  38410. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsRazorBlocks.stree.txt
  38411. +++ /dev/null
  38412. @@ -1,43 +0,0 @@
  38413. -Markup block - Gen<None> - 33 - (0:0,0)
  38414. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38415. - SyntaxKind.Unknown;[];
  38416. - Directive block - Gen<Directive:{custom;RazorBlock;Unrestricted}> - 33 - (0:0,0)
  38417. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38418. - SyntaxKind.Transition;[@];
  38419. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38420. - SyntaxKind.Identifier;[custom];
  38421. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  38422. - SyntaxKind.Whitespace;[ ];
  38423. - Code span - Gen<DirectiveToken {;String;Opt:False}> - ["Header"] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (8:0,8) - Tokens:1
  38424. - SyntaxKind.StringLiteral;["Header"];
  38425. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (16:0,16) - Tokens:1
  38426. - SyntaxKind.Whitespace;[ ];
  38427. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd - (17:0,17) - Tokens:1
  38428. - SyntaxKind.LeftBrace;[{];
  38429. - Markup block - Gen<None> - 14 - (18:0,18)
  38430. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:1
  38431. - SyntaxKind.Whitespace;[ ];
  38432. - Tag block - Gen<None> - 3 - (19:0,19)
  38433. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:3
  38434. - SyntaxKind.OpenAngle;[<];
  38435. - SyntaxKind.Text;[p];
  38436. - SyntaxKind.CloseAngle;[>];
  38437. - SyntaxKind.HtmlTextLiteral - [F{o}o] - [22..27) - FullWidth: 5 - Slots: 1
  38438. - SyntaxKind.List - [F{o}o] - [22..27) - FullWidth: 5 - Slots: 5
  38439. - SyntaxKind.Text;[F];
  38440. - SyntaxKind.Text;[{];
  38441. - SyntaxKind.Text;[o];
  38442. - SyntaxKind.Text;[}];
  38443. - SyntaxKind.Text;[o];
  38444. - Tag block - Gen<None> - 4 - (27:0,27)
  38445. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (27:0,27) - Tokens:4
  38446. - SyntaxKind.OpenAngle;[<];
  38447. - SyntaxKind.ForwardSlash;[/];
  38448. - SyntaxKind.Text;[p];
  38449. - SyntaxKind.CloseAngle;[>];
  38450. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (31:0,31) - Tokens:1
  38451. - SyntaxKind.Whitespace;[ ];
  38452. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (32:0,32) - Tokens:1
  38453. - SyntaxKind.RightBrace;[}];
  38454. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (33:0,33) - Tokens:1
  38455. - SyntaxKind.Unknown;[];
  38456. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsStringTokens.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsStringTokens.stree.txt
  38457. deleted file mode 100644
  38458. index bef10a81c31..00000000000
  38459. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsStringTokens.stree.txt
  38460. +++ /dev/null
  38461. @@ -1,14 +0,0 @@
  38462. -Markup block - Gen<None> - 17 - (0:0,0)
  38463. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38464. - SyntaxKind.Unknown;[];
  38465. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted}> - 17 - (0:0,0)
  38466. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38467. - SyntaxKind.Transition;[@];
  38468. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38469. - SyntaxKind.Identifier;[custom];
  38470. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  38471. - SyntaxKind.Whitespace;[ ];
  38472. - Code span - Gen<DirectiveToken {;String;Opt:False}> - ["AString"] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (8:0,8) - Tokens:1
  38473. - SyntaxKind.StringLiteral;["AString"];
  38474. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:1
  38475. - SyntaxKind.Unknown;[];
  38476. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsTypeTokens.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsTypeTokens.stree.txt
  38477. deleted file mode 100644
  38478. index 0947eb9d41f..00000000000
  38479. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsTypeTokens.stree.txt
  38480. +++ /dev/null
  38481. @@ -1,20 +0,0 @@
  38482. -Markup block - Gen<None> - 42 - (0:0,0)
  38483. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38484. - SyntaxKind.Unknown;[];
  38485. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted}> - 42 - (0:0,0)
  38486. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38487. - SyntaxKind.Transition;[@];
  38488. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38489. - SyntaxKind.Identifier;[custom];
  38490. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  38491. - SyntaxKind.Whitespace;[ ];
  38492. - Code span - Gen<DirectiveToken {;Type;Opt:False}> - [System.Text.Encoding.ASCIIEncoding] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (8:0,8) - Tokens:7
  38493. - SyntaxKind.Identifier;[System];
  38494. - SyntaxKind.Dot;[.];
  38495. - SyntaxKind.Identifier;[Text];
  38496. - SyntaxKind.Dot;[.];
  38497. - SyntaxKind.Identifier;[Encoding];
  38498. - SyntaxKind.Dot;[.];
  38499. - SyntaxKind.Identifier;[ASCIIEncoding];
  38500. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (42:0,42) - Tokens:1
  38501. - SyntaxKind.Unknown;[];
  38502. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Directives_CanUseReservedWord_Class.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Directives_CanUseReservedWord_Class.stree.txt
  38503. deleted file mode 100644
  38504. index 5c945ea75bb..00000000000
  38505. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Directives_CanUseReservedWord_Class.stree.txt
  38506. +++ /dev/null
  38507. @@ -1,10 +0,0 @@
  38508. -Markup block - Gen<None> - 6 - (0:0,0)
  38509. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38510. - SyntaxKind.Unknown;[];
  38511. - Directive block - Gen<Directive:{class;SingleLine;Unrestricted}> - 6 - (0:0,0)
  38512. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38513. - SyntaxKind.Transition;[@];
  38514. - MetaCode span - Gen<None> - [class] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38515. - SyntaxKind.Keyword;[class];
  38516. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:1
  38517. - SyntaxKind.Unknown;[];
  38518. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Directives_CanUseReservedWord_Namespace.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Directives_CanUseReservedWord_Namespace.stree.txt
  38519. deleted file mode 100644
  38520. index 83ae36a2e67..00000000000
  38521. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Directives_CanUseReservedWord_Namespace.stree.txt
  38522. +++ /dev/null
  38523. @@ -1,10 +0,0 @@
  38524. -Markup block - Gen<None> - 10 - (0:0,0)
  38525. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38526. - SyntaxKind.Unknown;[];
  38527. - Directive block - Gen<Directive:{namespace;SingleLine;Unrestricted}> - 10 - (0:0,0)
  38528. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38529. - SyntaxKind.Transition;[@];
  38530. - MetaCode span - Gen<None> - [namespace] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38531. - SyntaxKind.Keyword;[namespace];
  38532. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  38533. - SyntaxKind.Unknown;[];
  38534. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/EmptyFunctionsDirective.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/EmptyFunctionsDirective.stree.txt
  38535. deleted file mode 100644
  38536. index b35ade0d67f..00000000000
  38537. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/EmptyFunctionsDirective.stree.txt
  38538. +++ /dev/null
  38539. @@ -1,18 +0,0 @@
  38540. -Markup block - Gen<None> - 14 - (0:0,0)
  38541. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38542. - SyntaxKind.Unknown;[];
  38543. - Directive block - Gen<Directive:{functions;CodeBlock;Unrestricted}> - 14 - (0:0,0)
  38544. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38545. - SyntaxKind.Transition;[@];
  38546. - MetaCode span - Gen<None> - [functions] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38547. - SyntaxKind.Identifier;[functions];
  38548. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (10:0,10) - Tokens:1
  38549. - SyntaxKind.Whitespace;[ ];
  38550. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd - (11:0,11) - Tokens:1
  38551. - SyntaxKind.LeftBrace;[{];
  38552. - Code span - Gen<Stmt> - [ ] - CodeBlockEditHandler;Accepts:Any;CodeBlock - (12:0,12) - Tokens:1
  38553. - SyntaxKind.Whitespace;[ ];
  38554. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:1
  38555. - SyntaxKind.RightBrace;[}];
  38556. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  38557. - SyntaxKind.Unknown;[];
  38558. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/ExtensibleDirectiveDoesNotErorrIfNotAtStartOfLineBecauseOfWhitespace.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/ExtensibleDirectiveDoesNotErorrIfNotAtStartOfLineBecauseOfWhitespace.stree.txt
  38559. deleted file mode 100644
  38560. index 9800bcc8f00..00000000000
  38561. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/ExtensibleDirectiveDoesNotErorrIfNotAtStartOfLineBecauseOfWhitespace.stree.txt
  38562. +++ /dev/null
  38563. @@ -1,22 +0,0 @@
  38564. -Markup block - Gen<None> - 46 - (0:0,0)
  38565. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38566. - SyntaxKind.NewLine;[LF];
  38567. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted}> - 44 - (2:1,0)
  38568. - Code span - Gen<Stmt> - [ ] - SpanEditHandler;Accepts:Any - (2:1,0) - Tokens:1
  38569. - SyntaxKind.Whitespace;[ ];
  38570. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (4:1,2) - Tokens:1
  38571. - SyntaxKind.Transition;[@];
  38572. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (5:1,3) - Tokens:1
  38573. - SyntaxKind.Identifier;[custom];
  38574. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (11:1,9) - Tokens:1
  38575. - SyntaxKind.Whitespace;[ ];
  38576. - Code span - Gen<DirectiveToken {;Type;Opt:False}> - [System.Text.Encoding.ASCIIEncoding] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (12:1,10) - Tokens:7
  38577. - SyntaxKind.Identifier;[System];
  38578. - SyntaxKind.Dot;[.];
  38579. - SyntaxKind.Identifier;[Text];
  38580. - SyntaxKind.Dot;[.];
  38581. - SyntaxKind.Identifier;[Encoding];
  38582. - SyntaxKind.Dot;[.];
  38583. - SyntaxKind.Identifier;[ASCIIEncoding];
  38584. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (46:1,44) - Tokens:1
  38585. - SyntaxKind.Unknown;[];
  38586. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/ExtensibleDirectiveErrorsIfNotAtStartOfLine.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/ExtensibleDirectiveErrorsIfNotAtStartOfLine.stree.txt
  38587. deleted file mode 100644
  38588. index 0921a9be45f..00000000000
  38589. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/ExtensibleDirectiveErrorsIfNotAtStartOfLine.stree.txt
  38590. +++ /dev/null
  38591. @@ -1,23 +0,0 @@
  38592. -Markup block - Gen<None> - 48 - (0:0,0)
  38593. - Markup span - Gen<Markup> - [{ ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  38594. - SyntaxKind.Text;[{];
  38595. - SyntaxKind.Whitespace;[ ];
  38596. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted} [RZ2005(4:0,4 [6] )]> - 44 - (3:0,3)
  38597. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  38598. - SyntaxKind.Transition;[@];
  38599. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (4:0,4) - Tokens:1
  38600. - SyntaxKind.Identifier;[custom];
  38601. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (10:0,10) - Tokens:1
  38602. - SyntaxKind.Whitespace;[ ];
  38603. - Code span - Gen<DirectiveToken {;Type;Opt:False}> - [System.Text.Encoding.ASCIIEncoding] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (11:0,11) - Tokens:7
  38604. - SyntaxKind.Identifier;[System];
  38605. - SyntaxKind.Dot;[.];
  38606. - SyntaxKind.Identifier;[Text];
  38607. - SyntaxKind.Dot;[.];
  38608. - SyntaxKind.Identifier;[Encoding];
  38609. - SyntaxKind.Dot;[.];
  38610. - SyntaxKind.Identifier;[ASCIIEncoding];
  38611. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Whitespace - (45:0,45) - Tokens:1
  38612. - SyntaxKind.NewLine;[LF];
  38613. - Markup span - Gen<Markup> - [}] - SpanEditHandler;Accepts:Any - (47:1,0) - Tokens:1
  38614. - SyntaxKind.Text;[}];
  38615. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/InheritsDirectiveSupportsArrays.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/InheritsDirectiveSupportsArrays.stree.txt
  38616. deleted file mode 100644
  38617. index cb7c610d0e5..00000000000
  38618. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/InheritsDirectiveSupportsArrays.stree.txt
  38619. +++ /dev/null
  38620. @@ -1,20 +0,0 @@
  38621. -Markup block - Gen<None> - 22 - (0:0,0)
  38622. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38623. - SyntaxKind.Unknown;[];
  38624. - Directive block - Gen<Directive:{inherits;SingleLine;FileScopedSinglyOccurring}> - 22 - (0:0,0)
  38625. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38626. - SyntaxKind.Transition;[@];
  38627. - MetaCode span - Gen<None> - [inherits] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38628. - SyntaxKind.Identifier;[inherits];
  38629. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (9:0,9) - Tokens:1
  38630. - SyntaxKind.Whitespace;[ ];
  38631. - Code span - Gen<DirectiveToken {TypeName;Type;Opt:False}> - [string[[]][]] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (10:0,10) - Tokens:7
  38632. - SyntaxKind.Keyword;[string];
  38633. - SyntaxKind.LeftBracket;[[];
  38634. - SyntaxKind.LeftBracket;[[];
  38635. - SyntaxKind.RightBracket;[]];
  38636. - SyntaxKind.RightBracket;[]];
  38637. - SyntaxKind.LeftBracket;[[];
  38638. - SyntaxKind.RightBracket;[]];
  38639. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:1
  38640. - SyntaxKind.Unknown;[];
  38641. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/InheritsDirectiveSupportsNestedGenerics.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/InheritsDirectiveSupportsNestedGenerics.stree.txt
  38642. deleted file mode 100644
  38643. index 9a883699eaf..00000000000
  38644. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/InheritsDirectiveSupportsNestedGenerics.stree.txt
  38645. +++ /dev/null
  38646. @@ -1,30 +0,0 @@
  38647. -Markup block - Gen<None> - 87 - (0:0,0)
  38648. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38649. - SyntaxKind.Unknown;[];
  38650. - Directive block - Gen<Directive:{inherits;SingleLine;FileScopedSinglyOccurring}> - 87 - (0:0,0)
  38651. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38652. - SyntaxKind.Transition;[@];
  38653. - MetaCode span - Gen<None> - [inherits] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38654. - SyntaxKind.Identifier;[inherits];
  38655. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (9:0,9) - Tokens:1
  38656. - SyntaxKind.Whitespace;[ ];
  38657. - Code span - Gen<DirectiveToken {TypeName;Type;Opt:False}> - [System.Web.Mvc.WebViewPage<IEnumerable<MvcApplication2.Models.RegisterModel>>] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (10:0,10) - Tokens:17
  38658. - SyntaxKind.Identifier;[System];
  38659. - SyntaxKind.Dot;[.];
  38660. - SyntaxKind.Identifier;[Web];
  38661. - SyntaxKind.Dot;[.];
  38662. - SyntaxKind.Identifier;[Mvc];
  38663. - SyntaxKind.Dot;[.];
  38664. - SyntaxKind.Identifier;[WebViewPage];
  38665. - SyntaxKind.LessThan;[<];
  38666. - SyntaxKind.Identifier;[IEnumerable];
  38667. - SyntaxKind.LessThan;[<];
  38668. - SyntaxKind.Identifier;[MvcApplication2];
  38669. - SyntaxKind.Dot;[.];
  38670. - SyntaxKind.Identifier;[Models];
  38671. - SyntaxKind.Dot;[.];
  38672. - SyntaxKind.Identifier;[RegisterModel];
  38673. - SyntaxKind.GreaterThan;[>];
  38674. - SyntaxKind.GreaterThan;[>];
  38675. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (87:0,87) - Tokens:1
  38676. - SyntaxKind.Unknown;[];
  38677. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/InheritsDirectiveSupportsTypeKeywords.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/InheritsDirectiveSupportsTypeKeywords.stree.txt
  38678. deleted file mode 100644
  38679. index 5a7bc55b5c9..00000000000
  38680. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/InheritsDirectiveSupportsTypeKeywords.stree.txt
  38681. +++ /dev/null
  38682. @@ -1,14 +0,0 @@
  38683. -Markup block - Gen<None> - 16 - (0:0,0)
  38684. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38685. - SyntaxKind.Unknown;[];
  38686. - Directive block - Gen<Directive:{inherits;SingleLine;FileScopedSinglyOccurring}> - 16 - (0:0,0)
  38687. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38688. - SyntaxKind.Transition;[@];
  38689. - MetaCode span - Gen<None> - [inherits] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38690. - SyntaxKind.Identifier;[inherits];
  38691. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (9:0,9) - Tokens:1
  38692. - SyntaxKind.Whitespace;[ ];
  38693. - Code span - Gen<DirectiveToken {TypeName;Type;Opt:False}> - [string] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (10:0,10) - Tokens:1
  38694. - SyntaxKind.Keyword;[string];
  38695. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  38696. - SyntaxKind.Unknown;[];
  38697. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalDirectiveTokens_AreSkipped.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalDirectiveTokens_AreSkipped.stree.txt
  38698. deleted file mode 100644
  38699. index 937267a1158..00000000000
  38700. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalDirectiveTokens_AreSkipped.stree.txt
  38701. +++ /dev/null
  38702. @@ -1,12 +0,0 @@
  38703. -Markup block - Gen<None> - 8 - (0:0,0)
  38704. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38705. - SyntaxKind.Unknown;[];
  38706. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted}> - 8 - (0:0,0)
  38707. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38708. - SyntaxKind.Transition;[@];
  38709. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38710. - SyntaxKind.Identifier;[custom];
  38711. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  38712. - SyntaxKind.Whitespace;[ ];
  38713. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:1
  38714. - SyntaxKind.Unknown;[];
  38715. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalDirectiveTokens_WithBraces_AreParsed.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalDirectiveTokens_WithBraces_AreParsed.stree.txt
  38716. deleted file mode 100644
  38717. index a08f88a74b8..00000000000
  38718. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalDirectiveTokens_WithBraces_AreParsed.stree.txt
  38719. +++ /dev/null
  38720. @@ -1,14 +0,0 @@
  38721. -Markup block - Gen<None> - 29 - (0:0,0)
  38722. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38723. - SyntaxKind.Unknown;[];
  38724. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted}> - 29 - (0:0,0)
  38725. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38726. - SyntaxKind.Transition;[@];
  38727. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38728. - SyntaxKind.Identifier;[custom];
  38729. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  38730. - SyntaxKind.Whitespace;[ ];
  38731. - Code span - Gen<DirectiveToken {;String;Opt:True}> - ["{formaction}?/{id}?"] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (8:0,8) - Tokens:1
  38732. - SyntaxKind.StringLiteral;["{formaction}?/{id}?"];
  38733. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (29:0,29) - Tokens:1
  38734. - SyntaxKind.Unknown;[];
  38735. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalDirectiveTokens_WithMultipleOptionalTokens_AreParsed.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalDirectiveTokens_WithMultipleOptionalTokens_AreParsed.stree.txt
  38736. deleted file mode 100644
  38737. index 7cb6d46f42c..00000000000
  38738. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalDirectiveTokens_WithMultipleOptionalTokens_AreParsed.stree.txt
  38739. +++ /dev/null
  38740. @@ -1,20 +0,0 @@
  38741. -Markup block - Gen<None> - 43 - (0:0,0)
  38742. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38743. - SyntaxKind.Unknown;[];
  38744. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted}> - 43 - (0:0,0)
  38745. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38746. - SyntaxKind.Transition;[@];
  38747. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38748. - SyntaxKind.Identifier;[custom];
  38749. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  38750. - SyntaxKind.Whitespace;[ ];
  38751. - Code span - Gen<DirectiveToken {;String;Opt:True}> - ["{formaction}?/{id}?"] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (8:0,8) - Tokens:1
  38752. - SyntaxKind.StringLiteral;["{formaction}?/{id}?"];
  38753. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (29:0,29) - Tokens:1
  38754. - SyntaxKind.Whitespace;[ ];
  38755. - Code span - Gen<DirectiveToken {;Type;Opt:True}> - [System.String] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (30:0,30) - Tokens:3
  38756. - SyntaxKind.Identifier;[System];
  38757. - SyntaxKind.Dot;[.];
  38758. - SyntaxKind.Identifier;[String];
  38759. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (43:0,43) - Tokens:1
  38760. - SyntaxKind.Unknown;[];
  38761. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalDirectiveTokens_WithSimpleTokens_AreParsed.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalDirectiveTokens_WithSimpleTokens_AreParsed.stree.txt
  38762. deleted file mode 100644
  38763. index 2709d6336d3..00000000000
  38764. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalDirectiveTokens_WithSimpleTokens_AreParsed.stree.txt
  38765. +++ /dev/null
  38766. @@ -1,14 +0,0 @@
  38767. -Markup block - Gen<None> - 22 - (0:0,0)
  38768. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38769. - SyntaxKind.Unknown;[];
  38770. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted}> - 22 - (0:0,0)
  38771. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38772. - SyntaxKind.Transition;[@];
  38773. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38774. - SyntaxKind.Identifier;[custom];
  38775. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  38776. - SyntaxKind.Whitespace;[ ];
  38777. - Code span - Gen<DirectiveToken {;String;Opt:True}> - ["simple-value"] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (8:0,8) - Tokens:1
  38778. - SyntaxKind.StringLiteral;["simple-value"];
  38779. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:1
  38780. - SyntaxKind.Unknown;[];
  38781. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalMemberTokens_WithMemberSpecified_IsParsed.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalMemberTokens_WithMemberSpecified_IsParsed.stree.txt
  38782. deleted file mode 100644
  38783. index f9f4020e32b..00000000000
  38784. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalMemberTokens_WithMemberSpecified_IsParsed.stree.txt
  38785. +++ /dev/null
  38786. @@ -1,14 +0,0 @@
  38787. -Markup block - Gen<None> - 27 - (0:0,0)
  38788. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38789. - SyntaxKind.Unknown;[];
  38790. - Directive block - Gen<Directive:{TestDirective;SingleLine;Unrestricted}> - 27 - (0:0,0)
  38791. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38792. - SyntaxKind.Transition;[@];
  38793. - MetaCode span - Gen<None> - [TestDirective] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38794. - SyntaxKind.Identifier;[TestDirective];
  38795. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (14:0,14) - Tokens:1
  38796. - SyntaxKind.Whitespace;[ ];
  38797. - Code span - Gen<DirectiveToken {;Member;Opt:True}> - [PropertyName] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (15:0,15) - Tokens:1
  38798. - SyntaxKind.Identifier;[PropertyName];
  38799. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (27:0,27) - Tokens:1
  38800. - SyntaxKind.Unknown;[];
  38801. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalMemberTokens_WithMissingMember_IsParsed.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalMemberTokens_WithMissingMember_IsParsed.stree.txt
  38802. deleted file mode 100644
  38803. index e7a4614bd4d..00000000000
  38804. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalMemberTokens_WithMissingMember_IsParsed.stree.txt
  38805. +++ /dev/null
  38806. @@ -1,14 +0,0 @@
  38807. -Markup block - Gen<None> - 15 - (0:0,0)
  38808. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38809. - SyntaxKind.Unknown;[];
  38810. - Directive block - Gen<Directive:{TestDirective;SingleLine;Unrestricted}> - 15 - (0:0,0)
  38811. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38812. - SyntaxKind.Transition;[@];
  38813. - MetaCode span - Gen<None> - [TestDirective] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38814. - SyntaxKind.Identifier;[TestDirective];
  38815. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (14:0,14) - Tokens:1
  38816. - SyntaxKind.Whitespace;[ ];
  38817. - Code span - Gen<DirectiveToken {;Member;Opt:True}> - [] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (15:0,15) - Tokens:1
  38818. - SyntaxKind.Unknown;[];
  38819. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:1
  38820. - SyntaxKind.Unknown;[];
  38821. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Parse_FunctionsDirective.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Parse_FunctionsDirective.stree.txt
  38822. deleted file mode 100644
  38823. index d6b8dce2988..00000000000
  38824. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Parse_FunctionsDirective.stree.txt
  38825. +++ /dev/null
  38826. @@ -1,28 +0,0 @@
  38827. -Markup block - Gen<None> - 28 - (0:0,0)
  38828. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38829. - SyntaxKind.Unknown;[];
  38830. - Directive block - Gen<Directive:{functions;CodeBlock;Unrestricted}> - 28 - (0:0,0)
  38831. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38832. - SyntaxKind.Transition;[@];
  38833. - MetaCode span - Gen<None> - [functions] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38834. - SyntaxKind.Identifier;[functions];
  38835. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (10:0,10) - Tokens:1
  38836. - SyntaxKind.Whitespace;[ ];
  38837. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd - (11:0,11) - Tokens:1
  38838. - SyntaxKind.LeftBrace;[{];
  38839. - Code span - Gen<Stmt> - [ foo(); bar(); ] - CodeBlockEditHandler;Accepts:Any;CodeBlock - (12:0,12) - Tokens:11
  38840. - SyntaxKind.Whitespace;[ ];
  38841. - SyntaxKind.Identifier;[foo];
  38842. - SyntaxKind.LeftParenthesis;[(];
  38843. - SyntaxKind.RightParenthesis;[)];
  38844. - SyntaxKind.Semicolon;[;];
  38845. - SyntaxKind.Whitespace;[ ];
  38846. - SyntaxKind.Identifier;[bar];
  38847. - SyntaxKind.LeftParenthesis;[(];
  38848. - SyntaxKind.RightParenthesis;[)];
  38849. - SyntaxKind.Semicolon;[;];
  38850. - SyntaxKind.Whitespace;[ ];
  38851. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (27:0,27) - Tokens:1
  38852. - SyntaxKind.RightBrace;[}];
  38853. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (28:0,28) - Tokens:1
  38854. - SyntaxKind.Unknown;[];
  38855. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Parse_SectionDirective.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Parse_SectionDirective.stree.txt
  38856. deleted file mode 100644
  38857. index 3a6b35cf229..00000000000
  38858. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Parse_SectionDirective.stree.txt
  38859. +++ /dev/null
  38860. @@ -1,43 +0,0 @@
  38861. -Markup block - Gen<None> - 32 - (0:0,0)
  38862. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38863. - SyntaxKind.Unknown;[];
  38864. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted}> - 32 - (0:0,0)
  38865. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38866. - SyntaxKind.Transition;[@];
  38867. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38868. - SyntaxKind.Identifier;[section];
  38869. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  38870. - SyntaxKind.Whitespace;[ ];
  38871. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [Header] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  38872. - SyntaxKind.Identifier;[Header];
  38873. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (15:0,15) - Tokens:1
  38874. - SyntaxKind.Whitespace;[ ];
  38875. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd - (16:0,16) - Tokens:1
  38876. - SyntaxKind.LeftBrace;[{];
  38877. - Markup block - Gen<None> - 14 - (17:0,17)
  38878. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:1
  38879. - SyntaxKind.Whitespace;[ ];
  38880. - Tag block - Gen<None> - 3 - (18:0,18)
  38881. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:3
  38882. - SyntaxKind.OpenAngle;[<];
  38883. - SyntaxKind.Text;[p];
  38884. - SyntaxKind.CloseAngle;[>];
  38885. - SyntaxKind.HtmlTextLiteral - [F{o}o] - [21..26) - FullWidth: 5 - Slots: 1
  38886. - SyntaxKind.List - [F{o}o] - [21..26) - FullWidth: 5 - Slots: 5
  38887. - SyntaxKind.Text;[F];
  38888. - SyntaxKind.Text;[{];
  38889. - SyntaxKind.Text;[o];
  38890. - SyntaxKind.Text;[}];
  38891. - SyntaxKind.Text;[o];
  38892. - Tag block - Gen<None> - 4 - (26:0,26)
  38893. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (26:0,26) - Tokens:4
  38894. - SyntaxKind.OpenAngle;[<];
  38895. - SyntaxKind.ForwardSlash;[/];
  38896. - SyntaxKind.Text;[p];
  38897. - SyntaxKind.CloseAngle;[>];
  38898. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (30:0,30) - Tokens:1
  38899. - SyntaxKind.Whitespace;[ ];
  38900. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (31:0,31) - Tokens:1
  38901. - SyntaxKind.RightBrace;[}];
  38902. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (32:0,32) - Tokens:1
  38903. - SyntaxKind.Unknown;[];
  38904. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Parser_ParsesNamespaceDirectiveToken_WithMultipleSegments.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Parser_ParsesNamespaceDirectiveToken_WithMultipleSegments.stree.txt
  38905. deleted file mode 100644
  38906. index 0585c3609b8..00000000000
  38907. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Parser_ParsesNamespaceDirectiveToken_WithMultipleSegments.stree.txt
  38908. +++ /dev/null
  38909. @@ -1,18 +0,0 @@
  38910. -Markup block - Gen<None> - 29 - (0:0,0)
  38911. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38912. - SyntaxKind.Unknown;[];
  38913. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted}> - 29 - (0:0,0)
  38914. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38915. - SyntaxKind.Transition;[@];
  38916. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38917. - SyntaxKind.Identifier;[custom];
  38918. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  38919. - SyntaxKind.Whitespace;[ ];
  38920. - Code span - Gen<DirectiveToken {;Namespace;Opt:False}> - [BaseNamespace.Foo.Bar] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (8:0,8) - Tokens:5
  38921. - SyntaxKind.Identifier;[BaseNamespace];
  38922. - SyntaxKind.Dot;[.];
  38923. - SyntaxKind.Identifier;[Foo];
  38924. - SyntaxKind.Dot;[.];
  38925. - SyntaxKind.Identifier;[Bar];
  38926. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (29:0,29) - Tokens:1
  38927. - SyntaxKind.Unknown;[];
  38928. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Parser_ParsesNamespaceDirectiveToken_WithSingleSegment.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Parser_ParsesNamespaceDirectiveToken_WithSingleSegment.stree.txt
  38929. deleted file mode 100644
  38930. index 446919afdb6..00000000000
  38931. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Parser_ParsesNamespaceDirectiveToken_WithSingleSegment.stree.txt
  38932. +++ /dev/null
  38933. @@ -1,14 +0,0 @@
  38934. -Markup block - Gen<None> - 21 - (0:0,0)
  38935. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38936. - SyntaxKind.Unknown;[];
  38937. - Directive block - Gen<Directive:{custom;SingleLine;Unrestricted}> - 21 - (0:0,0)
  38938. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38939. - SyntaxKind.Transition;[@];
  38940. - MetaCode span - Gen<None> - [custom] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38941. - SyntaxKind.Identifier;[custom];
  38942. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  38943. - SyntaxKind.Whitespace;[ ];
  38944. - Code span - Gen<DirectiveToken {;Namespace;Opt:False}> - [BaseNamespace] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (8:0,8) - Tokens:1
  38945. - SyntaxKind.Identifier;[BaseNamespace];
  38946. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:1
  38947. - SyntaxKind.Unknown;[];
  38948. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_EndQuoteRequiresDoubleQuotesAroundValue.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_EndQuoteRequiresDoubleQuotesAroundValue.stree.txt
  38949. deleted file mode 100644
  38950. index 8391cb3f4c0..00000000000
  38951. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_EndQuoteRequiresDoubleQuotesAroundValue.stree.txt
  38952. +++ /dev/null
  38953. @@ -1,15 +0,0 @@
  38954. -Markup block - Gen<None> - 21 - (0:0,0)
  38955. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38956. - SyntaxKind.Unknown;[];
  38957. - Directive block - Gen<None> - 21 - (0:0,0)
  38958. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38959. - SyntaxKind.Transition;[@];
  38960. - MetaCode span - Gen<None> - [removeTagHelper] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38961. - SyntaxKind.Identifier;[removeTagHelper];
  38962. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  38963. - SyntaxKind.Whitespace;[ ];
  38964. - Code span - Gen<RemoveTagHelper:{Foo";Foo";;} [RZ1000(20:0,20 [1] ), RZ1019(17:0,17 [4] ), RZ1036(17:0,17 [4] )]> - [Foo"] - SpanEditHandler;Accepts:AnyExceptNewline - (17:0,17) - Tokens:2
  38965. - SyntaxKind.Identifier;[Foo];
  38966. - SyntaxKind.StringLiteral;["];RZ1000(20:0,20 [1] )
  38967. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:1
  38968. - SyntaxKind.Unknown;[];
  38969. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_InvalidLookupText_AddsError.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_InvalidLookupText_AddsError.stree.txt
  38970. deleted file mode 100644
  38971. index c30421dcdc2..00000000000
  38972. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_InvalidLookupText_AddsError.stree.txt
  38973. +++ /dev/null
  38974. @@ -1,14 +0,0 @@
  38975. -Markup block - Gen<None> - 20 - (0:0,0)
  38976. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38977. - SyntaxKind.Unknown;[];
  38978. - Directive block - Gen<None> - 20 - (0:0,0)
  38979. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  38980. - SyntaxKind.Transition;[@];
  38981. - MetaCode span - Gen<None> - [removeTagHelper] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  38982. - SyntaxKind.Identifier;[removeTagHelper];
  38983. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  38984. - SyntaxKind.Whitespace;[ ];
  38985. - Code span - Gen<RemoveTagHelper:{Foo;Foo;;} [RZ1036(17:0,17 [3] )]> - [Foo] - SpanEditHandler;Accepts:AnyExceptNewline - (17:0,17) - Tokens:1
  38986. - SyntaxKind.Identifier;[Foo];
  38987. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:1
  38988. - SyntaxKind.Unknown;[];
  38989. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_NoValue_Invalid.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_NoValue_Invalid.stree.txt
  38990. deleted file mode 100644
  38991. index 4d2ecdf2a95..00000000000
  38992. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_NoValue_Invalid.stree.txt
  38993. +++ /dev/null
  38994. @@ -1,14 +0,0 @@
  38995. -Markup block - Gen<None> - 19 - (0:0,0)
  38996. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  38997. - SyntaxKind.Unknown;[];
  38998. - Directive block - Gen<None> - 19 - (0:0,0)
  38999. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  39000. - SyntaxKind.Transition;[@];
  39001. - MetaCode span - Gen<None> - [removeTagHelper] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  39002. - SyntaxKind.Identifier;[removeTagHelper];
  39003. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  39004. - SyntaxKind.Whitespace;[ ];
  39005. - Code span - Gen<RemoveTagHelper:{"";;;} [RZ1036(18:0,18 [1] )]> - [""] - SpanEditHandler;Accepts:AnyExceptNewline - (17:0,17) - Tokens:1
  39006. - SyntaxKind.StringLiteral;[""];
  39007. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:1
  39008. - SyntaxKind.Unknown;[];
  39009. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_RequiresValue.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_RequiresValue.stree.txt
  39010. deleted file mode 100644
  39011. index b0b7c8cd36c..00000000000
  39012. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_RequiresValue.stree.txt
  39013. +++ /dev/null
  39014. @@ -1,14 +0,0 @@
  39015. -Markup block - Gen<None> - 17 - (0:0,0)
  39016. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  39017. - SyntaxKind.Unknown;[];
  39018. - Directive block - Gen<None> - 17 - (0:0,0)
  39019. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  39020. - SyntaxKind.Transition;[@];
  39021. - MetaCode span - Gen<None> - [removeTagHelper] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  39022. - SyntaxKind.Identifier;[removeTagHelper];
  39023. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  39024. - SyntaxKind.Whitespace;[ ];
  39025. - Code span - Gen<RemoveTagHelper:{;;;} [RZ1018(1:0,1 [15] ), RZ1036(17:0,17 [1] )]> - [] - SpanEditHandler;Accepts:AnyExceptNewline - (17:0,17) - Tokens:1
  39026. - SyntaxKind.Unknown;[];
  39027. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:1
  39028. - SyntaxKind.Unknown;[];
  39029. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_SingleQuotes_AddsError.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_SingleQuotes_AddsError.stree.txt
  39030. deleted file mode 100644
  39031. index edc2c98e60f..00000000000
  39032. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_SingleQuotes_AddsError.stree.txt
  39033. +++ /dev/null
  39034. @@ -1,14 +0,0 @@
  39035. -Markup block - Gen<None> - 25 - (0:0,0)
  39036. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  39037. - SyntaxKind.Unknown;[];
  39038. - Directive block - Gen<None> - 25 - (0:0,0)
  39039. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  39040. - SyntaxKind.Transition;[@];
  39041. - MetaCode span - Gen<None> - [removeTagHelper] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  39042. - SyntaxKind.Identifier;[removeTagHelper];
  39043. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  39044. - SyntaxKind.Whitespace;[ ];
  39045. - Code span - Gen<RemoveTagHelper:{'*, Foo';'*, Foo';;} [RZ1036(17:0,17 [8] )]> - ['*, Foo'] - SpanEditHandler;Accepts:AnyExceptNewline - (17:0,17) - Tokens:1
  39046. - SyntaxKind.CharacterLiteral;['*, Foo'];
  39047. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:1
  39048. - SyntaxKind.Unknown;[];
  39049. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_StartQuoteRequiresDoubleQuotesAroundValue.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_StartQuoteRequiresDoubleQuotesAroundValue.stree.txt
  39050. deleted file mode 100644
  39051. index 870c348af2c..00000000000
  39052. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_StartQuoteRequiresDoubleQuotesAroundValue.stree.txt
  39053. +++ /dev/null
  39054. @@ -1,14 +0,0 @@
  39055. -Markup block - Gen<None> - 21 - (0:0,0)
  39056. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  39057. - SyntaxKind.Unknown;[];
  39058. - Directive block - Gen<None> - 21 - (0:0,0)
  39059. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  39060. - SyntaxKind.Transition;[@];
  39061. - MetaCode span - Gen<None> - [removeTagHelper] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  39062. - SyntaxKind.Identifier;[removeTagHelper];
  39063. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  39064. - SyntaxKind.Whitespace;[ ];
  39065. - Code span - Gen<RemoveTagHelper:{"Foo;"Foo;;} [RZ1000(17:0,17 [1] ), RZ1019(17:0,17 [4] ), RZ1036(17:0,17 [4] )]> - ["Foo] - SpanEditHandler;Accepts:AnyExceptNewline - (17:0,17) - Tokens:1
  39066. - SyntaxKind.StringLiteral;["Foo];RZ1000(17:0,17 [1] )
  39067. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:1
  39068. - SyntaxKind.Unknown;[];
  39069. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_SupportsSpaces.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_SupportsSpaces.stree.txt
  39070. deleted file mode 100644
  39071. index fe72198ba62..00000000000
  39072. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_SupportsSpaces.stree.txt
  39073. +++ /dev/null
  39074. @@ -1,18 +0,0 @@
  39075. -Markup block - Gen<None> - 35 - (0:0,0)
  39076. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  39077. - SyntaxKind.Unknown;[];
  39078. - Directive block - Gen<None> - 35 - (0:0,0)
  39079. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  39080. - SyntaxKind.Transition;[@];
  39081. - MetaCode span - Gen<None> - [removeTagHelper] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  39082. - SyntaxKind.Identifier;[removeTagHelper];
  39083. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  39084. - SyntaxKind.Whitespace;[ ];
  39085. - Code span - Gen<RemoveTagHelper:{Foo, Bar;Foo, Bar;Foo;Bar}> - [Foo, Bar ] - SpanEditHandler;Accepts:AnyExceptNewline - (21:0,21) - Tokens:5
  39086. - SyntaxKind.Identifier;[Foo];
  39087. - SyntaxKind.Comma;[,];
  39088. - SyntaxKind.Whitespace;[ ];
  39089. - SyntaxKind.Identifier;[Bar];
  39090. - SyntaxKind.Whitespace;[ ];
  39091. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (35:0,35) - Tokens:1
  39092. - SyntaxKind.Unknown;[];
  39093. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_WithQuotes_InvalidLookupText_AddsError.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_WithQuotes_InvalidLookupText_AddsError.stree.txt
  39094. deleted file mode 100644
  39095. index 1f0666df2fb..00000000000
  39096. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_WithQuotes_InvalidLookupText_AddsError.stree.txt
  39097. +++ /dev/null
  39098. @@ -1,14 +0,0 @@
  39099. -Markup block - Gen<None> - 22 - (0:0,0)
  39100. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  39101. - SyntaxKind.Unknown;[];
  39102. - Directive block - Gen<None> - 22 - (0:0,0)
  39103. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  39104. - SyntaxKind.Transition;[@];
  39105. - MetaCode span - Gen<None> - [removeTagHelper] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  39106. - SyntaxKind.Identifier;[removeTagHelper];
  39107. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  39108. - SyntaxKind.Whitespace;[ ];
  39109. - Code span - Gen<RemoveTagHelper:{"Foo";Foo;;} [RZ1036(18:0,18 [3] )]> - ["Foo"] - SpanEditHandler;Accepts:AnyExceptNewline - (17:0,17) - Tokens:1
  39110. - SyntaxKind.StringLiteral;["Foo"];
  39111. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:1
  39112. - SyntaxKind.Unknown;[];
  39113. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_EndQuoteRequiresDoubleQuotesAroundValue.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_EndQuoteRequiresDoubleQuotesAroundValue.stree.txt
  39114. deleted file mode 100644
  39115. index 2dbb3eb569e..00000000000
  39116. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_EndQuoteRequiresDoubleQuotesAroundValue.stree.txt
  39117. +++ /dev/null
  39118. @@ -1,16 +0,0 @@
  39119. -Markup block - Gen<None> - 24 - (0:0,0)
  39120. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  39121. - SyntaxKind.Unknown;[];
  39122. - Directive block - Gen<None> - 24 - (0:0,0)
  39123. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  39124. - SyntaxKind.Transition;[@];
  39125. - MetaCode span - Gen<None> - [tagHelperPrefix] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  39126. - SyntaxKind.Identifier;[tagHelperPrefix];
  39127. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  39128. - SyntaxKind.Whitespace;[ ];
  39129. - Code span - Gen<TagHelperPrefix:{Foo ";Foo "} [RZ1000(23:0,23 [1] ), RZ1019(17:0,17 [7] ), RZ1020(17:0,17 [7] )]> - [Foo "] - SpanEditHandler;Accepts:AnyExceptNewline - (17:0,17) - Tokens:3
  39130. - SyntaxKind.Identifier;[Foo];
  39131. - SyntaxKind.Whitespace;[ ];
  39132. - SyntaxKind.StringLiteral;["];RZ1000(23:0,23 [1] )
  39133. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (24:0,24) - Tokens:1
  39134. - SyntaxKind.Unknown;[];
  39135. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_NoValueSucceeds.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_NoValueSucceeds.stree.txt
  39136. deleted file mode 100644
  39137. index d7a2dd3c676..00000000000
  39138. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_NoValueSucceeds.stree.txt
  39139. +++ /dev/null
  39140. @@ -1,14 +0,0 @@
  39141. -Markup block - Gen<None> - 19 - (0:0,0)
  39142. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  39143. - SyntaxKind.Unknown;[];
  39144. - Directive block - Gen<None> - 19 - (0:0,0)
  39145. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  39146. - SyntaxKind.Transition;[@];
  39147. - MetaCode span - Gen<None> - [tagHelperPrefix] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  39148. - SyntaxKind.Identifier;[tagHelperPrefix];
  39149. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  39150. - SyntaxKind.Whitespace;[ ];
  39151. - Code span - Gen<TagHelperPrefix:{"";}> - [""] - SpanEditHandler;Accepts:AnyExceptNewline - (17:0,17) - Tokens:1
  39152. - SyntaxKind.StringLiteral;[""];
  39153. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:1
  39154. - SyntaxKind.Unknown;[];
  39155. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_RequiresValue.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_RequiresValue.stree.txt
  39156. deleted file mode 100644
  39157. index b47f0135fb1..00000000000
  39158. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_RequiresValue.stree.txt
  39159. +++ /dev/null
  39160. @@ -1,14 +0,0 @@
  39161. -Markup block - Gen<None> - 17 - (0:0,0)
  39162. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  39163. - SyntaxKind.Unknown;[];
  39164. - Directive block - Gen<None> - 17 - (0:0,0)
  39165. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  39166. - SyntaxKind.Transition;[@];
  39167. - MetaCode span - Gen<None> - [tagHelperPrefix] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  39168. - SyntaxKind.Identifier;[tagHelperPrefix];
  39169. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  39170. - SyntaxKind.Whitespace;[ ];
  39171. - Code span - Gen<TagHelperPrefix:{;} [RZ1018(1:0,1 [15] )]> - [] - SpanEditHandler;Accepts:AnyExceptNewline - (17:0,17) - Tokens:1
  39172. - SyntaxKind.Unknown;[];
  39173. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:1
  39174. - SyntaxKind.Unknown;[];
  39175. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_StartQuoteRequiresDoubleQuotesAroundValue.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_StartQuoteRequiresDoubleQuotesAroundValue.stree.txt
  39176. deleted file mode 100644
  39177. index ad7e95ee8ae..00000000000
  39178. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_StartQuoteRequiresDoubleQuotesAroundValue.stree.txt
  39179. +++ /dev/null
  39180. @@ -1,14 +0,0 @@
  39181. -Markup block - Gen<None> - 21 - (0:0,0)
  39182. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  39183. - SyntaxKind.Unknown;[];
  39184. - Directive block - Gen<None> - 21 - (0:0,0)
  39185. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  39186. - SyntaxKind.Transition;[@];
  39187. - MetaCode span - Gen<None> - [tagHelperPrefix] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  39188. - SyntaxKind.Identifier;[tagHelperPrefix];
  39189. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  39190. - SyntaxKind.Whitespace;[ ];
  39191. - Code span - Gen<TagHelperPrefix:{"Foo;"Foo} [RZ1000(17:0,17 [1] ), RZ1019(17:0,17 [4] ), RZ1020(17:0,17 [4] )]> - ["Foo] - SpanEditHandler;Accepts:AnyExceptNewline - (17:0,17) - Tokens:1
  39192. - SyntaxKind.StringLiteral;["Foo];RZ1000(17:0,17 [1] )
  39193. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:1
  39194. - SyntaxKind.Unknown;[];
  39195. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_Succeeds.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_Succeeds.stree.txt
  39196. deleted file mode 100644
  39197. index 8f4da6020cb..00000000000
  39198. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_Succeeds.stree.txt
  39199. +++ /dev/null
  39200. @@ -1,14 +0,0 @@
  39201. -Markup block - Gen<None> - 20 - (0:0,0)
  39202. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  39203. - SyntaxKind.Unknown;[];
  39204. - Directive block - Gen<None> - 20 - (0:0,0)
  39205. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  39206. - SyntaxKind.Transition;[@];
  39207. - MetaCode span - Gen<None> - [tagHelperPrefix] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  39208. - SyntaxKind.Identifier;[tagHelperPrefix];
  39209. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  39210. - SyntaxKind.Whitespace;[ ];
  39211. - Code span - Gen<TagHelperPrefix:{Foo;Foo}> - [Foo] - SpanEditHandler;Accepts:AnyExceptNewline - (17:0,17) - Tokens:1
  39212. - SyntaxKind.Identifier;[Foo];
  39213. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:1
  39214. - SyntaxKind.Unknown;[];
  39215. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_WithQuotes_Succeeds.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_WithQuotes_Succeeds.stree.txt
  39216. deleted file mode 100644
  39217. index 997e4fb9593..00000000000
  39218. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_WithQuotes_Succeeds.stree.txt
  39219. +++ /dev/null
  39220. @@ -1,14 +0,0 @@
  39221. -Markup block - Gen<None> - 22 - (0:0,0)
  39222. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  39223. - SyntaxKind.Unknown;[];
  39224. - Directive block - Gen<None> - 22 - (0:0,0)
  39225. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  39226. - SyntaxKind.Transition;[@];
  39227. - MetaCode span - Gen<None> - [tagHelperPrefix] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  39228. - SyntaxKind.Identifier;[tagHelperPrefix];
  39229. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  39230. - SyntaxKind.Whitespace;[ ];
  39231. - Code span - Gen<TagHelperPrefix:{"Foo";Foo}> - ["Foo"] - SpanEditHandler;Accepts:AnyExceptNewline - (17:0,17) - Tokens:1
  39232. - SyntaxKind.StringLiteral;["Foo"];
  39233. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:1
  39234. - SyntaxKind.Unknown;[];
  39235. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/CapturesWhitespaceToEOLInInvalidUsingStmtAndTreatsAsFileCode.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/CapturesWhitespaceToEOLInInvalidUsingStmtAndTreatsAsFileCode.stree.txt
  39236. index c7cdd8cb0fb..b18a8a91e51 100644
  39237. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/CapturesWhitespaceToEOLInInvalidUsingStmtAndTreatsAsFileCode.stree.txt
  39238. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/CapturesWhitespaceToEOLInInvalidUsingStmtAndTreatsAsFileCode.stree.txt
  39239. @@ -1,5 +1,5 @@
  39240. -Statement block - Gen<None> - 17 - (0:0,0)
  39241. - Code span - Gen<Stmt> - [using LF] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  39242. - SyntaxKind.Keyword;[using];
  39243. - SyntaxKind.Whitespace;[ ];
  39244. - SyntaxKind.NewLine;[LF];
  39245. +CSharpCodeBlock - [0..17)::17 - [using LF]
  39246. + CSharpStatementLiteral - [0..17)::17 - [using LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  39247. + Keyword;[using];
  39248. + Whitespace;[ ];
  39249. + NewLine;[LF];
  39250. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/CorrectlyHandlesInCorrectTransitionsIfImplicitExpressionParensUnclosed.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/CorrectlyHandlesInCorrectTransitionsIfImplicitExpressionParensUnclosed.stree.txt
  39251. index 5285577e787..468237491a2 100644
  39252. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/CorrectlyHandlesInCorrectTransitionsIfImplicitExpressionParensUnclosed.stree.txt
  39253. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/CorrectlyHandlesInCorrectTransitionsIfImplicitExpressionParensUnclosed.stree.txt
  39254. @@ -1,5 +1,10 @@
  39255. -Expression block - Gen<Expr> - 7 - (0:0,0)
  39256. - Code span - Gen<Expr> - [Href(LF] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (0:0,0) - Tokens:3
  39257. - SyntaxKind.Identifier;[Href];
  39258. - SyntaxKind.LeftParenthesis;[(];
  39259. - SyntaxKind.NewLine;[LF];
  39260. +CSharpCodeBlock - [0..7)::7 - [Href(LF]
  39261. + CSharpImplicitExpression - [0..7)::7
  39262. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  39263. + Transition;[<Missing>];
  39264. + CSharpImplicitExpressionBody - [0..7)::7
  39265. + CSharpCodeBlock - [0..7)::7
  39266. + CSharpExpressionLiteral - [0..7)::7 - [Href(LF] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14
  39267. + Identifier;[Href];
  39268. + LeftParenthesis;[(];
  39269. + NewLine;[LF];
  39270. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/CorrectlyParsesAtSignInDelimitedBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/CorrectlyParsesAtSignInDelimitedBlock.stree.txt
  39271. index 6ef5983ab56..2bcf3d8ecc9 100644
  39272. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/CorrectlyParsesAtSignInDelimitedBlock.stree.txt
  39273. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/CorrectlyParsesAtSignInDelimitedBlock.stree.txt
  39274. @@ -1,17 +1,22 @@
  39275. -Expression block - Gen<Expr> - 46 - (0:0,0)
  39276. - MetaCode span - Gen<None> - [(] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  39277. - SyntaxKind.LeftParenthesis;[(];
  39278. - Code span - Gen<Expr> - [Request["description"] ?? @photo.Description] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:11
  39279. - SyntaxKind.Identifier;[Request];
  39280. - SyntaxKind.LeftBracket;[[];
  39281. - SyntaxKind.StringLiteral;["description"];
  39282. - SyntaxKind.RightBracket;[]];
  39283. - SyntaxKind.Whitespace;[ ];
  39284. - SyntaxKind.NullCoalesce;[??];
  39285. - SyntaxKind.Whitespace;[ ];
  39286. - SyntaxKind.Transition;[@];
  39287. - SyntaxKind.Identifier;[photo];
  39288. - SyntaxKind.Dot;[.];
  39289. - SyntaxKind.Identifier;[Description];
  39290. - MetaCode span - Gen<None> - [)] - SpanEditHandler;Accepts:None - (45:0,45) - Tokens:1
  39291. - SyntaxKind.RightParenthesis;[)];
  39292. +CSharpCodeBlock - [0..46)::46 - [(Request["description"] ?? @photo.Description)]
  39293. + CSharpExplicitExpression - [0..46)::46
  39294. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  39295. + Transition;[<Missing>];
  39296. + CSharpExplicitExpressionBody - [0..46)::46
  39297. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  39298. + LeftParenthesis;[(];
  39299. + CSharpCodeBlock - [1..45)::44
  39300. + CSharpExpressionLiteral - [1..45)::44 - [Request["description"] ?? @photo.Description] - Gen<Expr> - SpanEditHandler;Accepts:Any
  39301. + Identifier;[Request];
  39302. + LeftBracket;[[];
  39303. + StringLiteral;["description"];
  39304. + RightBracket;[]];
  39305. + Whitespace;[ ];
  39306. + NullCoalesce;[??];
  39307. + Whitespace;[ ];
  39308. + Transition;[@];
  39309. + Identifier;[photo];
  39310. + Dot;[.];
  39311. + Identifier;[Description];
  39312. + RazorMetaCode - [45..46)::1 - Gen<None> - SpanEditHandler;Accepts:None
  39313. + RightParenthesis;[)];
  39314. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/CorrectlyParsesMarkupIncorrectyAssumedToBeWithinAStatement.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/CorrectlyParsesMarkupIncorrectyAssumedToBeWithinAStatement.stree.txt
  39315. index b55b387eff1..d7ce8533bac 100644
  39316. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/CorrectlyParsesMarkupIncorrectyAssumedToBeWithinAStatement.stree.txt
  39317. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/CorrectlyParsesMarkupIncorrectyAssumedToBeWithinAStatement.stree.txt
  39318. @@ -1,45 +1,50 @@
  39319. -Statement block - Gen<None> - 64 - (0:0,0)
  39320. - Code span - Gen<Stmt> - [if(foo) {LF var foo = "foo bar bazLF ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:17
  39321. - SyntaxKind.Keyword;[if];
  39322. - SyntaxKind.LeftParenthesis;[(];
  39323. - SyntaxKind.Identifier;[foo];
  39324. - SyntaxKind.RightParenthesis;[)];
  39325. - SyntaxKind.Whitespace;[ ];
  39326. - SyntaxKind.LeftBrace;[{];
  39327. - SyntaxKind.NewLine;[LF];
  39328. - SyntaxKind.Whitespace;[ ];
  39329. - SyntaxKind.Identifier;[var];
  39330. - SyntaxKind.Whitespace;[ ];
  39331. - SyntaxKind.Identifier;[foo];
  39332. - SyntaxKind.Whitespace;[ ];
  39333. - SyntaxKind.Assign;[=];
  39334. - SyntaxKind.Whitespace;[ ];
  39335. - SyntaxKind.StringLiteral;["foo bar baz];RZ1000(25:1,14 [1] )
  39336. - SyntaxKind.NewLine;[LF];
  39337. - SyntaxKind.Whitespace;[ ];
  39338. - Markup block - Gen<None> - 20 - (43:2,4)
  39339. - Tag block - Gen<None> - 3 - (43:2,4)
  39340. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (43:2,4) - Tokens:3
  39341. - SyntaxKind.OpenAngle;[<];
  39342. - SyntaxKind.Text;[p];
  39343. - SyntaxKind.CloseAngle;[>];
  39344. - Markup span - Gen<Markup> - [Foo is ] - SpanEditHandler;Accepts:Any - (46:2,7) - Tokens:4
  39345. - SyntaxKind.Text;[Foo];
  39346. - SyntaxKind.Whitespace;[ ];
  39347. - SyntaxKind.Text;[is];
  39348. - SyntaxKind.Whitespace;[ ];
  39349. - Expression block - Gen<Expr> - 4 - (53:2,14)
  39350. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (53:2,14) - Tokens:1
  39351. - SyntaxKind.Transition;[@];
  39352. - Code span - Gen<Expr> - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (54:2,15) - Tokens:1
  39353. - SyntaxKind.Identifier;[foo];
  39354. - Tag block - Gen<None> - 4 - (57:2,18)
  39355. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (57:2,18) - Tokens:4
  39356. - SyntaxKind.OpenAngle;[<];
  39357. - SyntaxKind.ForwardSlash;[/];
  39358. - SyntaxKind.Text;[p];
  39359. - SyntaxKind.CloseAngle;[>];
  39360. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (61:2,22) - Tokens:1
  39361. - SyntaxKind.NewLine;[LF];
  39362. - Code span - Gen<Stmt> - [}] - SpanEditHandler;Accepts:Any - (63:3,0) - Tokens:1
  39363. - SyntaxKind.RightBrace;[}];
  39364. +CSharpCodeBlock - [0..64)::64 - [if(foo) {LF var foo = "foo bar bazLF <p>Foo is @foo</p>LF}]
  39365. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  39366. + Transition;[<Missing>];
  39367. + CSharpStatementLiteral - [0..43)::43 - [if(foo) {LF var foo = "foo bar bazLF ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  39368. + Keyword;[if];
  39369. + LeftParenthesis;[(];
  39370. + Identifier;[foo];
  39371. + RightParenthesis;[)];
  39372. + Whitespace;[ ];
  39373. + LeftBrace;[{];
  39374. + NewLine;[LF];
  39375. + Whitespace;[ ];
  39376. + Identifier;[var];
  39377. + Whitespace;[ ];
  39378. + Identifier;[foo];
  39379. + Whitespace;[ ];
  39380. + Assign;[=];
  39381. + Whitespace;[ ];
  39382. + StringLiteral;["foo bar baz];RZ1000(25:1,14 [1] )
  39383. + NewLine;[LF];
  39384. + Whitespace;[ ];
  39385. + MarkupBlock - [43..63)::20
  39386. + MarkupTagBlock - [43..46)::3 - [<p>]
  39387. + MarkupTextLiteral - [43..46)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  39388. + OpenAngle;[<];
  39389. + Text;[p];
  39390. + CloseAngle;[>];
  39391. + MarkupTextLiteral - [46..53)::7 - [Foo is ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  39392. + Text;[Foo];
  39393. + Whitespace;[ ];
  39394. + Text;[is];
  39395. + Whitespace;[ ];
  39396. + CSharpCodeBlock - [53..57)::4
  39397. + CSharpImplicitExpression - [53..57)::4
  39398. + CSharpTransition - [53..54)::1 - Gen<None> - SpanEditHandler;Accepts:None
  39399. + Transition;[@];
  39400. + CSharpImplicitExpressionBody - [54..57)::3
  39401. + CSharpCodeBlock - [54..57)::3
  39402. + CSharpExpressionLiteral - [54..57)::3 - [foo] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  39403. + Identifier;[foo];
  39404. + MarkupTagBlock - [57..61)::4 - [</p>]
  39405. + MarkupTextLiteral - [57..61)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  39406. + OpenAngle;[<];
  39407. + ForwardSlash;[/];
  39408. + Text;[p];
  39409. + CloseAngle;[>];
  39410. + MarkupTextLiteral - [61..63)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  39411. + NewLine;[LF];
  39412. + CSharpStatementLiteral - [63..64)::1 - [}] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  39413. + RightBrace;[}];
  39414. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/CorrectlyRecoversFromMissingCloseParenInExpressionWithinCode.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/CorrectlyRecoversFromMissingCloseParenInExpressionWithinCode.stree.txt
  39415. index 0bf1908997a..5c1e798cb7a 100644
  39416. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/CorrectlyRecoversFromMissingCloseParenInExpressionWithinCode.stree.txt
  39417. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/CorrectlyRecoversFromMissingCloseParenInExpressionWithinCode.stree.txt
  39418. @@ -1,24 +1,29 @@
  39419. -Statement block - Gen<None> - 29 - (0:0,0)
  39420. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  39421. - SyntaxKind.LeftBrace;[{];
  39422. - Code span - Gen<Stmt> - [string.Format(] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:4
  39423. - SyntaxKind.Keyword;[string];
  39424. - SyntaxKind.Dot;[.];
  39425. - SyntaxKind.Identifier;[Format];
  39426. - SyntaxKind.LeftParenthesis;[(];
  39427. - Markup block - Gen<None> - 13 - (15:0,15)
  39428. - Tag block - Gen<None> - 6 - (15:0,15)
  39429. - Markup span - Gen<Markup> - [<html>] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:3
  39430. - SyntaxKind.OpenAngle;[<];
  39431. - SyntaxKind.Text;[html];
  39432. - SyntaxKind.CloseAngle;[>];
  39433. - Tag block - Gen<None> - 7 - (21:0,21)
  39434. - Markup span - Gen<Markup> - [</html>] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:4
  39435. - SyntaxKind.OpenAngle;[<];
  39436. - SyntaxKind.ForwardSlash;[/];
  39437. - SyntaxKind.Text;[html];
  39438. - SyntaxKind.CloseAngle;[>];
  39439. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (28:0,28) - Tokens:1
  39440. - SyntaxKind.Unknown;[];
  39441. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (28:0,28) - Tokens:1
  39442. - SyntaxKind.RightBrace;[}];
  39443. +CSharpCodeBlock - [0..29)::29 - [{string.Format(<html></html>}]
  39444. + CSharpStatement - [0..29)::29
  39445. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  39446. + Transition;[<Missing>];
  39447. + CSharpStatementBody - [0..29)::29
  39448. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  39449. + LeftBrace;[{];
  39450. + CSharpCodeBlock - [1..28)::27
  39451. + CSharpStatementLiteral - [1..15)::14 - [string.Format(] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  39452. + Keyword;[string];
  39453. + Dot;[.];
  39454. + Identifier;[Format];
  39455. + LeftParenthesis;[(];
  39456. + MarkupBlock - [15..28)::13
  39457. + MarkupTagBlock - [15..21)::6 - [<html>]
  39458. + MarkupTextLiteral - [15..21)::6 - [<html>] - Gen<Markup> - SpanEditHandler;Accepts:None
  39459. + OpenAngle;[<];
  39460. + Text;[html];
  39461. + CloseAngle;[>];
  39462. + MarkupTagBlock - [21..28)::7 - [</html>]
  39463. + MarkupTextLiteral - [21..28)::7 - [</html>] - Gen<Markup> - SpanEditHandler;Accepts:None
  39464. + OpenAngle;[<];
  39465. + ForwardSlash;[/];
  39466. + Text;[html];
  39467. + CloseAngle;[>];
  39468. + CSharpStatementLiteral - [28..28)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  39469. + Marker;[];
  39470. + RazorMetaCode - [28..29)::1 - Gen<None> - SpanEditHandler;Accepts:None
  39471. + RightBrace;[}];
  39472. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/HandlesQuotesAfterTransition.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/HandlesQuotesAfterTransition.stree.txt
  39473. index 40da231bf0f..ba1a0451b32 100644
  39474. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/HandlesQuotesAfterTransition.stree.txt
  39475. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/HandlesQuotesAfterTransition.stree.txt
  39476. @@ -1,5 +1,8 @@
  39477. -Expression block - Gen<Expr> - 1 - (0:0,0)
  39478. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  39479. - SyntaxKind.Transition;[@];
  39480. - Code span - Gen<Expr> - [] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:1
  39481. - SyntaxKind.Unknown;[];
  39482. +CSharpCodeBlock - [0..1)::1 - [@]
  39483. + CSharpImplicitExpression - [0..1)::1
  39484. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  39485. + Transition;[@];
  39486. + CSharpImplicitExpressionBody - [1..1)::0
  39487. + CSharpCodeBlock - [1..1)::0
  39488. + CSharpExpressionLiteral - [1..1)::0 - [] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  39489. + Marker;[];
  39490. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/IncludesUnexpectedCharacterInSingleStatementControlFlowStatementError.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/IncludesUnexpectedCharacterInSingleStatementControlFlowStatementError.stree.txt
  39491. index 1442776795a..e8e84a746a2 100644
  39492. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/IncludesUnexpectedCharacterInSingleStatementControlFlowStatementError.stree.txt
  39493. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/IncludesUnexpectedCharacterInSingleStatementControlFlowStatementError.stree.txt
  39494. @@ -1,20 +1,22 @@
  39495. -Statement block - Gen<None> - 27 - (0:0,0)
  39496. - Code span - Gen<Stmt> - [if(foo)) { var bar = foo; }] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:18
  39497. - SyntaxKind.Keyword;[if];
  39498. - SyntaxKind.LeftParenthesis;[(];
  39499. - SyntaxKind.Identifier;[foo];
  39500. - SyntaxKind.RightParenthesis;[)];
  39501. - SyntaxKind.RightParenthesis;[)];
  39502. - SyntaxKind.Whitespace;[ ];
  39503. - SyntaxKind.LeftBrace;[{];
  39504. - SyntaxKind.Whitespace;[ ];
  39505. - SyntaxKind.Identifier;[var];
  39506. - SyntaxKind.Whitespace;[ ];
  39507. - SyntaxKind.Identifier;[bar];
  39508. - SyntaxKind.Whitespace;[ ];
  39509. - SyntaxKind.Assign;[=];
  39510. - SyntaxKind.Whitespace;[ ];
  39511. - SyntaxKind.Identifier;[foo];
  39512. - SyntaxKind.Semicolon;[;];
  39513. - SyntaxKind.Whitespace;[ ];
  39514. - SyntaxKind.RightBrace;[}];
  39515. +CSharpCodeBlock - [0..27)::27 - [if(foo)) { var bar = foo; }]
  39516. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  39517. + Transition;[<Missing>];
  39518. + CSharpStatementLiteral - [0..27)::27 - [if(foo)) { var bar = foo; }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  39519. + Keyword;[if];
  39520. + LeftParenthesis;[(];
  39521. + Identifier;[foo];
  39522. + RightParenthesis;[)];
  39523. + RightParenthesis;[)];
  39524. + Whitespace;[ ];
  39525. + LeftBrace;[{];
  39526. + Whitespace;[ ];
  39527. + Identifier;[var];
  39528. + Whitespace;[ ];
  39529. + Identifier;[bar];
  39530. + Whitespace;[ ];
  39531. + Assign;[=];
  39532. + Whitespace;[ ];
  39533. + Identifier;[foo];
  39534. + Semicolon;[;];
  39535. + Whitespace;[ ];
  39536. + RightBrace;[}];
  39537. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/MethodOutputsOpenCurlyAsCodeSpanIfEofFoundAfterOpenCurlyBrace.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/MethodOutputsOpenCurlyAsCodeSpanIfEofFoundAfterOpenCurlyBrace.stree.txt
  39538. index 491e2835069..783274bd753 100644
  39539. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/MethodOutputsOpenCurlyAsCodeSpanIfEofFoundAfterOpenCurlyBrace.stree.txt
  39540. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/MethodOutputsOpenCurlyAsCodeSpanIfEofFoundAfterOpenCurlyBrace.stree.txt
  39541. @@ -1,5 +1,12 @@
  39542. -Statement block - Gen<None> - 1 - (0:0,0)
  39543. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  39544. - SyntaxKind.LeftBrace;[{];
  39545. - Code span - Gen<Stmt> - [] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[}];AtEOL - (1:0,1) - Tokens:1
  39546. - SyntaxKind.Unknown;[];
  39547. +CSharpCodeBlock - [0..1)::1 - [{]
  39548. + CSharpStatement - [0..1)::1
  39549. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  39550. + Transition;[<Missing>];
  39551. + CSharpStatementBody - [0..1)::1
  39552. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  39553. + LeftBrace;[{];
  39554. + CSharpCodeBlock - [1..1)::0
  39555. + CSharpStatementLiteral - [1..1)::0 - [] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[}];AtEOL
  39556. + Marker;[];
  39557. + RazorMetaCode - [1..1)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  39558. + RightBrace;[<Missing>];
  39559. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/MethodOutputsZeroLengthCodeSpanIfStatementBlockEmpty.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/MethodOutputsZeroLengthCodeSpanIfStatementBlockEmpty.stree.txt
  39560. index 2128b174485..6e07f6a2020 100644
  39561. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/MethodOutputsZeroLengthCodeSpanIfStatementBlockEmpty.stree.txt
  39562. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/MethodOutputsZeroLengthCodeSpanIfStatementBlockEmpty.stree.txt
  39563. @@ -1,7 +1,12 @@
  39564. -Statement block - Gen<None> - 2 - (0:0,0)
  39565. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  39566. - SyntaxKind.LeftBrace;[{];
  39567. - Code span - Gen<Stmt> - [] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:1
  39568. - SyntaxKind.Unknown;[];
  39569. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  39570. - SyntaxKind.RightBrace;[}];
  39571. +CSharpCodeBlock - [0..2)::2 - [{}]
  39572. + CSharpStatement - [0..2)::2
  39573. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  39574. + Transition;[<Missing>];
  39575. + CSharpStatementBody - [0..2)::2
  39576. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  39577. + LeftBrace;[{];
  39578. + CSharpCodeBlock - [1..1)::0
  39579. + CSharpStatementLiteral - [1..1)::0 - [] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  39580. + Marker;[];
  39581. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  39582. + RightBrace;[}];
  39583. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/MethodParsesNothingIfFirstCharacterIsNotIdentifierStartOrParenOrBrace.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/MethodParsesNothingIfFirstCharacterIsNotIdentifierStartOrParenOrBrace.stree.txt
  39584. index 40da231bf0f..ba1a0451b32 100644
  39585. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/MethodParsesNothingIfFirstCharacterIsNotIdentifierStartOrParenOrBrace.stree.txt
  39586. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/MethodParsesNothingIfFirstCharacterIsNotIdentifierStartOrParenOrBrace.stree.txt
  39587. @@ -1,5 +1,8 @@
  39588. -Expression block - Gen<Expr> - 1 - (0:0,0)
  39589. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  39590. - SyntaxKind.Transition;[@];
  39591. - Code span - Gen<Expr> - [] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:1
  39592. - SyntaxKind.Unknown;[];
  39593. +CSharpCodeBlock - [0..1)::1 - [@]
  39594. + CSharpImplicitExpression - [0..1)::1
  39595. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  39596. + Transition;[@];
  39597. + CSharpImplicitExpressionBody - [1..1)::0
  39598. + CSharpCodeBlock - [1..1)::0
  39599. + CSharpExpressionLiteral - [1..1)::0 - [] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  39600. + Marker;[];
  39601. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/MethodProducesErrorIfEOFAfterTransitionInEmbeddedExpression.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/MethodProducesErrorIfEOFAfterTransitionInEmbeddedExpression.stree.txt
  39602. index c80317bc2f3..484ae4e1467 100644
  39603. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/MethodProducesErrorIfEOFAfterTransitionInEmbeddedExpression.stree.txt
  39604. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/MethodProducesErrorIfEOFAfterTransitionInEmbeddedExpression.stree.txt
  39605. @@ -1,13 +1,23 @@
  39606. -Statement block - Gen<None> - 8 - (0:0,0)
  39607. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  39608. - SyntaxKind.LeftBrace;[{];
  39609. - Code span - Gen<Stmt> - [LF ] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[}];AtEOL - (1:0,1) - Tokens:2
  39610. - SyntaxKind.NewLine;[LF];
  39611. - SyntaxKind.Whitespace;[ ];
  39612. - Expression block - Gen<Expr> - 1 - (7:1,4)
  39613. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (7:1,4) - Tokens:1
  39614. - SyntaxKind.Transition;[@];
  39615. - Code span - Gen<Expr> - [] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K14 - (8:1,5) - Tokens:1
  39616. - SyntaxKind.Unknown;[];
  39617. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (8:1,5) - Tokens:1
  39618. - SyntaxKind.Unknown;[];
  39619. +CSharpCodeBlock - [0..8)::8 - [{LF @]
  39620. + CSharpStatement - [0..8)::8
  39621. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  39622. + Transition;[<Missing>];
  39623. + CSharpStatementBody - [0..8)::8
  39624. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  39625. + LeftBrace;[{];
  39626. + CSharpCodeBlock - [1..8)::7
  39627. + CSharpStatementLiteral - [1..7)::6 - [LF ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[}];AtEOL
  39628. + NewLine;[LF];
  39629. + Whitespace;[ ];
  39630. + CSharpCodeBlock - [7..8)::1
  39631. + CSharpImplicitExpression - [7..8)::1
  39632. + CSharpTransition - [7..8)::1 - Gen<None> - SpanEditHandler;Accepts:None
  39633. + Transition;[@];
  39634. + CSharpImplicitExpressionBody - [8..8)::0
  39635. + CSharpCodeBlock - [8..8)::0
  39636. + CSharpExpressionLiteral - [8..8)::0 - [] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K14
  39637. + Marker;[];
  39638. + CSharpStatementLiteral - [8..8)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  39639. + Marker;[];
  39640. + RazorMetaCode - [8..8)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  39641. + RightBrace;[<Missing>];
  39642. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/MethodProducesErrorIfNewlineFollowsTransition.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/MethodProducesErrorIfNewlineFollowsTransition.stree.txt
  39643. index 40da231bf0f..ba1a0451b32 100644
  39644. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/MethodProducesErrorIfNewlineFollowsTransition.stree.txt
  39645. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/MethodProducesErrorIfNewlineFollowsTransition.stree.txt
  39646. @@ -1,5 +1,8 @@
  39647. -Expression block - Gen<Expr> - 1 - (0:0,0)
  39648. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  39649. - SyntaxKind.Transition;[@];
  39650. - Code span - Gen<Expr> - [] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:1
  39651. - SyntaxKind.Unknown;[];
  39652. +CSharpCodeBlock - [0..1)::1 - [@]
  39653. + CSharpImplicitExpression - [0..1)::1
  39654. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  39655. + Transition;[@];
  39656. + CSharpImplicitExpressionBody - [1..1)::0
  39657. + CSharpCodeBlock - [1..1)::0
  39658. + CSharpExpressionLiteral - [1..1)::0 - [] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  39659. + Marker;[];
  39660. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/MethodProducesErrorIfWhitespaceBetweenTransitionAndBlockStartInEmbeddedExpr.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/MethodProducesErrorIfWhitespaceBetweenTransitionAndBlockStartInEmbeddedExpr.stree.txt
  39661. index 3b85ef0e921..202bea6f3df 100644
  39662. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/MethodProducesErrorIfWhitespaceBetweenTransitionAndBlockStartInEmbeddedExpr.stree.txt
  39663. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/MethodProducesErrorIfWhitespaceBetweenTransitionAndBlockStartInEmbeddedExpr.stree.txt
  39664. @@ -1,18 +1,26 @@
  39665. -Statement block - Gen<None> - 16 - (0:0,0)
  39666. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  39667. - SyntaxKind.LeftBrace;[{];
  39668. - Code span - Gen<Stmt> - [LF ] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:2
  39669. - SyntaxKind.NewLine;[LF];
  39670. - SyntaxKind.Whitespace;[ ];
  39671. - Expression block - Gen<Expr> - 1 - (7:1,4)
  39672. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (7:1,4) - Tokens:1
  39673. - SyntaxKind.Transition;[@];
  39674. - Code span - Gen<Expr> - [] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K14 - (8:1,5) - Tokens:1
  39675. - SyntaxKind.Unknown;[];
  39676. - Code span - Gen<Stmt> - [ {}LF] - SpanEditHandler;Accepts:Any - (8:1,5) - Tokens:4
  39677. - SyntaxKind.Whitespace;[ ];
  39678. - SyntaxKind.LeftBrace;[{];
  39679. - SyntaxKind.RightBrace;[}];
  39680. - SyntaxKind.NewLine;[LF];
  39681. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (15:2,0) - Tokens:1
  39682. - SyntaxKind.RightBrace;[}];
  39683. +CSharpCodeBlock - [0..16)::16 - [{LF @ {}LF}]
  39684. + CSharpStatement - [0..16)::16
  39685. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  39686. + Transition;[<Missing>];
  39687. + CSharpStatementBody - [0..16)::16
  39688. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  39689. + LeftBrace;[{];
  39690. + CSharpCodeBlock - [1..15)::14
  39691. + CSharpStatementLiteral - [1..7)::6 - [LF ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  39692. + NewLine;[LF];
  39693. + Whitespace;[ ];
  39694. + CSharpCodeBlock - [7..8)::1
  39695. + CSharpImplicitExpression - [7..8)::1
  39696. + CSharpTransition - [7..8)::1 - Gen<None> - SpanEditHandler;Accepts:None
  39697. + Transition;[@];
  39698. + CSharpImplicitExpressionBody - [8..8)::0
  39699. + CSharpCodeBlock - [8..8)::0
  39700. + CSharpExpressionLiteral - [8..8)::0 - [] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K14
  39701. + Marker;[];
  39702. + CSharpStatementLiteral - [8..15)::7 - [ {}LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  39703. + Whitespace;[ ];
  39704. + LeftBrace;[{];
  39705. + RightBrace;[}];
  39706. + NewLine;[LF];
  39707. + RazorMetaCode - [15..16)::1 - Gen<None> - SpanEditHandler;Accepts:None
  39708. + RightBrace;[}];
  39709. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/OutputsErrorIfAtSignFollowedByLessThanSignAtStatementStart.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/OutputsErrorIfAtSignFollowedByLessThanSignAtStatementStart.stree.txt
  39710. index 87158d029b6..f7c288d0ed5 100644
  39711. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/OutputsErrorIfAtSignFollowedByLessThanSignAtStatementStart.stree.txt
  39712. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/OutputsErrorIfAtSignFollowedByLessThanSignAtStatementStart.stree.txt
  39713. @@ -1,30 +1,32 @@
  39714. -Statement block - Gen<None> - 23 - (0:0,0)
  39715. - Code span - Gen<Stmt> - [if(foo) {] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:6
  39716. - SyntaxKind.Keyword;[if];
  39717. - SyntaxKind.LeftParenthesis;[(];
  39718. - SyntaxKind.Identifier;[foo];
  39719. - SyntaxKind.RightParenthesis;[)];
  39720. - SyntaxKind.Whitespace;[ ];
  39721. - SyntaxKind.LeftBrace;[{];
  39722. - Markup block - Gen<None> - 13 - (9:0,9)
  39723. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:1
  39724. - SyntaxKind.Whitespace;[ ];
  39725. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  39726. - SyntaxKind.Transition;[@];
  39727. - Tag block - Gen<None> - 3 - (11:0,11)
  39728. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (11:0,11) - Tokens:3
  39729. - SyntaxKind.OpenAngle;[<];
  39730. - SyntaxKind.Text;[p];
  39731. - SyntaxKind.CloseAngle;[>];
  39732. - Markup span - Gen<Markup> - [Bar] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  39733. - SyntaxKind.Text;[Bar];
  39734. - Tag block - Gen<None> - 4 - (17:0,17)
  39735. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (17:0,17) - Tokens:4
  39736. - SyntaxKind.OpenAngle;[<];
  39737. - SyntaxKind.ForwardSlash;[/];
  39738. - SyntaxKind.Text;[p];
  39739. - SyntaxKind.CloseAngle;[>];
  39740. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:1
  39741. - SyntaxKind.Whitespace;[ ];
  39742. - Code span - Gen<Stmt> - [}] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:1
  39743. - SyntaxKind.RightBrace;[}];
  39744. +CSharpCodeBlock - [0..23)::23 - [if(foo) { @<p>Bar</p> }]
  39745. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  39746. + Transition;[<Missing>];
  39747. + CSharpStatementLiteral - [0..9)::9 - [if(foo) {] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  39748. + Keyword;[if];
  39749. + LeftParenthesis;[(];
  39750. + Identifier;[foo];
  39751. + RightParenthesis;[)];
  39752. + Whitespace;[ ];
  39753. + LeftBrace;[{];
  39754. + MarkupBlock - [9..22)::13
  39755. + MarkupTextLiteral - [9..10)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  39756. + Whitespace;[ ];
  39757. + MarkupTransition - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  39758. + Transition;[@];
  39759. + MarkupTagBlock - [11..14)::3 - [<p>]
  39760. + MarkupTextLiteral - [11..14)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  39761. + OpenAngle;[<];
  39762. + Text;[p];
  39763. + CloseAngle;[>];
  39764. + MarkupTextLiteral - [14..17)::3 - [Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  39765. + Text;[Bar];
  39766. + MarkupTagBlock - [17..21)::4 - [</p>]
  39767. + MarkupTextLiteral - [17..21)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  39768. + OpenAngle;[<];
  39769. + ForwardSlash;[/];
  39770. + Text;[p];
  39771. + CloseAngle;[>];
  39772. + MarkupTextLiteral - [21..22)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  39773. + Whitespace;[ ];
  39774. + CSharpStatementLiteral - [22..23)::1 - [}] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  39775. + RightBrace;[}];
  39776. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfCatchBlockUnterminatedAtEOF.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfCatchBlockUnterminatedAtEOF.stree.txt
  39777. index 7a8d568054c..6346eaedf3a 100644
  39778. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfCatchBlockUnterminatedAtEOF.stree.txt
  39779. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfCatchBlockUnterminatedAtEOF.stree.txt
  39780. @@ -1,47 +1,49 @@
  39781. -Statement block - Gen<None> - 70 - (0:0,0)
  39782. - Code span - Gen<Stmt> - [try { baz(); } catch(Foo) { var foo = bar; if(foo != null) { bar(); } ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:45
  39783. - SyntaxKind.Keyword;[try];
  39784. - SyntaxKind.Whitespace;[ ];
  39785. - SyntaxKind.LeftBrace;[{];
  39786. - SyntaxKind.Whitespace;[ ];
  39787. - SyntaxKind.Identifier;[baz];
  39788. - SyntaxKind.LeftParenthesis;[(];
  39789. - SyntaxKind.RightParenthesis;[)];
  39790. - SyntaxKind.Semicolon;[;];
  39791. - SyntaxKind.Whitespace;[ ];
  39792. - SyntaxKind.RightBrace;[}];
  39793. - SyntaxKind.Whitespace;[ ];
  39794. - SyntaxKind.Keyword;[catch];
  39795. - SyntaxKind.LeftParenthesis;[(];
  39796. - SyntaxKind.Identifier;[Foo];
  39797. - SyntaxKind.RightParenthesis;[)];
  39798. - SyntaxKind.Whitespace;[ ];
  39799. - SyntaxKind.LeftBrace;[{];
  39800. - SyntaxKind.Whitespace;[ ];
  39801. - SyntaxKind.Identifier;[var];
  39802. - SyntaxKind.Whitespace;[ ];
  39803. - SyntaxKind.Identifier;[foo];
  39804. - SyntaxKind.Whitespace;[ ];
  39805. - SyntaxKind.Assign;[=];
  39806. - SyntaxKind.Whitespace;[ ];
  39807. - SyntaxKind.Identifier;[bar];
  39808. - SyntaxKind.Semicolon;[;];
  39809. - SyntaxKind.Whitespace;[ ];
  39810. - SyntaxKind.Keyword;[if];
  39811. - SyntaxKind.LeftParenthesis;[(];
  39812. - SyntaxKind.Identifier;[foo];
  39813. - SyntaxKind.Whitespace;[ ];
  39814. - SyntaxKind.NotEqual;[!=];
  39815. - SyntaxKind.Whitespace;[ ];
  39816. - SyntaxKind.Keyword;[null];
  39817. - SyntaxKind.RightParenthesis;[)];
  39818. - SyntaxKind.Whitespace;[ ];
  39819. - SyntaxKind.LeftBrace;[{];
  39820. - SyntaxKind.Whitespace;[ ];
  39821. - SyntaxKind.Identifier;[bar];
  39822. - SyntaxKind.LeftParenthesis;[(];
  39823. - SyntaxKind.RightParenthesis;[)];
  39824. - SyntaxKind.Semicolon;[;];
  39825. - SyntaxKind.Whitespace;[ ];
  39826. - SyntaxKind.RightBrace;[}];
  39827. - SyntaxKind.Whitespace;[ ];
  39828. +CSharpCodeBlock - [0..70)::70 - [try { baz(); } catch(Foo) { var foo = bar; if(foo != null) { bar(); } ]
  39829. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  39830. + Transition;[<Missing>];
  39831. + CSharpStatementLiteral - [0..70)::70 - [try { baz(); } catch(Foo) { var foo = bar; if(foo != null) { bar(); } ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  39832. + Keyword;[try];
  39833. + Whitespace;[ ];
  39834. + LeftBrace;[{];
  39835. + Whitespace;[ ];
  39836. + Identifier;[baz];
  39837. + LeftParenthesis;[(];
  39838. + RightParenthesis;[)];
  39839. + Semicolon;[;];
  39840. + Whitespace;[ ];
  39841. + RightBrace;[}];
  39842. + Whitespace;[ ];
  39843. + Keyword;[catch];
  39844. + LeftParenthesis;[(];
  39845. + Identifier;[Foo];
  39846. + RightParenthesis;[)];
  39847. + Whitespace;[ ];
  39848. + LeftBrace;[{];
  39849. + Whitespace;[ ];
  39850. + Identifier;[var];
  39851. + Whitespace;[ ];
  39852. + Identifier;[foo];
  39853. + Whitespace;[ ];
  39854. + Assign;[=];
  39855. + Whitespace;[ ];
  39856. + Identifier;[bar];
  39857. + Semicolon;[;];
  39858. + Whitespace;[ ];
  39859. + Keyword;[if];
  39860. + LeftParenthesis;[(];
  39861. + Identifier;[foo];
  39862. + Whitespace;[ ];
  39863. + NotEqual;[!=];
  39864. + Whitespace;[ ];
  39865. + Keyword;[null];
  39866. + RightParenthesis;[)];
  39867. + Whitespace;[ ];
  39868. + LeftBrace;[{];
  39869. + Whitespace;[ ];
  39870. + Identifier;[bar];
  39871. + LeftParenthesis;[(];
  39872. + RightParenthesis;[)];
  39873. + Semicolon;[;];
  39874. + Whitespace;[ ];
  39875. + RightBrace;[}];
  39876. + Whitespace;[ ];
  39877. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfClassBlockUnterminatedAtEOF.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfClassBlockUnterminatedAtEOF.stree.txt
  39878. index 9a606a91a5b..a8904978f6d 100644
  39879. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfClassBlockUnterminatedAtEOF.stree.txt
  39880. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfClassBlockUnterminatedAtEOF.stree.txt
  39881. @@ -1,36 +1,44 @@
  39882. -Directive block - Gen<Directive:{functions;CodeBlock;Unrestricted} [RZ1006(10:0,10 [1] )]> - 54 - (0:0,0)
  39883. - MetaCode span - Gen<None> - [functions] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  39884. - SyntaxKind.Identifier;[functions];
  39885. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (9:0,9) - Tokens:1
  39886. - SyntaxKind.Whitespace;[ ];
  39887. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd - (10:0,10) - Tokens:1
  39888. - SyntaxKind.LeftBrace;[{];
  39889. - Code span - Gen<Stmt> - [ var foo = bar; if(foo != null) { bar(); } ] - CodeBlockEditHandler;Accepts:Any;CodeBlock - (11:0,11) - Tokens:28
  39890. - SyntaxKind.Whitespace;[ ];
  39891. - SyntaxKind.Identifier;[var];
  39892. - SyntaxKind.Whitespace;[ ];
  39893. - SyntaxKind.Identifier;[foo];
  39894. - SyntaxKind.Whitespace;[ ];
  39895. - SyntaxKind.Assign;[=];
  39896. - SyntaxKind.Whitespace;[ ];
  39897. - SyntaxKind.Identifier;[bar];
  39898. - SyntaxKind.Semicolon;[;];
  39899. - SyntaxKind.Whitespace;[ ];
  39900. - SyntaxKind.Keyword;[if];
  39901. - SyntaxKind.LeftParenthesis;[(];
  39902. - SyntaxKind.Identifier;[foo];
  39903. - SyntaxKind.Whitespace;[ ];
  39904. - SyntaxKind.NotEqual;[!=];
  39905. - SyntaxKind.Whitespace;[ ];
  39906. - SyntaxKind.Keyword;[null];
  39907. - SyntaxKind.RightParenthesis;[)];
  39908. - SyntaxKind.Whitespace;[ ];
  39909. - SyntaxKind.LeftBrace;[{];
  39910. - SyntaxKind.Whitespace;[ ];
  39911. - SyntaxKind.Identifier;[bar];
  39912. - SyntaxKind.LeftParenthesis;[(];
  39913. - SyntaxKind.RightParenthesis;[)];
  39914. - SyntaxKind.Semicolon;[;];
  39915. - SyntaxKind.Whitespace;[ ];
  39916. - SyntaxKind.RightBrace;[}];
  39917. - SyntaxKind.Whitespace;[ ];
  39918. +CSharpCodeBlock - [0..54)::54 - [functions { var foo = bar; if(foo != null) { bar(); } ]
  39919. + RazorDirective - [0..54)::54 - Directive:{functions;CodeBlock;Unrestricted} [RZ1006(10:0,10 [1] )]
  39920. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  39921. + Transition;[<Missing>];
  39922. + RazorDirectiveBody - [0..54)::54
  39923. + RazorMetaCode - [0..9)::9 - Gen<None> - SpanEditHandler;Accepts:None
  39924. + Identifier;[functions];
  39925. + CSharpCodeBlock - [9..54)::45
  39926. + MarkupTextLiteral - [9..10)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  39927. + Whitespace;[ ];
  39928. + RazorMetaCode - [10..11)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd
  39929. + LeftBrace;[{];
  39930. + CSharpCodeBlock - [11..54)::43
  39931. + CSharpStatementLiteral - [11..54)::43 - [ var foo = bar; if(foo != null) { bar(); } ] - Gen<Stmt> - CodeBlockEditHandler;Accepts:Any;CodeBlock
  39932. + Whitespace;[ ];
  39933. + Identifier;[var];
  39934. + Whitespace;[ ];
  39935. + Identifier;[foo];
  39936. + Whitespace;[ ];
  39937. + Assign;[=];
  39938. + Whitespace;[ ];
  39939. + Identifier;[bar];
  39940. + Semicolon;[;];
  39941. + Whitespace;[ ];
  39942. + Keyword;[if];
  39943. + LeftParenthesis;[(];
  39944. + Identifier;[foo];
  39945. + Whitespace;[ ];
  39946. + NotEqual;[!=];
  39947. + Whitespace;[ ];
  39948. + Keyword;[null];
  39949. + RightParenthesis;[)];
  39950. + Whitespace;[ ];
  39951. + LeftBrace;[{];
  39952. + Whitespace;[ ];
  39953. + Identifier;[bar];
  39954. + LeftParenthesis;[(];
  39955. + RightParenthesis;[)];
  39956. + Semicolon;[;];
  39957. + Whitespace;[ ];
  39958. + RightBrace;[}];
  39959. + Whitespace;[ ];
  39960. + RazorMetaCode - [54..54)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  39961. + RightBrace;[<Missing>];
  39962. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfDoBlockUnterminatedAtEOF.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfDoBlockUnterminatedAtEOF.stree.txt
  39963. index dffd45efb62..d00fd01cb43 100644
  39964. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfDoBlockUnterminatedAtEOF.stree.txt
  39965. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfDoBlockUnterminatedAtEOF.stree.txt
  39966. @@ -1,33 +1,35 @@
  39967. -Statement block - Gen<None> - 47 - (0:0,0)
  39968. - Code span - Gen<Stmt> - [do { var foo = bar; if(foo != null) { bar(); } ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:31
  39969. - SyntaxKind.Keyword;[do];
  39970. - SyntaxKind.Whitespace;[ ];
  39971. - SyntaxKind.LeftBrace;[{];
  39972. - SyntaxKind.Whitespace;[ ];
  39973. - SyntaxKind.Identifier;[var];
  39974. - SyntaxKind.Whitespace;[ ];
  39975. - SyntaxKind.Identifier;[foo];
  39976. - SyntaxKind.Whitespace;[ ];
  39977. - SyntaxKind.Assign;[=];
  39978. - SyntaxKind.Whitespace;[ ];
  39979. - SyntaxKind.Identifier;[bar];
  39980. - SyntaxKind.Semicolon;[;];
  39981. - SyntaxKind.Whitespace;[ ];
  39982. - SyntaxKind.Keyword;[if];
  39983. - SyntaxKind.LeftParenthesis;[(];
  39984. - SyntaxKind.Identifier;[foo];
  39985. - SyntaxKind.Whitespace;[ ];
  39986. - SyntaxKind.NotEqual;[!=];
  39987. - SyntaxKind.Whitespace;[ ];
  39988. - SyntaxKind.Keyword;[null];
  39989. - SyntaxKind.RightParenthesis;[)];
  39990. - SyntaxKind.Whitespace;[ ];
  39991. - SyntaxKind.LeftBrace;[{];
  39992. - SyntaxKind.Whitespace;[ ];
  39993. - SyntaxKind.Identifier;[bar];
  39994. - SyntaxKind.LeftParenthesis;[(];
  39995. - SyntaxKind.RightParenthesis;[)];
  39996. - SyntaxKind.Semicolon;[;];
  39997. - SyntaxKind.Whitespace;[ ];
  39998. - SyntaxKind.RightBrace;[}];
  39999. - SyntaxKind.Whitespace;[ ];
  40000. +CSharpCodeBlock - [0..47)::47 - [do { var foo = bar; if(foo != null) { bar(); } ]
  40001. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  40002. + Transition;[<Missing>];
  40003. + CSharpStatementLiteral - [0..47)::47 - [do { var foo = bar; if(foo != null) { bar(); } ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  40004. + Keyword;[do];
  40005. + Whitespace;[ ];
  40006. + LeftBrace;[{];
  40007. + Whitespace;[ ];
  40008. + Identifier;[var];
  40009. + Whitespace;[ ];
  40010. + Identifier;[foo];
  40011. + Whitespace;[ ];
  40012. + Assign;[=];
  40013. + Whitespace;[ ];
  40014. + Identifier;[bar];
  40015. + Semicolon;[;];
  40016. + Whitespace;[ ];
  40017. + Keyword;[if];
  40018. + LeftParenthesis;[(];
  40019. + Identifier;[foo];
  40020. + Whitespace;[ ];
  40021. + NotEqual;[!=];
  40022. + Whitespace;[ ];
  40023. + Keyword;[null];
  40024. + RightParenthesis;[)];
  40025. + Whitespace;[ ];
  40026. + LeftBrace;[{];
  40027. + Whitespace;[ ];
  40028. + Identifier;[bar];
  40029. + LeftParenthesis;[(];
  40030. + RightParenthesis;[)];
  40031. + Semicolon;[;];
  40032. + Whitespace;[ ];
  40033. + RightBrace;[}];
  40034. + Whitespace;[ ];
  40035. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfElseBlockUnterminatedAtEOF.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfElseBlockUnterminatedAtEOF.stree.txt
  40036. index 1c52331a427..a83c042a6ec 100644
  40037. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfElseBlockUnterminatedAtEOF.stree.txt
  40038. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfElseBlockUnterminatedAtEOF.stree.txt
  40039. @@ -1,47 +1,49 @@
  40040. -Statement block - Gen<None> - 68 - (0:0,0)
  40041. - Code span - Gen<Stmt> - [if(foo) { baz(); } else { var foo = bar; if(foo != null) { bar(); } ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:45
  40042. - SyntaxKind.Keyword;[if];
  40043. - SyntaxKind.LeftParenthesis;[(];
  40044. - SyntaxKind.Identifier;[foo];
  40045. - SyntaxKind.RightParenthesis;[)];
  40046. - SyntaxKind.Whitespace;[ ];
  40047. - SyntaxKind.LeftBrace;[{];
  40048. - SyntaxKind.Whitespace;[ ];
  40049. - SyntaxKind.Identifier;[baz];
  40050. - SyntaxKind.LeftParenthesis;[(];
  40051. - SyntaxKind.RightParenthesis;[)];
  40052. - SyntaxKind.Semicolon;[;];
  40053. - SyntaxKind.Whitespace;[ ];
  40054. - SyntaxKind.RightBrace;[}];
  40055. - SyntaxKind.Whitespace;[ ];
  40056. - SyntaxKind.Keyword;[else];
  40057. - SyntaxKind.Whitespace;[ ];
  40058. - SyntaxKind.LeftBrace;[{];
  40059. - SyntaxKind.Whitespace;[ ];
  40060. - SyntaxKind.Identifier;[var];
  40061. - SyntaxKind.Whitespace;[ ];
  40062. - SyntaxKind.Identifier;[foo];
  40063. - SyntaxKind.Whitespace;[ ];
  40064. - SyntaxKind.Assign;[=];
  40065. - SyntaxKind.Whitespace;[ ];
  40066. - SyntaxKind.Identifier;[bar];
  40067. - SyntaxKind.Semicolon;[;];
  40068. - SyntaxKind.Whitespace;[ ];
  40069. - SyntaxKind.Keyword;[if];
  40070. - SyntaxKind.LeftParenthesis;[(];
  40071. - SyntaxKind.Identifier;[foo];
  40072. - SyntaxKind.Whitespace;[ ];
  40073. - SyntaxKind.NotEqual;[!=];
  40074. - SyntaxKind.Whitespace;[ ];
  40075. - SyntaxKind.Keyword;[null];
  40076. - SyntaxKind.RightParenthesis;[)];
  40077. - SyntaxKind.Whitespace;[ ];
  40078. - SyntaxKind.LeftBrace;[{];
  40079. - SyntaxKind.Whitespace;[ ];
  40080. - SyntaxKind.Identifier;[bar];
  40081. - SyntaxKind.LeftParenthesis;[(];
  40082. - SyntaxKind.RightParenthesis;[)];
  40083. - SyntaxKind.Semicolon;[;];
  40084. - SyntaxKind.Whitespace;[ ];
  40085. - SyntaxKind.RightBrace;[}];
  40086. - SyntaxKind.Whitespace;[ ];
  40087. +CSharpCodeBlock - [0..68)::68 - [if(foo) { baz(); } else { var foo = bar; if(foo != null) { bar(); } ]
  40088. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  40089. + Transition;[<Missing>];
  40090. + CSharpStatementLiteral - [0..68)::68 - [if(foo) { baz(); } else { var foo = bar; if(foo != null) { bar(); } ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  40091. + Keyword;[if];
  40092. + LeftParenthesis;[(];
  40093. + Identifier;[foo];
  40094. + RightParenthesis;[)];
  40095. + Whitespace;[ ];
  40096. + LeftBrace;[{];
  40097. + Whitespace;[ ];
  40098. + Identifier;[baz];
  40099. + LeftParenthesis;[(];
  40100. + RightParenthesis;[)];
  40101. + Semicolon;[;];
  40102. + Whitespace;[ ];
  40103. + RightBrace;[}];
  40104. + Whitespace;[ ];
  40105. + Keyword;[else];
  40106. + Whitespace;[ ];
  40107. + LeftBrace;[{];
  40108. + Whitespace;[ ];
  40109. + Identifier;[var];
  40110. + Whitespace;[ ];
  40111. + Identifier;[foo];
  40112. + Whitespace;[ ];
  40113. + Assign;[=];
  40114. + Whitespace;[ ];
  40115. + Identifier;[bar];
  40116. + Semicolon;[;];
  40117. + Whitespace;[ ];
  40118. + Keyword;[if];
  40119. + LeftParenthesis;[(];
  40120. + Identifier;[foo];
  40121. + Whitespace;[ ];
  40122. + NotEqual;[!=];
  40123. + Whitespace;[ ];
  40124. + Keyword;[null];
  40125. + RightParenthesis;[)];
  40126. + Whitespace;[ ];
  40127. + LeftBrace;[{];
  40128. + Whitespace;[ ];
  40129. + Identifier;[bar];
  40130. + LeftParenthesis;[(];
  40131. + RightParenthesis;[)];
  40132. + Semicolon;[;];
  40133. + Whitespace;[ ];
  40134. + RightBrace;[}];
  40135. + Whitespace;[ ];
  40136. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfElseIfBlockUnterminatedAtEOF.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfElseIfBlockUnterminatedAtEOF.stree.txt
  40137. index a37cd608477..b84d1626734 100644
  40138. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfElseIfBlockUnterminatedAtEOF.stree.txt
  40139. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfElseIfBlockUnterminatedAtEOF.stree.txt
  40140. @@ -1,49 +1,51 @@
  40141. -Statement block - Gen<None> - 71 - (0:0,0)
  40142. - Code span - Gen<Stmt> - [if(foo) { baz(); } else if { var foo = bar; if(foo != null) { bar(); } ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:47
  40143. - SyntaxKind.Keyword;[if];
  40144. - SyntaxKind.LeftParenthesis;[(];
  40145. - SyntaxKind.Identifier;[foo];
  40146. - SyntaxKind.RightParenthesis;[)];
  40147. - SyntaxKind.Whitespace;[ ];
  40148. - SyntaxKind.LeftBrace;[{];
  40149. - SyntaxKind.Whitespace;[ ];
  40150. - SyntaxKind.Identifier;[baz];
  40151. - SyntaxKind.LeftParenthesis;[(];
  40152. - SyntaxKind.RightParenthesis;[)];
  40153. - SyntaxKind.Semicolon;[;];
  40154. - SyntaxKind.Whitespace;[ ];
  40155. - SyntaxKind.RightBrace;[}];
  40156. - SyntaxKind.Whitespace;[ ];
  40157. - SyntaxKind.Keyword;[else];
  40158. - SyntaxKind.Whitespace;[ ];
  40159. - SyntaxKind.Keyword;[if];
  40160. - SyntaxKind.Whitespace;[ ];
  40161. - SyntaxKind.LeftBrace;[{];
  40162. - SyntaxKind.Whitespace;[ ];
  40163. - SyntaxKind.Identifier;[var];
  40164. - SyntaxKind.Whitespace;[ ];
  40165. - SyntaxKind.Identifier;[foo];
  40166. - SyntaxKind.Whitespace;[ ];
  40167. - SyntaxKind.Assign;[=];
  40168. - SyntaxKind.Whitespace;[ ];
  40169. - SyntaxKind.Identifier;[bar];
  40170. - SyntaxKind.Semicolon;[;];
  40171. - SyntaxKind.Whitespace;[ ];
  40172. - SyntaxKind.Keyword;[if];
  40173. - SyntaxKind.LeftParenthesis;[(];
  40174. - SyntaxKind.Identifier;[foo];
  40175. - SyntaxKind.Whitespace;[ ];
  40176. - SyntaxKind.NotEqual;[!=];
  40177. - SyntaxKind.Whitespace;[ ];
  40178. - SyntaxKind.Keyword;[null];
  40179. - SyntaxKind.RightParenthesis;[)];
  40180. - SyntaxKind.Whitespace;[ ];
  40181. - SyntaxKind.LeftBrace;[{];
  40182. - SyntaxKind.Whitespace;[ ];
  40183. - SyntaxKind.Identifier;[bar];
  40184. - SyntaxKind.LeftParenthesis;[(];
  40185. - SyntaxKind.RightParenthesis;[)];
  40186. - SyntaxKind.Semicolon;[;];
  40187. - SyntaxKind.Whitespace;[ ];
  40188. - SyntaxKind.RightBrace;[}];
  40189. - SyntaxKind.Whitespace;[ ];
  40190. +CSharpCodeBlock - [0..71)::71 - [if(foo) { baz(); } else if { var foo = bar; if(foo != null) { bar(); } ]
  40191. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  40192. + Transition;[<Missing>];
  40193. + CSharpStatementLiteral - [0..71)::71 - [if(foo) { baz(); } else if { var foo = bar; if(foo != null) { bar(); } ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  40194. + Keyword;[if];
  40195. + LeftParenthesis;[(];
  40196. + Identifier;[foo];
  40197. + RightParenthesis;[)];
  40198. + Whitespace;[ ];
  40199. + LeftBrace;[{];
  40200. + Whitespace;[ ];
  40201. + Identifier;[baz];
  40202. + LeftParenthesis;[(];
  40203. + RightParenthesis;[)];
  40204. + Semicolon;[;];
  40205. + Whitespace;[ ];
  40206. + RightBrace;[}];
  40207. + Whitespace;[ ];
  40208. + Keyword;[else];
  40209. + Whitespace;[ ];
  40210. + Keyword;[if];
  40211. + Whitespace;[ ];
  40212. + LeftBrace;[{];
  40213. + Whitespace;[ ];
  40214. + Identifier;[var];
  40215. + Whitespace;[ ];
  40216. + Identifier;[foo];
  40217. + Whitespace;[ ];
  40218. + Assign;[=];
  40219. + Whitespace;[ ];
  40220. + Identifier;[bar];
  40221. + Semicolon;[;];
  40222. + Whitespace;[ ];
  40223. + Keyword;[if];
  40224. + LeftParenthesis;[(];
  40225. + Identifier;[foo];
  40226. + Whitespace;[ ];
  40227. + NotEqual;[!=];
  40228. + Whitespace;[ ];
  40229. + Keyword;[null];
  40230. + RightParenthesis;[)];
  40231. + Whitespace;[ ];
  40232. + LeftBrace;[{];
  40233. + Whitespace;[ ];
  40234. + Identifier;[bar];
  40235. + LeftParenthesis;[(];
  40236. + RightParenthesis;[)];
  40237. + Semicolon;[;];
  40238. + Whitespace;[ ];
  40239. + RightBrace;[}];
  40240. + Whitespace;[ ];
  40241. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfExplicitCodeBlockUnterminatedAtEOF.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfExplicitCodeBlockUnterminatedAtEOF.stree.txt
  40242. index ed2107e5d1b..067e430142d 100644
  40243. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfExplicitCodeBlockUnterminatedAtEOF.stree.txt
  40244. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfExplicitCodeBlockUnterminatedAtEOF.stree.txt
  40245. @@ -1,32 +1,39 @@
  40246. -Statement block - Gen<None> - 44 - (0:0,0)
  40247. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  40248. - SyntaxKind.LeftBrace;[{];
  40249. - Code span - Gen<Stmt> - [ var foo = bar; if(foo != null) { bar(); } ] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[}];AtEOL - (1:0,1) - Tokens:28
  40250. - SyntaxKind.Whitespace;[ ];
  40251. - SyntaxKind.Identifier;[var];
  40252. - SyntaxKind.Whitespace;[ ];
  40253. - SyntaxKind.Identifier;[foo];
  40254. - SyntaxKind.Whitespace;[ ];
  40255. - SyntaxKind.Assign;[=];
  40256. - SyntaxKind.Whitespace;[ ];
  40257. - SyntaxKind.Identifier;[bar];
  40258. - SyntaxKind.Semicolon;[;];
  40259. - SyntaxKind.Whitespace;[ ];
  40260. - SyntaxKind.Keyword;[if];
  40261. - SyntaxKind.LeftParenthesis;[(];
  40262. - SyntaxKind.Identifier;[foo];
  40263. - SyntaxKind.Whitespace;[ ];
  40264. - SyntaxKind.NotEqual;[!=];
  40265. - SyntaxKind.Whitespace;[ ];
  40266. - SyntaxKind.Keyword;[null];
  40267. - SyntaxKind.RightParenthesis;[)];
  40268. - SyntaxKind.Whitespace;[ ];
  40269. - SyntaxKind.LeftBrace;[{];
  40270. - SyntaxKind.Whitespace;[ ];
  40271. - SyntaxKind.Identifier;[bar];
  40272. - SyntaxKind.LeftParenthesis;[(];
  40273. - SyntaxKind.RightParenthesis;[)];
  40274. - SyntaxKind.Semicolon;[;];
  40275. - SyntaxKind.Whitespace;[ ];
  40276. - SyntaxKind.RightBrace;[}];
  40277. - SyntaxKind.Whitespace;[ ];
  40278. +CSharpCodeBlock - [0..44)::44 - [{ var foo = bar; if(foo != null) { bar(); } ]
  40279. + CSharpStatement - [0..44)::44
  40280. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  40281. + Transition;[<Missing>];
  40282. + CSharpStatementBody - [0..44)::44
  40283. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  40284. + LeftBrace;[{];
  40285. + CSharpCodeBlock - [1..44)::43
  40286. + CSharpStatementLiteral - [1..44)::43 - [ var foo = bar; if(foo != null) { bar(); } ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[}];AtEOL
  40287. + Whitespace;[ ];
  40288. + Identifier;[var];
  40289. + Whitespace;[ ];
  40290. + Identifier;[foo];
  40291. + Whitespace;[ ];
  40292. + Assign;[=];
  40293. + Whitespace;[ ];
  40294. + Identifier;[bar];
  40295. + Semicolon;[;];
  40296. + Whitespace;[ ];
  40297. + Keyword;[if];
  40298. + LeftParenthesis;[(];
  40299. + Identifier;[foo];
  40300. + Whitespace;[ ];
  40301. + NotEqual;[!=];
  40302. + Whitespace;[ ];
  40303. + Keyword;[null];
  40304. + RightParenthesis;[)];
  40305. + Whitespace;[ ];
  40306. + LeftBrace;[{];
  40307. + Whitespace;[ ];
  40308. + Identifier;[bar];
  40309. + LeftParenthesis;[(];
  40310. + RightParenthesis;[)];
  40311. + Semicolon;[;];
  40312. + Whitespace;[ ];
  40313. + RightBrace;[}];
  40314. + Whitespace;[ ];
  40315. + RazorMetaCode - [44..44)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  40316. + RightBrace;[<Missing>];
  40317. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfFinallyBlockUnterminatedAtEOF.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfFinallyBlockUnterminatedAtEOF.stree.txt
  40318. index 96559bd7780..acb7cdbca8e 100644
  40319. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfFinallyBlockUnterminatedAtEOF.stree.txt
  40320. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfFinallyBlockUnterminatedAtEOF.stree.txt
  40321. @@ -1,44 +1,46 @@
  40322. -Statement block - Gen<None> - 67 - (0:0,0)
  40323. - Code span - Gen<Stmt> - [try { baz(); } finally { var foo = bar; if(foo != null) { bar(); } ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:42
  40324. - SyntaxKind.Keyword;[try];
  40325. - SyntaxKind.Whitespace;[ ];
  40326. - SyntaxKind.LeftBrace;[{];
  40327. - SyntaxKind.Whitespace;[ ];
  40328. - SyntaxKind.Identifier;[baz];
  40329. - SyntaxKind.LeftParenthesis;[(];
  40330. - SyntaxKind.RightParenthesis;[)];
  40331. - SyntaxKind.Semicolon;[;];
  40332. - SyntaxKind.Whitespace;[ ];
  40333. - SyntaxKind.RightBrace;[}];
  40334. - SyntaxKind.Whitespace;[ ];
  40335. - SyntaxKind.Keyword;[finally];
  40336. - SyntaxKind.Whitespace;[ ];
  40337. - SyntaxKind.LeftBrace;[{];
  40338. - SyntaxKind.Whitespace;[ ];
  40339. - SyntaxKind.Identifier;[var];
  40340. - SyntaxKind.Whitespace;[ ];
  40341. - SyntaxKind.Identifier;[foo];
  40342. - SyntaxKind.Whitespace;[ ];
  40343. - SyntaxKind.Assign;[=];
  40344. - SyntaxKind.Whitespace;[ ];
  40345. - SyntaxKind.Identifier;[bar];
  40346. - SyntaxKind.Semicolon;[;];
  40347. - SyntaxKind.Whitespace;[ ];
  40348. - SyntaxKind.Keyword;[if];
  40349. - SyntaxKind.LeftParenthesis;[(];
  40350. - SyntaxKind.Identifier;[foo];
  40351. - SyntaxKind.Whitespace;[ ];
  40352. - SyntaxKind.NotEqual;[!=];
  40353. - SyntaxKind.Whitespace;[ ];
  40354. - SyntaxKind.Keyword;[null];
  40355. - SyntaxKind.RightParenthesis;[)];
  40356. - SyntaxKind.Whitespace;[ ];
  40357. - SyntaxKind.LeftBrace;[{];
  40358. - SyntaxKind.Whitespace;[ ];
  40359. - SyntaxKind.Identifier;[bar];
  40360. - SyntaxKind.LeftParenthesis;[(];
  40361. - SyntaxKind.RightParenthesis;[)];
  40362. - SyntaxKind.Semicolon;[;];
  40363. - SyntaxKind.Whitespace;[ ];
  40364. - SyntaxKind.RightBrace;[}];
  40365. - SyntaxKind.Whitespace;[ ];
  40366. +CSharpCodeBlock - [0..67)::67 - [try { baz(); } finally { var foo = bar; if(foo != null) { bar(); } ]
  40367. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  40368. + Transition;[<Missing>];
  40369. + CSharpStatementLiteral - [0..67)::67 - [try { baz(); } finally { var foo = bar; if(foo != null) { bar(); } ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  40370. + Keyword;[try];
  40371. + Whitespace;[ ];
  40372. + LeftBrace;[{];
  40373. + Whitespace;[ ];
  40374. + Identifier;[baz];
  40375. + LeftParenthesis;[(];
  40376. + RightParenthesis;[)];
  40377. + Semicolon;[;];
  40378. + Whitespace;[ ];
  40379. + RightBrace;[}];
  40380. + Whitespace;[ ];
  40381. + Keyword;[finally];
  40382. + Whitespace;[ ];
  40383. + LeftBrace;[{];
  40384. + Whitespace;[ ];
  40385. + Identifier;[var];
  40386. + Whitespace;[ ];
  40387. + Identifier;[foo];
  40388. + Whitespace;[ ];
  40389. + Assign;[=];
  40390. + Whitespace;[ ];
  40391. + Identifier;[bar];
  40392. + Semicolon;[;];
  40393. + Whitespace;[ ];
  40394. + Keyword;[if];
  40395. + LeftParenthesis;[(];
  40396. + Identifier;[foo];
  40397. + Whitespace;[ ];
  40398. + NotEqual;[!=];
  40399. + Whitespace;[ ];
  40400. + Keyword;[null];
  40401. + RightParenthesis;[)];
  40402. + Whitespace;[ ];
  40403. + LeftBrace;[{];
  40404. + Whitespace;[ ];
  40405. + Identifier;[bar];
  40406. + LeftParenthesis;[(];
  40407. + RightParenthesis;[)];
  40408. + Semicolon;[;];
  40409. + Whitespace;[ ];
  40410. + RightBrace;[}];
  40411. + Whitespace;[ ];
  40412. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfForBlockUnterminatedAtEOF.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfForBlockUnterminatedAtEOF.stree.txt
  40413. index d65c73a1b99..ec0e99c7069 100644
  40414. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfForBlockUnterminatedAtEOF.stree.txt
  40415. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfForBlockUnterminatedAtEOF.stree.txt
  40416. @@ -1,37 +1,39 @@
  40417. -Statement block - Gen<None> - 54 - (0:0,0)
  40418. - Code span - Gen<Stmt> - [for (foo) { var foo = bar; if(foo != null) { bar(); } ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:35
  40419. - SyntaxKind.Keyword;[for];
  40420. - SyntaxKind.Whitespace;[ ];
  40421. - SyntaxKind.LeftParenthesis;[(];
  40422. - SyntaxKind.Identifier;[foo];
  40423. - SyntaxKind.RightParenthesis;[)];
  40424. - SyntaxKind.Whitespace;[ ];
  40425. - SyntaxKind.LeftBrace;[{];
  40426. - SyntaxKind.Whitespace;[ ];
  40427. - SyntaxKind.Identifier;[var];
  40428. - SyntaxKind.Whitespace;[ ];
  40429. - SyntaxKind.Identifier;[foo];
  40430. - SyntaxKind.Whitespace;[ ];
  40431. - SyntaxKind.Assign;[=];
  40432. - SyntaxKind.Whitespace;[ ];
  40433. - SyntaxKind.Identifier;[bar];
  40434. - SyntaxKind.Semicolon;[;];
  40435. - SyntaxKind.Whitespace;[ ];
  40436. - SyntaxKind.Keyword;[if];
  40437. - SyntaxKind.LeftParenthesis;[(];
  40438. - SyntaxKind.Identifier;[foo];
  40439. - SyntaxKind.Whitespace;[ ];
  40440. - SyntaxKind.NotEqual;[!=];
  40441. - SyntaxKind.Whitespace;[ ];
  40442. - SyntaxKind.Keyword;[null];
  40443. - SyntaxKind.RightParenthesis;[)];
  40444. - SyntaxKind.Whitespace;[ ];
  40445. - SyntaxKind.LeftBrace;[{];
  40446. - SyntaxKind.Whitespace;[ ];
  40447. - SyntaxKind.Identifier;[bar];
  40448. - SyntaxKind.LeftParenthesis;[(];
  40449. - SyntaxKind.RightParenthesis;[)];
  40450. - SyntaxKind.Semicolon;[;];
  40451. - SyntaxKind.Whitespace;[ ];
  40452. - SyntaxKind.RightBrace;[}];
  40453. - SyntaxKind.Whitespace;[ ];
  40454. +CSharpCodeBlock - [0..54)::54 - [for (foo) { var foo = bar; if(foo != null) { bar(); } ]
  40455. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  40456. + Transition;[<Missing>];
  40457. + CSharpStatementLiteral - [0..54)::54 - [for (foo) { var foo = bar; if(foo != null) { bar(); } ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  40458. + Keyword;[for];
  40459. + Whitespace;[ ];
  40460. + LeftParenthesis;[(];
  40461. + Identifier;[foo];
  40462. + RightParenthesis;[)];
  40463. + Whitespace;[ ];
  40464. + LeftBrace;[{];
  40465. + Whitespace;[ ];
  40466. + Identifier;[var];
  40467. + Whitespace;[ ];
  40468. + Identifier;[foo];
  40469. + Whitespace;[ ];
  40470. + Assign;[=];
  40471. + Whitespace;[ ];
  40472. + Identifier;[bar];
  40473. + Semicolon;[;];
  40474. + Whitespace;[ ];
  40475. + Keyword;[if];
  40476. + LeftParenthesis;[(];
  40477. + Identifier;[foo];
  40478. + Whitespace;[ ];
  40479. + NotEqual;[!=];
  40480. + Whitespace;[ ];
  40481. + Keyword;[null];
  40482. + RightParenthesis;[)];
  40483. + Whitespace;[ ];
  40484. + LeftBrace;[{];
  40485. + Whitespace;[ ];
  40486. + Identifier;[bar];
  40487. + LeftParenthesis;[(];
  40488. + RightParenthesis;[)];
  40489. + Semicolon;[;];
  40490. + Whitespace;[ ];
  40491. + RightBrace;[}];
  40492. + Whitespace;[ ];
  40493. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfForeachBlockUnterminatedAtEOF.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfForeachBlockUnterminatedAtEOF.stree.txt
  40494. index 611834ba29f..27861871840 100644
  40495. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfForeachBlockUnterminatedAtEOF.stree.txt
  40496. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfForeachBlockUnterminatedAtEOF.stree.txt
  40497. @@ -1,37 +1,39 @@
  40498. -Statement block - Gen<None> - 58 - (0:0,0)
  40499. - Code span - Gen<Stmt> - [foreach (foo) { var foo = bar; if(foo != null) { bar(); } ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:35
  40500. - SyntaxKind.Keyword;[foreach];
  40501. - SyntaxKind.Whitespace;[ ];
  40502. - SyntaxKind.LeftParenthesis;[(];
  40503. - SyntaxKind.Identifier;[foo];
  40504. - SyntaxKind.RightParenthesis;[)];
  40505. - SyntaxKind.Whitespace;[ ];
  40506. - SyntaxKind.LeftBrace;[{];
  40507. - SyntaxKind.Whitespace;[ ];
  40508. - SyntaxKind.Identifier;[var];
  40509. - SyntaxKind.Whitespace;[ ];
  40510. - SyntaxKind.Identifier;[foo];
  40511. - SyntaxKind.Whitespace;[ ];
  40512. - SyntaxKind.Assign;[=];
  40513. - SyntaxKind.Whitespace;[ ];
  40514. - SyntaxKind.Identifier;[bar];
  40515. - SyntaxKind.Semicolon;[;];
  40516. - SyntaxKind.Whitespace;[ ];
  40517. - SyntaxKind.Keyword;[if];
  40518. - SyntaxKind.LeftParenthesis;[(];
  40519. - SyntaxKind.Identifier;[foo];
  40520. - SyntaxKind.Whitespace;[ ];
  40521. - SyntaxKind.NotEqual;[!=];
  40522. - SyntaxKind.Whitespace;[ ];
  40523. - SyntaxKind.Keyword;[null];
  40524. - SyntaxKind.RightParenthesis;[)];
  40525. - SyntaxKind.Whitespace;[ ];
  40526. - SyntaxKind.LeftBrace;[{];
  40527. - SyntaxKind.Whitespace;[ ];
  40528. - SyntaxKind.Identifier;[bar];
  40529. - SyntaxKind.LeftParenthesis;[(];
  40530. - SyntaxKind.RightParenthesis;[)];
  40531. - SyntaxKind.Semicolon;[;];
  40532. - SyntaxKind.Whitespace;[ ];
  40533. - SyntaxKind.RightBrace;[}];
  40534. - SyntaxKind.Whitespace;[ ];
  40535. +CSharpCodeBlock - [0..58)::58 - [foreach (foo) { var foo = bar; if(foo != null) { bar(); } ]
  40536. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  40537. + Transition;[<Missing>];
  40538. + CSharpStatementLiteral - [0..58)::58 - [foreach (foo) { var foo = bar; if(foo != null) { bar(); } ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  40539. + Keyword;[foreach];
  40540. + Whitespace;[ ];
  40541. + LeftParenthesis;[(];
  40542. + Identifier;[foo];
  40543. + RightParenthesis;[)];
  40544. + Whitespace;[ ];
  40545. + LeftBrace;[{];
  40546. + Whitespace;[ ];
  40547. + Identifier;[var];
  40548. + Whitespace;[ ];
  40549. + Identifier;[foo];
  40550. + Whitespace;[ ];
  40551. + Assign;[=];
  40552. + Whitespace;[ ];
  40553. + Identifier;[bar];
  40554. + Semicolon;[;];
  40555. + Whitespace;[ ];
  40556. + Keyword;[if];
  40557. + LeftParenthesis;[(];
  40558. + Identifier;[foo];
  40559. + Whitespace;[ ];
  40560. + NotEqual;[!=];
  40561. + Whitespace;[ ];
  40562. + Keyword;[null];
  40563. + RightParenthesis;[)];
  40564. + Whitespace;[ ];
  40565. + LeftBrace;[{];
  40566. + Whitespace;[ ];
  40567. + Identifier;[bar];
  40568. + LeftParenthesis;[(];
  40569. + RightParenthesis;[)];
  40570. + Semicolon;[;];
  40571. + Whitespace;[ ];
  40572. + RightBrace;[}];
  40573. + Whitespace;[ ];
  40574. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfIfBlockUnterminatedAtEOF.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfIfBlockUnterminatedAtEOF.stree.txt
  40575. index 9dcb914c02f..570fd40972f 100644
  40576. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfIfBlockUnterminatedAtEOF.stree.txt
  40577. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfIfBlockUnterminatedAtEOF.stree.txt
  40578. @@ -1,37 +1,39 @@
  40579. -Statement block - Gen<None> - 53 - (0:0,0)
  40580. - Code span - Gen<Stmt> - [if (foo) { var foo = bar; if(foo != null) { bar(); } ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:35
  40581. - SyntaxKind.Keyword;[if];
  40582. - SyntaxKind.Whitespace;[ ];
  40583. - SyntaxKind.LeftParenthesis;[(];
  40584. - SyntaxKind.Identifier;[foo];
  40585. - SyntaxKind.RightParenthesis;[)];
  40586. - SyntaxKind.Whitespace;[ ];
  40587. - SyntaxKind.LeftBrace;[{];
  40588. - SyntaxKind.Whitespace;[ ];
  40589. - SyntaxKind.Identifier;[var];
  40590. - SyntaxKind.Whitespace;[ ];
  40591. - SyntaxKind.Identifier;[foo];
  40592. - SyntaxKind.Whitespace;[ ];
  40593. - SyntaxKind.Assign;[=];
  40594. - SyntaxKind.Whitespace;[ ];
  40595. - SyntaxKind.Identifier;[bar];
  40596. - SyntaxKind.Semicolon;[;];
  40597. - SyntaxKind.Whitespace;[ ];
  40598. - SyntaxKind.Keyword;[if];
  40599. - SyntaxKind.LeftParenthesis;[(];
  40600. - SyntaxKind.Identifier;[foo];
  40601. - SyntaxKind.Whitespace;[ ];
  40602. - SyntaxKind.NotEqual;[!=];
  40603. - SyntaxKind.Whitespace;[ ];
  40604. - SyntaxKind.Keyword;[null];
  40605. - SyntaxKind.RightParenthesis;[)];
  40606. - SyntaxKind.Whitespace;[ ];
  40607. - SyntaxKind.LeftBrace;[{];
  40608. - SyntaxKind.Whitespace;[ ];
  40609. - SyntaxKind.Identifier;[bar];
  40610. - SyntaxKind.LeftParenthesis;[(];
  40611. - SyntaxKind.RightParenthesis;[)];
  40612. - SyntaxKind.Semicolon;[;];
  40613. - SyntaxKind.Whitespace;[ ];
  40614. - SyntaxKind.RightBrace;[}];
  40615. - SyntaxKind.Whitespace;[ ];
  40616. +CSharpCodeBlock - [0..53)::53 - [if (foo) { var foo = bar; if(foo != null) { bar(); } ]
  40617. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  40618. + Transition;[<Missing>];
  40619. + CSharpStatementLiteral - [0..53)::53 - [if (foo) { var foo = bar; if(foo != null) { bar(); } ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  40620. + Keyword;[if];
  40621. + Whitespace;[ ];
  40622. + LeftParenthesis;[(];
  40623. + Identifier;[foo];
  40624. + RightParenthesis;[)];
  40625. + Whitespace;[ ];
  40626. + LeftBrace;[{];
  40627. + Whitespace;[ ];
  40628. + Identifier;[var];
  40629. + Whitespace;[ ];
  40630. + Identifier;[foo];
  40631. + Whitespace;[ ];
  40632. + Assign;[=];
  40633. + Whitespace;[ ];
  40634. + Identifier;[bar];
  40635. + Semicolon;[;];
  40636. + Whitespace;[ ];
  40637. + Keyword;[if];
  40638. + LeftParenthesis;[(];
  40639. + Identifier;[foo];
  40640. + Whitespace;[ ];
  40641. + NotEqual;[!=];
  40642. + Whitespace;[ ];
  40643. + Keyword;[null];
  40644. + RightParenthesis;[)];
  40645. + Whitespace;[ ];
  40646. + LeftBrace;[{];
  40647. + Whitespace;[ ];
  40648. + Identifier;[bar];
  40649. + LeftParenthesis;[(];
  40650. + RightParenthesis;[)];
  40651. + Semicolon;[;];
  40652. + Whitespace;[ ];
  40653. + RightBrace;[}];
  40654. + Whitespace;[ ];
  40655. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfLockBlockUnterminatedAtEOF.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfLockBlockUnterminatedAtEOF.stree.txt
  40656. index 408980c538e..2fdc1d6161c 100644
  40657. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfLockBlockUnterminatedAtEOF.stree.txt
  40658. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfLockBlockUnterminatedAtEOF.stree.txt
  40659. @@ -1,37 +1,39 @@
  40660. -Statement block - Gen<None> - 55 - (0:0,0)
  40661. - Code span - Gen<Stmt> - [lock (foo) { var foo = bar; if(foo != null) { bar(); } ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:35
  40662. - SyntaxKind.Keyword;[lock];
  40663. - SyntaxKind.Whitespace;[ ];
  40664. - SyntaxKind.LeftParenthesis;[(];
  40665. - SyntaxKind.Identifier;[foo];
  40666. - SyntaxKind.RightParenthesis;[)];
  40667. - SyntaxKind.Whitespace;[ ];
  40668. - SyntaxKind.LeftBrace;[{];
  40669. - SyntaxKind.Whitespace;[ ];
  40670. - SyntaxKind.Identifier;[var];
  40671. - SyntaxKind.Whitespace;[ ];
  40672. - SyntaxKind.Identifier;[foo];
  40673. - SyntaxKind.Whitespace;[ ];
  40674. - SyntaxKind.Assign;[=];
  40675. - SyntaxKind.Whitespace;[ ];
  40676. - SyntaxKind.Identifier;[bar];
  40677. - SyntaxKind.Semicolon;[;];
  40678. - SyntaxKind.Whitespace;[ ];
  40679. - SyntaxKind.Keyword;[if];
  40680. - SyntaxKind.LeftParenthesis;[(];
  40681. - SyntaxKind.Identifier;[foo];
  40682. - SyntaxKind.Whitespace;[ ];
  40683. - SyntaxKind.NotEqual;[!=];
  40684. - SyntaxKind.Whitespace;[ ];
  40685. - SyntaxKind.Keyword;[null];
  40686. - SyntaxKind.RightParenthesis;[)];
  40687. - SyntaxKind.Whitespace;[ ];
  40688. - SyntaxKind.LeftBrace;[{];
  40689. - SyntaxKind.Whitespace;[ ];
  40690. - SyntaxKind.Identifier;[bar];
  40691. - SyntaxKind.LeftParenthesis;[(];
  40692. - SyntaxKind.RightParenthesis;[)];
  40693. - SyntaxKind.Semicolon;[;];
  40694. - SyntaxKind.Whitespace;[ ];
  40695. - SyntaxKind.RightBrace;[}];
  40696. - SyntaxKind.Whitespace;[ ];
  40697. +CSharpCodeBlock - [0..55)::55 - [lock (foo) { var foo = bar; if(foo != null) { bar(); } ]
  40698. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  40699. + Transition;[<Missing>];
  40700. + CSharpStatementLiteral - [0..55)::55 - [lock (foo) { var foo = bar; if(foo != null) { bar(); } ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  40701. + Keyword;[lock];
  40702. + Whitespace;[ ];
  40703. + LeftParenthesis;[(];
  40704. + Identifier;[foo];
  40705. + RightParenthesis;[)];
  40706. + Whitespace;[ ];
  40707. + LeftBrace;[{];
  40708. + Whitespace;[ ];
  40709. + Identifier;[var];
  40710. + Whitespace;[ ];
  40711. + Identifier;[foo];
  40712. + Whitespace;[ ];
  40713. + Assign;[=];
  40714. + Whitespace;[ ];
  40715. + Identifier;[bar];
  40716. + Semicolon;[;];
  40717. + Whitespace;[ ];
  40718. + Keyword;[if];
  40719. + LeftParenthesis;[(];
  40720. + Identifier;[foo];
  40721. + Whitespace;[ ];
  40722. + NotEqual;[!=];
  40723. + Whitespace;[ ];
  40724. + Keyword;[null];
  40725. + RightParenthesis;[)];
  40726. + Whitespace;[ ];
  40727. + LeftBrace;[{];
  40728. + Whitespace;[ ];
  40729. + Identifier;[bar];
  40730. + LeftParenthesis;[(];
  40731. + RightParenthesis;[)];
  40732. + Semicolon;[;];
  40733. + Whitespace;[ ];
  40734. + RightBrace;[}];
  40735. + Whitespace;[ ];
  40736. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfSwitchBlockUnterminatedAtEOF.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfSwitchBlockUnterminatedAtEOF.stree.txt
  40737. index c9988fb22cb..4f7feb24760 100644
  40738. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfSwitchBlockUnterminatedAtEOF.stree.txt
  40739. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfSwitchBlockUnterminatedAtEOF.stree.txt
  40740. @@ -1,37 +1,39 @@
  40741. -Statement block - Gen<None> - 57 - (0:0,0)
  40742. - Code span - Gen<Stmt> - [switch (foo) { var foo = bar; if(foo != null) { bar(); } ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:35
  40743. - SyntaxKind.Keyword;[switch];
  40744. - SyntaxKind.Whitespace;[ ];
  40745. - SyntaxKind.LeftParenthesis;[(];
  40746. - SyntaxKind.Identifier;[foo];
  40747. - SyntaxKind.RightParenthesis;[)];
  40748. - SyntaxKind.Whitespace;[ ];
  40749. - SyntaxKind.LeftBrace;[{];
  40750. - SyntaxKind.Whitespace;[ ];
  40751. - SyntaxKind.Identifier;[var];
  40752. - SyntaxKind.Whitespace;[ ];
  40753. - SyntaxKind.Identifier;[foo];
  40754. - SyntaxKind.Whitespace;[ ];
  40755. - SyntaxKind.Assign;[=];
  40756. - SyntaxKind.Whitespace;[ ];
  40757. - SyntaxKind.Identifier;[bar];
  40758. - SyntaxKind.Semicolon;[;];
  40759. - SyntaxKind.Whitespace;[ ];
  40760. - SyntaxKind.Keyword;[if];
  40761. - SyntaxKind.LeftParenthesis;[(];
  40762. - SyntaxKind.Identifier;[foo];
  40763. - SyntaxKind.Whitespace;[ ];
  40764. - SyntaxKind.NotEqual;[!=];
  40765. - SyntaxKind.Whitespace;[ ];
  40766. - SyntaxKind.Keyword;[null];
  40767. - SyntaxKind.RightParenthesis;[)];
  40768. - SyntaxKind.Whitespace;[ ];
  40769. - SyntaxKind.LeftBrace;[{];
  40770. - SyntaxKind.Whitespace;[ ];
  40771. - SyntaxKind.Identifier;[bar];
  40772. - SyntaxKind.LeftParenthesis;[(];
  40773. - SyntaxKind.RightParenthesis;[)];
  40774. - SyntaxKind.Semicolon;[;];
  40775. - SyntaxKind.Whitespace;[ ];
  40776. - SyntaxKind.RightBrace;[}];
  40777. - SyntaxKind.Whitespace;[ ];
  40778. +CSharpCodeBlock - [0..57)::57 - [switch (foo) { var foo = bar; if(foo != null) { bar(); } ]
  40779. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  40780. + Transition;[<Missing>];
  40781. + CSharpStatementLiteral - [0..57)::57 - [switch (foo) { var foo = bar; if(foo != null) { bar(); } ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  40782. + Keyword;[switch];
  40783. + Whitespace;[ ];
  40784. + LeftParenthesis;[(];
  40785. + Identifier;[foo];
  40786. + RightParenthesis;[)];
  40787. + Whitespace;[ ];
  40788. + LeftBrace;[{];
  40789. + Whitespace;[ ];
  40790. + Identifier;[var];
  40791. + Whitespace;[ ];
  40792. + Identifier;[foo];
  40793. + Whitespace;[ ];
  40794. + Assign;[=];
  40795. + Whitespace;[ ];
  40796. + Identifier;[bar];
  40797. + Semicolon;[;];
  40798. + Whitespace;[ ];
  40799. + Keyword;[if];
  40800. + LeftParenthesis;[(];
  40801. + Identifier;[foo];
  40802. + Whitespace;[ ];
  40803. + NotEqual;[!=];
  40804. + Whitespace;[ ];
  40805. + Keyword;[null];
  40806. + RightParenthesis;[)];
  40807. + Whitespace;[ ];
  40808. + LeftBrace;[{];
  40809. + Whitespace;[ ];
  40810. + Identifier;[bar];
  40811. + LeftParenthesis;[(];
  40812. + RightParenthesis;[)];
  40813. + Semicolon;[;];
  40814. + Whitespace;[ ];
  40815. + RightBrace;[}];
  40816. + Whitespace;[ ];
  40817. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfTryBlockUnterminatedAtEOF.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfTryBlockUnterminatedAtEOF.stree.txt
  40818. index 29ed508ce66..269deab5f9f 100644
  40819. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfTryBlockUnterminatedAtEOF.stree.txt
  40820. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfTryBlockUnterminatedAtEOF.stree.txt
  40821. @@ -1,33 +1,35 @@
  40822. -Statement block - Gen<None> - 48 - (0:0,0)
  40823. - Code span - Gen<Stmt> - [try { var foo = bar; if(foo != null) { bar(); } ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:31
  40824. - SyntaxKind.Keyword;[try];
  40825. - SyntaxKind.Whitespace;[ ];
  40826. - SyntaxKind.LeftBrace;[{];
  40827. - SyntaxKind.Whitespace;[ ];
  40828. - SyntaxKind.Identifier;[var];
  40829. - SyntaxKind.Whitespace;[ ];
  40830. - SyntaxKind.Identifier;[foo];
  40831. - SyntaxKind.Whitespace;[ ];
  40832. - SyntaxKind.Assign;[=];
  40833. - SyntaxKind.Whitespace;[ ];
  40834. - SyntaxKind.Identifier;[bar];
  40835. - SyntaxKind.Semicolon;[;];
  40836. - SyntaxKind.Whitespace;[ ];
  40837. - SyntaxKind.Keyword;[if];
  40838. - SyntaxKind.LeftParenthesis;[(];
  40839. - SyntaxKind.Identifier;[foo];
  40840. - SyntaxKind.Whitespace;[ ];
  40841. - SyntaxKind.NotEqual;[!=];
  40842. - SyntaxKind.Whitespace;[ ];
  40843. - SyntaxKind.Keyword;[null];
  40844. - SyntaxKind.RightParenthesis;[)];
  40845. - SyntaxKind.Whitespace;[ ];
  40846. - SyntaxKind.LeftBrace;[{];
  40847. - SyntaxKind.Whitespace;[ ];
  40848. - SyntaxKind.Identifier;[bar];
  40849. - SyntaxKind.LeftParenthesis;[(];
  40850. - SyntaxKind.RightParenthesis;[)];
  40851. - SyntaxKind.Semicolon;[;];
  40852. - SyntaxKind.Whitespace;[ ];
  40853. - SyntaxKind.RightBrace;[}];
  40854. - SyntaxKind.Whitespace;[ ];
  40855. +CSharpCodeBlock - [0..48)::48 - [try { var foo = bar; if(foo != null) { bar(); } ]
  40856. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  40857. + Transition;[<Missing>];
  40858. + CSharpStatementLiteral - [0..48)::48 - [try { var foo = bar; if(foo != null) { bar(); } ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  40859. + Keyword;[try];
  40860. + Whitespace;[ ];
  40861. + LeftBrace;[{];
  40862. + Whitespace;[ ];
  40863. + Identifier;[var];
  40864. + Whitespace;[ ];
  40865. + Identifier;[foo];
  40866. + Whitespace;[ ];
  40867. + Assign;[=];
  40868. + Whitespace;[ ];
  40869. + Identifier;[bar];
  40870. + Semicolon;[;];
  40871. + Whitespace;[ ];
  40872. + Keyword;[if];
  40873. + LeftParenthesis;[(];
  40874. + Identifier;[foo];
  40875. + Whitespace;[ ];
  40876. + NotEqual;[!=];
  40877. + Whitespace;[ ];
  40878. + Keyword;[null];
  40879. + RightParenthesis;[)];
  40880. + Whitespace;[ ];
  40881. + LeftBrace;[{];
  40882. + Whitespace;[ ];
  40883. + Identifier;[bar];
  40884. + LeftParenthesis;[(];
  40885. + RightParenthesis;[)];
  40886. + Semicolon;[;];
  40887. + Whitespace;[ ];
  40888. + RightBrace;[}];
  40889. + Whitespace;[ ];
  40890. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfUsingBlockUnterminatedAtEOF.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfUsingBlockUnterminatedAtEOF.stree.txt
  40891. index 61ae015863e..b18009cd78e 100644
  40892. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfUsingBlockUnterminatedAtEOF.stree.txt
  40893. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfUsingBlockUnterminatedAtEOF.stree.txt
  40894. @@ -1,37 +1,39 @@
  40895. -Statement block - Gen<None> - 56 - (0:0,0)
  40896. - Code span - Gen<Stmt> - [using (foo) { var foo = bar; if(foo != null) { bar(); } ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:35
  40897. - SyntaxKind.Keyword;[using];
  40898. - SyntaxKind.Whitespace;[ ];
  40899. - SyntaxKind.LeftParenthesis;[(];
  40900. - SyntaxKind.Identifier;[foo];
  40901. - SyntaxKind.RightParenthesis;[)];
  40902. - SyntaxKind.Whitespace;[ ];
  40903. - SyntaxKind.LeftBrace;[{];
  40904. - SyntaxKind.Whitespace;[ ];
  40905. - SyntaxKind.Identifier;[var];
  40906. - SyntaxKind.Whitespace;[ ];
  40907. - SyntaxKind.Identifier;[foo];
  40908. - SyntaxKind.Whitespace;[ ];
  40909. - SyntaxKind.Assign;[=];
  40910. - SyntaxKind.Whitespace;[ ];
  40911. - SyntaxKind.Identifier;[bar];
  40912. - SyntaxKind.Semicolon;[;];
  40913. - SyntaxKind.Whitespace;[ ];
  40914. - SyntaxKind.Keyword;[if];
  40915. - SyntaxKind.LeftParenthesis;[(];
  40916. - SyntaxKind.Identifier;[foo];
  40917. - SyntaxKind.Whitespace;[ ];
  40918. - SyntaxKind.NotEqual;[!=];
  40919. - SyntaxKind.Whitespace;[ ];
  40920. - SyntaxKind.Keyword;[null];
  40921. - SyntaxKind.RightParenthesis;[)];
  40922. - SyntaxKind.Whitespace;[ ];
  40923. - SyntaxKind.LeftBrace;[{];
  40924. - SyntaxKind.Whitespace;[ ];
  40925. - SyntaxKind.Identifier;[bar];
  40926. - SyntaxKind.LeftParenthesis;[(];
  40927. - SyntaxKind.RightParenthesis;[)];
  40928. - SyntaxKind.Semicolon;[;];
  40929. - SyntaxKind.Whitespace;[ ];
  40930. - SyntaxKind.RightBrace;[}];
  40931. - SyntaxKind.Whitespace;[ ];
  40932. +CSharpCodeBlock - [0..56)::56 - [using (foo) { var foo = bar; if(foo != null) { bar(); } ]
  40933. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  40934. + Transition;[<Missing>];
  40935. + CSharpStatementLiteral - [0..56)::56 - [using (foo) { var foo = bar; if(foo != null) { bar(); } ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  40936. + Keyword;[using];
  40937. + Whitespace;[ ];
  40938. + LeftParenthesis;[(];
  40939. + Identifier;[foo];
  40940. + RightParenthesis;[)];
  40941. + Whitespace;[ ];
  40942. + LeftBrace;[{];
  40943. + Whitespace;[ ];
  40944. + Identifier;[var];
  40945. + Whitespace;[ ];
  40946. + Identifier;[foo];
  40947. + Whitespace;[ ];
  40948. + Assign;[=];
  40949. + Whitespace;[ ];
  40950. + Identifier;[bar];
  40951. + Semicolon;[;];
  40952. + Whitespace;[ ];
  40953. + Keyword;[if];
  40954. + LeftParenthesis;[(];
  40955. + Identifier;[foo];
  40956. + Whitespace;[ ];
  40957. + NotEqual;[!=];
  40958. + Whitespace;[ ];
  40959. + Keyword;[null];
  40960. + RightParenthesis;[)];
  40961. + Whitespace;[ ];
  40962. + LeftBrace;[{];
  40963. + Whitespace;[ ];
  40964. + Identifier;[bar];
  40965. + LeftParenthesis;[(];
  40966. + RightParenthesis;[)];
  40967. + Semicolon;[;];
  40968. + Whitespace;[ ];
  40969. + RightBrace;[}];
  40970. + Whitespace;[ ];
  40971. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfWhileBlockUnterminatedAtEOF.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfWhileBlockUnterminatedAtEOF.stree.txt
  40972. index 21cd2742d9c..89c3366824c 100644
  40973. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfWhileBlockUnterminatedAtEOF.stree.txt
  40974. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ReportsErrorIfWhileBlockUnterminatedAtEOF.stree.txt
  40975. @@ -1,37 +1,39 @@
  40976. -Statement block - Gen<None> - 56 - (0:0,0)
  40977. - Code span - Gen<Stmt> - [while (foo) { var foo = bar; if(foo != null) { bar(); } ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:35
  40978. - SyntaxKind.Keyword;[while];
  40979. - SyntaxKind.Whitespace;[ ];
  40980. - SyntaxKind.LeftParenthesis;[(];
  40981. - SyntaxKind.Identifier;[foo];
  40982. - SyntaxKind.RightParenthesis;[)];
  40983. - SyntaxKind.Whitespace;[ ];
  40984. - SyntaxKind.LeftBrace;[{];
  40985. - SyntaxKind.Whitespace;[ ];
  40986. - SyntaxKind.Identifier;[var];
  40987. - SyntaxKind.Whitespace;[ ];
  40988. - SyntaxKind.Identifier;[foo];
  40989. - SyntaxKind.Whitespace;[ ];
  40990. - SyntaxKind.Assign;[=];
  40991. - SyntaxKind.Whitespace;[ ];
  40992. - SyntaxKind.Identifier;[bar];
  40993. - SyntaxKind.Semicolon;[;];
  40994. - SyntaxKind.Whitespace;[ ];
  40995. - SyntaxKind.Keyword;[if];
  40996. - SyntaxKind.LeftParenthesis;[(];
  40997. - SyntaxKind.Identifier;[foo];
  40998. - SyntaxKind.Whitespace;[ ];
  40999. - SyntaxKind.NotEqual;[!=];
  41000. - SyntaxKind.Whitespace;[ ];
  41001. - SyntaxKind.Keyword;[null];
  41002. - SyntaxKind.RightParenthesis;[)];
  41003. - SyntaxKind.Whitespace;[ ];
  41004. - SyntaxKind.LeftBrace;[{];
  41005. - SyntaxKind.Whitespace;[ ];
  41006. - SyntaxKind.Identifier;[bar];
  41007. - SyntaxKind.LeftParenthesis;[(];
  41008. - SyntaxKind.RightParenthesis;[)];
  41009. - SyntaxKind.Semicolon;[;];
  41010. - SyntaxKind.Whitespace;[ ];
  41011. - SyntaxKind.RightBrace;[}];
  41012. - SyntaxKind.Whitespace;[ ];
  41013. +CSharpCodeBlock - [0..56)::56 - [while (foo) { var foo = bar; if(foo != null) { bar(); } ]
  41014. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  41015. + Transition;[<Missing>];
  41016. + CSharpStatementLiteral - [0..56)::56 - [while (foo) { var foo = bar; if(foo != null) { bar(); } ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  41017. + Keyword;[while];
  41018. + Whitespace;[ ];
  41019. + LeftParenthesis;[(];
  41020. + Identifier;[foo];
  41021. + RightParenthesis;[)];
  41022. + Whitespace;[ ];
  41023. + LeftBrace;[{];
  41024. + Whitespace;[ ];
  41025. + Identifier;[var];
  41026. + Whitespace;[ ];
  41027. + Identifier;[foo];
  41028. + Whitespace;[ ];
  41029. + Assign;[=];
  41030. + Whitespace;[ ];
  41031. + Identifier;[bar];
  41032. + Semicolon;[;];
  41033. + Whitespace;[ ];
  41034. + Keyword;[if];
  41035. + LeftParenthesis;[(];
  41036. + Identifier;[foo];
  41037. + Whitespace;[ ];
  41038. + NotEqual;[!=];
  41039. + Whitespace;[ ];
  41040. + Keyword;[null];
  41041. + RightParenthesis;[)];
  41042. + Whitespace;[ ];
  41043. + LeftBrace;[{];
  41044. + Whitespace;[ ];
  41045. + Identifier;[bar];
  41046. + LeftParenthesis;[(];
  41047. + RightParenthesis;[)];
  41048. + Semicolon;[;];
  41049. + Whitespace;[ ];
  41050. + RightBrace;[}];
  41051. + Whitespace;[ ];
  41052. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/RequiresControlFlowStatementsToHaveBraces.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/RequiresControlFlowStatementsToHaveBraces.stree.txt
  41053. index 5e9d2a11bcc..c73c39fea7a 100644
  41054. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/RequiresControlFlowStatementsToHaveBraces.stree.txt
  41055. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/RequiresControlFlowStatementsToHaveBraces.stree.txt
  41056. @@ -1,66 +1,68 @@
  41057. -Statement block - Gen<None> - 58 - (0:0,0)
  41058. - Code span - Gen<Stmt> - [if(foo) ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:5
  41059. - SyntaxKind.Keyword;[if];
  41060. - SyntaxKind.LeftParenthesis;[(];
  41061. - SyntaxKind.Identifier;[foo];
  41062. - SyntaxKind.RightParenthesis;[)];
  41063. - SyntaxKind.Whitespace;[ ];
  41064. - Markup block - Gen<None> - 11 - (8:0,8)
  41065. - Tag block - Gen<None> - 3 - (8:0,8)
  41066. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (8:0,8) - Tokens:3
  41067. - SyntaxKind.OpenAngle;[<];
  41068. - SyntaxKind.Text;[p];
  41069. - SyntaxKind.CloseAngle;[>];
  41070. - Markup span - Gen<Markup> - [Bar] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:1
  41071. - SyntaxKind.Text;[Bar];
  41072. - Tag block - Gen<None> - 4 - (14:0,14)
  41073. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (14:0,14) - Tokens:4
  41074. - SyntaxKind.OpenAngle;[<];
  41075. - SyntaxKind.ForwardSlash;[/];
  41076. - SyntaxKind.Text;[p];
  41077. - SyntaxKind.CloseAngle;[>];
  41078. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (18:0,18) - Tokens:1
  41079. - SyntaxKind.Whitespace;[ ];
  41080. - Code span - Gen<Stmt> - [else if(bar) ] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:7
  41081. - SyntaxKind.Keyword;[else];
  41082. - SyntaxKind.Whitespace;[ ];
  41083. - SyntaxKind.Keyword;[if];
  41084. - SyntaxKind.LeftParenthesis;[(];
  41085. - SyntaxKind.Identifier;[bar];
  41086. - SyntaxKind.RightParenthesis;[)];
  41087. - SyntaxKind.Whitespace;[ ];
  41088. - Markup block - Gen<None> - 11 - (32:0,32)
  41089. - Tag block - Gen<None> - 3 - (32:0,32)
  41090. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (32:0,32) - Tokens:3
  41091. - SyntaxKind.OpenAngle;[<];
  41092. - SyntaxKind.Text;[p];
  41093. - SyntaxKind.CloseAngle;[>];
  41094. - Markup span - Gen<Markup> - [Baz] - SpanEditHandler;Accepts:Any - (35:0,35) - Tokens:1
  41095. - SyntaxKind.Text;[Baz];
  41096. - Tag block - Gen<None> - 4 - (38:0,38)
  41097. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (38:0,38) - Tokens:4
  41098. - SyntaxKind.OpenAngle;[<];
  41099. - SyntaxKind.ForwardSlash;[/];
  41100. - SyntaxKind.Text;[p];
  41101. - SyntaxKind.CloseAngle;[>];
  41102. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (42:0,42) - Tokens:1
  41103. - SyntaxKind.Whitespace;[ ];
  41104. - Code span - Gen<Stmt> - [else ] - SpanEditHandler;Accepts:Any - (43:0,43) - Tokens:2
  41105. - SyntaxKind.Keyword;[else];
  41106. - SyntaxKind.Whitespace;[ ];
  41107. - Markup block - Gen<None> - 10 - (48:0,48)
  41108. - Tag block - Gen<None> - 3 - (48:0,48)
  41109. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (48:0,48) - Tokens:3
  41110. - SyntaxKind.OpenAngle;[<];
  41111. - SyntaxKind.Text;[p];
  41112. - SyntaxKind.CloseAngle;[>];
  41113. - Markup span - Gen<Markup> - [Boz] - SpanEditHandler;Accepts:Any - (51:0,51) - Tokens:1
  41114. - SyntaxKind.Text;[Boz];
  41115. - Tag block - Gen<None> - 4 - (54:0,54)
  41116. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (54:0,54) - Tokens:4
  41117. - SyntaxKind.OpenAngle;[<];
  41118. - SyntaxKind.ForwardSlash;[/];
  41119. - SyntaxKind.Text;[p];
  41120. - SyntaxKind.CloseAngle;[>];
  41121. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (58:0,58) - Tokens:1
  41122. - SyntaxKind.Unknown;[];
  41123. +CSharpCodeBlock - [0..58)::58 - [if(foo) <p>Bar</p> else if(bar) <p>Baz</p> else <p>Boz</p>]
  41124. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  41125. + Transition;[<Missing>];
  41126. + CSharpStatementLiteral - [0..8)::8 - [if(foo) ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  41127. + Keyword;[if];
  41128. + LeftParenthesis;[(];
  41129. + Identifier;[foo];
  41130. + RightParenthesis;[)];
  41131. + Whitespace;[ ];
  41132. + MarkupBlock - [8..19)::11
  41133. + MarkupTagBlock - [8..11)::3 - [<p>]
  41134. + MarkupTextLiteral - [8..11)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  41135. + OpenAngle;[<];
  41136. + Text;[p];
  41137. + CloseAngle;[>];
  41138. + MarkupTextLiteral - [11..14)::3 - [Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  41139. + Text;[Bar];
  41140. + MarkupTagBlock - [14..18)::4 - [</p>]
  41141. + MarkupTextLiteral - [14..18)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  41142. + OpenAngle;[<];
  41143. + ForwardSlash;[/];
  41144. + Text;[p];
  41145. + CloseAngle;[>];
  41146. + MarkupTextLiteral - [18..19)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  41147. + Whitespace;[ ];
  41148. + CSharpStatementLiteral - [19..32)::13 - [else if(bar) ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  41149. + Keyword;[else];
  41150. + Whitespace;[ ];
  41151. + Keyword;[if];
  41152. + LeftParenthesis;[(];
  41153. + Identifier;[bar];
  41154. + RightParenthesis;[)];
  41155. + Whitespace;[ ];
  41156. + MarkupBlock - [32..43)::11
  41157. + MarkupTagBlock - [32..35)::3 - [<p>]
  41158. + MarkupTextLiteral - [32..35)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  41159. + OpenAngle;[<];
  41160. + Text;[p];
  41161. + CloseAngle;[>];
  41162. + MarkupTextLiteral - [35..38)::3 - [Baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  41163. + Text;[Baz];
  41164. + MarkupTagBlock - [38..42)::4 - [</p>]
  41165. + MarkupTextLiteral - [38..42)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  41166. + OpenAngle;[<];
  41167. + ForwardSlash;[/];
  41168. + Text;[p];
  41169. + CloseAngle;[>];
  41170. + MarkupTextLiteral - [42..43)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  41171. + Whitespace;[ ];
  41172. + CSharpStatementLiteral - [43..48)::5 - [else ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  41173. + Keyword;[else];
  41174. + Whitespace;[ ];
  41175. + MarkupBlock - [48..58)::10
  41176. + MarkupTagBlock - [48..51)::3 - [<p>]
  41177. + MarkupTextLiteral - [48..51)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  41178. + OpenAngle;[<];
  41179. + Text;[p];
  41180. + CloseAngle;[>];
  41181. + MarkupTextLiteral - [51..54)::3 - [Boz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  41182. + Text;[Boz];
  41183. + MarkupTagBlock - [54..58)::4 - [</p>]
  41184. + MarkupTextLiteral - [54..58)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  41185. + OpenAngle;[<];
  41186. + ForwardSlash;[/];
  41187. + Text;[p];
  41188. + CloseAngle;[>];
  41189. + CSharpStatementLiteral - [58..58)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  41190. + Marker;[];
  41191. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ResumesIfStatementAfterOpenParen.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ResumesIfStatementAfterOpenParen.stree.txt
  41192. index e27910989ef..256126f941e 100644
  41193. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ResumesIfStatementAfterOpenParen.stree.txt
  41194. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ResumesIfStatementAfterOpenParen.stree.txt
  41195. @@ -1,28 +1,30 @@
  41196. -Statement block - Gen<None> - 24 - (0:0,0)
  41197. - Code span - Gen<Stmt> - [if(LFelse {] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:6
  41198. - SyntaxKind.Keyword;[if];
  41199. - SyntaxKind.LeftParenthesis;[(];
  41200. - SyntaxKind.NewLine;[LF];
  41201. - SyntaxKind.Keyword;[else];
  41202. - SyntaxKind.Whitespace;[ ];
  41203. - SyntaxKind.LeftBrace;[{];
  41204. - Markup block - Gen<None> - 12 - (11:1,6)
  41205. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (11:1,6) - Tokens:1
  41206. - SyntaxKind.Whitespace;[ ];
  41207. - Tag block - Gen<None> - 3 - (12:1,7)
  41208. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (12:1,7) - Tokens:3
  41209. - SyntaxKind.OpenAngle;[<];
  41210. - SyntaxKind.Text;[p];
  41211. - SyntaxKind.CloseAngle;[>];
  41212. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:Any - (15:1,10) - Tokens:1
  41213. - SyntaxKind.Text;[Foo];
  41214. - Tag block - Gen<None> - 4 - (18:1,13)
  41215. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (18:1,13) - Tokens:4
  41216. - SyntaxKind.OpenAngle;[<];
  41217. - SyntaxKind.ForwardSlash;[/];
  41218. - SyntaxKind.Text;[p];
  41219. - SyntaxKind.CloseAngle;[>];
  41220. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (22:1,17) - Tokens:1
  41221. - SyntaxKind.Whitespace;[ ];
  41222. - Code span - Gen<Stmt> - [}] - SpanEditHandler;Accepts:None - (23:1,18) - Tokens:1
  41223. - SyntaxKind.RightBrace;[}];
  41224. +CSharpCodeBlock - [0..24)::24 - [if(LFelse { <p>Foo</p> }]
  41225. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  41226. + Transition;[<Missing>];
  41227. + CSharpStatementLiteral - [0..11)::11 - [if(LFelse {] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  41228. + Keyword;[if];
  41229. + LeftParenthesis;[(];
  41230. + NewLine;[LF];
  41231. + Keyword;[else];
  41232. + Whitespace;[ ];
  41233. + LeftBrace;[{];
  41234. + MarkupBlock - [11..23)::12
  41235. + MarkupTextLiteral - [11..12)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  41236. + Whitespace;[ ];
  41237. + MarkupTagBlock - [12..15)::3 - [<p>]
  41238. + MarkupTextLiteral - [12..15)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  41239. + OpenAngle;[<];
  41240. + Text;[p];
  41241. + CloseAngle;[>];
  41242. + MarkupTextLiteral - [15..18)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  41243. + Text;[Foo];
  41244. + MarkupTagBlock - [18..22)::4 - [</p>]
  41245. + MarkupTextLiteral - [18..22)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  41246. + OpenAngle;[<];
  41247. + ForwardSlash;[/];
  41248. + Text;[p];
  41249. + CloseAngle;[>];
  41250. + MarkupTextLiteral - [22..23)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  41251. + Whitespace;[ ];
  41252. + CSharpStatementLiteral - [23..24)::1 - [}] - Gen<Stmt> - SpanEditHandler;Accepts:None
  41253. + RightBrace;[}];
  41254. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ShouldReportErrorAndTerminateAtEOFIfBracketInImplicitExpressionUnclosed.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ShouldReportErrorAndTerminateAtEOFIfBracketInImplicitExpressionUnclosed.stree.txt
  41255. index 7edce356660..1f0a3bc0e98 100644
  41256. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ShouldReportErrorAndTerminateAtEOFIfBracketInImplicitExpressionUnclosed.stree.txt
  41257. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ShouldReportErrorAndTerminateAtEOFIfBracketInImplicitExpressionUnclosed.stree.txt
  41258. @@ -1,12 +1,17 @@
  41259. -Expression block - Gen<Expr> - 22 - (0:0,0)
  41260. - Code span - Gen<Expr> - [Foo[Bar[Baz]LFBizLFBoz] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (0:0,0) - Tokens:10
  41261. - SyntaxKind.Identifier;[Foo];
  41262. - SyntaxKind.LeftBracket;[[];
  41263. - SyntaxKind.Identifier;[Bar];
  41264. - SyntaxKind.LeftBracket;[[];
  41265. - SyntaxKind.Identifier;[Baz];
  41266. - SyntaxKind.RightBracket;[]];
  41267. - SyntaxKind.NewLine;[LF];
  41268. - SyntaxKind.Identifier;[Biz];
  41269. - SyntaxKind.NewLine;[LF];
  41270. - SyntaxKind.Identifier;[Boz];
  41271. +CSharpCodeBlock - [0..22)::22 - [Foo[Bar[Baz]LFBizLFBoz]
  41272. + CSharpImplicitExpression - [0..22)::22
  41273. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  41274. + Transition;[<Missing>];
  41275. + CSharpImplicitExpressionBody - [0..22)::22
  41276. + CSharpCodeBlock - [0..22)::22
  41277. + CSharpExpressionLiteral - [0..22)::22 - [Foo[Bar[Baz]LFBizLFBoz] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14
  41278. + Identifier;[Foo];
  41279. + LeftBracket;[[];
  41280. + Identifier;[Bar];
  41281. + LeftBracket;[[];
  41282. + Identifier;[Baz];
  41283. + RightBracket;[]];
  41284. + NewLine;[LF];
  41285. + Identifier;[Biz];
  41286. + NewLine;[LF];
  41287. + Identifier;[Boz];
  41288. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ShouldReportErrorAndTerminateAtEOFIfIfParenInExplicitExprUnclosed.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ShouldReportErrorAndTerminateAtEOFIfIfParenInExplicitExprUnclosed.stree.txt
  41289. index 5bc5080b047..766d81299a7 100644
  41290. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ShouldReportErrorAndTerminateAtEOFIfIfParenInExplicitExprUnclosed.stree.txt
  41291. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ShouldReportErrorAndTerminateAtEOFIfIfParenInExplicitExprUnclosed.stree.txt
  41292. @@ -1,9 +1,16 @@
  41293. -Expression block - Gen<Expr> - 13 - (0:0,0)
  41294. - MetaCode span - Gen<None> - [(] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  41295. - SyntaxKind.LeftParenthesis;[(];
  41296. - Code span - Gen<Expr> - [foo barLFbaz] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:5
  41297. - SyntaxKind.Identifier;[foo];
  41298. - SyntaxKind.Whitespace;[ ];
  41299. - SyntaxKind.Identifier;[bar];
  41300. - SyntaxKind.NewLine;[LF];
  41301. - SyntaxKind.Identifier;[baz];
  41302. +CSharpCodeBlock - [0..13)::13 - [(foo barLFbaz]
  41303. + CSharpExplicitExpression - [0..13)::13
  41304. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  41305. + Transition;[<Missing>];
  41306. + CSharpExplicitExpressionBody - [0..13)::13
  41307. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41308. + LeftParenthesis;[(];
  41309. + CSharpCodeBlock - [1..13)::12
  41310. + CSharpExpressionLiteral - [1..13)::12 - [foo barLFbaz] - Gen<Expr> - SpanEditHandler;Accepts:Any
  41311. + Identifier;[foo];
  41312. + Whitespace;[ ];
  41313. + Identifier;[bar];
  41314. + NewLine;[LF];
  41315. + Identifier;[baz];
  41316. + RazorMetaCode - [13..13)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  41317. + RightParenthesis;[<Missing>];
  41318. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ShouldReportErrorAndTerminateAtEOFIfParenInImplicitExprUnclosed.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ShouldReportErrorAndTerminateAtEOFIfParenInImplicitExprUnclosed.stree.txt
  41319. index 487be52e9e3..e23f852f622 100644
  41320. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ShouldReportErrorAndTerminateAtEOFIfParenInImplicitExprUnclosed.stree.txt
  41321. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ShouldReportErrorAndTerminateAtEOFIfParenInImplicitExprUnclosed.stree.txt
  41322. @@ -1,12 +1,17 @@
  41323. -Expression block - Gen<Expr> - 22 - (0:0,0)
  41324. - Code span - Gen<Expr> - [Foo(Bar(Baz)LFBizLFBoz] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (0:0,0) - Tokens:10
  41325. - SyntaxKind.Identifier;[Foo];
  41326. - SyntaxKind.LeftParenthesis;[(];
  41327. - SyntaxKind.Identifier;[Bar];
  41328. - SyntaxKind.LeftParenthesis;[(];
  41329. - SyntaxKind.Identifier;[Baz];
  41330. - SyntaxKind.RightParenthesis;[)];
  41331. - SyntaxKind.NewLine;[LF];
  41332. - SyntaxKind.Identifier;[Biz];
  41333. - SyntaxKind.NewLine;[LF];
  41334. - SyntaxKind.Identifier;[Boz];
  41335. +CSharpCodeBlock - [0..22)::22 - [Foo(Bar(Baz)LFBizLFBoz]
  41336. + CSharpImplicitExpression - [0..22)::22
  41337. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  41338. + Transition;[<Missing>];
  41339. + CSharpImplicitExpressionBody - [0..22)::22
  41340. + CSharpCodeBlock - [0..22)::22
  41341. + CSharpExpressionLiteral - [0..22)::22 - [Foo(Bar(Baz)LFBizLFBoz] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14
  41342. + Identifier;[Foo];
  41343. + LeftParenthesis;[(];
  41344. + Identifier;[Bar];
  41345. + LeftParenthesis;[(];
  41346. + Identifier;[Baz];
  41347. + RightParenthesis;[)];
  41348. + NewLine;[LF];
  41349. + Identifier;[Biz];
  41350. + NewLine;[LF];
  41351. + Identifier;[Boz];
  41352. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ShouldReportErrorAndTerminateAtMarkupIfBracketInImplicitExprUnclosed.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ShouldReportErrorAndTerminateAtMarkupIfBracketInImplicitExprUnclosed.stree.txt
  41353. index 6f02e88cec2..80c61bdeee9 100644
  41354. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ShouldReportErrorAndTerminateAtMarkupIfBracketInImplicitExprUnclosed.stree.txt
  41355. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ShouldReportErrorAndTerminateAtMarkupIfBracketInImplicitExprUnclosed.stree.txt
  41356. @@ -1,11 +1,16 @@
  41357. -Expression block - Gen<Expr> - 19 - (0:0,0)
  41358. - Code span - Gen<Expr> - [Foo[Bar[Baz]LFBizLF] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (0:0,0) - Tokens:9
  41359. - SyntaxKind.Identifier;[Foo];
  41360. - SyntaxKind.LeftBracket;[[];
  41361. - SyntaxKind.Identifier;[Bar];
  41362. - SyntaxKind.LeftBracket;[[];
  41363. - SyntaxKind.Identifier;[Baz];
  41364. - SyntaxKind.RightBracket;[]];
  41365. - SyntaxKind.NewLine;[LF];
  41366. - SyntaxKind.Identifier;[Biz];
  41367. - SyntaxKind.NewLine;[LF];
  41368. +CSharpCodeBlock - [0..19)::19 - [Foo[Bar[Baz]LFBizLF]
  41369. + CSharpImplicitExpression - [0..19)::19
  41370. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  41371. + Transition;[<Missing>];
  41372. + CSharpImplicitExpressionBody - [0..19)::19
  41373. + CSharpCodeBlock - [0..19)::19
  41374. + CSharpExpressionLiteral - [0..19)::19 - [Foo[Bar[Baz]LFBizLF] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14
  41375. + Identifier;[Foo];
  41376. + LeftBracket;[[];
  41377. + Identifier;[Bar];
  41378. + LeftBracket;[[];
  41379. + Identifier;[Baz];
  41380. + RightBracket;[]];
  41381. + NewLine;[LF];
  41382. + Identifier;[Biz];
  41383. + NewLine;[LF];
  41384. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ShouldReportErrorAndTerminateAtMarkupIfIfParenInExplicitExprUnclosed.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ShouldReportErrorAndTerminateAtMarkupIfIfParenInExplicitExprUnclosed.stree.txt
  41385. index 526cc8c9927..783b2be0378 100644
  41386. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ShouldReportErrorAndTerminateAtMarkupIfIfParenInExplicitExprUnclosed.stree.txt
  41387. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ShouldReportErrorAndTerminateAtMarkupIfIfParenInExplicitExprUnclosed.stree.txt
  41388. @@ -1,8 +1,15 @@
  41389. -Expression block - Gen<Expr> - 10 - (0:0,0)
  41390. - MetaCode span - Gen<None> - [(] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  41391. - SyntaxKind.LeftParenthesis;[(];
  41392. - Code span - Gen<Expr> - [foo barLF] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:4
  41393. - SyntaxKind.Identifier;[foo];
  41394. - SyntaxKind.Whitespace;[ ];
  41395. - SyntaxKind.Identifier;[bar];
  41396. - SyntaxKind.NewLine;[LF];
  41397. +CSharpCodeBlock - [0..10)::10 - [(foo barLF]
  41398. + CSharpExplicitExpression - [0..10)::10
  41399. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  41400. + Transition;[<Missing>];
  41401. + CSharpExplicitExpressionBody - [0..10)::10
  41402. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41403. + LeftParenthesis;[(];
  41404. + CSharpCodeBlock - [1..10)::9
  41405. + CSharpExpressionLiteral - [1..10)::9 - [foo barLF] - Gen<Expr> - SpanEditHandler;Accepts:Any
  41406. + Identifier;[foo];
  41407. + Whitespace;[ ];
  41408. + Identifier;[bar];
  41409. + NewLine;[LF];
  41410. + RazorMetaCode - [10..10)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  41411. + RightParenthesis;[<Missing>];
  41412. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ShouldReportErrorAndTerminateAtMarkupIfParenInImplicitExpressionUnclosed.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ShouldReportErrorAndTerminateAtMarkupIfParenInImplicitExpressionUnclosed.stree.txt
  41413. index 74a5b4d8e89..87fcb7b68c7 100644
  41414. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ShouldReportErrorAndTerminateAtMarkupIfParenInImplicitExpressionUnclosed.stree.txt
  41415. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/ShouldReportErrorAndTerminateAtMarkupIfParenInImplicitExpressionUnclosed.stree.txt
  41416. @@ -1,11 +1,16 @@
  41417. -Expression block - Gen<Expr> - 19 - (0:0,0)
  41418. - Code span - Gen<Expr> - [Foo(Bar(Baz)LFBizLF] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (0:0,0) - Tokens:9
  41419. - SyntaxKind.Identifier;[Foo];
  41420. - SyntaxKind.LeftParenthesis;[(];
  41421. - SyntaxKind.Identifier;[Bar];
  41422. - SyntaxKind.LeftParenthesis;[(];
  41423. - SyntaxKind.Identifier;[Baz];
  41424. - SyntaxKind.RightParenthesis;[)];
  41425. - SyntaxKind.NewLine;[LF];
  41426. - SyntaxKind.Identifier;[Biz];
  41427. - SyntaxKind.NewLine;[LF];
  41428. +CSharpCodeBlock - [0..19)::19 - [Foo(Bar(Baz)LFBizLF]
  41429. + CSharpImplicitExpression - [0..19)::19
  41430. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  41431. + Transition;[<Missing>];
  41432. + CSharpImplicitExpressionBody - [0..19)::19
  41433. + CSharpCodeBlock - [0..19)::19
  41434. + CSharpExpressionLiteral - [0..19)::19 - [Foo(Bar(Baz)LFBizLF] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14
  41435. + Identifier;[Foo];
  41436. + LeftParenthesis;[(];
  41437. + Identifier;[Bar];
  41438. + LeftParenthesis;[(];
  41439. + Identifier;[Baz];
  41440. + RightParenthesis;[)];
  41441. + NewLine;[LF];
  41442. + Identifier;[Biz];
  41443. + NewLine;[LF];
  41444. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesForeachBlockAtEOLWhenRecoveringFromMissingCloseParen.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesForeachBlockAtEOLWhenRecoveringFromMissingCloseParen.stree.txt
  41445. index 4ea2cc9be1f..70277e63f78 100644
  41446. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesForeachBlockAtEOLWhenRecoveringFromMissingCloseParen.stree.txt
  41447. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesForeachBlockAtEOLWhenRecoveringFromMissingCloseParen.stree.txt
  41448. @@ -1,8 +1,10 @@
  41449. -Statement block - Gen<None> - 17 - (0:0,0)
  41450. - Code span - Gen<Stmt> - [foreach(foo barLF] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:6
  41451. - SyntaxKind.Keyword;[foreach];
  41452. - SyntaxKind.LeftParenthesis;[(];
  41453. - SyntaxKind.Identifier;[foo];
  41454. - SyntaxKind.Whitespace;[ ];
  41455. - SyntaxKind.Identifier;[bar];
  41456. - SyntaxKind.NewLine;[LF];
  41457. +CSharpCodeBlock - [0..17)::17 - [foreach(foo barLF]
  41458. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  41459. + Transition;[<Missing>];
  41460. + CSharpStatementLiteral - [0..17)::17 - [foreach(foo barLF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  41461. + Keyword;[foreach];
  41462. + LeftParenthesis;[(];
  41463. + Identifier;[foo];
  41464. + Whitespace;[ ];
  41465. + Identifier;[bar];
  41466. + NewLine;[LF];
  41467. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesIfBlockAtEOLWhenRecoveringFromMissingCloseParen.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesIfBlockAtEOLWhenRecoveringFromMissingCloseParen.stree.txt
  41468. index 2fb112facda..48e421bb194 100644
  41469. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesIfBlockAtEOLWhenRecoveringFromMissingCloseParen.stree.txt
  41470. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesIfBlockAtEOLWhenRecoveringFromMissingCloseParen.stree.txt
  41471. @@ -1,8 +1,10 @@
  41472. -Statement block - Gen<None> - 12 - (0:0,0)
  41473. - Code span - Gen<Stmt> - [if(foo barLF] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:6
  41474. - SyntaxKind.Keyword;[if];
  41475. - SyntaxKind.LeftParenthesis;[(];
  41476. - SyntaxKind.Identifier;[foo];
  41477. - SyntaxKind.Whitespace;[ ];
  41478. - SyntaxKind.Identifier;[bar];
  41479. - SyntaxKind.NewLine;[LF];
  41480. +CSharpCodeBlock - [0..12)::12 - [if(foo barLF]
  41481. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  41482. + Transition;[<Missing>];
  41483. + CSharpStatementLiteral - [0..12)::12 - [if(foo barLF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  41484. + Keyword;[if];
  41485. + LeftParenthesis;[(];
  41486. + Identifier;[foo];
  41487. + Whitespace;[ ];
  41488. + Identifier;[bar];
  41489. + NewLine;[LF];
  41490. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesNormalCSharpStringsAtEOLIfEndQuoteMissing.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesNormalCSharpStringsAtEOLIfEndQuoteMissing.stree.txt
  41491. index c8a7548e04e..4239af88861 100644
  41492. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesNormalCSharpStringsAtEOLIfEndQuoteMissing.stree.txt
  41493. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesNormalCSharpStringsAtEOLIfEndQuoteMissing.stree.txt
  41494. @@ -1,21 +1,23 @@
  41495. -Statement block - Gen<None> - 41 - (0:0,0)
  41496. - Code span - Gen<Stmt> - [if(foo) {LF var p = "foo bar bazLF;LF}] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:19
  41497. - SyntaxKind.Keyword;[if];
  41498. - SyntaxKind.LeftParenthesis;[(];
  41499. - SyntaxKind.Identifier;[foo];
  41500. - SyntaxKind.RightParenthesis;[)];
  41501. - SyntaxKind.Whitespace;[ ];
  41502. - SyntaxKind.LeftBrace;[{];
  41503. - SyntaxKind.NewLine;[LF];
  41504. - SyntaxKind.Whitespace;[ ];
  41505. - SyntaxKind.Identifier;[var];
  41506. - SyntaxKind.Whitespace;[ ];
  41507. - SyntaxKind.Identifier;[p];
  41508. - SyntaxKind.Whitespace;[ ];
  41509. - SyntaxKind.Assign;[=];
  41510. - SyntaxKind.Whitespace;[ ];
  41511. - SyntaxKind.StringLiteral;["foo bar baz];RZ1000(23:1,12 [1] )
  41512. - SyntaxKind.NewLine;[LF];
  41513. - SyntaxKind.Semicolon;[;];
  41514. - SyntaxKind.NewLine;[LF];
  41515. - SyntaxKind.RightBrace;[}];
  41516. +CSharpCodeBlock - [0..41)::41 - [if(foo) {LF var p = "foo bar bazLF;LF}]
  41517. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  41518. + Transition;[<Missing>];
  41519. + CSharpStatementLiteral - [0..41)::41 - [if(foo) {LF var p = "foo bar bazLF;LF}] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  41520. + Keyword;[if];
  41521. + LeftParenthesis;[(];
  41522. + Identifier;[foo];
  41523. + RightParenthesis;[)];
  41524. + Whitespace;[ ];
  41525. + LeftBrace;[{];
  41526. + NewLine;[LF];
  41527. + Whitespace;[ ];
  41528. + Identifier;[var];
  41529. + Whitespace;[ ];
  41530. + Identifier;[p];
  41531. + Whitespace;[ ];
  41532. + Assign;[=];
  41533. + Whitespace;[ ];
  41534. + StringLiteral;["foo bar baz];RZ1000(23:1,12 [1] )
  41535. + NewLine;[LF];
  41536. + Semicolon;[;];
  41537. + NewLine;[LF];
  41538. + RightBrace;[}];
  41539. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesNormalStringAtEndOfFile.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesNormalStringAtEndOfFile.stree.txt
  41540. index 5626bc0158e..8d5349ea506 100644
  41541. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesNormalStringAtEndOfFile.stree.txt
  41542. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesNormalStringAtEndOfFile.stree.txt
  41543. @@ -1,16 +1,18 @@
  41544. -Statement block - Gen<None> - 45 - (0:0,0)
  41545. - Code span - Gen<Stmt> - [if(foo) { var foo = "blah blah blah blah blah] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:14
  41546. - SyntaxKind.Keyword;[if];
  41547. - SyntaxKind.LeftParenthesis;[(];
  41548. - SyntaxKind.Identifier;[foo];
  41549. - SyntaxKind.RightParenthesis;[)];
  41550. - SyntaxKind.Whitespace;[ ];
  41551. - SyntaxKind.LeftBrace;[{];
  41552. - SyntaxKind.Whitespace;[ ];
  41553. - SyntaxKind.Identifier;[var];
  41554. - SyntaxKind.Whitespace;[ ];
  41555. - SyntaxKind.Identifier;[foo];
  41556. - SyntaxKind.Whitespace;[ ];
  41557. - SyntaxKind.Assign;[=];
  41558. - SyntaxKind.Whitespace;[ ];
  41559. - SyntaxKind.StringLiteral;["blah blah blah blah blah];RZ1000(20:0,20 [1] )
  41560. +CSharpCodeBlock - [0..45)::45 - [if(foo) { var foo = "blah blah blah blah blah]
  41561. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  41562. + Transition;[<Missing>];
  41563. + CSharpStatementLiteral - [0..45)::45 - [if(foo) { var foo = "blah blah blah blah blah] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  41564. + Keyword;[if];
  41565. + LeftParenthesis;[(];
  41566. + Identifier;[foo];
  41567. + RightParenthesis;[)];
  41568. + Whitespace;[ ];
  41569. + LeftBrace;[{];
  41570. + Whitespace;[ ];
  41571. + Identifier;[var];
  41572. + Whitespace;[ ];
  41573. + Identifier;[foo];
  41574. + Whitespace;[ ];
  41575. + Assign;[=];
  41576. + Whitespace;[ ];
  41577. + StringLiteral;["blah blah blah blah blah];RZ1000(20:0,20 [1] )
  41578. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesUsingBlockAtEOLWhenRecoveringFromMissingCloseParen.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesUsingBlockAtEOLWhenRecoveringFromMissingCloseParen.stree.txt
  41579. index cb18b098c3f..4364777d949 100644
  41580. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesUsingBlockAtEOLWhenRecoveringFromMissingCloseParen.stree.txt
  41581. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesUsingBlockAtEOLWhenRecoveringFromMissingCloseParen.stree.txt
  41582. @@ -1,8 +1,10 @@
  41583. -Statement block - Gen<None> - 15 - (0:0,0)
  41584. - Code span - Gen<Stmt> - [using(foo barLF] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:6
  41585. - SyntaxKind.Keyword;[using];
  41586. - SyntaxKind.LeftParenthesis;[(];
  41587. - SyntaxKind.Identifier;[foo];
  41588. - SyntaxKind.Whitespace;[ ];
  41589. - SyntaxKind.Identifier;[bar];
  41590. - SyntaxKind.NewLine;[LF];
  41591. +CSharpCodeBlock - [0..15)::15 - [using(foo barLF]
  41592. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  41593. + Transition;[<Missing>];
  41594. + CSharpStatementLiteral - [0..15)::15 - [using(foo barLF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  41595. + Keyword;[using];
  41596. + LeftParenthesis;[(];
  41597. + Identifier;[foo];
  41598. + Whitespace;[ ];
  41599. + Identifier;[bar];
  41600. + NewLine;[LF];
  41601. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesVerbatimStringAtEndOfFile.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesVerbatimStringAtEndOfFile.stree.txt
  41602. index e3dff85a705..6de37b9cacc 100644
  41603. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesVerbatimStringAtEndOfFile.stree.txt
  41604. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesVerbatimStringAtEndOfFile.stree.txt
  41605. @@ -1,16 +1,18 @@
  41606. -Statement block - Gen<None> - 60 - (0:0,0)
  41607. - Code span - Gen<Stmt> - [if(foo) { var foo = @"blah LFblah; LF<p>Foo</p>LFblah LFblah] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:14
  41608. - SyntaxKind.Keyword;[if];
  41609. - SyntaxKind.LeftParenthesis;[(];
  41610. - SyntaxKind.Identifier;[foo];
  41611. - SyntaxKind.RightParenthesis;[)];
  41612. - SyntaxKind.Whitespace;[ ];
  41613. - SyntaxKind.LeftBrace;[{];
  41614. - SyntaxKind.Whitespace;[ ];
  41615. - SyntaxKind.Identifier;[var];
  41616. - SyntaxKind.Whitespace;[ ];
  41617. - SyntaxKind.Identifier;[foo];
  41618. - SyntaxKind.Whitespace;[ ];
  41619. - SyntaxKind.Assign;[=];
  41620. - SyntaxKind.Whitespace;[ ];
  41621. - SyntaxKind.StringLiteral;[@"blah LFblah; LF<p>Foo</p>LFblah LFblah];RZ1000(20:0,20 [1] )
  41622. +CSharpCodeBlock - [0..60)::60 - [if(foo) { var foo = @"blah LFblah; LF<p>Foo</p>LFblah LFblah]
  41623. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  41624. + Transition;[<Missing>];
  41625. + CSharpStatementLiteral - [0..60)::60 - [if(foo) { var foo = @"blah LFblah; LF<p>Foo</p>LFblah LFblah] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  41626. + Keyword;[if];
  41627. + LeftParenthesis;[(];
  41628. + Identifier;[foo];
  41629. + RightParenthesis;[)];
  41630. + Whitespace;[ ];
  41631. + LeftBrace;[{];
  41632. + Whitespace;[ ];
  41633. + Identifier;[var];
  41634. + Whitespace;[ ];
  41635. + Identifier;[foo];
  41636. + Whitespace;[ ];
  41637. + Assign;[=];
  41638. + Whitespace;[ ];
  41639. + StringLiteral;[@"blah LFblah; LF<p>Foo</p>LFblah LFblah];RZ1000(20:0,20 [1] )
  41640. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesWhileClauseInDoStmtAtEOLWhenRecoveringFromMissingCloseParen.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesWhileClauseInDoStmtAtEOLWhenRecoveringFromMissingCloseParen.stree.txt
  41641. index 995a7e16d8d..d9a53191201 100644
  41642. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesWhileClauseInDoStmtAtEOLWhenRecoveringFromMissingCloseParen.stree.txt
  41643. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/TerminatesWhileClauseInDoStmtAtEOLWhenRecoveringFromMissingCloseParen.stree.txt
  41644. @@ -1,14 +1,16 @@
  41645. -Statement block - Gen<None> - 22 - (0:0,0)
  41646. - Code span - Gen<Stmt> - [do { } while(foo barLF] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:12
  41647. - SyntaxKind.Keyword;[do];
  41648. - SyntaxKind.Whitespace;[ ];
  41649. - SyntaxKind.LeftBrace;[{];
  41650. - SyntaxKind.Whitespace;[ ];
  41651. - SyntaxKind.RightBrace;[}];
  41652. - SyntaxKind.Whitespace;[ ];
  41653. - SyntaxKind.Keyword;[while];
  41654. - SyntaxKind.LeftParenthesis;[(];
  41655. - SyntaxKind.Identifier;[foo];
  41656. - SyntaxKind.Whitespace;[ ];
  41657. - SyntaxKind.Identifier;[bar];
  41658. - SyntaxKind.NewLine;[LF];
  41659. +CSharpCodeBlock - [0..22)::22 - [do { } while(foo barLF]
  41660. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  41661. + Transition;[<Missing>];
  41662. + CSharpStatementLiteral - [0..22)::22 - [do { } while(foo barLF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  41663. + Keyword;[do];
  41664. + Whitespace;[ ];
  41665. + LeftBrace;[{];
  41666. + Whitespace;[ ];
  41667. + RightBrace;[}];
  41668. + Whitespace;[ ];
  41669. + Keyword;[while];
  41670. + LeftParenthesis;[(];
  41671. + Identifier;[foo];
  41672. + Whitespace;[ ];
  41673. + Identifier;[bar];
  41674. + NewLine;[LF];
  41675. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/WithHelperDirectiveProducesError.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/WithHelperDirectiveProducesError.stree.txt
  41676. index 933270de61a..9f58fb8d4fc 100644
  41677. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/WithHelperDirectiveProducesError.stree.txt
  41678. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/WithHelperDirectiveProducesError.stree.txt
  41679. @@ -1,5 +1,8 @@
  41680. -Expression block - Gen<Expr> - 7 - (0:0,0)
  41681. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  41682. - SyntaxKind.Transition;[@];
  41683. - Code span - Gen<Expr> - [helper] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:1
  41684. - SyntaxKind.Identifier;[helper];
  41685. +CSharpCodeBlock - [0..7)::7 - [@helper]
  41686. + CSharpImplicitExpression - [0..7)::7
  41687. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41688. + Transition;[@];
  41689. + CSharpImplicitExpressionBody - [1..7)::6
  41690. + CSharpCodeBlock - [1..7)::6
  41691. + CSharpExpressionLiteral - [1..7)::6 - [helper] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  41692. + Identifier;[helper];
  41693. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/WithNestedCodeBlockProducesError.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/WithNestedCodeBlockProducesError.stree.txt
  41694. index c4e84ca7876..cd9063b5ddd 100644
  41695. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/WithNestedCodeBlockProducesError.stree.txt
  41696. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpErrorTest/WithNestedCodeBlockProducesError.stree.txt
  41697. @@ -1,20 +1,23 @@
  41698. -Statement block - Gen<None> - 11 - (0:0,0)
  41699. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  41700. - SyntaxKind.Transition;[@];
  41701. - Code span - Gen<Stmt> - [if { ] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:4
  41702. - SyntaxKind.Keyword;[if];
  41703. - SyntaxKind.Whitespace;[ ];
  41704. - SyntaxKind.LeftBrace;[{];
  41705. - SyntaxKind.Whitespace;[ ];
  41706. - Statement block - Gen<None> - 3 - (6:0,6)
  41707. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (6:0,6) - Tokens:1
  41708. - SyntaxKind.Transition;[@];
  41709. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (7:0,7) - Tokens:1
  41710. - SyntaxKind.LeftBrace;[{];
  41711. - Code span - Gen<Stmt> - [] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (8:0,8) - Tokens:1
  41712. - SyntaxKind.Unknown;[];
  41713. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (8:0,8) - Tokens:1
  41714. - SyntaxKind.RightBrace;[}];
  41715. - Code span - Gen<Stmt> - [ }] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:2
  41716. - SyntaxKind.Whitespace;[ ];
  41717. - SyntaxKind.RightBrace;[}];
  41718. +CSharpCodeBlock - [0..11)::11 - [@if { @{} }]
  41719. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41720. + Transition;[@];
  41721. + CSharpStatementLiteral - [1..6)::5 - [if { ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  41722. + Keyword;[if];
  41723. + Whitespace;[ ];
  41724. + LeftBrace;[{];
  41725. + Whitespace;[ ];
  41726. + CSharpCodeBlock - [6..9)::3
  41727. + CSharpStatement - [6..9)::3
  41728. + CSharpTransition - [6..7)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41729. + Transition;[@];
  41730. + CSharpStatementBody - [7..9)::2
  41731. + RazorMetaCode - [7..8)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41732. + LeftBrace;[{];
  41733. + CSharpCodeBlock - [8..8)::0
  41734. + CSharpStatementLiteral - [8..8)::0 - [] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  41735. + Marker;[];
  41736. + RazorMetaCode - [8..9)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41737. + RightBrace;[}];
  41738. + CSharpStatementLiteral - [9..11)::2 - [ }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  41739. + Whitespace;[ ];
  41740. + RightBrace;[}];
  41741. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptConsecutiveEscapedQuotesInNonVerbatimStrings.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptConsecutiveEscapedQuotesInNonVerbatimStrings.stree.txt
  41742. index 23eb18e3789..f49a76b0268 100644
  41743. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptConsecutiveEscapedQuotesInNonVerbatimStrings.stree.txt
  41744. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptConsecutiveEscapedQuotesInNonVerbatimStrings.stree.txt
  41745. @@ -1,9 +1,12 @@
  41746. -Expression block - Gen<Expr> - 9 - (0:0,0)
  41747. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  41748. - SyntaxKind.Transition;[@];
  41749. - MetaCode span - Gen<None> - [(] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  41750. - SyntaxKind.LeftParenthesis;[(];
  41751. - Code span - Gen<Expr> - ["\"\""] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  41752. - SyntaxKind.StringLiteral;["\"\""];
  41753. - MetaCode span - Gen<None> - [)] - SpanEditHandler;Accepts:None - (8:0,8) - Tokens:1
  41754. - SyntaxKind.RightParenthesis;[)];
  41755. +CSharpCodeBlock - [0..9)::9 - [@("\"\"")]
  41756. + CSharpExplicitExpression - [0..9)::9
  41757. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41758. + Transition;[@];
  41759. + CSharpExplicitExpressionBody - [1..9)::8
  41760. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41761. + LeftParenthesis;[(];
  41762. + CSharpCodeBlock - [2..8)::6
  41763. + CSharpExpressionLiteral - [2..8)::6 - ["\"\""] - Gen<Expr> - SpanEditHandler;Accepts:Any
  41764. + StringLiteral;["\"\""];
  41765. + RazorMetaCode - [8..9)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41766. + RightParenthesis;[)];
  41767. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptConsecutiveEscapedQuotesInVerbatimStrings.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptConsecutiveEscapedQuotesInVerbatimStrings.stree.txt
  41768. index 6b9fcb71979..e69f9b164d1 100644
  41769. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptConsecutiveEscapedQuotesInVerbatimStrings.stree.txt
  41770. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptConsecutiveEscapedQuotesInVerbatimStrings.stree.txt
  41771. @@ -1,9 +1,12 @@
  41772. -Expression block - Gen<Expr> - 10 - (0:0,0)
  41773. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  41774. - SyntaxKind.Transition;[@];
  41775. - MetaCode span - Gen<None> - [(] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  41776. - SyntaxKind.LeftParenthesis;[(];
  41777. - Code span - Gen<Expr> - [@""""""] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  41778. - SyntaxKind.StringLiteral;[@""""""];
  41779. - MetaCode span - Gen<None> - [)] - SpanEditHandler;Accepts:None - (9:0,9) - Tokens:1
  41780. - SyntaxKind.RightParenthesis;[)];
  41781. +CSharpCodeBlock - [0..10)::10 - [@(@"""""")]
  41782. + CSharpExplicitExpression - [0..10)::10
  41783. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41784. + Transition;[@];
  41785. + CSharpExplicitExpressionBody - [1..10)::9
  41786. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41787. + LeftParenthesis;[(];
  41788. + CSharpCodeBlock - [2..9)::7
  41789. + CSharpExpressionLiteral - [2..9)::7 - [@""""""] - Gen<Expr> - SpanEditHandler;Accepts:Any
  41790. + StringLiteral;[@""""""];
  41791. + RazorMetaCode - [9..10)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41792. + RightParenthesis;[)];
  41793. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptEscapedQuoteInNonVerbatimStrings.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptEscapedQuoteInNonVerbatimStrings.stree.txt
  41794. index f0cd4945837..c06f7074d8f 100644
  41795. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptEscapedQuoteInNonVerbatimStrings.stree.txt
  41796. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptEscapedQuoteInNonVerbatimStrings.stree.txt
  41797. @@ -1,9 +1,12 @@
  41798. -Expression block - Gen<Expr> - 7 - (0:0,0)
  41799. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  41800. - SyntaxKind.Transition;[@];
  41801. - MetaCode span - Gen<None> - [(] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  41802. - SyntaxKind.LeftParenthesis;[(];
  41803. - Code span - Gen<Expr> - ["\""] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  41804. - SyntaxKind.StringLiteral;["\""];
  41805. - MetaCode span - Gen<None> - [)] - SpanEditHandler;Accepts:None - (6:0,6) - Tokens:1
  41806. - SyntaxKind.RightParenthesis;[)];
  41807. +CSharpCodeBlock - [0..7)::7 - [@("\"")]
  41808. + CSharpExplicitExpression - [0..7)::7
  41809. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41810. + Transition;[@];
  41811. + CSharpExplicitExpressionBody - [1..7)::6
  41812. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41813. + LeftParenthesis;[(];
  41814. + CSharpCodeBlock - [2..6)::4
  41815. + CSharpExpressionLiteral - [2..6)::4 - ["\""] - Gen<Expr> - SpanEditHandler;Accepts:Any
  41816. + StringLiteral;["\""];
  41817. + RazorMetaCode - [6..7)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41818. + RightParenthesis;[)];
  41819. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptEscapedQuoteInVerbatimStrings.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptEscapedQuoteInVerbatimStrings.stree.txt
  41820. index 302eae7f863..cd3c0cbcf05 100644
  41821. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptEscapedQuoteInVerbatimStrings.stree.txt
  41822. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptEscapedQuoteInVerbatimStrings.stree.txt
  41823. @@ -1,9 +1,12 @@
  41824. -Expression block - Gen<Expr> - 8 - (0:0,0)
  41825. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  41826. - SyntaxKind.Transition;[@];
  41827. - MetaCode span - Gen<None> - [(] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  41828. - SyntaxKind.LeftParenthesis;[(];
  41829. - Code span - Gen<Expr> - [@""""] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  41830. - SyntaxKind.StringLiteral;[@""""];
  41831. - MetaCode span - Gen<None> - [)] - SpanEditHandler;Accepts:None - (7:0,7) - Tokens:1
  41832. - SyntaxKind.RightParenthesis;[)];
  41833. +CSharpCodeBlock - [0..8)::8 - [@(@"""")]
  41834. + CSharpExplicitExpression - [0..8)::8
  41835. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41836. + Transition;[@];
  41837. + CSharpExplicitExpressionBody - [1..8)::7
  41838. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41839. + LeftParenthesis;[(];
  41840. + CSharpCodeBlock - [2..7)::5
  41841. + CSharpExpressionLiteral - [2..7)::5 - [@""""] - Gen<Expr> - SpanEditHandler;Accepts:Any
  41842. + StringLiteral;[@""""];
  41843. + RazorMetaCode - [7..8)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41844. + RightParenthesis;[)];
  41845. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptMultiLineVerbatimStrings.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptMultiLineVerbatimStrings.stree.txt
  41846. index 031978a70fe..37413cbf137 100644
  41847. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptMultiLineVerbatimStrings.stree.txt
  41848. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptMultiLineVerbatimStrings.stree.txt
  41849. @@ -1,9 +1,12 @@
  41850. -Expression block - Gen<Expr> - 23 - (0:0,0)
  41851. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  41852. - SyntaxKind.Transition;[@];
  41853. - MetaCode span - Gen<None> - [(] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  41854. - SyntaxKind.LeftParenthesis;[(];
  41855. - Code span - Gen<Expr> - [@"LFFooLFBarLFBazLF"] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  41856. - SyntaxKind.StringLiteral;[@"LFFooLFBarLFBazLF"];
  41857. - MetaCode span - Gen<None> - [)] - SpanEditHandler;Accepts:None - (22:4,1) - Tokens:1
  41858. - SyntaxKind.RightParenthesis;[)];
  41859. +CSharpCodeBlock - [0..23)::23 - [@(@"LFFooLFBarLFBazLF")]
  41860. + CSharpExplicitExpression - [0..23)::23
  41861. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41862. + Transition;[@];
  41863. + CSharpExplicitExpressionBody - [1..23)::22
  41864. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41865. + LeftParenthesis;[(];
  41866. + CSharpCodeBlock - [2..22)::20
  41867. + CSharpExpressionLiteral - [2..22)::20 - [@"LFFooLFBarLFBazLF"] - Gen<Expr> - SpanEditHandler;Accepts:Any
  41868. + StringLiteral;[@"LFFooLFBarLFBazLF"];
  41869. + RazorMetaCode - [22..23)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41870. + RightParenthesis;[)];
  41871. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptMultipleEscapedQuotesInNonVerbatimStrings.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptMultipleEscapedQuotesInNonVerbatimStrings.stree.txt
  41872. index 196693b74a3..34c432a1d23 100644
  41873. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptMultipleEscapedQuotesInNonVerbatimStrings.stree.txt
  41874. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptMultipleEscapedQuotesInNonVerbatimStrings.stree.txt
  41875. @@ -1,9 +1,12 @@
  41876. -Expression block - Gen<Expr> - 21 - (0:0,0)
  41877. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  41878. - SyntaxKind.Transition;[@];
  41879. - MetaCode span - Gen<None> - [(] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  41880. - SyntaxKind.LeftParenthesis;[(];
  41881. - Code span - Gen<Expr> - ["\"hello, world\""] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  41882. - SyntaxKind.StringLiteral;["\"hello, world\""];
  41883. - MetaCode span - Gen<None> - [)] - SpanEditHandler;Accepts:None - (20:0,20) - Tokens:1
  41884. - SyntaxKind.RightParenthesis;[)];
  41885. +CSharpCodeBlock - [0..21)::21 - [@("\"hello, world\"")]
  41886. + CSharpExplicitExpression - [0..21)::21
  41887. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41888. + Transition;[@];
  41889. + CSharpExplicitExpressionBody - [1..21)::20
  41890. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41891. + LeftParenthesis;[(];
  41892. + CSharpCodeBlock - [2..20)::18
  41893. + CSharpExpressionLiteral - [2..20)::18 - ["\"hello, world\""] - Gen<Expr> - SpanEditHandler;Accepts:Any
  41894. + StringLiteral;["\"hello, world\""];
  41895. + RazorMetaCode - [20..21)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41896. + RightParenthesis;[)];
  41897. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptMultipleEscapedQuotesInVerbatimStrings.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptMultipleEscapedQuotesInVerbatimStrings.stree.txt
  41898. index 3db6a694d2d..0f798f47a8a 100644
  41899. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptMultipleEscapedQuotesInVerbatimStrings.stree.txt
  41900. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptMultipleEscapedQuotesInVerbatimStrings.stree.txt
  41901. @@ -1,9 +1,12 @@
  41902. -Expression block - Gen<Expr> - 22 - (0:0,0)
  41903. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  41904. - SyntaxKind.Transition;[@];
  41905. - MetaCode span - Gen<None> - [(] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  41906. - SyntaxKind.LeftParenthesis;[(];
  41907. - Code span - Gen<Expr> - [@"""hello, world"""] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  41908. - SyntaxKind.StringLiteral;[@"""hello, world"""];
  41909. - MetaCode span - Gen<None> - [)] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:1
  41910. - SyntaxKind.RightParenthesis;[)];
  41911. +CSharpCodeBlock - [0..22)::22 - [@(@"""hello, world""")]
  41912. + CSharpExplicitExpression - [0..22)::22
  41913. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41914. + Transition;[@];
  41915. + CSharpExplicitExpressionBody - [1..22)::21
  41916. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41917. + LeftParenthesis;[(];
  41918. + CSharpCodeBlock - [2..21)::19
  41919. + CSharpExpressionLiteral - [2..21)::19 - [@"""hello, world"""] - Gen<Expr> - SpanEditHandler;Accepts:Any
  41920. + StringLiteral;[@"""hello, world"""];
  41921. + RazorMetaCode - [21..22)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41922. + RightParenthesis;[)];
  41923. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptMultipleRepeatedEscapedQuoteInVerbatimStrings.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptMultipleRepeatedEscapedQuoteInVerbatimStrings.stree.txt
  41924. index 6b9fcb71979..e69f9b164d1 100644
  41925. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptMultipleRepeatedEscapedQuoteInVerbatimStrings.stree.txt
  41926. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldAcceptMultipleRepeatedEscapedQuoteInVerbatimStrings.stree.txt
  41927. @@ -1,9 +1,12 @@
  41928. -Expression block - Gen<Expr> - 10 - (0:0,0)
  41929. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  41930. - SyntaxKind.Transition;[@];
  41931. - MetaCode span - Gen<None> - [(] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  41932. - SyntaxKind.LeftParenthesis;[(];
  41933. - Code span - Gen<Expr> - [@""""""] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  41934. - SyntaxKind.StringLiteral;[@""""""];
  41935. - MetaCode span - Gen<None> - [)] - SpanEditHandler;Accepts:None - (9:0,9) - Tokens:1
  41936. - SyntaxKind.RightParenthesis;[)];
  41937. +CSharpCodeBlock - [0..10)::10 - [@(@"""""")]
  41938. + CSharpExplicitExpression - [0..10)::10
  41939. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41940. + Transition;[@];
  41941. + CSharpExplicitExpressionBody - [1..10)::9
  41942. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41943. + LeftParenthesis;[(];
  41944. + CSharpCodeBlock - [2..9)::7
  41945. + CSharpExpressionLiteral - [2..9)::7 - [@""""""] - Gen<Expr> - SpanEditHandler;Accepts:Any
  41946. + StringLiteral;[@""""""];
  41947. + RazorMetaCode - [9..10)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41948. + RightParenthesis;[)];
  41949. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldOutputZeroLengthCodeSpanIfEOFOccursAfterStartOfExplicitExpr.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldOutputZeroLengthCodeSpanIfEOFOccursAfterStartOfExplicitExpr.stree.txt
  41950. index 796bf693089..7d069c8afc5 100644
  41951. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldOutputZeroLengthCodeSpanIfEOFOccursAfterStartOfExplicitExpr.stree.txt
  41952. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldOutputZeroLengthCodeSpanIfEOFOccursAfterStartOfExplicitExpr.stree.txt
  41953. @@ -1,7 +1,12 @@
  41954. -Expression block - Gen<Expr> - 2 - (0:0,0)
  41955. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  41956. - SyntaxKind.Transition;[@];
  41957. - MetaCode span - Gen<None> - [(] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  41958. - SyntaxKind.LeftParenthesis;[(];
  41959. - Code span - Gen<Expr> - [] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  41960. - SyntaxKind.Unknown;[];
  41961. +CSharpCodeBlock - [0..2)::2 - [@(]
  41962. + CSharpExplicitExpression - [0..2)::2
  41963. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41964. + Transition;[@];
  41965. + CSharpExplicitExpressionBody - [1..2)::1
  41966. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41967. + LeftParenthesis;[(];
  41968. + CSharpCodeBlock - [2..2)::0
  41969. + CSharpExpressionLiteral - [2..2)::0 - [] - Gen<Expr> - SpanEditHandler;Accepts:Any
  41970. + Marker;[];
  41971. + RazorMetaCode - [2..2)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  41972. + RightParenthesis;[<Missing>];
  41973. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldOutputZeroLengthCodeSpanIfExplicitExpressionIsEmpty.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldOutputZeroLengthCodeSpanIfExplicitExpressionIsEmpty.stree.txt
  41974. index 86c59ee8dc4..ef8d7b9f41c 100644
  41975. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldOutputZeroLengthCodeSpanIfExplicitExpressionIsEmpty.stree.txt
  41976. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpExplicitExpressionTest/ShouldOutputZeroLengthCodeSpanIfExplicitExpressionIsEmpty.stree.txt
  41977. @@ -1,9 +1,12 @@
  41978. -Expression block - Gen<Expr> - 3 - (0:0,0)
  41979. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  41980. - SyntaxKind.Transition;[@];
  41981. - MetaCode span - Gen<None> - [(] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  41982. - SyntaxKind.LeftParenthesis;[(];
  41983. - Code span - Gen<Expr> - [] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  41984. - SyntaxKind.Unknown;[];
  41985. - MetaCode span - Gen<None> - [)] - SpanEditHandler;Accepts:None - (2:0,2) - Tokens:1
  41986. - SyntaxKind.RightParenthesis;[)];
  41987. +CSharpCodeBlock - [0..3)::3 - [@()]
  41988. + CSharpExplicitExpression - [0..3)::3
  41989. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41990. + Transition;[@];
  41991. + CSharpExplicitExpressionBody - [1..3)::2
  41992. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41993. + LeftParenthesis;[(];
  41994. + CSharpCodeBlock - [2..2)::0
  41995. + CSharpExpressionLiteral - [2..2)::0 - [] - Gen<Expr> - SpanEditHandler;Accepts:Any
  41996. + Marker;[];
  41997. + RazorMetaCode - [2..3)::1 - Gen<None> - SpanEditHandler;Accepts:None
  41998. + RightParenthesis;[)];
  41999. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/AcceptsNonEnglishCharactersThatAreValidIdentifiers.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/AcceptsNonEnglishCharactersThatAreValidIdentifiers.stree.txt
  42000. index c833af2ae0f..dc6218dac5b 100644
  42001. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/AcceptsNonEnglishCharactersThatAreValidIdentifiers.stree.txt
  42002. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/AcceptsNonEnglishCharactersThatAreValidIdentifiers.stree.txt
  42003. @@ -1,5 +1,8 @@
  42004. -Expression block - Gen<Expr> - 8 - (0:0,0)
  42005. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42006. - SyntaxKind.Transition;[@];
  42007. - Code span - Gen<Expr> - [हळूँजद॔] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:1
  42008. - SyntaxKind.Identifier;[हळूँजद॔];
  42009. +CSharpCodeBlock - [0..8)::8 - [@हळूँजद॔]
  42010. + CSharpImplicitExpression - [0..8)::8
  42011. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42012. + Transition;[@];
  42013. + CSharpImplicitExpressionBody - [1..8)::7
  42014. + CSharpCodeBlock - [1..8)::7
  42015. + CSharpExpressionLiteral - [1..8)::7 - [हळूँजद॔] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42016. + Identifier;[हळूँजद॔];
  42017. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/DoesNotAcceptSemicolonIfExpressionTerminatedByWhitespace.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/DoesNotAcceptSemicolonIfExpressionTerminatedByWhitespace.stree.txt
  42018. index d6126280d94..fae52862a52 100644
  42019. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/DoesNotAcceptSemicolonIfExpressionTerminatedByWhitespace.stree.txt
  42020. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/DoesNotAcceptSemicolonIfExpressionTerminatedByWhitespace.stree.txt
  42021. @@ -1,5 +1,8 @@
  42022. -Expression block - Gen<Expr> - 4 - (0:0,0)
  42023. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42024. - SyntaxKind.Transition;[@];
  42025. - Code span - Gen<Expr> - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:1
  42026. - SyntaxKind.Identifier;[foo];
  42027. +CSharpCodeBlock - [0..4)::4 - [@foo]
  42028. + CSharpImplicitExpression - [0..4)::4
  42029. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42030. + Transition;[@];
  42031. + CSharpImplicitExpressionBody - [1..4)::3
  42032. + CSharpCodeBlock - [1..4)::3
  42033. + CSharpExpressionLiteral - [1..4)::3 - [foo] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42034. + Identifier;[foo];
  42035. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/DoesNotIncludeDotAtEOFInImplicitExpression.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/DoesNotIncludeDotAtEOFInImplicitExpression.stree.txt
  42036. index ece2fdbfe0f..330a241eff7 100644
  42037. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/DoesNotIncludeDotAtEOFInImplicitExpression.stree.txt
  42038. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/DoesNotIncludeDotAtEOFInImplicitExpression.stree.txt
  42039. @@ -1,7 +1,10 @@
  42040. -Expression block - Gen<Expr> - 8 - (0:0,0)
  42041. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42042. - SyntaxKind.Transition;[@];
  42043. - Code span - Gen<Expr> - [foo.bar] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:3
  42044. - SyntaxKind.Identifier;[foo];
  42045. - SyntaxKind.Dot;[.];
  42046. - SyntaxKind.Identifier;[bar];
  42047. +CSharpCodeBlock - [0..8)::8 - [@foo.bar]
  42048. + CSharpImplicitExpression - [0..8)::8
  42049. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42050. + Transition;[@];
  42051. + CSharpImplicitExpressionBody - [1..8)::7
  42052. + CSharpCodeBlock - [1..8)::7
  42053. + CSharpExpressionLiteral - [1..8)::7 - [foo.bar] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42054. + Identifier;[foo];
  42055. + Dot;[.];
  42056. + Identifier;[bar];
  42057. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/DoesNotIncludeDotFollowedByInvalidIdentifierCharInImplicitExpr1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/DoesNotIncludeDotFollowedByInvalidIdentifierCharInImplicitExpr1.stree.txt
  42058. index ece2fdbfe0f..330a241eff7 100644
  42059. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/DoesNotIncludeDotFollowedByInvalidIdentifierCharInImplicitExpr1.stree.txt
  42060. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/DoesNotIncludeDotFollowedByInvalidIdentifierCharInImplicitExpr1.stree.txt
  42061. @@ -1,7 +1,10 @@
  42062. -Expression block - Gen<Expr> - 8 - (0:0,0)
  42063. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42064. - SyntaxKind.Transition;[@];
  42065. - Code span - Gen<Expr> - [foo.bar] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:3
  42066. - SyntaxKind.Identifier;[foo];
  42067. - SyntaxKind.Dot;[.];
  42068. - SyntaxKind.Identifier;[bar];
  42069. +CSharpCodeBlock - [0..8)::8 - [@foo.bar]
  42070. + CSharpImplicitExpression - [0..8)::8
  42071. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42072. + Transition;[@];
  42073. + CSharpImplicitExpressionBody - [1..8)::7
  42074. + CSharpCodeBlock - [1..8)::7
  42075. + CSharpExpressionLiteral - [1..8)::7 - [foo.bar] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42076. + Identifier;[foo];
  42077. + Dot;[.];
  42078. + Identifier;[bar];
  42079. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/DoesNotIncludeDotFollowedByInvalidIdentifierCharInImplicitExpr2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/DoesNotIncludeDotFollowedByInvalidIdentifierCharInImplicitExpr2.stree.txt
  42080. index ece2fdbfe0f..330a241eff7 100644
  42081. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/DoesNotIncludeDotFollowedByInvalidIdentifierCharInImplicitExpr2.stree.txt
  42082. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/DoesNotIncludeDotFollowedByInvalidIdentifierCharInImplicitExpr2.stree.txt
  42083. @@ -1,7 +1,10 @@
  42084. -Expression block - Gen<Expr> - 8 - (0:0,0)
  42085. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42086. - SyntaxKind.Transition;[@];
  42087. - Code span - Gen<Expr> - [foo.bar] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:3
  42088. - SyntaxKind.Identifier;[foo];
  42089. - SyntaxKind.Dot;[.];
  42090. - SyntaxKind.Identifier;[bar];
  42091. +CSharpCodeBlock - [0..8)::8 - [@foo.bar]
  42092. + CSharpImplicitExpression - [0..8)::8
  42093. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42094. + Transition;[@];
  42095. + CSharpImplicitExpressionBody - [1..8)::7
  42096. + CSharpCodeBlock - [1..8)::7
  42097. + CSharpExpressionLiteral - [1..8)::7 - [foo.bar] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42098. + Identifier;[foo];
  42099. + Dot;[.];
  42100. + Identifier;[bar];
  42101. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/DoesNotIncludeSemicolonAfterDot.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/DoesNotIncludeSemicolonAfterDot.stree.txt
  42102. index ece2fdbfe0f..330a241eff7 100644
  42103. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/DoesNotIncludeSemicolonAfterDot.stree.txt
  42104. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/DoesNotIncludeSemicolonAfterDot.stree.txt
  42105. @@ -1,7 +1,10 @@
  42106. -Expression block - Gen<Expr> - 8 - (0:0,0)
  42107. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42108. - SyntaxKind.Transition;[@];
  42109. - Code span - Gen<Expr> - [foo.bar] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:3
  42110. - SyntaxKind.Identifier;[foo];
  42111. - SyntaxKind.Dot;[.];
  42112. - SyntaxKind.Identifier;[bar];
  42113. +CSharpCodeBlock - [0..8)::8 - [@foo.bar]
  42114. + CSharpImplicitExpression - [0..8)::8
  42115. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42116. + Transition;[@];
  42117. + CSharpImplicitExpressionBody - [1..8)::7
  42118. + CSharpCodeBlock - [1..8)::7
  42119. + CSharpExpressionLiteral - [1..8)::7 - [foo.bar] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42120. + Identifier;[foo];
  42121. + Dot;[.];
  42122. + Identifier;[bar];
  42123. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/IgnoresSemicolonAtEndOfDottedIdentifiers.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/IgnoresSemicolonAtEndOfDottedIdentifiers.stree.txt
  42124. index 9b751618bf3..14504470ec0 100644
  42125. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/IgnoresSemicolonAtEndOfDottedIdentifiers.stree.txt
  42126. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/IgnoresSemicolonAtEndOfDottedIdentifiers.stree.txt
  42127. @@ -1,9 +1,12 @@
  42128. -Expression block - Gen<Expr> - 12 - (0:0,0)
  42129. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42130. - SyntaxKind.Transition;[@];
  42131. - Code span - Gen<Expr> - [foo.bar.baz] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:5
  42132. - SyntaxKind.Identifier;[foo];
  42133. - SyntaxKind.Dot;[.];
  42134. - SyntaxKind.Identifier;[bar];
  42135. - SyntaxKind.Dot;[.];
  42136. - SyntaxKind.Identifier;[baz];
  42137. +CSharpCodeBlock - [0..12)::12 - [@foo.bar.baz]
  42138. + CSharpImplicitExpression - [0..12)::12
  42139. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42140. + Transition;[@];
  42141. + CSharpImplicitExpressionBody - [1..12)::11
  42142. + CSharpCodeBlock - [1..12)::11
  42143. + CSharpExpressionLiteral - [1..12)::11 - [foo.bar.baz] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42144. + Identifier;[foo];
  42145. + Dot;[.];
  42146. + Identifier;[bar];
  42147. + Dot;[.];
  42148. + Identifier;[baz];
  42149. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/IgnoresSemicolonAtEndOfSimpleImplicitExpression.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/IgnoresSemicolonAtEndOfSimpleImplicitExpression.stree.txt
  42150. index d6126280d94..fae52862a52 100644
  42151. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/IgnoresSemicolonAtEndOfSimpleImplicitExpression.stree.txt
  42152. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/IgnoresSemicolonAtEndOfSimpleImplicitExpression.stree.txt
  42153. @@ -1,5 +1,8 @@
  42154. -Expression block - Gen<Expr> - 4 - (0:0,0)
  42155. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42156. - SyntaxKind.Transition;[@];
  42157. - Code span - Gen<Expr> - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:1
  42158. - SyntaxKind.Identifier;[foo];
  42159. +CSharpCodeBlock - [0..4)::4 - [@foo]
  42160. + CSharpImplicitExpression - [0..4)::4
  42161. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42162. + Transition;[@];
  42163. + CSharpImplicitExpressionBody - [1..4)::3
  42164. + CSharpCodeBlock - [1..4)::3
  42165. + CSharpExpressionLiteral - [1..4)::3 - [foo] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42166. + Identifier;[foo];
  42167. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/NestedImplicitExpression.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/NestedImplicitExpression.stree.txt
  42168. index f7400b9631f..3c07560c0df 100644
  42169. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/NestedImplicitExpression.stree.txt
  42170. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/NestedImplicitExpression.stree.txt
  42171. @@ -1,18 +1,23 @@
  42172. -Statement block - Gen<None> - 18 - (0:0,0)
  42173. - Code span - Gen<Stmt> - [if (true) { ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:8
  42174. - SyntaxKind.Keyword;[if];
  42175. - SyntaxKind.Whitespace;[ ];
  42176. - SyntaxKind.LeftParenthesis;[(];
  42177. - SyntaxKind.Keyword;[true];
  42178. - SyntaxKind.RightParenthesis;[)];
  42179. - SyntaxKind.Whitespace;[ ];
  42180. - SyntaxKind.LeftBrace;[{];
  42181. - SyntaxKind.Whitespace;[ ];
  42182. - Expression block - Gen<Expr> - 4 - (12:0,12)
  42183. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:1
  42184. - SyntaxKind.Transition;[@];
  42185. - Code span - Gen<Expr> - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K14 - (13:0,13) - Tokens:1
  42186. - SyntaxKind.Identifier;[foo];
  42187. - Code span - Gen<Stmt> - [ }] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:2
  42188. - SyntaxKind.Whitespace;[ ];
  42189. - SyntaxKind.RightBrace;[}];
  42190. +CSharpCodeBlock - [0..18)::18 - [if (true) { @foo }]
  42191. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  42192. + Transition;[<Missing>];
  42193. + CSharpStatementLiteral - [0..12)::12 - [if (true) { ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  42194. + Keyword;[if];
  42195. + Whitespace;[ ];
  42196. + LeftParenthesis;[(];
  42197. + Keyword;[true];
  42198. + RightParenthesis;[)];
  42199. + Whitespace;[ ];
  42200. + LeftBrace;[{];
  42201. + Whitespace;[ ];
  42202. + CSharpCodeBlock - [12..16)::4
  42203. + CSharpImplicitExpression - [12..16)::4
  42204. + CSharpTransition - [12..13)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42205. + Transition;[@];
  42206. + CSharpImplicitExpressionBody - [13..16)::3
  42207. + CSharpCodeBlock - [13..16)::3
  42208. + CSharpExpressionLiteral - [13..16)::3 - [foo] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K14
  42209. + Identifier;[foo];
  42210. + CSharpStatementLiteral - [16..18)::2 - [ }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  42211. + Whitespace;[ ];
  42212. + RightBrace;[}];
  42213. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/OutputExpressionIfModuleTokenNotFollowedByBrace.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/OutputExpressionIfModuleTokenNotFollowedByBrace.stree.txt
  42214. index 92f959c82f9..1bd76d3d010 100644
  42215. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/OutputExpressionIfModuleTokenNotFollowedByBrace.stree.txt
  42216. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/OutputExpressionIfModuleTokenNotFollowedByBrace.stree.txt
  42217. @@ -1,9 +1,12 @@
  42218. -Expression block - Gen<Expr> - 13 - (0:0,0)
  42219. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42220. - SyntaxKind.Transition;[@];
  42221. - Code span - Gen<Expr> - [module.foo()] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:5
  42222. - SyntaxKind.Identifier;[module];
  42223. - SyntaxKind.Dot;[.];
  42224. - SyntaxKind.Identifier;[foo];
  42225. - SyntaxKind.LeftParenthesis;[(];
  42226. - SyntaxKind.RightParenthesis;[)];
  42227. +CSharpCodeBlock - [0..13)::13 - [@module.foo()]
  42228. + CSharpImplicitExpression - [0..13)::13
  42229. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42230. + Transition;[@];
  42231. + CSharpImplicitExpressionBody - [1..13)::12
  42232. + CSharpCodeBlock - [1..13)::12
  42233. + CSharpExpressionLiteral - [1..13)::12 - [module.foo()] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42234. + Identifier;[module];
  42235. + Dot;[.];
  42236. + Identifier;[foo];
  42237. + LeftParenthesis;[(];
  42238. + RightParenthesis;[)];
  42239. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/OutputsZeroLengthCodeSpanIfEOFOccursAfterTransition.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/OutputsZeroLengthCodeSpanIfEOFOccursAfterTransition.stree.txt
  42240. index 40da231bf0f..ba1a0451b32 100644
  42241. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/OutputsZeroLengthCodeSpanIfEOFOccursAfterTransition.stree.txt
  42242. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/OutputsZeroLengthCodeSpanIfEOFOccursAfterTransition.stree.txt
  42243. @@ -1,5 +1,8 @@
  42244. -Expression block - Gen<Expr> - 1 - (0:0,0)
  42245. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42246. - SyntaxKind.Transition;[@];
  42247. - Code span - Gen<Expr> - [] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:1
  42248. - SyntaxKind.Unknown;[];
  42249. +CSharpCodeBlock - [0..1)::1 - [@]
  42250. + CSharpImplicitExpression - [0..1)::1
  42251. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42252. + Transition;[@];
  42253. + CSharpImplicitExpressionBody - [1..1)::0
  42254. + CSharpCodeBlock - [1..1)::0
  42255. + CSharpExpressionLiteral - [1..1)::0 - [] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42256. + Marker;[];
  42257. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/OutputsZeroLengthCodeSpanIfInvalidCharacterFollowsTransition.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/OutputsZeroLengthCodeSpanIfInvalidCharacterFollowsTransition.stree.txt
  42258. index 40da231bf0f..ba1a0451b32 100644
  42259. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/OutputsZeroLengthCodeSpanIfInvalidCharacterFollowsTransition.stree.txt
  42260. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/OutputsZeroLengthCodeSpanIfInvalidCharacterFollowsTransition.stree.txt
  42261. @@ -1,5 +1,8 @@
  42262. -Expression block - Gen<Expr> - 1 - (0:0,0)
  42263. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42264. - SyntaxKind.Transition;[@];
  42265. - Code span - Gen<Expr> - [] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:1
  42266. - SyntaxKind.Unknown;[];
  42267. +CSharpCodeBlock - [0..1)::1 - [@]
  42268. + CSharpImplicitExpression - [0..1)::1
  42269. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42270. + Transition;[@];
  42271. + CSharpImplicitExpressionBody - [1..1)::0
  42272. + CSharpCodeBlock - [1..1)::0
  42273. + CSharpExpressionLiteral - [1..1)::0 - [] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42274. + Marker;[];
  42275. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesDottedIdentifiersAsImplicitExpression.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesDottedIdentifiersAsImplicitExpression.stree.txt
  42276. index 9b751618bf3..14504470ec0 100644
  42277. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesDottedIdentifiersAsImplicitExpression.stree.txt
  42278. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesDottedIdentifiersAsImplicitExpression.stree.txt
  42279. @@ -1,9 +1,12 @@
  42280. -Expression block - Gen<Expr> - 12 - (0:0,0)
  42281. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42282. - SyntaxKind.Transition;[@];
  42283. - Code span - Gen<Expr> - [foo.bar.baz] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:5
  42284. - SyntaxKind.Identifier;[foo];
  42285. - SyntaxKind.Dot;[.];
  42286. - SyntaxKind.Identifier;[bar];
  42287. - SyntaxKind.Dot;[.];
  42288. - SyntaxKind.Identifier;[baz];
  42289. +CSharpCodeBlock - [0..12)::12 - [@foo.bar.baz]
  42290. + CSharpImplicitExpression - [0..12)::12
  42291. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42292. + Transition;[@];
  42293. + CSharpImplicitExpressionBody - [1..12)::11
  42294. + CSharpCodeBlock - [1..12)::11
  42295. + CSharpExpressionLiteral - [1..12)::11 - [foo.bar.baz] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42296. + Identifier;[foo];
  42297. + Dot;[.];
  42298. + Identifier;[bar];
  42299. + Dot;[.];
  42300. + Identifier;[baz];
  42301. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket1.stree.txt
  42302. index b18c1f269f4..d192fdd05bb 100644
  42303. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket1.stree.txt
  42304. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket1.stree.txt
  42305. @@ -1,5 +1,8 @@
  42306. -Expression block - Gen<Expr> - 4 - (0:0,0)
  42307. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42308. - SyntaxKind.Transition;[@];
  42309. - Code span - Gen<Expr> - [val] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:1
  42310. - SyntaxKind.Identifier;[val];
  42311. +CSharpCodeBlock - [0..4)::4 - [@val]
  42312. + CSharpImplicitExpression - [0..4)::4
  42313. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42314. + Transition;[@];
  42315. + CSharpImplicitExpressionBody - [1..4)::3
  42316. + CSharpCodeBlock - [1..4)::3
  42317. + CSharpExpressionLiteral - [1..4)::3 - [val] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42318. + Identifier;[val];
  42319. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket10.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket10.stree.txt
  42320. index bf5897cfb6e..e0ab082b483 100644
  42321. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket10.stree.txt
  42322. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket10.stree.txt
  42323. @@ -1,10 +1,13 @@
  42324. -Expression block - Gen<Expr> - 9 - (0:0,0)
  42325. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42326. - SyntaxKind.Transition;[@];
  42327. - Code span - Gen<Expr> - [val?[-1]] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:6
  42328. - SyntaxKind.Identifier;[val];
  42329. - SyntaxKind.QuestionMark;[?];
  42330. - SyntaxKind.LeftBracket;[[];
  42331. - SyntaxKind.Minus;[-];
  42332. - SyntaxKind.IntegerLiteral;[1];
  42333. - SyntaxKind.RightBracket;[]];
  42334. +CSharpCodeBlock - [0..9)::9 - [@val?[-1]]
  42335. + CSharpImplicitExpression - [0..9)::9
  42336. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42337. + Transition;[@];
  42338. + CSharpImplicitExpressionBody - [1..9)::8
  42339. + CSharpCodeBlock - [1..9)::8
  42340. + CSharpExpressionLiteral - [1..9)::8 - [val?[-1]] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42341. + Identifier;[val];
  42342. + QuestionMark;[?];
  42343. + LeftBracket;[[];
  42344. + Minus;[-];
  42345. + IntegerLiteral;[1];
  42346. + RightBracket;[]];
  42347. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket11.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket11.stree.txt
  42348. index 646f168e3a2..dfc4db003b2 100644
  42349. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket11.stree.txt
  42350. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket11.stree.txt
  42351. @@ -1,12 +1,15 @@
  42352. -Expression block - Gen<Expr> - 15 - (0:0,0)
  42353. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42354. - SyntaxKind.Transition;[@];
  42355. - Code span - Gen<Expr> - [val?[abc]?[def] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:8
  42356. - SyntaxKind.Identifier;[val];
  42357. - SyntaxKind.QuestionMark;[?];
  42358. - SyntaxKind.LeftBracket;[[];
  42359. - SyntaxKind.Identifier;[abc];
  42360. - SyntaxKind.RightBracket;[]];
  42361. - SyntaxKind.QuestionMark;[?];
  42362. - SyntaxKind.LeftBracket;[[];
  42363. - SyntaxKind.Identifier;[def];
  42364. +CSharpCodeBlock - [0..15)::15 - [@val?[abc]?[def]
  42365. + CSharpImplicitExpression - [0..15)::15
  42366. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42367. + Transition;[@];
  42368. + CSharpImplicitExpressionBody - [1..15)::14
  42369. + CSharpCodeBlock - [1..15)::14
  42370. + CSharpExpressionLiteral - [1..15)::14 - [val?[abc]?[def] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14
  42371. + Identifier;[val];
  42372. + QuestionMark;[?];
  42373. + LeftBracket;[[];
  42374. + Identifier;[abc];
  42375. + RightBracket;[]];
  42376. + QuestionMark;[?];
  42377. + LeftBracket;[[];
  42378. + Identifier;[def];
  42379. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket12.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket12.stree.txt
  42380. index fdeae1b84d4..37ae5f3343d 100644
  42381. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket12.stree.txt
  42382. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket12.stree.txt
  42383. @@ -1,13 +1,16 @@
  42384. -Expression block - Gen<Expr> - 14 - (0:0,0)
  42385. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42386. - SyntaxKind.Transition;[@];
  42387. - Code span - Gen<Expr> - [val?[abc]?[2]] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:9
  42388. - SyntaxKind.Identifier;[val];
  42389. - SyntaxKind.QuestionMark;[?];
  42390. - SyntaxKind.LeftBracket;[[];
  42391. - SyntaxKind.Identifier;[abc];
  42392. - SyntaxKind.RightBracket;[]];
  42393. - SyntaxKind.QuestionMark;[?];
  42394. - SyntaxKind.LeftBracket;[[];
  42395. - SyntaxKind.IntegerLiteral;[2];
  42396. - SyntaxKind.RightBracket;[]];
  42397. +CSharpCodeBlock - [0..14)::14 - [@val?[abc]?[2]]
  42398. + CSharpImplicitExpression - [0..14)::14
  42399. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42400. + Transition;[@];
  42401. + CSharpImplicitExpressionBody - [1..14)::13
  42402. + CSharpCodeBlock - [1..14)::13
  42403. + CSharpExpressionLiteral - [1..14)::13 - [val?[abc]?[2]] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42404. + Identifier;[val];
  42405. + QuestionMark;[?];
  42406. + LeftBracket;[[];
  42407. + Identifier;[abc];
  42408. + RightBracket;[]];
  42409. + QuestionMark;[?];
  42410. + LeftBracket;[[];
  42411. + IntegerLiteral;[2];
  42412. + RightBracket;[]];
  42413. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket13.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket13.stree.txt
  42414. index 6095a9ffe4b..12942f3d782 100644
  42415. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket13.stree.txt
  42416. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket13.stree.txt
  42417. @@ -1,16 +1,19 @@
  42418. -Expression block - Gen<Expr> - 22 - (0:0,0)
  42419. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42420. - SyntaxKind.Transition;[@];
  42421. - Code span - Gen<Expr> - [val?[abc]?.more?[def]] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:12
  42422. - SyntaxKind.Identifier;[val];
  42423. - SyntaxKind.QuestionMark;[?];
  42424. - SyntaxKind.LeftBracket;[[];
  42425. - SyntaxKind.Identifier;[abc];
  42426. - SyntaxKind.RightBracket;[]];
  42427. - SyntaxKind.QuestionMark;[?];
  42428. - SyntaxKind.Dot;[.];
  42429. - SyntaxKind.Identifier;[more];
  42430. - SyntaxKind.QuestionMark;[?];
  42431. - SyntaxKind.LeftBracket;[[];
  42432. - SyntaxKind.Identifier;[def];
  42433. - SyntaxKind.RightBracket;[]];
  42434. +CSharpCodeBlock - [0..22)::22 - [@val?[abc]?.more?[def]]
  42435. + CSharpImplicitExpression - [0..22)::22
  42436. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42437. + Transition;[@];
  42438. + CSharpImplicitExpressionBody - [1..22)::21
  42439. + CSharpCodeBlock - [1..22)::21
  42440. + CSharpExpressionLiteral - [1..22)::21 - [val?[abc]?.more?[def]] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42441. + Identifier;[val];
  42442. + QuestionMark;[?];
  42443. + LeftBracket;[[];
  42444. + Identifier;[abc];
  42445. + RightBracket;[]];
  42446. + QuestionMark;[?];
  42447. + Dot;[.];
  42448. + Identifier;[more];
  42449. + QuestionMark;[?];
  42450. + LeftBracket;[[];
  42451. + Identifier;[def];
  42452. + RightBracket;[]];
  42453. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket14.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket14.stree.txt
  42454. index 05179539662..ee022171e8a 100644
  42455. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket14.stree.txt
  42456. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket14.stree.txt
  42457. @@ -1,15 +1,18 @@
  42458. -Expression block - Gen<Expr> - 21 - (0:0,0)
  42459. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42460. - SyntaxKind.Transition;[@];
  42461. - Code span - Gen<Expr> - [val?[abc]?.more?.abc] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:11
  42462. - SyntaxKind.Identifier;[val];
  42463. - SyntaxKind.QuestionMark;[?];
  42464. - SyntaxKind.LeftBracket;[[];
  42465. - SyntaxKind.Identifier;[abc];
  42466. - SyntaxKind.RightBracket;[]];
  42467. - SyntaxKind.QuestionMark;[?];
  42468. - SyntaxKind.Dot;[.];
  42469. - SyntaxKind.Identifier;[more];
  42470. - SyntaxKind.QuestionMark;[?];
  42471. - SyntaxKind.Dot;[.];
  42472. - SyntaxKind.Identifier;[abc];
  42473. +CSharpCodeBlock - [0..21)::21 - [@val?[abc]?.more?.abc]
  42474. + CSharpImplicitExpression - [0..21)::21
  42475. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42476. + Transition;[@];
  42477. + CSharpImplicitExpressionBody - [1..21)::20
  42478. + CSharpCodeBlock - [1..21)::20
  42479. + CSharpExpressionLiteral - [1..21)::20 - [val?[abc]?.more?.abc] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42480. + Identifier;[val];
  42481. + QuestionMark;[?];
  42482. + LeftBracket;[[];
  42483. + Identifier;[abc];
  42484. + RightBracket;[]];
  42485. + QuestionMark;[?];
  42486. + Dot;[.];
  42487. + Identifier;[more];
  42488. + QuestionMark;[?];
  42489. + Dot;[.];
  42490. + Identifier;[abc];
  42491. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket15.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket15.stree.txt
  42492. index da502209c5f..1cfcda0fd36 100644
  42493. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket15.stree.txt
  42494. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket15.stree.txt
  42495. @@ -1,13 +1,16 @@
  42496. -Expression block - Gen<Expr> - 19 - (0:0,0)
  42497. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42498. - SyntaxKind.Transition;[@];
  42499. - Code span - Gen<Expr> - [val?[null ?? true]] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:9
  42500. - SyntaxKind.Identifier;[val];
  42501. - SyntaxKind.QuestionMark;[?];
  42502. - SyntaxKind.LeftBracket;[[];
  42503. - SyntaxKind.Keyword;[null];
  42504. - SyntaxKind.Whitespace;[ ];
  42505. - SyntaxKind.NullCoalesce;[??];
  42506. - SyntaxKind.Whitespace;[ ];
  42507. - SyntaxKind.Keyword;[true];
  42508. - SyntaxKind.RightBracket;[]];
  42509. +CSharpCodeBlock - [0..19)::19 - [@val?[null ?? true]]
  42510. + CSharpImplicitExpression - [0..19)::19
  42511. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42512. + Transition;[@];
  42513. + CSharpImplicitExpressionBody - [1..19)::18
  42514. + CSharpCodeBlock - [1..19)::18
  42515. + CSharpExpressionLiteral - [1..19)::18 - [val?[null ?? true]] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42516. + Identifier;[val];
  42517. + QuestionMark;[?];
  42518. + LeftBracket;[[];
  42519. + Keyword;[null];
  42520. + Whitespace;[ ];
  42521. + NullCoalesce;[??];
  42522. + Whitespace;[ ];
  42523. + Keyword;[true];
  42524. + RightBracket;[]];
  42525. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket16.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket16.stree.txt
  42526. index e30c74d598f..d6fb60a93eb 100644
  42527. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket16.stree.txt
  42528. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket16.stree.txt
  42529. @@ -1,17 +1,20 @@
  42530. -Expression block - Gen<Expr> - 20 - (0:0,0)
  42531. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42532. - SyntaxKind.Transition;[@];
  42533. - Code span - Gen<Expr> - [val?[abc?.gef?[-1]]] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:13
  42534. - SyntaxKind.Identifier;[val];
  42535. - SyntaxKind.QuestionMark;[?];
  42536. - SyntaxKind.LeftBracket;[[];
  42537. - SyntaxKind.Identifier;[abc];
  42538. - SyntaxKind.QuestionMark;[?];
  42539. - SyntaxKind.Dot;[.];
  42540. - SyntaxKind.Identifier;[gef];
  42541. - SyntaxKind.QuestionMark;[?];
  42542. - SyntaxKind.LeftBracket;[[];
  42543. - SyntaxKind.Minus;[-];
  42544. - SyntaxKind.IntegerLiteral;[1];
  42545. - SyntaxKind.RightBracket;[]];
  42546. - SyntaxKind.RightBracket;[]];
  42547. +CSharpCodeBlock - [0..20)::20 - [@val?[abc?.gef?[-1]]]
  42548. + CSharpImplicitExpression - [0..20)::20
  42549. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42550. + Transition;[@];
  42551. + CSharpImplicitExpressionBody - [1..20)::19
  42552. + CSharpCodeBlock - [1..20)::19
  42553. + CSharpExpressionLiteral - [1..20)::19 - [val?[abc?.gef?[-1]]] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42554. + Identifier;[val];
  42555. + QuestionMark;[?];
  42556. + LeftBracket;[[];
  42557. + Identifier;[abc];
  42558. + QuestionMark;[?];
  42559. + Dot;[.];
  42560. + Identifier;[gef];
  42561. + QuestionMark;[?];
  42562. + LeftBracket;[[];
  42563. + Minus;[-];
  42564. + IntegerLiteral;[1];
  42565. + RightBracket;[]];
  42566. + RightBracket;[]];
  42567. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket2.stree.txt
  42568. index b18c1f269f4..d192fdd05bb 100644
  42569. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket2.stree.txt
  42570. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket2.stree.txt
  42571. @@ -1,5 +1,8 @@
  42572. -Expression block - Gen<Expr> - 4 - (0:0,0)
  42573. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42574. - SyntaxKind.Transition;[@];
  42575. - Code span - Gen<Expr> - [val] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:1
  42576. - SyntaxKind.Identifier;[val];
  42577. +CSharpCodeBlock - [0..4)::4 - [@val]
  42578. + CSharpImplicitExpression - [0..4)::4
  42579. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42580. + Transition;[@];
  42581. + CSharpImplicitExpressionBody - [1..4)::3
  42582. + CSharpCodeBlock - [1..4)::3
  42583. + CSharpExpressionLiteral - [1..4)::3 - [val] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42584. + Identifier;[val];
  42585. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket3.stree.txt
  42586. index c0e4634e0e4..5de915db6fc 100644
  42587. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket3.stree.txt
  42588. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket3.stree.txt
  42589. @@ -1,7 +1,10 @@
  42590. -Expression block - Gen<Expr> - 6 - (0:0,0)
  42591. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42592. - SyntaxKind.Transition;[@];
  42593. - Code span - Gen<Expr> - [val?[] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:3
  42594. - SyntaxKind.Identifier;[val];
  42595. - SyntaxKind.QuestionMark;[?];
  42596. - SyntaxKind.LeftBracket;[[];
  42597. +CSharpCodeBlock - [0..6)::6 - [@val?[]
  42598. + CSharpImplicitExpression - [0..6)::6
  42599. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42600. + Transition;[@];
  42601. + CSharpImplicitExpressionBody - [1..6)::5
  42602. + CSharpCodeBlock - [1..6)::5
  42603. + CSharpExpressionLiteral - [1..6)::5 - [val?[] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14
  42604. + Identifier;[val];
  42605. + QuestionMark;[?];
  42606. + LeftBracket;[[];
  42607. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket4.stree.txt
  42608. index b18c1f269f4..d192fdd05bb 100644
  42609. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket4.stree.txt
  42610. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket4.stree.txt
  42611. @@ -1,5 +1,8 @@
  42612. -Expression block - Gen<Expr> - 4 - (0:0,0)
  42613. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42614. - SyntaxKind.Transition;[@];
  42615. - Code span - Gen<Expr> - [val] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:1
  42616. - SyntaxKind.Identifier;[val];
  42617. +CSharpCodeBlock - [0..4)::4 - [@val]
  42618. + CSharpImplicitExpression - [0..4)::4
  42619. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42620. + Transition;[@];
  42621. + CSharpImplicitExpressionBody - [1..4)::3
  42622. + CSharpCodeBlock - [1..4)::3
  42623. + CSharpExpressionLiteral - [1..4)::3 - [val] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42624. + Identifier;[val];
  42625. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket5.stree.txt
  42626. index 0fc1f37efc2..c588b955059 100644
  42627. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket5.stree.txt
  42628. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket5.stree.txt
  42629. @@ -1,8 +1,11 @@
  42630. -Expression block - Gen<Expr> - 10 - (0:0,0)
  42631. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42632. - SyntaxKind.Transition;[@];
  42633. - Code span - Gen<Expr> - [val?[more] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:4
  42634. - SyntaxKind.Identifier;[val];
  42635. - SyntaxKind.QuestionMark;[?];
  42636. - SyntaxKind.LeftBracket;[[];
  42637. - SyntaxKind.Identifier;[more];
  42638. +CSharpCodeBlock - [0..10)::10 - [@val?[more]
  42639. + CSharpImplicitExpression - [0..10)::10
  42640. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42641. + Transition;[@];
  42642. + CSharpImplicitExpressionBody - [1..10)::9
  42643. + CSharpCodeBlock - [1..10)::9
  42644. + CSharpExpressionLiteral - [1..10)::9 - [val?[more] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14
  42645. + Identifier;[val];
  42646. + QuestionMark;[?];
  42647. + LeftBracket;[[];
  42648. + Identifier;[more];
  42649. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket6.stree.txt
  42650. index ae96d51b058..26101c41b38 100644
  42651. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket6.stree.txt
  42652. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket6.stree.txt
  42653. @@ -1,9 +1,12 @@
  42654. -Expression block - Gen<Expr> - 8 - (0:0,0)
  42655. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42656. - SyntaxKind.Transition;[@];
  42657. - Code span - Gen<Expr> - [val?[0]] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:5
  42658. - SyntaxKind.Identifier;[val];
  42659. - SyntaxKind.QuestionMark;[?];
  42660. - SyntaxKind.LeftBracket;[[];
  42661. - SyntaxKind.IntegerLiteral;[0];
  42662. - SyntaxKind.RightBracket;[]];
  42663. +CSharpCodeBlock - [0..8)::8 - [@val?[0]]
  42664. + CSharpImplicitExpression - [0..8)::8
  42665. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42666. + Transition;[@];
  42667. + CSharpImplicitExpressionBody - [1..8)::7
  42668. + CSharpCodeBlock - [1..8)::7
  42669. + CSharpExpressionLiteral - [1..8)::7 - [val?[0]] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42670. + Identifier;[val];
  42671. + QuestionMark;[?];
  42672. + LeftBracket;[[];
  42673. + IntegerLiteral;[0];
  42674. + RightBracket;[]];
  42675. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket7.stree.txt
  42676. index c0e4634e0e4..5de915db6fc 100644
  42677. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket7.stree.txt
  42678. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket7.stree.txt
  42679. @@ -1,7 +1,10 @@
  42680. -Expression block - Gen<Expr> - 6 - (0:0,0)
  42681. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42682. - SyntaxKind.Transition;[@];
  42683. - Code span - Gen<Expr> - [val?[] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:3
  42684. - SyntaxKind.Identifier;[val];
  42685. - SyntaxKind.QuestionMark;[?];
  42686. - SyntaxKind.LeftBracket;[[];
  42687. +CSharpCodeBlock - [0..6)::6 - [@val?[]
  42688. + CSharpImplicitExpression - [0..6)::6
  42689. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42690. + Transition;[@];
  42691. + CSharpImplicitExpressionBody - [1..6)::5
  42692. + CSharpCodeBlock - [1..6)::5
  42693. + CSharpExpressionLiteral - [1..6)::5 - [val?[] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14
  42694. + Identifier;[val];
  42695. + QuestionMark;[?];
  42696. + LeftBracket;[[];
  42697. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket8.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket8.stree.txt
  42698. index c58999c69b4..2c87b8e4753 100644
  42699. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket8.stree.txt
  42700. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket8.stree.txt
  42701. @@ -1,9 +1,12 @@
  42702. -Expression block - Gen<Expr> - 11 - (0:0,0)
  42703. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42704. - SyntaxKind.Transition;[@];
  42705. - Code span - Gen<Expr> - [val?[more.] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:5
  42706. - SyntaxKind.Identifier;[val];
  42707. - SyntaxKind.QuestionMark;[?];
  42708. - SyntaxKind.LeftBracket;[[];
  42709. - SyntaxKind.Identifier;[more];
  42710. - SyntaxKind.Dot;[.];
  42711. +CSharpCodeBlock - [0..11)::11 - [@val?[more.]
  42712. + CSharpImplicitExpression - [0..11)::11
  42713. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42714. + Transition;[@];
  42715. + CSharpImplicitExpressionBody - [1..11)::10
  42716. + CSharpCodeBlock - [1..11)::10
  42717. + CSharpExpressionLiteral - [1..11)::10 - [val?[more.] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14
  42718. + Identifier;[val];
  42719. + QuestionMark;[?];
  42720. + LeftBracket;[[];
  42721. + Identifier;[more];
  42722. + Dot;[.];
  42723. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket9.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket9.stree.txt
  42724. index b18c1f269f4..d192fdd05bb 100644
  42725. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket9.stree.txt
  42726. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Bracket9.stree.txt
  42727. @@ -1,5 +1,8 @@
  42728. -Expression block - Gen<Expr> - 4 - (0:0,0)
  42729. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42730. - SyntaxKind.Transition;[@];
  42731. - Code span - Gen<Expr> - [val] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:1
  42732. - SyntaxKind.Identifier;[val];
  42733. +CSharpCodeBlock - [0..4)::4 - [@val]
  42734. + CSharpImplicitExpression - [0..4)::4
  42735. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42736. + Transition;[@];
  42737. + CSharpImplicitExpressionBody - [1..4)::3
  42738. + CSharpCodeBlock - [1..4)::3
  42739. + CSharpExpressionLiteral - [1..4)::3 - [val] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42740. + Identifier;[val];
  42741. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot1.stree.txt
  42742. index b18c1f269f4..d192fdd05bb 100644
  42743. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot1.stree.txt
  42744. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot1.stree.txt
  42745. @@ -1,5 +1,8 @@
  42746. -Expression block - Gen<Expr> - 4 - (0:0,0)
  42747. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42748. - SyntaxKind.Transition;[@];
  42749. - Code span - Gen<Expr> - [val] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:1
  42750. - SyntaxKind.Identifier;[val];
  42751. +CSharpCodeBlock - [0..4)::4 - [@val]
  42752. + CSharpImplicitExpression - [0..4)::4
  42753. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42754. + Transition;[@];
  42755. + CSharpImplicitExpressionBody - [1..4)::3
  42756. + CSharpCodeBlock - [1..4)::3
  42757. + CSharpExpressionLiteral - [1..4)::3 - [val] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42758. + Identifier;[val];
  42759. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot10.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot10.stree.txt
  42760. index ac416a7286f..6e31b6d8037 100644
  42761. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot10.stree.txt
  42762. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot10.stree.txt
  42763. @@ -1,8 +1,11 @@
  42764. -Expression block - Gen<Expr> - 10 - (0:0,0)
  42765. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42766. - SyntaxKind.Transition;[@];
  42767. - Code span - Gen<Expr> - [val?.more] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:4
  42768. - SyntaxKind.Identifier;[val];
  42769. - SyntaxKind.QuestionMark;[?];
  42770. - SyntaxKind.Dot;[.];
  42771. - SyntaxKind.Identifier;[more];
  42772. +CSharpCodeBlock - [0..10)::10 - [@val?.more]
  42773. + CSharpImplicitExpression - [0..10)::10
  42774. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42775. + Transition;[@];
  42776. + CSharpImplicitExpressionBody - [1..10)::9
  42777. + CSharpCodeBlock - [1..10)::9
  42778. + CSharpExpressionLiteral - [1..10)::9 - [val?.more] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42779. + Identifier;[val];
  42780. + QuestionMark;[?];
  42781. + Dot;[.];
  42782. + Identifier;[more];
  42783. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot11.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot11.stree.txt
  42784. index b18c1f269f4..d192fdd05bb 100644
  42785. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot11.stree.txt
  42786. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot11.stree.txt
  42787. @@ -1,5 +1,8 @@
  42788. -Expression block - Gen<Expr> - 4 - (0:0,0)
  42789. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42790. - SyntaxKind.Transition;[@];
  42791. - Code span - Gen<Expr> - [val] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:1
  42792. - SyntaxKind.Identifier;[val];
  42793. +CSharpCodeBlock - [0..4)::4 - [@val]
  42794. + CSharpImplicitExpression - [0..4)::4
  42795. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42796. + Transition;[@];
  42797. + CSharpImplicitExpressionBody - [1..4)::3
  42798. + CSharpCodeBlock - [1..4)::3
  42799. + CSharpExpressionLiteral - [1..4)::3 - [val] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42800. + Identifier;[val];
  42801. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot12.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot12.stree.txt
  42802. index bacea444e67..918469033ed 100644
  42803. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot12.stree.txt
  42804. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot12.stree.txt
  42805. @@ -1,13 +1,16 @@
  42806. -Expression block - Gen<Expr> - 19 - (0:0,0)
  42807. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42808. - SyntaxKind.Transition;[@];
  42809. - Code span - Gen<Expr> - [val?.more(false)?.] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:9
  42810. - SyntaxKind.Identifier;[val];
  42811. - SyntaxKind.QuestionMark;[?];
  42812. - SyntaxKind.Dot;[.];
  42813. - SyntaxKind.Identifier;[more];
  42814. - SyntaxKind.LeftParenthesis;[(];
  42815. - SyntaxKind.Keyword;[false];
  42816. - SyntaxKind.RightParenthesis;[)];
  42817. - SyntaxKind.QuestionMark;[?];
  42818. - SyntaxKind.Dot;[.];
  42819. +CSharpCodeBlock - [0..19)::19 - [@val?.more(false)?.]
  42820. + CSharpImplicitExpression - [0..19)::19
  42821. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42822. + Transition;[@];
  42823. + CSharpImplicitExpressionBody - [1..19)::18
  42824. + CSharpCodeBlock - [1..19)::18
  42825. + CSharpExpressionLiteral - [1..19)::18 - [val?.more(false)?.] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42826. + Identifier;[val];
  42827. + QuestionMark;[?];
  42828. + Dot;[.];
  42829. + Identifier;[more];
  42830. + LeftParenthesis;[(];
  42831. + Keyword;[false];
  42832. + RightParenthesis;[)];
  42833. + QuestionMark;[?];
  42834. + Dot;[.];
  42835. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot13.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot13.stree.txt
  42836. index aa043d3d76e..569911daeb6 100644
  42837. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot13.stree.txt
  42838. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot13.stree.txt
  42839. @@ -1,14 +1,17 @@
  42840. -Expression block - Gen<Expr> - 22 - (0:0,0)
  42841. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42842. - SyntaxKind.Transition;[@];
  42843. - Code span - Gen<Expr> - [val?.more(false)?.abc] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:10
  42844. - SyntaxKind.Identifier;[val];
  42845. - SyntaxKind.QuestionMark;[?];
  42846. - SyntaxKind.Dot;[.];
  42847. - SyntaxKind.Identifier;[more];
  42848. - SyntaxKind.LeftParenthesis;[(];
  42849. - SyntaxKind.Keyword;[false];
  42850. - SyntaxKind.RightParenthesis;[)];
  42851. - SyntaxKind.QuestionMark;[?];
  42852. - SyntaxKind.Dot;[.];
  42853. - SyntaxKind.Identifier;[abc];
  42854. +CSharpCodeBlock - [0..22)::22 - [@val?.more(false)?.abc]
  42855. + CSharpImplicitExpression - [0..22)::22
  42856. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42857. + Transition;[@];
  42858. + CSharpImplicitExpressionBody - [1..22)::21
  42859. + CSharpCodeBlock - [1..22)::21
  42860. + CSharpExpressionLiteral - [1..22)::21 - [val?.more(false)?.abc] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42861. + Identifier;[val];
  42862. + QuestionMark;[?];
  42863. + Dot;[.];
  42864. + Identifier;[more];
  42865. + LeftParenthesis;[(];
  42866. + Keyword;[false];
  42867. + RightParenthesis;[)];
  42868. + QuestionMark;[?];
  42869. + Dot;[.];
  42870. + Identifier;[abc];
  42871. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot14.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot14.stree.txt
  42872. index 1aec905882a..f7d7e07ff30 100644
  42873. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot14.stree.txt
  42874. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot14.stree.txt
  42875. @@ -1,18 +1,21 @@
  42876. -Expression block - Gen<Expr> - 29 - (0:0,0)
  42877. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42878. - SyntaxKind.Transition;[@];
  42879. - Code span - Gen<Expr> - [val?.more(null ?? true)?.abc] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:14
  42880. - SyntaxKind.Identifier;[val];
  42881. - SyntaxKind.QuestionMark;[?];
  42882. - SyntaxKind.Dot;[.];
  42883. - SyntaxKind.Identifier;[more];
  42884. - SyntaxKind.LeftParenthesis;[(];
  42885. - SyntaxKind.Keyword;[null];
  42886. - SyntaxKind.Whitespace;[ ];
  42887. - SyntaxKind.NullCoalesce;[??];
  42888. - SyntaxKind.Whitespace;[ ];
  42889. - SyntaxKind.Keyword;[true];
  42890. - SyntaxKind.RightParenthesis;[)];
  42891. - SyntaxKind.QuestionMark;[?];
  42892. - SyntaxKind.Dot;[.];
  42893. - SyntaxKind.Identifier;[abc];
  42894. +CSharpCodeBlock - [0..29)::29 - [@val?.more(null ?? true)?.abc]
  42895. + CSharpImplicitExpression - [0..29)::29
  42896. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42897. + Transition;[@];
  42898. + CSharpImplicitExpressionBody - [1..29)::28
  42899. + CSharpCodeBlock - [1..29)::28
  42900. + CSharpExpressionLiteral - [1..29)::28 - [val?.more(null ?? true)?.abc] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42901. + Identifier;[val];
  42902. + QuestionMark;[?];
  42903. + Dot;[.];
  42904. + Identifier;[more];
  42905. + LeftParenthesis;[(];
  42906. + Keyword;[null];
  42907. + Whitespace;[ ];
  42908. + NullCoalesce;[??];
  42909. + Whitespace;[ ];
  42910. + Keyword;[true];
  42911. + RightParenthesis;[)];
  42912. + QuestionMark;[?];
  42913. + Dot;[.];
  42914. + Identifier;[abc];
  42915. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot2.stree.txt
  42916. index b18c1f269f4..d192fdd05bb 100644
  42917. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot2.stree.txt
  42918. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot2.stree.txt
  42919. @@ -1,5 +1,8 @@
  42920. -Expression block - Gen<Expr> - 4 - (0:0,0)
  42921. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42922. - SyntaxKind.Transition;[@];
  42923. - Code span - Gen<Expr> - [val] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:1
  42924. - SyntaxKind.Identifier;[val];
  42925. +CSharpCodeBlock - [0..4)::4 - [@val]
  42926. + CSharpImplicitExpression - [0..4)::4
  42927. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42928. + Transition;[@];
  42929. + CSharpImplicitExpressionBody - [1..4)::3
  42930. + CSharpCodeBlock - [1..4)::3
  42931. + CSharpExpressionLiteral - [1..4)::3 - [val] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42932. + Identifier;[val];
  42933. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot3.stree.txt
  42934. index b18c1f269f4..d192fdd05bb 100644
  42935. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot3.stree.txt
  42936. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot3.stree.txt
  42937. @@ -1,5 +1,8 @@
  42938. -Expression block - Gen<Expr> - 4 - (0:0,0)
  42939. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42940. - SyntaxKind.Transition;[@];
  42941. - Code span - Gen<Expr> - [val] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:1
  42942. - SyntaxKind.Identifier;[val];
  42943. +CSharpCodeBlock - [0..4)::4 - [@val]
  42944. + CSharpImplicitExpression - [0..4)::4
  42945. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42946. + Transition;[@];
  42947. + CSharpImplicitExpressionBody - [1..4)::3
  42948. + CSharpCodeBlock - [1..4)::3
  42949. + CSharpExpressionLiteral - [1..4)::3 - [val] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42950. + Identifier;[val];
  42951. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot4.stree.txt
  42952. index b18c1f269f4..d192fdd05bb 100644
  42953. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot4.stree.txt
  42954. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot4.stree.txt
  42955. @@ -1,5 +1,8 @@
  42956. -Expression block - Gen<Expr> - 4 - (0:0,0)
  42957. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42958. - SyntaxKind.Transition;[@];
  42959. - Code span - Gen<Expr> - [val] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:1
  42960. - SyntaxKind.Identifier;[val];
  42961. +CSharpCodeBlock - [0..4)::4 - [@val]
  42962. + CSharpImplicitExpression - [0..4)::4
  42963. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42964. + Transition;[@];
  42965. + CSharpImplicitExpressionBody - [1..4)::3
  42966. + CSharpCodeBlock - [1..4)::3
  42967. + CSharpExpressionLiteral - [1..4)::3 - [val] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42968. + Identifier;[val];
  42969. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot5.stree.txt
  42970. index f71f1f7ae8b..c65efbf4738 100644
  42971. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot5.stree.txt
  42972. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot5.stree.txt
  42973. @@ -1,7 +1,10 @@
  42974. -Expression block - Gen<Expr> - 6 - (0:0,0)
  42975. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42976. - SyntaxKind.Transition;[@];
  42977. - Code span - Gen<Expr> - [val?.] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:3
  42978. - SyntaxKind.Identifier;[val];
  42979. - SyntaxKind.QuestionMark;[?];
  42980. - SyntaxKind.Dot;[.];
  42981. +CSharpCodeBlock - [0..6)::6 - [@val?.]
  42982. + CSharpImplicitExpression - [0..6)::6
  42983. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  42984. + Transition;[@];
  42985. + CSharpImplicitExpressionBody - [1..6)::5
  42986. + CSharpCodeBlock - [1..6)::5
  42987. + CSharpExpressionLiteral - [1..6)::5 - [val?.] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  42988. + Identifier;[val];
  42989. + QuestionMark;[?];
  42990. + Dot;[.];
  42991. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot6.stree.txt
  42992. index b18c1f269f4..d192fdd05bb 100644
  42993. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot6.stree.txt
  42994. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot6.stree.txt
  42995. @@ -1,5 +1,8 @@
  42996. -Expression block - Gen<Expr> - 4 - (0:0,0)
  42997. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  42998. - SyntaxKind.Transition;[@];
  42999. - Code span - Gen<Expr> - [val] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:1
  43000. - SyntaxKind.Identifier;[val];
  43001. +CSharpCodeBlock - [0..4)::4 - [@val]
  43002. + CSharpImplicitExpression - [0..4)::4
  43003. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  43004. + Transition;[@];
  43005. + CSharpImplicitExpressionBody - [1..4)::3
  43006. + CSharpCodeBlock - [1..4)::3
  43007. + CSharpExpressionLiteral - [1..4)::3 - [val] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  43008. + Identifier;[val];
  43009. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot7.stree.txt
  43010. index f71f1f7ae8b..c65efbf4738 100644
  43011. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot7.stree.txt
  43012. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot7.stree.txt
  43013. @@ -1,7 +1,10 @@
  43014. -Expression block - Gen<Expr> - 6 - (0:0,0)
  43015. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  43016. - SyntaxKind.Transition;[@];
  43017. - Code span - Gen<Expr> - [val?.] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:3
  43018. - SyntaxKind.Identifier;[val];
  43019. - SyntaxKind.QuestionMark;[?];
  43020. - SyntaxKind.Dot;[.];
  43021. +CSharpCodeBlock - [0..6)::6 - [@val?.]
  43022. + CSharpImplicitExpression - [0..6)::6
  43023. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  43024. + Transition;[@];
  43025. + CSharpImplicitExpressionBody - [1..6)::5
  43026. + CSharpCodeBlock - [1..6)::5
  43027. + CSharpExpressionLiteral - [1..6)::5 - [val?.] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  43028. + Identifier;[val];
  43029. + QuestionMark;[?];
  43030. + Dot;[.];
  43031. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot8.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot8.stree.txt
  43032. index f71f1f7ae8b..c65efbf4738 100644
  43033. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot8.stree.txt
  43034. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot8.stree.txt
  43035. @@ -1,7 +1,10 @@
  43036. -Expression block - Gen<Expr> - 6 - (0:0,0)
  43037. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  43038. - SyntaxKind.Transition;[@];
  43039. - Code span - Gen<Expr> - [val?.] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:3
  43040. - SyntaxKind.Identifier;[val];
  43041. - SyntaxKind.QuestionMark;[?];
  43042. - SyntaxKind.Dot;[.];
  43043. +CSharpCodeBlock - [0..6)::6 - [@val?.]
  43044. + CSharpImplicitExpression - [0..6)::6
  43045. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  43046. + Transition;[@];
  43047. + CSharpImplicitExpressionBody - [1..6)::5
  43048. + CSharpCodeBlock - [1..6)::5
  43049. + CSharpExpressionLiteral - [1..6)::5 - [val?.] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  43050. + Identifier;[val];
  43051. + QuestionMark;[?];
  43052. + Dot;[.];
  43053. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot9.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot9.stree.txt
  43054. index ac416a7286f..6e31b6d8037 100644
  43055. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot9.stree.txt
  43056. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesNullConditionalOperatorImplicitExpression_Dot9.stree.txt
  43057. @@ -1,8 +1,11 @@
  43058. -Expression block - Gen<Expr> - 10 - (0:0,0)
  43059. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  43060. - SyntaxKind.Transition;[@];
  43061. - Code span - Gen<Expr> - [val?.more] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:4
  43062. - SyntaxKind.Identifier;[val];
  43063. - SyntaxKind.QuestionMark;[?];
  43064. - SyntaxKind.Dot;[.];
  43065. - SyntaxKind.Identifier;[more];
  43066. +CSharpCodeBlock - [0..10)::10 - [@val?.more]
  43067. + CSharpImplicitExpression - [0..10)::10
  43068. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  43069. + Transition;[@];
  43070. + CSharpImplicitExpressionBody - [1..10)::9
  43071. + CSharpCodeBlock - [1..10)::9
  43072. + CSharpExpressionLiteral - [1..10)::9 - [val?.more] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  43073. + Identifier;[val];
  43074. + QuestionMark;[?];
  43075. + Dot;[.];
  43076. + Identifier;[more];
  43077. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesSingleIdentifierAsImplicitExpression.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesSingleIdentifierAsImplicitExpression.stree.txt
  43078. index d6126280d94..fae52862a52 100644
  43079. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesSingleIdentifierAsImplicitExpression.stree.txt
  43080. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParsesSingleIdentifierAsImplicitExpression.stree.txt
  43081. @@ -1,5 +1,8 @@
  43082. -Expression block - Gen<Expr> - 4 - (0:0,0)
  43083. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  43084. - SyntaxKind.Transition;[@];
  43085. - Code span - Gen<Expr> - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:1
  43086. - SyntaxKind.Identifier;[foo];
  43087. +CSharpCodeBlock - [0..4)::4 - [@foo]
  43088. + CSharpImplicitExpression - [0..4)::4
  43089. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  43090. + Transition;[@];
  43091. + CSharpImplicitExpressionBody - [1..4)::3
  43092. + CSharpCodeBlock - [1..4)::3
  43093. + CSharpExpressionLiteral - [1..4)::3 - [foo] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  43094. + Identifier;[foo];
  43095. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ProperlyParsesBracketsAndBalancesThemInImplicitExpression.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ProperlyParsesBracketsAndBalancesThemInImplicitExpression.stree.txt
  43096. index 4a48ef8c599..5fd275a6872 100644
  43097. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ProperlyParsesBracketsAndBalancesThemInImplicitExpression.stree.txt
  43098. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ProperlyParsesBracketsAndBalancesThemInImplicitExpression.stree.txt
  43099. @@ -1,25 +1,28 @@
  43100. -Expression block - Gen<Expr> - 34 - (0:0,0)
  43101. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  43102. - SyntaxKind.Transition;[@];
  43103. - Code span - Gen<Expr> - [foo.bar[4 * (8 + 7)]["fo\"o"].baz] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:21
  43104. - SyntaxKind.Identifier;[foo];
  43105. - SyntaxKind.Dot;[.];
  43106. - SyntaxKind.Identifier;[bar];
  43107. - SyntaxKind.LeftBracket;[[];
  43108. - SyntaxKind.IntegerLiteral;[4];
  43109. - SyntaxKind.Whitespace;[ ];
  43110. - SyntaxKind.Star;[*];
  43111. - SyntaxKind.Whitespace;[ ];
  43112. - SyntaxKind.LeftParenthesis;[(];
  43113. - SyntaxKind.IntegerLiteral;[8];
  43114. - SyntaxKind.Whitespace;[ ];
  43115. - SyntaxKind.Plus;[+];
  43116. - SyntaxKind.Whitespace;[ ];
  43117. - SyntaxKind.IntegerLiteral;[7];
  43118. - SyntaxKind.RightParenthesis;[)];
  43119. - SyntaxKind.RightBracket;[]];
  43120. - SyntaxKind.LeftBracket;[[];
  43121. - SyntaxKind.StringLiteral;["fo\"o"];
  43122. - SyntaxKind.RightBracket;[]];
  43123. - SyntaxKind.Dot;[.];
  43124. - SyntaxKind.Identifier;[baz];
  43125. +CSharpCodeBlock - [0..34)::34 - [@foo.bar[4 * (8 + 7)]["fo\"o"].baz]
  43126. + CSharpImplicitExpression - [0..34)::34
  43127. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  43128. + Transition;[@];
  43129. + CSharpImplicitExpressionBody - [1..34)::33
  43130. + CSharpCodeBlock - [1..34)::33
  43131. + CSharpExpressionLiteral - [1..34)::33 - [foo.bar[4 * (8 + 7)]["fo\"o"].baz] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  43132. + Identifier;[foo];
  43133. + Dot;[.];
  43134. + Identifier;[bar];
  43135. + LeftBracket;[[];
  43136. + IntegerLiteral;[4];
  43137. + Whitespace;[ ];
  43138. + Star;[*];
  43139. + Whitespace;[ ];
  43140. + LeftParenthesis;[(];
  43141. + IntegerLiteral;[8];
  43142. + Whitespace;[ ];
  43143. + Plus;[+];
  43144. + Whitespace;[ ];
  43145. + IntegerLiteral;[7];
  43146. + RightParenthesis;[)];
  43147. + RightBracket;[]];
  43148. + LeftBracket;[[];
  43149. + StringLiteral;["fo\"o"];
  43150. + RightBracket;[]];
  43151. + Dot;[.];
  43152. + Identifier;[baz];
  43153. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ProperlyParsesParenthesesAndBalancesThemInImplicitExpression.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ProperlyParsesParenthesesAndBalancesThemInImplicitExpression.stree.txt
  43154. index 24c0b3ea592..f5a664425e1 100644
  43155. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ProperlyParsesParenthesesAndBalancesThemInImplicitExpression.stree.txt
  43156. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ProperlyParsesParenthesesAndBalancesThemInImplicitExpression.stree.txt
  43157. @@ -1,63 +1,66 @@
  43158. -Expression block - Gen<Expr> - 115 - (0:0,0)
  43159. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  43160. - SyntaxKind.Transition;[@];
  43161. - Code span - Gen<Expr> - [foo().bar("bi\"z", 4)("chained method; call").baz(@"bo""z", '\'', () => { return 4; }, (4+5+new { foo = bar[4] }))] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:59
  43162. - SyntaxKind.Identifier;[foo];
  43163. - SyntaxKind.LeftParenthesis;[(];
  43164. - SyntaxKind.RightParenthesis;[)];
  43165. - SyntaxKind.Dot;[.];
  43166. - SyntaxKind.Identifier;[bar];
  43167. - SyntaxKind.LeftParenthesis;[(];
  43168. - SyntaxKind.StringLiteral;["bi\"z"];
  43169. - SyntaxKind.Comma;[,];
  43170. - SyntaxKind.Whitespace;[ ];
  43171. - SyntaxKind.IntegerLiteral;[4];
  43172. - SyntaxKind.RightParenthesis;[)];
  43173. - SyntaxKind.LeftParenthesis;[(];
  43174. - SyntaxKind.StringLiteral;["chained method; call"];
  43175. - SyntaxKind.RightParenthesis;[)];
  43176. - SyntaxKind.Dot;[.];
  43177. - SyntaxKind.Identifier;[baz];
  43178. - SyntaxKind.LeftParenthesis;[(];
  43179. - SyntaxKind.StringLiteral;[@"bo""z"];
  43180. - SyntaxKind.Comma;[,];
  43181. - SyntaxKind.Whitespace;[ ];
  43182. - SyntaxKind.CharacterLiteral;['\''];
  43183. - SyntaxKind.Comma;[,];
  43184. - SyntaxKind.Whitespace;[ ];
  43185. - SyntaxKind.LeftParenthesis;[(];
  43186. - SyntaxKind.RightParenthesis;[)];
  43187. - SyntaxKind.Whitespace;[ ];
  43188. - SyntaxKind.GreaterThanEqual;[=>];
  43189. - SyntaxKind.Whitespace;[ ];
  43190. - SyntaxKind.LeftBrace;[{];
  43191. - SyntaxKind.Whitespace;[ ];
  43192. - SyntaxKind.Keyword;[return];
  43193. - SyntaxKind.Whitespace;[ ];
  43194. - SyntaxKind.IntegerLiteral;[4];
  43195. - SyntaxKind.Semicolon;[;];
  43196. - SyntaxKind.Whitespace;[ ];
  43197. - SyntaxKind.RightBrace;[}];
  43198. - SyntaxKind.Comma;[,];
  43199. - SyntaxKind.Whitespace;[ ];
  43200. - SyntaxKind.LeftParenthesis;[(];
  43201. - SyntaxKind.IntegerLiteral;[4];
  43202. - SyntaxKind.Plus;[+];
  43203. - SyntaxKind.IntegerLiteral;[5];
  43204. - SyntaxKind.Plus;[+];
  43205. - SyntaxKind.Keyword;[new];
  43206. - SyntaxKind.Whitespace;[ ];
  43207. - SyntaxKind.LeftBrace;[{];
  43208. - SyntaxKind.Whitespace;[ ];
  43209. - SyntaxKind.Identifier;[foo];
  43210. - SyntaxKind.Whitespace;[ ];
  43211. - SyntaxKind.Assign;[=];
  43212. - SyntaxKind.Whitespace;[ ];
  43213. - SyntaxKind.Identifier;[bar];
  43214. - SyntaxKind.LeftBracket;[[];
  43215. - SyntaxKind.IntegerLiteral;[4];
  43216. - SyntaxKind.RightBracket;[]];
  43217. - SyntaxKind.Whitespace;[ ];
  43218. - SyntaxKind.RightBrace;[}];
  43219. - SyntaxKind.RightParenthesis;[)];
  43220. - SyntaxKind.RightParenthesis;[)];
  43221. +CSharpCodeBlock - [0..115)::115 - [@foo().bar("bi\"z", 4)("chained method; call").baz(@"bo""z", '\'', () => { return 4; }, (4+5+new { foo = bar[4] }))]
  43222. + CSharpImplicitExpression - [0..115)::115
  43223. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  43224. + Transition;[@];
  43225. + CSharpImplicitExpressionBody - [1..115)::114
  43226. + CSharpCodeBlock - [1..115)::114
  43227. + CSharpExpressionLiteral - [1..115)::114 - [foo().bar("bi\"z", 4)("chained method; call").baz(@"bo""z", '\'', () => { return 4; }, (4+5+new { foo = bar[4] }))] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  43228. + Identifier;[foo];
  43229. + LeftParenthesis;[(];
  43230. + RightParenthesis;[)];
  43231. + Dot;[.];
  43232. + Identifier;[bar];
  43233. + LeftParenthesis;[(];
  43234. + StringLiteral;["bi\"z"];
  43235. + Comma;[,];
  43236. + Whitespace;[ ];
  43237. + IntegerLiteral;[4];
  43238. + RightParenthesis;[)];
  43239. + LeftParenthesis;[(];
  43240. + StringLiteral;["chained method; call"];
  43241. + RightParenthesis;[)];
  43242. + Dot;[.];
  43243. + Identifier;[baz];
  43244. + LeftParenthesis;[(];
  43245. + StringLiteral;[@"bo""z"];
  43246. + Comma;[,];
  43247. + Whitespace;[ ];
  43248. + CharacterLiteral;['\''];
  43249. + Comma;[,];
  43250. + Whitespace;[ ];
  43251. + LeftParenthesis;[(];
  43252. + RightParenthesis;[)];
  43253. + Whitespace;[ ];
  43254. + GreaterThanEqual;[=>];
  43255. + Whitespace;[ ];
  43256. + LeftBrace;[{];
  43257. + Whitespace;[ ];
  43258. + Keyword;[return];
  43259. + Whitespace;[ ];
  43260. + IntegerLiteral;[4];
  43261. + Semicolon;[;];
  43262. + Whitespace;[ ];
  43263. + RightBrace;[}];
  43264. + Comma;[,];
  43265. + Whitespace;[ ];
  43266. + LeftParenthesis;[(];
  43267. + IntegerLiteral;[4];
  43268. + Plus;[+];
  43269. + IntegerLiteral;[5];
  43270. + Plus;[+];
  43271. + Keyword;[new];
  43272. + Whitespace;[ ];
  43273. + LeftBrace;[{];
  43274. + Whitespace;[ ];
  43275. + Identifier;[foo];
  43276. + Whitespace;[ ];
  43277. + Assign;[=];
  43278. + Whitespace;[ ];
  43279. + Identifier;[bar];
  43280. + LeftBracket;[[];
  43281. + IntegerLiteral;[4];
  43282. + RightBracket;[]];
  43283. + Whitespace;[ ];
  43284. + RightBrace;[}];
  43285. + RightParenthesis;[)];
  43286. + RightParenthesis;[)];
  43287. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/StopsBalancingParenthesesAtEOF.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/StopsBalancingParenthesesAtEOF.stree.txt
  43288. index 11fbcd48bc7..aa7e5347dc8 100644
  43289. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/StopsBalancingParenthesesAtEOF.stree.txt
  43290. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/StopsBalancingParenthesesAtEOF.stree.txt
  43291. @@ -1,8 +1,11 @@
  43292. -Expression block - Gen<Expr> - 7 - (0:0,0)
  43293. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  43294. - SyntaxKind.Transition;[@];
  43295. - Code span - Gen<Expr> - [foo(()] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:4
  43296. - SyntaxKind.Identifier;[foo];
  43297. - SyntaxKind.LeftParenthesis;[(];
  43298. - SyntaxKind.LeftParenthesis;[(];
  43299. - SyntaxKind.RightParenthesis;[)];
  43300. +CSharpCodeBlock - [0..7)::7 - [@foo(()]
  43301. + CSharpImplicitExpression - [0..7)::7
  43302. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  43303. + Transition;[@];
  43304. + CSharpImplicitExpressionBody - [1..7)::6
  43305. + CSharpCodeBlock - [1..7)::6
  43306. + CSharpExpressionLiteral - [1..7)::6 - [foo(()] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14
  43307. + Identifier;[foo];
  43308. + LeftParenthesis;[(];
  43309. + LeftParenthesis;[(];
  43310. + RightParenthesis;[)];
  43311. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/SupportsSlashesWithinComplexImplicitExpressions.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/SupportsSlashesWithinComplexImplicitExpressions.stree.txt
  43312. index 1d0244fc8df..2154a5e70e7 100644
  43313. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/SupportsSlashesWithinComplexImplicitExpressions.stree.txt
  43314. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/SupportsSlashesWithinComplexImplicitExpressions.stree.txt
  43315. @@ -1,39 +1,42 @@
  43316. -Expression block - Gen<Expr> - 103 - (0:0,0)
  43317. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  43318. - SyntaxKind.Transition;[@];
  43319. - Code span - Gen<Expr> - [DataGridColumn.Template("Years of Service", e => (int)Math.Round((DateTime.Now - dt).TotalDays / 365))] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:35
  43320. - SyntaxKind.Identifier;[DataGridColumn];
  43321. - SyntaxKind.Dot;[.];
  43322. - SyntaxKind.Identifier;[Template];
  43323. - SyntaxKind.LeftParenthesis;[(];
  43324. - SyntaxKind.StringLiteral;["Years of Service"];
  43325. - SyntaxKind.Comma;[,];
  43326. - SyntaxKind.Whitespace;[ ];
  43327. - SyntaxKind.Identifier;[e];
  43328. - SyntaxKind.Whitespace;[ ];
  43329. - SyntaxKind.GreaterThanEqual;[=>];
  43330. - SyntaxKind.Whitespace;[ ];
  43331. - SyntaxKind.LeftParenthesis;[(];
  43332. - SyntaxKind.Keyword;[int];
  43333. - SyntaxKind.RightParenthesis;[)];
  43334. - SyntaxKind.Identifier;[Math];
  43335. - SyntaxKind.Dot;[.];
  43336. - SyntaxKind.Identifier;[Round];
  43337. - SyntaxKind.LeftParenthesis;[(];
  43338. - SyntaxKind.LeftParenthesis;[(];
  43339. - SyntaxKind.Identifier;[DateTime];
  43340. - SyntaxKind.Dot;[.];
  43341. - SyntaxKind.Identifier;[Now];
  43342. - SyntaxKind.Whitespace;[ ];
  43343. - SyntaxKind.Minus;[-];
  43344. - SyntaxKind.Whitespace;[ ];
  43345. - SyntaxKind.Identifier;[dt];
  43346. - SyntaxKind.RightParenthesis;[)];
  43347. - SyntaxKind.Dot;[.];
  43348. - SyntaxKind.Identifier;[TotalDays];
  43349. - SyntaxKind.Whitespace;[ ];
  43350. - SyntaxKind.Slash;[/];
  43351. - SyntaxKind.Whitespace;[ ];
  43352. - SyntaxKind.IntegerLiteral;[365];
  43353. - SyntaxKind.RightParenthesis;[)];
  43354. - SyntaxKind.RightParenthesis;[)];
  43355. +CSharpCodeBlock - [0..103)::103 - [@DataGridColumn.Template("Years of Service", e => (int)Math.Round((DateTime.Now - dt).TotalDays / 365))]
  43356. + CSharpImplicitExpression - [0..103)::103
  43357. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  43358. + Transition;[@];
  43359. + CSharpImplicitExpressionBody - [1..103)::102
  43360. + CSharpCodeBlock - [1..103)::102
  43361. + CSharpExpressionLiteral - [1..103)::102 - [DataGridColumn.Template("Years of Service", e => (int)Math.Round((DateTime.Now - dt).TotalDays / 365))] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  43362. + Identifier;[DataGridColumn];
  43363. + Dot;[.];
  43364. + Identifier;[Template];
  43365. + LeftParenthesis;[(];
  43366. + StringLiteral;["Years of Service"];
  43367. + Comma;[,];
  43368. + Whitespace;[ ];
  43369. + Identifier;[e];
  43370. + Whitespace;[ ];
  43371. + GreaterThanEqual;[=>];
  43372. + Whitespace;[ ];
  43373. + LeftParenthesis;[(];
  43374. + Keyword;[int];
  43375. + RightParenthesis;[)];
  43376. + Identifier;[Math];
  43377. + Dot;[.];
  43378. + Identifier;[Round];
  43379. + LeftParenthesis;[(];
  43380. + LeftParenthesis;[(];
  43381. + Identifier;[DateTime];
  43382. + Dot;[.];
  43383. + Identifier;[Now];
  43384. + Whitespace;[ ];
  43385. + Minus;[-];
  43386. + Whitespace;[ ];
  43387. + Identifier;[dt];
  43388. + RightParenthesis;[)];
  43389. + Dot;[.];
  43390. + Identifier;[TotalDays];
  43391. + Whitespace;[ ];
  43392. + Slash;[/];
  43393. + Whitespace;[ ];
  43394. + IntegerLiteral;[365];
  43395. + RightParenthesis;[)];
  43396. + RightParenthesis;[)];
  43397. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesAfterIdentifierUnlessFollowedByDotOrParenInImplicitExpr.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesAfterIdentifierUnlessFollowedByDotOrParenInImplicitExpr.stree.txt
  43398. index ece2fdbfe0f..330a241eff7 100644
  43399. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesAfterIdentifierUnlessFollowedByDotOrParenInImplicitExpr.stree.txt
  43400. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesAfterIdentifierUnlessFollowedByDotOrParenInImplicitExpr.stree.txt
  43401. @@ -1,7 +1,10 @@
  43402. -Expression block - Gen<Expr> - 8 - (0:0,0)
  43403. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  43404. - SyntaxKind.Transition;[@];
  43405. - Code span - Gen<Expr> - [foo.bar] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:3
  43406. - SyntaxKind.Identifier;[foo];
  43407. - SyntaxKind.Dot;[.];
  43408. - SyntaxKind.Identifier;[bar];
  43409. +CSharpCodeBlock - [0..8)::8 - [@foo.bar]
  43410. + CSharpImplicitExpression - [0..8)::8
  43411. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  43412. + Transition;[@];
  43413. + CSharpImplicitExpressionBody - [1..8)::7
  43414. + CSharpCodeBlock - [1..8)::7
  43415. + CSharpExpressionLiteral - [1..8)::7 - [foo.bar] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  43416. + Identifier;[foo];
  43417. + Dot;[.];
  43418. + Identifier;[bar];
  43419. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesImplicitExprBeforeDotIfDotNotFollowedByIdentifierStartChar.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesImplicitExprBeforeDotIfDotNotFollowedByIdentifierStartChar.stree.txt
  43420. index 72c6d76525d..d2344bfa28d 100644
  43421. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesImplicitExprBeforeDotIfDotNotFollowedByIdentifierStartChar.stree.txt
  43422. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesImplicitExprBeforeDotIfDotNotFollowedByIdentifierStartChar.stree.txt
  43423. @@ -1,11 +1,14 @@
  43424. -Expression block - Gen<Expr> - 14 - (0:0,0)
  43425. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  43426. - SyntaxKind.Transition;[@];
  43427. - Code span - Gen<Expr> - [foo().bar.baz] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:7
  43428. - SyntaxKind.Identifier;[foo];
  43429. - SyntaxKind.LeftParenthesis;[(];
  43430. - SyntaxKind.RightParenthesis;[)];
  43431. - SyntaxKind.Dot;[.];
  43432. - SyntaxKind.Identifier;[bar];
  43433. - SyntaxKind.Dot;[.];
  43434. - SyntaxKind.Identifier;[baz];
  43435. +CSharpCodeBlock - [0..14)::14 - [@foo().bar.baz]
  43436. + CSharpImplicitExpression - [0..14)::14
  43437. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  43438. + Transition;[@];
  43439. + CSharpImplicitExpressionBody - [1..14)::13
  43440. + CSharpCodeBlock - [1..14)::13
  43441. + CSharpExpressionLiteral - [1..14)::13 - [foo().bar.baz] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  43442. + Identifier;[foo];
  43443. + LeftParenthesis;[(];
  43444. + RightParenthesis;[)];
  43445. + Dot;[.];
  43446. + Identifier;[bar];
  43447. + Dot;[.];
  43448. + Identifier;[baz];
  43449. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesImplicitExpressionAtHtmlEndTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesImplicitExpressionAtHtmlEndTag.stree.txt
  43450. index 72c6d76525d..d2344bfa28d 100644
  43451. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesImplicitExpressionAtHtmlEndTag.stree.txt
  43452. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesImplicitExpressionAtHtmlEndTag.stree.txt
  43453. @@ -1,11 +1,14 @@
  43454. -Expression block - Gen<Expr> - 14 - (0:0,0)
  43455. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  43456. - SyntaxKind.Transition;[@];
  43457. - Code span - Gen<Expr> - [foo().bar.baz] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:7
  43458. - SyntaxKind.Identifier;[foo];
  43459. - SyntaxKind.LeftParenthesis;[(];
  43460. - SyntaxKind.RightParenthesis;[)];
  43461. - SyntaxKind.Dot;[.];
  43462. - SyntaxKind.Identifier;[bar];
  43463. - SyntaxKind.Dot;[.];
  43464. - SyntaxKind.Identifier;[baz];
  43465. +CSharpCodeBlock - [0..14)::14 - [@foo().bar.baz]
  43466. + CSharpImplicitExpression - [0..14)::14
  43467. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  43468. + Transition;[@];
  43469. + CSharpImplicitExpressionBody - [1..14)::13
  43470. + CSharpCodeBlock - [1..14)::13
  43471. + CSharpExpressionLiteral - [1..14)::13 - [foo().bar.baz] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  43472. + Identifier;[foo];
  43473. + LeftParenthesis;[(];
  43474. + RightParenthesis;[)];
  43475. + Dot;[.];
  43476. + Identifier;[bar];
  43477. + Dot;[.];
  43478. + Identifier;[baz];
  43479. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesImplicitExpressionAtHtmlStartTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesImplicitExpressionAtHtmlStartTag.stree.txt
  43480. index 72c6d76525d..d2344bfa28d 100644
  43481. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesImplicitExpressionAtHtmlStartTag.stree.txt
  43482. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesImplicitExpressionAtHtmlStartTag.stree.txt
  43483. @@ -1,11 +1,14 @@
  43484. -Expression block - Gen<Expr> - 14 - (0:0,0)
  43485. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  43486. - SyntaxKind.Transition;[@];
  43487. - Code span - Gen<Expr> - [foo().bar.baz] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:7
  43488. - SyntaxKind.Identifier;[foo];
  43489. - SyntaxKind.LeftParenthesis;[(];
  43490. - SyntaxKind.RightParenthesis;[)];
  43491. - SyntaxKind.Dot;[.];
  43492. - SyntaxKind.Identifier;[bar];
  43493. - SyntaxKind.Dot;[.];
  43494. - SyntaxKind.Identifier;[baz];
  43495. +CSharpCodeBlock - [0..14)::14 - [@foo().bar.baz]
  43496. + CSharpImplicitExpression - [0..14)::14
  43497. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  43498. + Transition;[@];
  43499. + CSharpImplicitExpressionBody - [1..14)::13
  43500. + CSharpCodeBlock - [1..14)::13
  43501. + CSharpExpressionLiteral - [1..14)::13 - [foo().bar.baz] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  43502. + Identifier;[foo];
  43503. + LeftParenthesis;[(];
  43504. + RightParenthesis;[)];
  43505. + Dot;[.];
  43506. + Identifier;[bar];
  43507. + Dot;[.];
  43508. + Identifier;[baz];
  43509. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesImplicitExpressionAtLastValidPointIfDotFollowedByWhitespace.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesImplicitExpressionAtLastValidPointIfDotFollowedByWhitespace.stree.txt
  43510. index d6126280d94..fae52862a52 100644
  43511. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesImplicitExpressionAtLastValidPointIfDotFollowedByWhitespace.stree.txt
  43512. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesImplicitExpressionAtLastValidPointIfDotFollowedByWhitespace.stree.txt
  43513. @@ -1,5 +1,8 @@
  43514. -Expression block - Gen<Expr> - 4 - (0:0,0)
  43515. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  43516. - SyntaxKind.Transition;[@];
  43517. - Code span - Gen<Expr> - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:1
  43518. - SyntaxKind.Identifier;[foo];
  43519. +CSharpCodeBlock - [0..4)::4 - [@foo]
  43520. + CSharpImplicitExpression - [0..4)::4
  43521. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  43522. + Transition;[@];
  43523. + CSharpImplicitExpressionBody - [1..4)::3
  43524. + CSharpCodeBlock - [1..4)::3
  43525. + CSharpExpressionLiteral - [1..4)::3 - [foo] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  43526. + Identifier;[foo];
  43527. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesImplicitExpressionIfCloseParenFollowedByAnyWhiteSpace.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesImplicitExpressionIfCloseParenFollowedByAnyWhiteSpace.stree.txt
  43528. index db01d146c34..8b9c2926b35 100644
  43529. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesImplicitExpressionIfCloseParenFollowedByAnyWhiteSpace.stree.txt
  43530. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesImplicitExpressionIfCloseParenFollowedByAnyWhiteSpace.stree.txt
  43531. @@ -1,9 +1,12 @@
  43532. -Expression block - Gen<Expr> - 10 - (0:0,0)
  43533. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  43534. - SyntaxKind.Transition;[@];
  43535. - Code span - Gen<Expr> - [foo.bar()] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:5
  43536. - SyntaxKind.Identifier;[foo];
  43537. - SyntaxKind.Dot;[.];
  43538. - SyntaxKind.Identifier;[bar];
  43539. - SyntaxKind.LeftParenthesis;[(];
  43540. - SyntaxKind.RightParenthesis;[)];
  43541. +CSharpCodeBlock - [0..10)::10 - [@foo.bar()]
  43542. + CSharpImplicitExpression - [0..10)::10
  43543. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  43544. + Transition;[@];
  43545. + CSharpImplicitExpressionBody - [1..10)::9
  43546. + CSharpCodeBlock - [1..10)::9
  43547. + CSharpExpressionLiteral - [1..10)::9 - [foo.bar()] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  43548. + Identifier;[foo];
  43549. + Dot;[.];
  43550. + Identifier;[bar];
  43551. + LeftParenthesis;[(];
  43552. + RightParenthesis;[)];
  43553. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesImplicitExpressionIfIdentifierFollowedByAnyWhiteSpace.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesImplicitExpressionIfIdentifierFollowedByAnyWhiteSpace.stree.txt
  43554. index d6126280d94..fae52862a52 100644
  43555. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesImplicitExpressionIfIdentifierFollowedByAnyWhiteSpace.stree.txt
  43556. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/TerminatesImplicitExpressionIfIdentifierFollowedByAnyWhiteSpace.stree.txt
  43557. @@ -1,5 +1,8 @@
  43558. -Expression block - Gen<Expr> - 4 - (0:0,0)
  43559. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  43560. - SyntaxKind.Transition;[@];
  43561. - Code span - Gen<Expr> - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:1
  43562. - SyntaxKind.Identifier;[foo];
  43563. +CSharpCodeBlock - [0..4)::4 - [@foo]
  43564. + CSharpImplicitExpression - [0..4)::4
  43565. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  43566. + Transition;[@];
  43567. + CSharpImplicitExpressionBody - [1..4)::3
  43568. + CSharpCodeBlock - [1..4)::3
  43569. + CSharpExpressionLiteral - [1..4)::3 - [foo] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  43570. + Identifier;[foo];
  43571. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpNestedStatementsTest/NestedCodeBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpNestedStatementsTest/NestedCodeBlock.stree.txt
  43572. index 512300af6cd..23cef6534e3 100644
  43573. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpNestedStatementsTest/NestedCodeBlock.stree.txt
  43574. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpNestedStatementsTest/NestedCodeBlock.stree.txt
  43575. @@ -1,29 +1,29 @@
  43576. -Statement block - Gen<None> - 35 - (0:0,0)
  43577. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  43578. - SyntaxKind.Transition;[@];
  43579. - Code span - Gen<Stmt> - [while(true) { { { { foo(); } } } }] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:25
  43580. - SyntaxKind.Keyword;[while];
  43581. - SyntaxKind.LeftParenthesis;[(];
  43582. - SyntaxKind.Keyword;[true];
  43583. - SyntaxKind.RightParenthesis;[)];
  43584. - SyntaxKind.Whitespace;[ ];
  43585. - SyntaxKind.LeftBrace;[{];
  43586. - SyntaxKind.Whitespace;[ ];
  43587. - SyntaxKind.LeftBrace;[{];
  43588. - SyntaxKind.Whitespace;[ ];
  43589. - SyntaxKind.LeftBrace;[{];
  43590. - SyntaxKind.Whitespace;[ ];
  43591. - SyntaxKind.LeftBrace;[{];
  43592. - SyntaxKind.Whitespace;[ ];
  43593. - SyntaxKind.Identifier;[foo];
  43594. - SyntaxKind.LeftParenthesis;[(];
  43595. - SyntaxKind.RightParenthesis;[)];
  43596. - SyntaxKind.Semicolon;[;];
  43597. - SyntaxKind.Whitespace;[ ];
  43598. - SyntaxKind.RightBrace;[}];
  43599. - SyntaxKind.Whitespace;[ ];
  43600. - SyntaxKind.RightBrace;[}];
  43601. - SyntaxKind.Whitespace;[ ];
  43602. - SyntaxKind.RightBrace;[}];
  43603. - SyntaxKind.Whitespace;[ ];
  43604. - SyntaxKind.RightBrace;[}];
  43605. +CSharpCodeBlock - [0..35)::35 - [@while(true) { { { { foo(); } } } }]
  43606. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  43607. + Transition;[@];
  43608. + CSharpStatementLiteral - [1..35)::34 - [while(true) { { { { foo(); } } } }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  43609. + Keyword;[while];
  43610. + LeftParenthesis;[(];
  43611. + Keyword;[true];
  43612. + RightParenthesis;[)];
  43613. + Whitespace;[ ];
  43614. + LeftBrace;[{];
  43615. + Whitespace;[ ];
  43616. + LeftBrace;[{];
  43617. + Whitespace;[ ];
  43618. + LeftBrace;[{];
  43619. + Whitespace;[ ];
  43620. + LeftBrace;[{];
  43621. + Whitespace;[ ];
  43622. + Identifier;[foo];
  43623. + LeftParenthesis;[(];
  43624. + RightParenthesis;[)];
  43625. + Semicolon;[;];
  43626. + Whitespace;[ ];
  43627. + RightBrace;[}];
  43628. + Whitespace;[ ];
  43629. + RightBrace;[}];
  43630. + Whitespace;[ ];
  43631. + RightBrace;[}];
  43632. + Whitespace;[ ];
  43633. + RightBrace;[}];
  43634. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpNestedStatementsTest/NestedExplicitExpression.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpNestedStatementsTest/NestedExplicitExpression.stree.txt
  43635. index 7431ac80240..555f64dafe3 100644
  43636. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpNestedStatementsTest/NestedExplicitExpression.stree.txt
  43637. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpNestedStatementsTest/NestedExplicitExpression.stree.txt
  43638. @@ -1,23 +1,26 @@
  43639. -Statement block - Gen<None> - 23 - (0:0,0)
  43640. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  43641. - SyntaxKind.Transition;[@];
  43642. - Code span - Gen<Stmt> - [while(true) { ] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:7
  43643. - SyntaxKind.Keyword;[while];
  43644. - SyntaxKind.LeftParenthesis;[(];
  43645. - SyntaxKind.Keyword;[true];
  43646. - SyntaxKind.RightParenthesis;[)];
  43647. - SyntaxKind.Whitespace;[ ];
  43648. - SyntaxKind.LeftBrace;[{];
  43649. - SyntaxKind.Whitespace;[ ];
  43650. - Expression block - Gen<Expr> - 6 - (15:0,15)
  43651. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:1
  43652. - SyntaxKind.Transition;[@];
  43653. - MetaCode span - Gen<None> - [(] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  43654. - SyntaxKind.LeftParenthesis;[(];
  43655. - Code span - Gen<Expr> - [foo] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:1
  43656. - SyntaxKind.Identifier;[foo];
  43657. - MetaCode span - Gen<None> - [)] - SpanEditHandler;Accepts:None - (20:0,20) - Tokens:1
  43658. - SyntaxKind.RightParenthesis;[)];
  43659. - Code span - Gen<Stmt> - [ }] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:2
  43660. - SyntaxKind.Whitespace;[ ];
  43661. - SyntaxKind.RightBrace;[}];
  43662. +CSharpCodeBlock - [0..23)::23 - [@while(true) { @(foo) }]
  43663. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  43664. + Transition;[@];
  43665. + CSharpStatementLiteral - [1..15)::14 - [while(true) { ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  43666. + Keyword;[while];
  43667. + LeftParenthesis;[(];
  43668. + Keyword;[true];
  43669. + RightParenthesis;[)];
  43670. + Whitespace;[ ];
  43671. + LeftBrace;[{];
  43672. + Whitespace;[ ];
  43673. + CSharpCodeBlock - [15..21)::6
  43674. + CSharpExplicitExpression - [15..21)::6
  43675. + CSharpTransition - [15..16)::1 - Gen<None> - SpanEditHandler;Accepts:None
  43676. + Transition;[@];
  43677. + CSharpExplicitExpressionBody - [16..21)::5
  43678. + RazorMetaCode - [16..17)::1 - Gen<None> - SpanEditHandler;Accepts:None
  43679. + LeftParenthesis;[(];
  43680. + CSharpCodeBlock - [17..20)::3
  43681. + CSharpExpressionLiteral - [17..20)::3 - [foo] - Gen<Expr> - SpanEditHandler;Accepts:Any
  43682. + Identifier;[foo];
  43683. + RazorMetaCode - [20..21)::1 - Gen<None> - SpanEditHandler;Accepts:None
  43684. + RightParenthesis;[)];
  43685. + CSharpStatementLiteral - [21..23)::2 - [ }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  43686. + Whitespace;[ ];
  43687. + RightBrace;[}];
  43688. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpNestedStatementsTest/NestedImplicitExpression.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpNestedStatementsTest/NestedImplicitExpression.stree.txt
  43689. index 4eee2c3a6f2..749472b5589 100644
  43690. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpNestedStatementsTest/NestedImplicitExpression.stree.txt
  43691. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpNestedStatementsTest/NestedImplicitExpression.stree.txt
  43692. @@ -1,19 +1,22 @@
  43693. -Statement block - Gen<None> - 21 - (0:0,0)
  43694. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  43695. - SyntaxKind.Transition;[@];
  43696. - Code span - Gen<Stmt> - [while(true) { ] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:7
  43697. - SyntaxKind.Keyword;[while];
  43698. - SyntaxKind.LeftParenthesis;[(];
  43699. - SyntaxKind.Keyword;[true];
  43700. - SyntaxKind.RightParenthesis;[)];
  43701. - SyntaxKind.Whitespace;[ ];
  43702. - SyntaxKind.LeftBrace;[{];
  43703. - SyntaxKind.Whitespace;[ ];
  43704. - Expression block - Gen<Expr> - 4 - (15:0,15)
  43705. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:1
  43706. - SyntaxKind.Transition;[@];
  43707. - Code span - Gen<Expr> - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K14 - (16:0,16) - Tokens:1
  43708. - SyntaxKind.Identifier;[foo];
  43709. - Code span - Gen<Stmt> - [ }] - SpanEditHandler;Accepts:None - (19:0,19) - Tokens:2
  43710. - SyntaxKind.Whitespace;[ ];
  43711. - SyntaxKind.RightBrace;[}];
  43712. +CSharpCodeBlock - [0..21)::21 - [@while(true) { @foo }]
  43713. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  43714. + Transition;[@];
  43715. + CSharpStatementLiteral - [1..15)::14 - [while(true) { ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  43716. + Keyword;[while];
  43717. + LeftParenthesis;[(];
  43718. + Keyword;[true];
  43719. + RightParenthesis;[)];
  43720. + Whitespace;[ ];
  43721. + LeftBrace;[{];
  43722. + Whitespace;[ ];
  43723. + CSharpCodeBlock - [15..19)::4
  43724. + CSharpImplicitExpression - [15..19)::4
  43725. + CSharpTransition - [15..16)::1 - Gen<None> - SpanEditHandler;Accepts:None
  43726. + Transition;[@];
  43727. + CSharpImplicitExpressionBody - [16..19)::3
  43728. + CSharpCodeBlock - [16..19)::3
  43729. + CSharpExpressionLiteral - [16..19)::3 - [foo] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K14
  43730. + Identifier;[foo];
  43731. + CSharpStatementLiteral - [19..21)::2 - [ }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  43732. + Whitespace;[ ];
  43733. + RightBrace;[}];
  43734. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpNestedStatementsTest/NestedKeywordStatement.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpNestedStatementsTest/NestedKeywordStatement.stree.txt
  43735. index 8bb927c9e5b..96fe888bc03 100644
  43736. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpNestedStatementsTest/NestedKeywordStatement.stree.txt
  43737. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpNestedStatementsTest/NestedKeywordStatement.stree.txt
  43738. @@ -1,43 +1,43 @@
  43739. -Statement block - Gen<None> - 55 - (0:0,0)
  43740. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  43741. - SyntaxKind.Transition;[@];
  43742. - Code span - Gen<Stmt> - [while(true) { for(int i = 0; i < 10; i++) { foo(); } }] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:39
  43743. - SyntaxKind.Keyword;[while];
  43744. - SyntaxKind.LeftParenthesis;[(];
  43745. - SyntaxKind.Keyword;[true];
  43746. - SyntaxKind.RightParenthesis;[)];
  43747. - SyntaxKind.Whitespace;[ ];
  43748. - SyntaxKind.LeftBrace;[{];
  43749. - SyntaxKind.Whitespace;[ ];
  43750. - SyntaxKind.Keyword;[for];
  43751. - SyntaxKind.LeftParenthesis;[(];
  43752. - SyntaxKind.Keyword;[int];
  43753. - SyntaxKind.Whitespace;[ ];
  43754. - SyntaxKind.Identifier;[i];
  43755. - SyntaxKind.Whitespace;[ ];
  43756. - SyntaxKind.Assign;[=];
  43757. - SyntaxKind.Whitespace;[ ];
  43758. - SyntaxKind.IntegerLiteral;[0];
  43759. - SyntaxKind.Semicolon;[;];
  43760. - SyntaxKind.Whitespace;[ ];
  43761. - SyntaxKind.Identifier;[i];
  43762. - SyntaxKind.Whitespace;[ ];
  43763. - SyntaxKind.LessThan;[<];
  43764. - SyntaxKind.Whitespace;[ ];
  43765. - SyntaxKind.IntegerLiteral;[10];
  43766. - SyntaxKind.Semicolon;[;];
  43767. - SyntaxKind.Whitespace;[ ];
  43768. - SyntaxKind.Identifier;[i];
  43769. - SyntaxKind.Increment;[++];
  43770. - SyntaxKind.RightParenthesis;[)];
  43771. - SyntaxKind.Whitespace;[ ];
  43772. - SyntaxKind.LeftBrace;[{];
  43773. - SyntaxKind.Whitespace;[ ];
  43774. - SyntaxKind.Identifier;[foo];
  43775. - SyntaxKind.LeftParenthesis;[(];
  43776. - SyntaxKind.RightParenthesis;[)];
  43777. - SyntaxKind.Semicolon;[;];
  43778. - SyntaxKind.Whitespace;[ ];
  43779. - SyntaxKind.RightBrace;[}];
  43780. - SyntaxKind.Whitespace;[ ];
  43781. - SyntaxKind.RightBrace;[}];
  43782. +CSharpCodeBlock - [0..55)::55 - [@while(true) { for(int i = 0; i < 10; i++) { foo(); } }]
  43783. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  43784. + Transition;[@];
  43785. + CSharpStatementLiteral - [1..55)::54 - [while(true) { for(int i = 0; i < 10; i++) { foo(); } }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  43786. + Keyword;[while];
  43787. + LeftParenthesis;[(];
  43788. + Keyword;[true];
  43789. + RightParenthesis;[)];
  43790. + Whitespace;[ ];
  43791. + LeftBrace;[{];
  43792. + Whitespace;[ ];
  43793. + Keyword;[for];
  43794. + LeftParenthesis;[(];
  43795. + Keyword;[int];
  43796. + Whitespace;[ ];
  43797. + Identifier;[i];
  43798. + Whitespace;[ ];
  43799. + Assign;[=];
  43800. + Whitespace;[ ];
  43801. + IntegerLiteral;[0];
  43802. + Semicolon;[;];
  43803. + Whitespace;[ ];
  43804. + Identifier;[i];
  43805. + Whitespace;[ ];
  43806. + LessThan;[<];
  43807. + Whitespace;[ ];
  43808. + IntegerLiteral;[10];
  43809. + Semicolon;[;];
  43810. + Whitespace;[ ];
  43811. + Identifier;[i];
  43812. + Increment;[++];
  43813. + RightParenthesis;[)];
  43814. + Whitespace;[ ];
  43815. + LeftBrace;[{];
  43816. + Whitespace;[ ];
  43817. + Identifier;[foo];
  43818. + LeftParenthesis;[(];
  43819. + RightParenthesis;[)];
  43820. + Semicolon;[;];
  43821. + Whitespace;[ ];
  43822. + RightBrace;[}];
  43823. + Whitespace;[ ];
  43824. + RightBrace;[}];
  43825. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpNestedStatementsTest/NestedMarkupBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpNestedStatementsTest/NestedMarkupBlock.stree.txt
  43826. index f7dfcb67d6e..e914c2afcb7 100644
  43827. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpNestedStatementsTest/NestedMarkupBlock.stree.txt
  43828. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpNestedStatementsTest/NestedMarkupBlock.stree.txt
  43829. @@ -1,30 +1,30 @@
  43830. -Statement block - Gen<None> - 29 - (0:0,0)
  43831. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  43832. - SyntaxKind.Transition;[@];
  43833. - Code span - Gen<Stmt> - [while(true) {] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:6
  43834. - SyntaxKind.Keyword;[while];
  43835. - SyntaxKind.LeftParenthesis;[(];
  43836. - SyntaxKind.Keyword;[true];
  43837. - SyntaxKind.RightParenthesis;[)];
  43838. - SyntaxKind.Whitespace;[ ];
  43839. - SyntaxKind.LeftBrace;[{];
  43840. - Markup block - Gen<None> - 14 - (14:0,14)
  43841. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  43842. - SyntaxKind.Whitespace;[ ];
  43843. - Tag block - Gen<None> - 3 - (15:0,15)
  43844. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:3
  43845. - SyntaxKind.OpenAngle;[<];
  43846. - SyntaxKind.Text;[p];
  43847. - SyntaxKind.CloseAngle;[>];
  43848. - Markup span - Gen<Markup> - [Hello] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:1
  43849. - SyntaxKind.Text;[Hello];
  43850. - Tag block - Gen<None> - 4 - (23:0,23)
  43851. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (23:0,23) - Tokens:4
  43852. - SyntaxKind.OpenAngle;[<];
  43853. - SyntaxKind.ForwardSlash;[/];
  43854. - SyntaxKind.Text;[p];
  43855. - SyntaxKind.CloseAngle;[>];
  43856. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (27:0,27) - Tokens:1
  43857. - SyntaxKind.Whitespace;[ ];
  43858. - Code span - Gen<Stmt> - [}] - SpanEditHandler;Accepts:None - (28:0,28) - Tokens:1
  43859. - SyntaxKind.RightBrace;[}];
  43860. +CSharpCodeBlock - [0..29)::29 - [@while(true) { <p>Hello</p> }]
  43861. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  43862. + Transition;[@];
  43863. + CSharpStatementLiteral - [1..14)::13 - [while(true) {] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  43864. + Keyword;[while];
  43865. + LeftParenthesis;[(];
  43866. + Keyword;[true];
  43867. + RightParenthesis;[)];
  43868. + Whitespace;[ ];
  43869. + LeftBrace;[{];
  43870. + MarkupBlock - [14..28)::14
  43871. + MarkupTextLiteral - [14..15)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  43872. + Whitespace;[ ];
  43873. + MarkupTagBlock - [15..18)::3 - [<p>]
  43874. + MarkupTextLiteral - [15..18)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  43875. + OpenAngle;[<];
  43876. + Text;[p];
  43877. + CloseAngle;[>];
  43878. + MarkupTextLiteral - [18..23)::5 - [Hello] - Gen<Markup> - SpanEditHandler;Accepts:Any
  43879. + Text;[Hello];
  43880. + MarkupTagBlock - [23..27)::4 - [</p>]
  43881. + MarkupTextLiteral - [23..27)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  43882. + OpenAngle;[<];
  43883. + ForwardSlash;[/];
  43884. + Text;[p];
  43885. + CloseAngle;[>];
  43886. + MarkupTextLiteral - [27..28)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  43887. + Whitespace;[ ];
  43888. + CSharpStatementLiteral - [28..29)::1 - [}] - Gen<Stmt> - SpanEditHandler;Accepts:None
  43889. + RightBrace;[}];
  43890. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpNestedStatementsTest/NestedSimpleStatement.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpNestedStatementsTest/NestedSimpleStatement.stree.txt
  43891. index 9c3cab81534..b80423d15c8 100644
  43892. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpNestedStatementsTest/NestedSimpleStatement.stree.txt
  43893. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpNestedStatementsTest/NestedSimpleStatement.stree.txt
  43894. @@ -1,17 +1,17 @@
  43895. -Statement block - Gen<None> - 23 - (0:0,0)
  43896. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  43897. - SyntaxKind.Transition;[@];
  43898. - Code span - Gen<Stmt> - [while(true) { foo(); }] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:13
  43899. - SyntaxKind.Keyword;[while];
  43900. - SyntaxKind.LeftParenthesis;[(];
  43901. - SyntaxKind.Keyword;[true];
  43902. - SyntaxKind.RightParenthesis;[)];
  43903. - SyntaxKind.Whitespace;[ ];
  43904. - SyntaxKind.LeftBrace;[{];
  43905. - SyntaxKind.Whitespace;[ ];
  43906. - SyntaxKind.Identifier;[foo];
  43907. - SyntaxKind.LeftParenthesis;[(];
  43908. - SyntaxKind.RightParenthesis;[)];
  43909. - SyntaxKind.Semicolon;[;];
  43910. - SyntaxKind.Whitespace;[ ];
  43911. - SyntaxKind.RightBrace;[}];
  43912. +CSharpCodeBlock - [0..23)::23 - [@while(true) { foo(); }]
  43913. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  43914. + Transition;[@];
  43915. + CSharpStatementLiteral - [1..23)::22 - [while(true) { foo(); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  43916. + Keyword;[while];
  43917. + LeftParenthesis;[(];
  43918. + Keyword;[true];
  43919. + RightParenthesis;[)];
  43920. + Whitespace;[ ];
  43921. + LeftBrace;[{];
  43922. + Whitespace;[ ];
  43923. + Identifier;[foo];
  43924. + LeftParenthesis;[(];
  43925. + RightParenthesis;[)];
  43926. + Semicolon;[;];
  43927. + Whitespace;[ ];
  43928. + RightBrace;[}];
  43929. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/EmptyRazorComment.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/EmptyRazorComment.stree.txt
  43930. index 0fa26e309a2..4ffe83985cd 100644
  43931. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/EmptyRazorComment.stree.txt
  43932. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/EmptyRazorComment.stree.txt
  43933. @@ -1,16 +1,12 @@
  43934. -Markup block - Gen<None> - 4 - (0:0,0)
  43935. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  43936. - SyntaxKind.Unknown;[];
  43937. - Comment block - Gen<RazorComment> - 4 - (0:0,0)
  43938. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  43939. - SyntaxKind.RazorCommentTransition;[@];
  43940. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  43941. - SyntaxKind.RazorCommentStar;[*];
  43942. - Comment span - Gen<None> - [] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  43943. - SyntaxKind.Unknown;[];
  43944. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (2:0,2) - Tokens:1
  43945. - SyntaxKind.RazorCommentStar;[*];
  43946. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  43947. - SyntaxKind.RazorCommentTransition;[@];
  43948. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  43949. - SyntaxKind.Unknown;[];
  43950. +RazorDocument - [0..4)::4 - [@**@]
  43951. + MarkupBlock - [0..4)::4
  43952. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  43953. + Marker;[];
  43954. + RazorComment - [0..4)::4
  43955. + RazorCommentTransition;[@];
  43956. + RazorCommentStar;[*];
  43957. + RazorCommentLiteral;[<Missing>];
  43958. + RazorCommentStar;[*];
  43959. + RazorCommentTransition;[@];
  43960. + MarkupTextLiteral - [4..4)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  43961. + Marker;[];
  43962. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/MultipleRazorCommentInMarkup.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/MultipleRazorCommentInMarkup.stree.txt
  43963. index cc542a8c2ff..b5d71e6e7dd 100644
  43964. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/MultipleRazorCommentInMarkup.stree.txt
  43965. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/MultipleRazorCommentInMarkup.stree.txt
  43966. @@ -1,43 +1,34 @@
  43967. -Markup block - Gen<None> - 25 - (0:0,0)
  43968. - Tag block - Gen<None> - 3 - (0:0,0)
  43969. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  43970. - SyntaxKind.OpenAngle;[<];
  43971. - SyntaxKind.Text;[p];
  43972. - SyntaxKind.CloseAngle;[>];
  43973. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:1
  43974. - SyntaxKind.NewLine;[LF];
  43975. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Any - (5:1,0) - Tokens:1
  43976. - SyntaxKind.Whitespace;[ ];
  43977. - Comment block - Gen<RazorComment> - 4 - (7:1,2)
  43978. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (7:1,2) - Tokens:1
  43979. - SyntaxKind.RazorCommentTransition;[@];
  43980. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (8:1,3) - Tokens:1
  43981. - SyntaxKind.RazorCommentStar;[*];
  43982. - Comment span - Gen<None> - [] - SpanEditHandler;Accepts:Any - (9:1,4) - Tokens:1
  43983. - SyntaxKind.Unknown;[];
  43984. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (9:1,4) - Tokens:1
  43985. - SyntaxKind.RazorCommentStar;[*];
  43986. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (10:1,5) - Tokens:1
  43987. - SyntaxKind.RazorCommentTransition;[@];
  43988. - Markup span - Gen<None> - [ LF] - SpanEditHandler;Accepts:Any - (11:1,6) - Tokens:2
  43989. - SyntaxKind.Whitespace;[ ];
  43990. - SyntaxKind.NewLine;[LF];
  43991. - Comment block - Gen<RazorComment> - 4 - (15:2,0)
  43992. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (15:2,0) - Tokens:1
  43993. - SyntaxKind.RazorCommentTransition;[@];
  43994. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (16:2,1) - Tokens:1
  43995. - SyntaxKind.RazorCommentStar;[*];
  43996. - Comment span - Gen<None> - [] - SpanEditHandler;Accepts:Any - (17:2,2) - Tokens:1
  43997. - SyntaxKind.Unknown;[];
  43998. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (17:2,2) - Tokens:1
  43999. - SyntaxKind.RazorCommentStar;[*];
  44000. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (18:2,3) - Tokens:1
  44001. - SyntaxKind.RazorCommentTransition;[@];
  44002. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (19:2,4) - Tokens:1
  44003. - SyntaxKind.NewLine;[LF];
  44004. - Tag block - Gen<None> - 4 - (21:3,0)
  44005. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (21:3,0) - Tokens:4
  44006. - SyntaxKind.OpenAngle;[<];
  44007. - SyntaxKind.ForwardSlash;[/];
  44008. - SyntaxKind.Text;[p];
  44009. - SyntaxKind.CloseAngle;[>];
  44010. +RazorDocument - [0..25)::25 - [<p>LF @**@ LF@**@LF</p>]
  44011. + MarkupBlock - [0..25)::25
  44012. + MarkupTagBlock - [0..3)::3 - [<p>]
  44013. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44014. + OpenAngle;[<];
  44015. + Text;[p];
  44016. + CloseAngle;[>];
  44017. + MarkupTextLiteral - [3..5)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44018. + NewLine;[LF];
  44019. + MarkupEphemeralTextLiteral - [5..7)::2 - [ ] - Gen<None> - SpanEditHandler;Accepts:Any
  44020. + Whitespace;[ ];
  44021. + RazorComment - [7..11)::4
  44022. + RazorCommentTransition;[@];
  44023. + RazorCommentStar;[*];
  44024. + RazorCommentLiteral;[<Missing>];
  44025. + RazorCommentStar;[*];
  44026. + RazorCommentTransition;[@];
  44027. + MarkupEphemeralTextLiteral - [11..15)::4 - [ LF] - Gen<None> - SpanEditHandler;Accepts:Any
  44028. + Whitespace;[ ];
  44029. + NewLine;[LF];
  44030. + RazorComment - [15..19)::4
  44031. + RazorCommentTransition;[@];
  44032. + RazorCommentStar;[*];
  44033. + RazorCommentLiteral;[<Missing>];
  44034. + RazorCommentStar;[*];
  44035. + RazorCommentTransition;[@];
  44036. + MarkupEphemeralTextLiteral - [19..21)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  44037. + NewLine;[LF];
  44038. + MarkupTagBlock - [21..25)::4 - [</p>]
  44039. + MarkupTextLiteral - [21..25)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44040. + OpenAngle;[<];
  44041. + ForwardSlash;[/];
  44042. + Text;[p];
  44043. + CloseAngle;[>];
  44044. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/MultipleRazorCommentsInSameLineInMarkup.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/MultipleRazorCommentsInSameLineInMarkup.stree.txt
  44045. index aa67eb99bf7..6c431b2348f 100644
  44046. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/MultipleRazorCommentsInSameLineInMarkup.stree.txt
  44047. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/MultipleRazorCommentsInSameLineInMarkup.stree.txt
  44048. @@ -1,42 +1,33 @@
  44049. -Markup block - Gen<None> - 21 - (0:0,0)
  44050. - Tag block - Gen<None> - 3 - (0:0,0)
  44051. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  44052. - SyntaxKind.OpenAngle;[<];
  44053. - SyntaxKind.Text;[p];
  44054. - SyntaxKind.CloseAngle;[>];
  44055. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:1
  44056. - SyntaxKind.NewLine;[LF];
  44057. - Comment block - Gen<RazorComment> - 4 - (5:1,0)
  44058. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (5:1,0) - Tokens:1
  44059. - SyntaxKind.RazorCommentTransition;[@];
  44060. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (6:1,1) - Tokens:1
  44061. - SyntaxKind.RazorCommentStar;[*];
  44062. - Comment span - Gen<None> - [] - SpanEditHandler;Accepts:Any - (7:1,2) - Tokens:1
  44063. - SyntaxKind.Unknown;[];
  44064. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (7:1,2) - Tokens:1
  44065. - SyntaxKind.RazorCommentStar;[*];
  44066. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (8:1,3) - Tokens:1
  44067. - SyntaxKind.RazorCommentTransition;[@];
  44068. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (9:1,4) - Tokens:1
  44069. - SyntaxKind.Unknown;[];
  44070. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Any - (9:1,4) - Tokens:1
  44071. - SyntaxKind.Whitespace;[ ];
  44072. - Comment block - Gen<RazorComment> - 4 - (11:1,6)
  44073. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (11:1,6) - Tokens:1
  44074. - SyntaxKind.RazorCommentTransition;[@];
  44075. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (12:1,7) - Tokens:1
  44076. - SyntaxKind.RazorCommentStar;[*];
  44077. - Comment span - Gen<None> - [] - SpanEditHandler;Accepts:Any - (13:1,8) - Tokens:1
  44078. - SyntaxKind.Unknown;[];
  44079. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (13:1,8) - Tokens:1
  44080. - SyntaxKind.RazorCommentStar;[*];
  44081. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (14:1,9) - Tokens:1
  44082. - SyntaxKind.RazorCommentTransition;[@];
  44083. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (15:1,10) - Tokens:1
  44084. - SyntaxKind.NewLine;[LF];
  44085. - Tag block - Gen<None> - 4 - (17:2,0)
  44086. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (17:2,0) - Tokens:4
  44087. - SyntaxKind.OpenAngle;[<];
  44088. - SyntaxKind.ForwardSlash;[/];
  44089. - SyntaxKind.Text;[p];
  44090. - SyntaxKind.CloseAngle;[>];
  44091. +RazorDocument - [0..21)::21 - [<p>LF@**@ @**@LF</p>]
  44092. + MarkupBlock - [0..21)::21
  44093. + MarkupTagBlock - [0..3)::3 - [<p>]
  44094. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44095. + OpenAngle;[<];
  44096. + Text;[p];
  44097. + CloseAngle;[>];
  44098. + MarkupTextLiteral - [3..5)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44099. + NewLine;[LF];
  44100. + RazorComment - [5..9)::4
  44101. + RazorCommentTransition;[@];
  44102. + RazorCommentStar;[*];
  44103. + RazorCommentLiteral;[<Missing>];
  44104. + RazorCommentStar;[*];
  44105. + RazorCommentTransition;[@];
  44106. + MarkupTextLiteral - [9..9)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44107. + Marker;[];
  44108. + MarkupEphemeralTextLiteral - [9..11)::2 - [ ] - Gen<None> - SpanEditHandler;Accepts:Any
  44109. + Whitespace;[ ];
  44110. + RazorComment - [11..15)::4
  44111. + RazorCommentTransition;[@];
  44112. + RazorCommentStar;[*];
  44113. + RazorCommentLiteral;[<Missing>];
  44114. + RazorCommentStar;[*];
  44115. + RazorCommentTransition;[@];
  44116. + MarkupEphemeralTextLiteral - [15..17)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  44117. + NewLine;[LF];
  44118. + MarkupTagBlock - [17..21)::4 - [</p>]
  44119. + MarkupTextLiteral - [17..21)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44120. + OpenAngle;[<];
  44121. + ForwardSlash;[/];
  44122. + Text;[p];
  44123. + CloseAngle;[>];
  44124. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentInClosingTagBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentInClosingTagBlock.stree.txt
  44125. index be566bbf0e8..b92e9893081 100644
  44126. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentInClosingTagBlock.stree.txt
  44127. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentInClosingTagBlock.stree.txt
  44128. @@ -1,25 +1,21 @@
  44129. -Markup block - Gen<None> - 33 - (0:0,0)
  44130. - Tag block - Gen<None> - 6 - (0:0,0)
  44131. - Markup span - Gen<Markup> - [<text>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  44132. - SyntaxKind.OpenAngle;[<];
  44133. - SyntaxKind.Text;[text];
  44134. - SyntaxKind.CloseAngle;[>];
  44135. - Tag block - Gen<None> - 7 - (6:0,6)
  44136. - Markup span - Gen<Markup> - [</text ] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:4
  44137. - SyntaxKind.OpenAngle;[<];
  44138. - SyntaxKind.ForwardSlash;[/];
  44139. - SyntaxKind.Text;[text];
  44140. - SyntaxKind.Whitespace;[ ];
  44141. - Comment block - Gen<RazorComment> - 19 - (13:0,13)
  44142. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:1
  44143. - SyntaxKind.RazorCommentTransition;[@];
  44144. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (14:0,14) - Tokens:1
  44145. - SyntaxKind.RazorCommentStar;[*];
  44146. - Comment span - Gen<None> - [ razor comment ] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:1
  44147. - SyntaxKind.RazorCommentLiteral;[ razor comment ];
  44148. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (30:0,30) - Tokens:1
  44149. - SyntaxKind.RazorCommentStar;[*];
  44150. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (31:0,31) - Tokens:1
  44151. - SyntaxKind.RazorCommentTransition;[@];
  44152. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (32:0,32) - Tokens:1
  44153. - SyntaxKind.CloseAngle;[>];
  44154. +RazorDocument - [0..33)::33 - [<text></text @* razor comment *@>]
  44155. + MarkupBlock - [0..33)::33
  44156. + MarkupTagBlock - [0..6)::6 - [<text>]
  44157. + MarkupTextLiteral - [0..6)::6 - [<text>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44158. + OpenAngle;[<];
  44159. + Text;[text];
  44160. + CloseAngle;[>];
  44161. + MarkupTagBlock - [6..13)::7 - [</text ]
  44162. + MarkupTextLiteral - [6..13)::7 - [</text ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44163. + OpenAngle;[<];
  44164. + ForwardSlash;[/];
  44165. + Text;[text];
  44166. + Whitespace;[ ];
  44167. + RazorComment - [13..32)::19
  44168. + RazorCommentTransition;[@];
  44169. + RazorCommentStar;[*];
  44170. + RazorCommentLiteral;[ razor comment ];
  44171. + RazorCommentStar;[*];
  44172. + RazorCommentTransition;[@];
  44173. + MarkupTextLiteral - [32..33)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44174. + CloseAngle;[>];
  44175. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentInImplicitExpressionMethodCall.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentInImplicitExpressionMethodCall.stree.txt
  44176. index 0fa62fac082..59217177a62 100644
  44177. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentInImplicitExpressionMethodCall.stree.txt
  44178. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentInImplicitExpressionMethodCall.stree.txt
  44179. @@ -1,23 +1,22 @@
  44180. -Markup block - Gen<None> - 13 - (0:0,0)
  44181. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  44182. - SyntaxKind.Unknown;[];
  44183. - Expression block - Gen<Expr> - 13 - (0:0,0)
  44184. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  44185. - SyntaxKind.Transition;[@];
  44186. - Code span - Gen<Expr> - [foo(LF] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:3
  44187. - SyntaxKind.Identifier;[foo];
  44188. - SyntaxKind.LeftParenthesis;[(];
  44189. - SyntaxKind.NewLine;[LF];
  44190. - Comment block - Gen<RazorComment> - 4 - (7:1,0)
  44191. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (7:1,0) - Tokens:1
  44192. - SyntaxKind.RazorCommentTransition;[@];
  44193. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (8:1,1) - Tokens:1
  44194. - SyntaxKind.RazorCommentStar;[*];
  44195. - Comment span - Gen<None> - [] - SpanEditHandler;Accepts:Any - (9:1,2) - Tokens:1
  44196. - SyntaxKind.Unknown;[];
  44197. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (9:1,2) - Tokens:1
  44198. - SyntaxKind.RazorCommentStar;[*];
  44199. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (10:1,3) - Tokens:1
  44200. - SyntaxKind.RazorCommentTransition;[@];
  44201. - Code span - Gen<Expr> - [LF] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (11:1,4) - Tokens:1
  44202. - SyntaxKind.NewLine;[LF];
  44203. +RazorDocument - [0..13)::13 - [@foo(LF@**@LF]
  44204. + MarkupBlock - [0..13)::13
  44205. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44206. + Marker;[];
  44207. + CSharpCodeBlock - [0..13)::13
  44208. + CSharpImplicitExpression - [0..13)::13
  44209. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  44210. + Transition;[@];
  44211. + CSharpImplicitExpressionBody - [1..13)::12
  44212. + CSharpCodeBlock - [1..13)::12
  44213. + CSharpExpressionLiteral - [1..7)::6 - [foo(LF] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14
  44214. + Identifier;[foo];
  44215. + LeftParenthesis;[(];
  44216. + NewLine;[LF];
  44217. + RazorComment - [7..11)::4
  44218. + RazorCommentTransition;[@];
  44219. + RazorCommentStar;[*];
  44220. + RazorCommentLiteral;[<Missing>];
  44221. + RazorCommentStar;[*];
  44222. + RazorCommentTransition;[@];
  44223. + CSharpExpressionLiteral - [11..13)::2 - [LF] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14
  44224. + NewLine;[LF];
  44225. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentInMarkup.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentInMarkup.stree.txt
  44226. index 1cb47341713..365ba65dbab 100644
  44227. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentInMarkup.stree.txt
  44228. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentInMarkup.stree.txt
  44229. @@ -1,27 +1,23 @@
  44230. -Markup block - Gen<None> - 15 - (0:0,0)
  44231. - Tag block - Gen<None> - 3 - (0:0,0)
  44232. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  44233. - SyntaxKind.OpenAngle;[<];
  44234. - SyntaxKind.Text;[p];
  44235. - SyntaxKind.CloseAngle;[>];
  44236. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:1
  44237. - SyntaxKind.NewLine;[LF];
  44238. - Comment block - Gen<RazorComment> - 4 - (5:1,0)
  44239. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (5:1,0) - Tokens:1
  44240. - SyntaxKind.RazorCommentTransition;[@];
  44241. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (6:1,1) - Tokens:1
  44242. - SyntaxKind.RazorCommentStar;[*];
  44243. - Comment span - Gen<None> - [] - SpanEditHandler;Accepts:Any - (7:1,2) - Tokens:1
  44244. - SyntaxKind.Unknown;[];
  44245. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (7:1,2) - Tokens:1
  44246. - SyntaxKind.RazorCommentStar;[*];
  44247. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (8:1,3) - Tokens:1
  44248. - SyntaxKind.RazorCommentTransition;[@];
  44249. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (9:1,4) - Tokens:1
  44250. - SyntaxKind.NewLine;[LF];
  44251. - Tag block - Gen<None> - 4 - (11:2,0)
  44252. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (11:2,0) - Tokens:4
  44253. - SyntaxKind.OpenAngle;[<];
  44254. - SyntaxKind.ForwardSlash;[/];
  44255. - SyntaxKind.Text;[p];
  44256. - SyntaxKind.CloseAngle;[>];
  44257. +RazorDocument - [0..15)::15 - [<p>LF@**@LF</p>]
  44258. + MarkupBlock - [0..15)::15
  44259. + MarkupTagBlock - [0..3)::3 - [<p>]
  44260. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44261. + OpenAngle;[<];
  44262. + Text;[p];
  44263. + CloseAngle;[>];
  44264. + MarkupTextLiteral - [3..5)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44265. + NewLine;[LF];
  44266. + RazorComment - [5..9)::4
  44267. + RazorCommentTransition;[@];
  44268. + RazorCommentStar;[*];
  44269. + RazorCommentLiteral;[<Missing>];
  44270. + RazorCommentStar;[*];
  44271. + RazorCommentTransition;[@];
  44272. + MarkupEphemeralTextLiteral - [9..11)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  44273. + NewLine;[LF];
  44274. + MarkupTagBlock - [11..15)::4 - [</p>]
  44275. + MarkupTextLiteral - [11..15)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44276. + OpenAngle;[<];
  44277. + ForwardSlash;[/];
  44278. + Text;[p];
  44279. + CloseAngle;[>];
  44280. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentInOpeningTagBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentInOpeningTagBlock.stree.txt
  44281. index 7ae337d7648..85ccccc8add 100644
  44282. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentInOpeningTagBlock.stree.txt
  44283. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentInOpeningTagBlock.stree.txt
  44284. @@ -1,25 +1,21 @@
  44285. -Markup block - Gen<None> - 33 - (0:0,0)
  44286. - Tag block - Gen<None> - 26 - (0:0,0)
  44287. - Markup span - Gen<Markup> - [<text ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  44288. - SyntaxKind.OpenAngle;[<];
  44289. - SyntaxKind.Text;[text];
  44290. - SyntaxKind.Whitespace;[ ];
  44291. - Comment block - Gen<RazorComment> - 19 - (6:0,6)
  44292. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (6:0,6) - Tokens:1
  44293. - SyntaxKind.RazorCommentTransition;[@];
  44294. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (7:0,7) - Tokens:1
  44295. - SyntaxKind.RazorCommentStar;[*];
  44296. - Comment span - Gen<None> - [ razor comment ] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:1
  44297. - SyntaxKind.RazorCommentLiteral;[ razor comment ];
  44298. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (23:0,23) - Tokens:1
  44299. - SyntaxKind.RazorCommentStar;[*];
  44300. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (24:0,24) - Tokens:1
  44301. - SyntaxKind.RazorCommentTransition;[@];
  44302. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:1
  44303. - SyntaxKind.CloseAngle;[>];
  44304. - Tag block - Gen<None> - 7 - (26:0,26)
  44305. - Markup span - Gen<Markup> - [</text>] - SpanEditHandler;Accepts:Any - (26:0,26) - Tokens:4
  44306. - SyntaxKind.OpenAngle;[<];
  44307. - SyntaxKind.ForwardSlash;[/];
  44308. - SyntaxKind.Text;[text];
  44309. - SyntaxKind.CloseAngle;[>];
  44310. +RazorDocument - [0..33)::33 - [<text @* razor comment *@></text>]
  44311. + MarkupBlock - [0..33)::33
  44312. + MarkupTagBlock - [0..26)::26 - [<text @* razor comment *@>]
  44313. + MarkupTextLiteral - [0..6)::6 - [<text ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44314. + OpenAngle;[<];
  44315. + Text;[text];
  44316. + Whitespace;[ ];
  44317. + RazorComment - [6..25)::19
  44318. + RazorCommentTransition;[@];
  44319. + RazorCommentStar;[*];
  44320. + RazorCommentLiteral;[ razor comment ];
  44321. + RazorCommentStar;[*];
  44322. + RazorCommentTransition;[@];
  44323. + MarkupTextLiteral - [25..26)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44324. + CloseAngle;[>];
  44325. + MarkupTagBlock - [26..33)::7 - [</text>]
  44326. + MarkupTextLiteral - [26..33)::7 - [</text>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44327. + OpenAngle;[<];
  44328. + ForwardSlash;[/];
  44329. + Text;[text];
  44330. + CloseAngle;[>];
  44331. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentInVerbatimBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentInVerbatimBlock.stree.txt
  44332. index d7fc7840fb6..45402df0128 100644
  44333. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentInVerbatimBlock.stree.txt
  44334. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentInVerbatimBlock.stree.txt
  44335. @@ -1,35 +1,36 @@
  44336. -Markup block - Gen<None> - 26 - (0:0,0)
  44337. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  44338. - SyntaxKind.Unknown;[];
  44339. - Statement block - Gen<None> - 26 - (0:0,0)
  44340. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  44341. - SyntaxKind.Transition;[@];
  44342. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  44343. - SyntaxKind.LeftBrace;[{];
  44344. - Code span - Gen<Stmt> - [LF ] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[}];AtEOL - (2:0,2) - Tokens:2
  44345. - SyntaxKind.NewLine;[LF];
  44346. - SyntaxKind.Whitespace;[ ];
  44347. - Markup block - Gen<None> - 18 - (8:1,4)
  44348. - Tag block - Gen<None> - 5 - (8:1,4)
  44349. - Transition span - Gen<None> - [<text] - SpanEditHandler;Accepts:Any - (8:1,4) - Tokens:2
  44350. - SyntaxKind.OpenAngle;[<];
  44351. - SyntaxKind.Text;[text];
  44352. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (13:1,9) - Tokens:1
  44353. - SyntaxKind.NewLine;[LF];
  44354. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Any - (15:2,0) - Tokens:1
  44355. - SyntaxKind.Whitespace;[ ];
  44356. - Comment block - Gen<RazorComment> - 4 - (19:2,4)
  44357. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (19:2,4) - Tokens:1
  44358. - SyntaxKind.RazorCommentTransition;[@];
  44359. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (20:2,5) - Tokens:1
  44360. - SyntaxKind.RazorCommentStar;[*];
  44361. - Comment span - Gen<None> - [] - SpanEditHandler;Accepts:Any - (21:2,6) - Tokens:1
  44362. - SyntaxKind.Unknown;[];
  44363. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (21:2,6) - Tokens:1
  44364. - SyntaxKind.RazorCommentStar;[*];
  44365. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (22:2,7) - Tokens:1
  44366. - SyntaxKind.RazorCommentTransition;[@];
  44367. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (23:2,8) - Tokens:1
  44368. - SyntaxKind.NewLine;[LF];
  44369. - Markup span - Gen<Markup> - [}] - SpanEditHandler;Accepts:Any - (25:3,0) - Tokens:1
  44370. - SyntaxKind.Text;[}];
  44371. +RazorDocument - [0..26)::26 - [@{LF <textLF @**@LF}]
  44372. + MarkupBlock - [0..26)::26
  44373. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44374. + Marker;[];
  44375. + CSharpCodeBlock - [0..26)::26
  44376. + CSharpStatement - [0..26)::26
  44377. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  44378. + Transition;[@];
  44379. + CSharpStatementBody - [1..26)::25
  44380. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  44381. + LeftBrace;[{];
  44382. + CSharpCodeBlock - [2..26)::24
  44383. + CSharpStatementLiteral - [2..8)::6 - [LF ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[}];AtEOL
  44384. + NewLine;[LF];
  44385. + Whitespace;[ ];
  44386. + MarkupBlock - [8..26)::18
  44387. + MarkupTagBlock - [8..13)::5 - [<text]
  44388. + MarkupTransition - [8..13)::5 - Gen<None> - SpanEditHandler;Accepts:Any
  44389. + OpenAngle;[<];
  44390. + Text;[text];
  44391. + MarkupTextLiteral - [13..15)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  44392. + NewLine;[LF];
  44393. + MarkupEphemeralTextLiteral - [15..19)::4 - [ ] - Gen<None> - SpanEditHandler;Accepts:Any
  44394. + Whitespace;[ ];
  44395. + RazorComment - [19..23)::4
  44396. + RazorCommentTransition;[@];
  44397. + RazorCommentStar;[*];
  44398. + RazorCommentLiteral;[<Missing>];
  44399. + RazorCommentStar;[*];
  44400. + RazorCommentTransition;[@];
  44401. + MarkupEphemeralTextLiteral - [23..25)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  44402. + NewLine;[LF];
  44403. + MarkupTextLiteral - [25..26)::1 - [}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44404. + Text;[}];
  44405. + RazorMetaCode - [26..26)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  44406. + RightBrace;[<Missing>];
  44407. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentWithExtraNewLineInMarkup.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentWithExtraNewLineInMarkup.stree.txt
  44408. index 2a4dd88b3d7..606807056b4 100644
  44409. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentWithExtraNewLineInMarkup.stree.txt
  44410. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentWithExtraNewLineInMarkup.stree.txt
  44411. @@ -1,43 +1,34 @@
  44412. -Markup block - Gen<None> - 45 - (0:0,0)
  44413. - Tag block - Gen<None> - 3 - (0:0,0)
  44414. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  44415. - SyntaxKind.OpenAngle;[<];
  44416. - SyntaxKind.Text;[p];
  44417. - SyntaxKind.CloseAngle;[>];
  44418. - Markup span - Gen<Markup> - [LFLF] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:2
  44419. - SyntaxKind.NewLine;[LF];
  44420. - SyntaxKind.NewLine;[LF];
  44421. - Comment block - Gen<RazorComment> - 13 - (7:2,0)
  44422. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (7:2,0) - Tokens:1
  44423. - SyntaxKind.RazorCommentTransition;[@];
  44424. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (8:2,1) - Tokens:1
  44425. - SyntaxKind.RazorCommentStar;[*];
  44426. - Comment span - Gen<None> - [ content ] - SpanEditHandler;Accepts:Any - (9:2,2) - Tokens:1
  44427. - SyntaxKind.RazorCommentLiteral;[ content ];
  44428. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (18:2,11) - Tokens:1
  44429. - SyntaxKind.RazorCommentStar;[*];
  44430. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (19:2,12) - Tokens:1
  44431. - SyntaxKind.RazorCommentTransition;[@];
  44432. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (20:2,13) - Tokens:1
  44433. - SyntaxKind.NewLine;[LF];
  44434. - Comment block - Gen<RazorComment> - 15 - (22:3,0)
  44435. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (22:3,0) - Tokens:1
  44436. - SyntaxKind.RazorCommentTransition;[@];
  44437. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (23:3,1) - Tokens:1
  44438. - SyntaxKind.RazorCommentStar;[*];
  44439. - Comment span - Gen<None> - [LFcontentLF] - SpanEditHandler;Accepts:Any - (24:3,2) - Tokens:1
  44440. - SyntaxKind.RazorCommentLiteral;[LFcontentLF];
  44441. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (35:5,0) - Tokens:1
  44442. - SyntaxKind.RazorCommentStar;[*];
  44443. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (36:5,1) - Tokens:1
  44444. - SyntaxKind.RazorCommentTransition;[@];
  44445. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (37:5,2) - Tokens:1
  44446. - SyntaxKind.NewLine;[LF];
  44447. - SyntaxKind.HtmlTextLiteral - [LF] - [39..41) - FullWidth: 2 - Slots: 1
  44448. - SyntaxKind.NewLine;[LF];
  44449. - Tag block - Gen<None> - 4 - (41:7,0)
  44450. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (41:7,0) - Tokens:4
  44451. - SyntaxKind.OpenAngle;[<];
  44452. - SyntaxKind.ForwardSlash;[/];
  44453. - SyntaxKind.Text;[p];
  44454. - SyntaxKind.CloseAngle;[>];
  44455. +RazorDocument - [0..45)::45 - [<p>LFLF@* content *@LF@*LFcontentLF*@LFLF</p>]
  44456. + MarkupBlock - [0..45)::45
  44457. + MarkupTagBlock - [0..3)::3 - [<p>]
  44458. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44459. + OpenAngle;[<];
  44460. + Text;[p];
  44461. + CloseAngle;[>];
  44462. + MarkupTextLiteral - [3..7)::4 - [LFLF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44463. + NewLine;[LF];
  44464. + NewLine;[LF];
  44465. + RazorComment - [7..20)::13
  44466. + RazorCommentTransition;[@];
  44467. + RazorCommentStar;[*];
  44468. + RazorCommentLiteral;[ content ];
  44469. + RazorCommentStar;[*];
  44470. + RazorCommentTransition;[@];
  44471. + MarkupEphemeralTextLiteral - [20..22)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  44472. + NewLine;[LF];
  44473. + RazorComment - [22..37)::15
  44474. + RazorCommentTransition;[@];
  44475. + RazorCommentStar;[*];
  44476. + RazorCommentLiteral;[LFcontentLF];
  44477. + RazorCommentStar;[*];
  44478. + RazorCommentTransition;[@];
  44479. + MarkupEphemeralTextLiteral - [37..39)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  44480. + NewLine;[LF];
  44481. + MarkupTextLiteral - [39..41)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44482. + NewLine;[LF];
  44483. + MarkupTagBlock - [41..45)::4 - [</p>]
  44484. + MarkupTextLiteral - [41..45)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44485. + OpenAngle;[<];
  44486. + ForwardSlash;[/];
  44487. + Text;[p];
  44488. + CloseAngle;[>];
  44489. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentsSurroundingMarkup.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentsSurroundingMarkup.stree.txt
  44490. index 89ef6af7708..9a928afc4f4 100644
  44491. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentsSurroundingMarkup.stree.txt
  44492. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorCommentsSurroundingMarkup.stree.txt
  44493. @@ -1,42 +1,33 @@
  44494. -Markup block - Gen<None> - 42 - (0:0,0)
  44495. - Tag block - Gen<None> - 3 - (0:0,0)
  44496. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  44497. - SyntaxKind.OpenAngle;[<];
  44498. - SyntaxKind.Text;[p];
  44499. - SyntaxKind.CloseAngle;[>];
  44500. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:1
  44501. - SyntaxKind.NewLine;[LF];
  44502. - Comment block - Gen<RazorComment> - 11 - (5:1,0)
  44503. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (5:1,0) - Tokens:1
  44504. - SyntaxKind.RazorCommentTransition;[@];
  44505. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (6:1,1) - Tokens:1
  44506. - SyntaxKind.RazorCommentStar;[*];
  44507. - Comment span - Gen<None> - [ hello ] - SpanEditHandler;Accepts:Any - (7:1,2) - Tokens:1
  44508. - SyntaxKind.RazorCommentLiteral;[ hello ];
  44509. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (14:1,9) - Tokens:1
  44510. - SyntaxKind.RazorCommentStar;[*];
  44511. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (15:1,10) - Tokens:1
  44512. - SyntaxKind.RazorCommentTransition;[@];
  44513. - Markup span - Gen<Markup> - [ content ] - SpanEditHandler;Accepts:Any - (16:1,11) - Tokens:3
  44514. - SyntaxKind.Whitespace;[ ];
  44515. - SyntaxKind.Text;[content];
  44516. - SyntaxKind.Whitespace;[ ];
  44517. - Comment block - Gen<RazorComment> - 11 - (25:1,20)
  44518. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (25:1,20) - Tokens:1
  44519. - SyntaxKind.RazorCommentTransition;[@];
  44520. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (26:1,21) - Tokens:1
  44521. - SyntaxKind.RazorCommentStar;[*];
  44522. - Comment span - Gen<None> - [ world ] - SpanEditHandler;Accepts:Any - (27:1,22) - Tokens:1
  44523. - SyntaxKind.RazorCommentLiteral;[ world ];
  44524. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (34:1,29) - Tokens:1
  44525. - SyntaxKind.RazorCommentStar;[*];
  44526. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (35:1,30) - Tokens:1
  44527. - SyntaxKind.RazorCommentTransition;[@];
  44528. - SyntaxKind.HtmlTextLiteral - [LF] - [36..38) - FullWidth: 2 - Slots: 1
  44529. - SyntaxKind.NewLine;[LF];
  44530. - Tag block - Gen<None> - 4 - (38:2,0)
  44531. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (38:2,0) - Tokens:4
  44532. - SyntaxKind.OpenAngle;[<];
  44533. - SyntaxKind.ForwardSlash;[/];
  44534. - SyntaxKind.Text;[p];
  44535. - SyntaxKind.CloseAngle;[>];
  44536. +RazorDocument - [0..42)::42 - [<p>LF@* hello *@ content @* world *@LF</p>]
  44537. + MarkupBlock - [0..42)::42
  44538. + MarkupTagBlock - [0..3)::3 - [<p>]
  44539. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44540. + OpenAngle;[<];
  44541. + Text;[p];
  44542. + CloseAngle;[>];
  44543. + MarkupTextLiteral - [3..5)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44544. + NewLine;[LF];
  44545. + RazorComment - [5..16)::11
  44546. + RazorCommentTransition;[@];
  44547. + RazorCommentStar;[*];
  44548. + RazorCommentLiteral;[ hello ];
  44549. + RazorCommentStar;[*];
  44550. + RazorCommentTransition;[@];
  44551. + MarkupTextLiteral - [16..25)::9 - [ content ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44552. + Whitespace;[ ];
  44553. + Text;[content];
  44554. + Whitespace;[ ];
  44555. + RazorComment - [25..36)::11
  44556. + RazorCommentTransition;[@];
  44557. + RazorCommentStar;[*];
  44558. + RazorCommentLiteral;[ world ];
  44559. + RazorCommentStar;[*];
  44560. + RazorCommentTransition;[@];
  44561. + MarkupTextLiteral - [36..38)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44562. + NewLine;[LF];
  44563. + MarkupTagBlock - [38..42)::4 - [</p>]
  44564. + MarkupTextLiteral - [38..42)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44565. + OpenAngle;[<];
  44566. + ForwardSlash;[/];
  44567. + Text;[p];
  44568. + CloseAngle;[>];
  44569. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorMultilineCommentInBlock.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorMultilineCommentInBlock.cspans.txt
  44570. new file mode 100644
  44571. index 00000000000..7f93c44b8fa
  44572. --- /dev/null
  44573. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorMultilineCommentInBlock.cspans.txt
  44574. @@ -0,0 +1,12 @@
  44575. +Markup span at (0:0,0 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [44] )
  44576. +Transition span at (2:1,0 [1] ) (Accepts:None) - Parent: Statement block at (2:1,0 [40] )
  44577. +MetaCode span at (3:1,1 [1] ) (Accepts:None) - Parent: Statement block at (2:1,0 [40] )
  44578. +Code span at (4:1,2 [6] ) (Accepts:Any) - Parent: Statement block at (2:1,0 [40] )
  44579. +Transition span at (10:2,4 [1] ) (Accepts:None) - Parent: Comment block at (10:2,4 [29] )
  44580. +MetaCode span at (11:2,5 [1] ) (Accepts:None) - Parent: Comment block at (10:2,4 [29] )
  44581. +Comment span at (12:2,6 [25] ) (Accepts:Any) - Parent: Comment block at (10:2,4 [29] )
  44582. +MetaCode span at (37:4,4 [1] ) (Accepts:None) - Parent: Comment block at (10:2,4 [29] )
  44583. +Transition span at (38:4,5 [1] ) (Accepts:None) - Parent: Comment block at (10:2,4 [29] )
  44584. +Code span at (39:4,6 [2] ) (Accepts:Any) - Parent: Statement block at (2:1,0 [40] )
  44585. +MetaCode span at (41:5,0 [1] ) (Accepts:None) - Parent: Statement block at (2:1,0 [40] )
  44586. +Markup span at (42:5,1 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [44] )
  44587. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorMultilineCommentInBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorMultilineCommentInBlock.stree.txt
  44588. new file mode 100644
  44589. index 00000000000..fa32dc202e8
  44590. --- /dev/null
  44591. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/RazorMultilineCommentInBlock.stree.txt
  44592. @@ -0,0 +1,27 @@
  44593. +RazorDocument - [0..44)::44 - [LF@{LF @*LFThis is a commentLF *@LF}LF]
  44594. + MarkupBlock - [0..44)::44
  44595. + MarkupTextLiteral - [0..2)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44596. + NewLine;[LF];
  44597. + CSharpCodeBlock - [2..42)::40
  44598. + CSharpStatement - [2..42)::40
  44599. + CSharpTransition - [2..3)::1 - Gen<None> - SpanEditHandler;Accepts:None
  44600. + Transition;[@];
  44601. + CSharpStatementBody - [3..42)::39
  44602. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  44603. + LeftBrace;[{];
  44604. + CSharpCodeBlock - [4..41)::37
  44605. + CSharpStatementLiteral - [4..10)::6 - [LF ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  44606. + NewLine;[LF];
  44607. + Whitespace;[ ];
  44608. + RazorComment - [10..39)::29
  44609. + RazorCommentTransition;[@];
  44610. + RazorCommentStar;[*];
  44611. + RazorCommentLiteral;[LFThis is a commentLF ];
  44612. + RazorCommentStar;[*];
  44613. + RazorCommentTransition;[@];
  44614. + CSharpStatementLiteral - [39..41)::2 - [LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  44615. + NewLine;[LF];
  44616. + RazorMetaCode - [41..42)::1 - Gen<None> - SpanEditHandler;Accepts:None
  44617. + RightBrace;[}];
  44618. + MarkupEphemeralTextLiteral - [42..44)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  44619. + NewLine;[LF];
  44620. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/UnterminatedRazorComment.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/UnterminatedRazorComment.stree.txt
  44621. index e205d34acc4..60adcc438ae 100644
  44622. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/UnterminatedRazorComment.stree.txt
  44623. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/UnterminatedRazorComment.stree.txt
  44624. @@ -1,10 +1,10 @@
  44625. -Markup block - Gen<None> - 2 - (0:0,0)
  44626. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  44627. - SyntaxKind.Unknown;[];
  44628. - Comment block - Gen<RazorComment> - 2 - (0:0,0)
  44629. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  44630. - SyntaxKind.RazorCommentTransition;[@];
  44631. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  44632. - SyntaxKind.RazorCommentStar;[*];
  44633. - Comment span - Gen<None> - [] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  44634. - SyntaxKind.Unknown;[];
  44635. +RazorDocument - [0..2)::2 - [@*]
  44636. + MarkupBlock - [0..2)::2
  44637. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44638. + Marker;[];
  44639. + RazorComment - [0..2)::2
  44640. + RazorCommentTransition;[@];
  44641. + RazorCommentStar;[*];
  44642. + RazorCommentLiteral;[<Missing>];
  44643. + RazorCommentStar;[<Missing>];RZ1028(0:0,0 [2] )
  44644. + RazorCommentTransition;[<Missing>];
  44645. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/UnterminatedRazorCommentInImplicitExpressionMethodCall.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/UnterminatedRazorCommentInImplicitExpressionMethodCall.stree.txt
  44646. index edad2144603..dc61b633965 100644
  44647. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/UnterminatedRazorCommentInImplicitExpressionMethodCall.stree.txt
  44648. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/UnterminatedRazorCommentInImplicitExpressionMethodCall.stree.txt
  44649. @@ -1,16 +1,19 @@
  44650. -Markup block - Gen<None> - 7 - (0:0,0)
  44651. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  44652. - SyntaxKind.Unknown;[];
  44653. - Expression block - Gen<Expr> - 7 - (0:0,0)
  44654. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  44655. - SyntaxKind.Transition;[@];
  44656. - Code span - Gen<Expr> - [foo(] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:2
  44657. - SyntaxKind.Identifier;[foo];
  44658. - SyntaxKind.LeftParenthesis;[(];
  44659. - Comment block - Gen<RazorComment> - 2 - (5:0,5)
  44660. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (5:0,5) - Tokens:1
  44661. - SyntaxKind.RazorCommentTransition;[@];
  44662. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (6:0,6) - Tokens:1
  44663. - SyntaxKind.RazorCommentStar;[*];
  44664. - Comment span - Gen<None> - [] - SpanEditHandler;Accepts:Any - (7:0,7) - Tokens:1
  44665. - SyntaxKind.Unknown;[];
  44666. +RazorDocument - [0..7)::7 - [@foo(@*]
  44667. + MarkupBlock - [0..7)::7
  44668. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44669. + Marker;[];
  44670. + CSharpCodeBlock - [0..7)::7
  44671. + CSharpImplicitExpression - [0..7)::7
  44672. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  44673. + Transition;[@];
  44674. + CSharpImplicitExpressionBody - [1..7)::6
  44675. + CSharpCodeBlock - [1..7)::6
  44676. + CSharpExpressionLiteral - [1..5)::4 - [foo(] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14
  44677. + Identifier;[foo];
  44678. + LeftParenthesis;[(];
  44679. + RazorComment - [5..7)::2
  44680. + RazorCommentTransition;[@];
  44681. + RazorCommentStar;[*];
  44682. + RazorCommentLiteral;[<Missing>];
  44683. + RazorCommentStar;[<Missing>];RZ1028(5:0,5 [2] )
  44684. + RazorCommentTransition;[<Missing>];
  44685. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/UnterminatedRazorCommentInVerbatimBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/UnterminatedRazorCommentInVerbatimBlock.stree.txt
  44686. index 943ac7f11af..6e7b2b40578 100644
  44687. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/UnterminatedRazorCommentInVerbatimBlock.stree.txt
  44688. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpRazorCommentsTest/UnterminatedRazorCommentInVerbatimBlock.stree.txt
  44689. @@ -1,17 +1,22 @@
  44690. -Markup block - Gen<None> - 4 - (0:0,0)
  44691. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  44692. - SyntaxKind.Unknown;[];
  44693. - Statement block - Gen<None> - 4 - (0:0,0)
  44694. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  44695. - SyntaxKind.Transition;[@];
  44696. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  44697. - SyntaxKind.LeftBrace;[{];
  44698. - Code span - Gen<Stmt> - [] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[}];AtEOL - (2:0,2) - Tokens:1
  44699. - SyntaxKind.Unknown;[];
  44700. - Comment block - Gen<RazorComment> - 2 - (2:0,2)
  44701. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (2:0,2) - Tokens:1
  44702. - SyntaxKind.RazorCommentTransition;[@];
  44703. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  44704. - SyntaxKind.RazorCommentStar;[*];
  44705. - Comment span - Gen<None> - [] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  44706. - SyntaxKind.Unknown;[];
  44707. +RazorDocument - [0..4)::4 - [@{@*]
  44708. + MarkupBlock - [0..4)::4
  44709. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44710. + Marker;[];
  44711. + CSharpCodeBlock - [0..4)::4
  44712. + CSharpStatement - [0..4)::4
  44713. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  44714. + Transition;[@];
  44715. + CSharpStatementBody - [1..4)::3
  44716. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  44717. + LeftBrace;[{];
  44718. + CSharpCodeBlock - [2..4)::2
  44719. + CSharpStatementLiteral - [2..2)::0 - [] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[}];AtEOL
  44720. + Marker;[];
  44721. + RazorComment - [2..4)::2
  44722. + RazorCommentTransition;[@];
  44723. + RazorCommentStar;[*];
  44724. + RazorCommentLiteral;[<Missing>];
  44725. + RazorCommentStar;[<Missing>];RZ1028(2:0,2 [2] )
  44726. + RazorCommentTransition;[<Missing>];
  44727. + RazorMetaCode - [4..4)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  44728. + RightBrace;[<Missing>];
  44729. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpReservedWordsTest/ReservedWord.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpReservedWordsTest/ReservedWord.stree.txt
  44730. index 33f42033002..3baba18c538 100644
  44731. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpReservedWordsTest/ReservedWord.stree.txt
  44732. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpReservedWordsTest/ReservedWord.stree.txt
  44733. @@ -1,3 +1,7 @@
  44734. -Directive block - Gen<None> - 9 - (0:0,0)
  44735. - MetaCode span - Gen<None> - [namespace] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  44736. - SyntaxKind.Keyword;[namespace];
  44737. +CSharpCodeBlock - [0..9)::9 - [namespace]
  44738. + RazorDirective - [0..9)::9
  44739. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  44740. + Transition;[<Missing>];
  44741. + RazorDirectiveBody - [0..9)::9
  44742. + RazorMetaCode - [0..9)::9 - Gen<None> - SpanEditHandler;Accepts:None
  44743. + Keyword;[namespace];
  44744. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpReservedWordsTest/ReservedWordIsCaseSensitive.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpReservedWordsTest/ReservedWordIsCaseSensitive.stree.txt
  44745. index d13f855c015..d87e2a2d23c 100644
  44746. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpReservedWordsTest/ReservedWordIsCaseSensitive.stree.txt
  44747. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpReservedWordsTest/ReservedWordIsCaseSensitive.stree.txt
  44748. @@ -1,3 +1,8 @@
  44749. -Expression block - Gen<Expr> - 9 - (0:0,0)
  44750. - Code span - Gen<Expr> - [NameSpace] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (0:0,0) - Tokens:1
  44751. - SyntaxKind.Identifier;[NameSpace];
  44752. +CSharpCodeBlock - [0..9)::9 - [NameSpace]
  44753. + CSharpImplicitExpression - [0..9)::9
  44754. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  44755. + Transition;[<Missing>];
  44756. + CSharpImplicitExpressionBody - [0..9)::9
  44757. + CSharpCodeBlock - [0..9)::9
  44758. + CSharpExpressionLiteral - [0..9)::9 - [NameSpace] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  44759. + Identifier;[NameSpace];
  44760. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/AcceptsOpenBraceMultipleLinesBelowSectionName.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/AcceptsOpenBraceMultipleLinesBelowSectionName.stree.txt
  44761. index 2dfc967323d..1f9ceb88ea8 100644
  44762. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/AcceptsOpenBraceMultipleLinesBelowSectionName.stree.txt
  44763. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/AcceptsOpenBraceMultipleLinesBelowSectionName.stree.txt
  44764. @@ -1,44 +1,48 @@
  44765. -Markup block - Gen<None> - 46 - (0:0,0)
  44766. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  44767. - SyntaxKind.Unknown;[];
  44768. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted}> - 46 - (0:0,0)
  44769. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  44770. - SyntaxKind.Transition;[@];
  44771. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  44772. - SyntaxKind.Identifier;[section];
  44773. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  44774. - SyntaxKind.Whitespace;[ ];
  44775. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [foo] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  44776. - SyntaxKind.Identifier;[foo];
  44777. - Markup span - Gen<None> - [ LFLFLFLFLFLF] - SpanEditHandler;Accepts:AllWhitespace - (12:0,12) - Tokens:7
  44778. - SyntaxKind.Whitespace;[ ];
  44779. - SyntaxKind.NewLine;[LF];
  44780. - SyntaxKind.NewLine;[LF];
  44781. - SyntaxKind.NewLine;[LF];
  44782. - SyntaxKind.NewLine;[LF];
  44783. - SyntaxKind.NewLine;[LF];
  44784. - SyntaxKind.NewLine;[LF];
  44785. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd - (30:6,0) - Tokens:1
  44786. - SyntaxKind.LeftBrace;[{];
  44787. - Markup block - Gen<None> - 14 - (31:6,1)
  44788. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:Any - (31:6,1) - Tokens:1
  44789. - SyntaxKind.NewLine;[LF];
  44790. - Tag block - Gen<None> - 3 - (33:7,0)
  44791. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (33:7,0) - Tokens:3
  44792. - SyntaxKind.OpenAngle;[<];
  44793. - SyntaxKind.Text;[p];
  44794. - SyntaxKind.CloseAngle;[>];
  44795. - SyntaxKind.HtmlTextLiteral - [Foo] - [36..39) - FullWidth: 3 - Slots: 1
  44796. - SyntaxKind.Text;[Foo];
  44797. - Tag block - Gen<None> - 4 - (39:7,6)
  44798. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (39:7,6) - Tokens:4
  44799. - SyntaxKind.OpenAngle;[<];
  44800. - SyntaxKind.ForwardSlash;[/];
  44801. - SyntaxKind.Text;[p];
  44802. - SyntaxKind.CloseAngle;[>];
  44803. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:Any - (43:7,10) - Tokens:1
  44804. - SyntaxKind.NewLine;[LF];
  44805. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (45:8,0) - Tokens:1
  44806. - SyntaxKind.RightBrace;[}];
  44807. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (46:8,1) - Tokens:1
  44808. - SyntaxKind.Unknown;[];
  44809. +RazorDocument - [0..46)::46 - [@section foo LFLFLFLFLFLF{LF<p>Foo</p>LF}]
  44810. + MarkupBlock - [0..46)::46
  44811. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44812. + Marker;[];
  44813. + CSharpCodeBlock - [0..46)::46
  44814. + RazorDirective - [0..46)::46 - Directive:{section;RazorBlock;Unrestricted}
  44815. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  44816. + Transition;[@];
  44817. + RazorDirectiveBody - [1..46)::45
  44818. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  44819. + Identifier;[section];
  44820. + CSharpCodeBlock - [8..46)::38
  44821. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  44822. + Whitespace;[ ];
  44823. + CSharpStatementLiteral - [9..12)::3 - [foo] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  44824. + Identifier;[foo];
  44825. + MarkupTextLiteral - [12..30)::18 - [ LFLFLFLFLFLF] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  44826. + Whitespace;[ ];
  44827. + NewLine;[LF];
  44828. + NewLine;[LF];
  44829. + NewLine;[LF];
  44830. + NewLine;[LF];
  44831. + NewLine;[LF];
  44832. + NewLine;[LF];
  44833. + RazorMetaCode - [30..31)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd
  44834. + LeftBrace;[{];
  44835. + MarkupBlock - [31..45)::14
  44836. + MarkupTextLiteral - [31..33)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44837. + NewLine;[LF];
  44838. + MarkupTagBlock - [33..36)::3 - [<p>]
  44839. + MarkupTextLiteral - [33..36)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44840. + OpenAngle;[<];
  44841. + Text;[p];
  44842. + CloseAngle;[>];
  44843. + MarkupTextLiteral - [36..39)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44844. + Text;[Foo];
  44845. + MarkupTagBlock - [39..43)::4 - [</p>]
  44846. + MarkupTextLiteral - [39..43)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44847. + OpenAngle;[<];
  44848. + ForwardSlash;[/];
  44849. + Text;[p];
  44850. + CloseAngle;[>];
  44851. + MarkupTextLiteral - [43..45)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44852. + NewLine;[LF];
  44853. + RazorMetaCode - [45..46)::1 - Gen<None> - SpanEditHandler;Accepts:None
  44854. + RightBrace;[}];
  44855. + MarkupTextLiteral - [46..46)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44856. + Marker;[];
  44857. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/AllowsBracesInCSharpExpression.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/AllowsBracesInCSharpExpression.stree.txt
  44858. index be93416c6f0..d46f43c9a5f 100644
  44859. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/AllowsBracesInCSharpExpression.stree.txt
  44860. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/AllowsBracesInCSharpExpression.stree.txt
  44861. @@ -1,58 +1,65 @@
  44862. -Markup block - Gen<None> - 76 - (0:0,0)
  44863. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  44864. - SyntaxKind.Unknown;[];
  44865. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted}> - 76 - (0:0,0)
  44866. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  44867. - SyntaxKind.Transition;[@];
  44868. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  44869. - SyntaxKind.Identifier;[section];
  44870. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  44871. - SyntaxKind.Whitespace;[ ];
  44872. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [foo] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  44873. - SyntaxKind.Identifier;[foo];
  44874. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (12:0,12) - Tokens:1
  44875. - SyntaxKind.Whitespace;[ ];
  44876. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd - (13:0,13) - Tokens:1
  44877. - SyntaxKind.LeftBrace;[{];
  44878. - Markup block - Gen<None> - 61 - (14:0,14)
  44879. - Markup span - Gen<Markup> - [ I really want to render a close brace, so here I go: ] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:25
  44880. - SyntaxKind.Whitespace;[ ];
  44881. - SyntaxKind.Text;[I];
  44882. - SyntaxKind.Whitespace;[ ];
  44883. - SyntaxKind.Text;[really];
  44884. - SyntaxKind.Whitespace;[ ];
  44885. - SyntaxKind.Text;[want];
  44886. - SyntaxKind.Whitespace;[ ];
  44887. - SyntaxKind.Text;[to];
  44888. - SyntaxKind.Whitespace;[ ];
  44889. - SyntaxKind.Text;[render];
  44890. - SyntaxKind.Whitespace;[ ];
  44891. - SyntaxKind.Text;[a];
  44892. - SyntaxKind.Whitespace;[ ];
  44893. - SyntaxKind.Text;[close];
  44894. - SyntaxKind.Whitespace;[ ];
  44895. - SyntaxKind.Text;[brace,];
  44896. - SyntaxKind.Whitespace;[ ];
  44897. - SyntaxKind.Text;[so];
  44898. - SyntaxKind.Whitespace;[ ];
  44899. - SyntaxKind.Text;[here];
  44900. - SyntaxKind.Whitespace;[ ];
  44901. - SyntaxKind.Text;[I];
  44902. - SyntaxKind.Whitespace;[ ];
  44903. - SyntaxKind.Text;[go:];
  44904. - SyntaxKind.Whitespace;[ ];
  44905. - Expression block - Gen<Expr> - 6 - (68:0,68)
  44906. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (68:0,68) - Tokens:1
  44907. - SyntaxKind.Transition;[@];
  44908. - MetaCode span - Gen<None> - [(] - SpanEditHandler;Accepts:None - (69:0,69) - Tokens:1
  44909. - SyntaxKind.LeftParenthesis;[(];
  44910. - Code span - Gen<Expr> - ["}"] - SpanEditHandler;Accepts:Any - (70:0,70) - Tokens:1
  44911. - SyntaxKind.StringLiteral;["}"];
  44912. - MetaCode span - Gen<None> - [)] - SpanEditHandler;Accepts:None - (73:0,73) - Tokens:1
  44913. - SyntaxKind.RightParenthesis;[)];
  44914. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (74:0,74) - Tokens:1
  44915. - SyntaxKind.Whitespace;[ ];
  44916. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (75:0,75) - Tokens:1
  44917. - SyntaxKind.RightBrace;[}];
  44918. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (76:0,76) - Tokens:1
  44919. - SyntaxKind.Unknown;[];
  44920. +RazorDocument - [0..76)::76 - [@section foo { I really want to render a close brace, so here I go: @("}") }]
  44921. + MarkupBlock - [0..76)::76
  44922. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44923. + Marker;[];
  44924. + CSharpCodeBlock - [0..76)::76
  44925. + RazorDirective - [0..76)::76 - Directive:{section;RazorBlock;Unrestricted}
  44926. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  44927. + Transition;[@];
  44928. + RazorDirectiveBody - [1..76)::75
  44929. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  44930. + Identifier;[section];
  44931. + CSharpCodeBlock - [8..76)::68
  44932. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  44933. + Whitespace;[ ];
  44934. + CSharpStatementLiteral - [9..12)::3 - [foo] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  44935. + Identifier;[foo];
  44936. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  44937. + Whitespace;[ ];
  44938. + RazorMetaCode - [13..14)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd
  44939. + LeftBrace;[{];
  44940. + MarkupBlock - [14..75)::61
  44941. + MarkupTextLiteral - [14..68)::54 - [ I really want to render a close brace, so here I go: ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44942. + Whitespace;[ ];
  44943. + Text;[I];
  44944. + Whitespace;[ ];
  44945. + Text;[really];
  44946. + Whitespace;[ ];
  44947. + Text;[want];
  44948. + Whitespace;[ ];
  44949. + Text;[to];
  44950. + Whitespace;[ ];
  44951. + Text;[render];
  44952. + Whitespace;[ ];
  44953. + Text;[a];
  44954. + Whitespace;[ ];
  44955. + Text;[close];
  44956. + Whitespace;[ ];
  44957. + Text;[brace,];
  44958. + Whitespace;[ ];
  44959. + Text;[so];
  44960. + Whitespace;[ ];
  44961. + Text;[here];
  44962. + Whitespace;[ ];
  44963. + Text;[I];
  44964. + Whitespace;[ ];
  44965. + Text;[go:];
  44966. + Whitespace;[ ];
  44967. + CSharpCodeBlock - [68..74)::6
  44968. + CSharpExplicitExpression - [68..74)::6
  44969. + CSharpTransition - [68..69)::1 - Gen<None> - SpanEditHandler;Accepts:None
  44970. + Transition;[@];
  44971. + CSharpExplicitExpressionBody - [69..74)::5
  44972. + RazorMetaCode - [69..70)::1 - Gen<None> - SpanEditHandler;Accepts:None
  44973. + LeftParenthesis;[(];
  44974. + CSharpCodeBlock - [70..73)::3
  44975. + CSharpExpressionLiteral - [70..73)::3 - ["}"] - Gen<Expr> - SpanEditHandler;Accepts:Any
  44976. + StringLiteral;["}"];
  44977. + RazorMetaCode - [73..74)::1 - Gen<None> - SpanEditHandler;Accepts:None
  44978. + RightParenthesis;[)];
  44979. + MarkupTextLiteral - [74..75)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44980. + Whitespace;[ ];
  44981. + RazorMetaCode - [75..76)::1 - Gen<None> - SpanEditHandler;Accepts:None
  44982. + RightBrace;[}];
  44983. + MarkupTextLiteral - [76..76)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  44984. + Marker;[];
  44985. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/BalancesBraces.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/BalancesBraces.stree.txt
  44986. index f8333a79a7f..65d0a45276f 100644
  44987. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/BalancesBraces.stree.txt
  44988. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/BalancesBraces.stree.txt
  44989. @@ -1,48 +1,52 @@
  44990. -Markup block - Gen<None> - 67 - (0:0,0)
  44991. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  44992. - SyntaxKind.Unknown;[];
  44993. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted}> - 67 - (0:0,0)
  44994. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  44995. - SyntaxKind.Transition;[@];
  44996. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  44997. - SyntaxKind.Identifier;[section];
  44998. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  44999. - SyntaxKind.Whitespace;[ ];
  45000. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [foo] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  45001. - SyntaxKind.Identifier;[foo];
  45002. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (12:0,12) - Tokens:1
  45003. - SyntaxKind.Whitespace;[ ];
  45004. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd - (13:0,13) - Tokens:1
  45005. - SyntaxKind.LeftBrace;[{];
  45006. - Markup block - Gen<None> - 52 - (14:0,14)
  45007. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  45008. - SyntaxKind.Whitespace;[ ];
  45009. - Tag block - Gen<None> - 8 - (15:0,15)
  45010. - Markup span - Gen<Markup> - [<script>] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:3
  45011. - SyntaxKind.OpenAngle;[<];
  45012. - SyntaxKind.Text;[script];
  45013. - SyntaxKind.CloseAngle;[>];
  45014. - Markup span - Gen<Markup> - [(function foo() { return 1; })();] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:11
  45015. - SyntaxKind.Text;[(function];
  45016. - SyntaxKind.Whitespace;[ ];
  45017. - SyntaxKind.Text;[foo()];
  45018. - SyntaxKind.Whitespace;[ ];
  45019. - SyntaxKind.Text;[{];
  45020. - SyntaxKind.Whitespace;[ ];
  45021. - SyntaxKind.Text;[return];
  45022. - SyntaxKind.Whitespace;[ ];
  45023. - SyntaxKind.Text;[1;];
  45024. - SyntaxKind.Whitespace;[ ];
  45025. - SyntaxKind.Text;[})();];
  45026. - Tag block - Gen<None> - 9 - (56:0,56)
  45027. - Markup span - Gen<Markup> - [</script>] - SpanEditHandler;Accepts:Any - (56:0,56) - Tokens:4
  45028. - SyntaxKind.OpenAngle;[<];
  45029. - SyntaxKind.ForwardSlash;[/];
  45030. - SyntaxKind.Text;[script];
  45031. - SyntaxKind.CloseAngle;[>];
  45032. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (65:0,65) - Tokens:1
  45033. - SyntaxKind.Whitespace;[ ];
  45034. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (66:0,66) - Tokens:1
  45035. - SyntaxKind.RightBrace;[}];
  45036. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (67:0,67) - Tokens:1
  45037. - SyntaxKind.Unknown;[];
  45038. +RazorDocument - [0..67)::67 - [@section foo { <script>(function foo() { return 1; })();</script> }]
  45039. + MarkupBlock - [0..67)::67
  45040. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45041. + Marker;[];
  45042. + CSharpCodeBlock - [0..67)::67
  45043. + RazorDirective - [0..67)::67 - Directive:{section;RazorBlock;Unrestricted}
  45044. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  45045. + Transition;[@];
  45046. + RazorDirectiveBody - [1..67)::66
  45047. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  45048. + Identifier;[section];
  45049. + CSharpCodeBlock - [8..67)::59
  45050. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  45051. + Whitespace;[ ];
  45052. + CSharpStatementLiteral - [9..12)::3 - [foo] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  45053. + Identifier;[foo];
  45054. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  45055. + Whitespace;[ ];
  45056. + RazorMetaCode - [13..14)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd
  45057. + LeftBrace;[{];
  45058. + MarkupBlock - [14..66)::52
  45059. + MarkupTextLiteral - [14..15)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45060. + Whitespace;[ ];
  45061. + MarkupTagBlock - [15..23)::8 - [<script>]
  45062. + MarkupTextLiteral - [15..23)::8 - [<script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45063. + OpenAngle;[<];
  45064. + Text;[script];
  45065. + CloseAngle;[>];
  45066. + MarkupTextLiteral - [23..56)::33 - [(function foo() { return 1; })();] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45067. + Text;[(function];
  45068. + Whitespace;[ ];
  45069. + Text;[foo()];
  45070. + Whitespace;[ ];
  45071. + Text;[{];
  45072. + Whitespace;[ ];
  45073. + Text;[return];
  45074. + Whitespace;[ ];
  45075. + Text;[1;];
  45076. + Whitespace;[ ];
  45077. + Text;[})();];
  45078. + MarkupTagBlock - [56..65)::9 - [</script>]
  45079. + MarkupTextLiteral - [56..65)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45080. + OpenAngle;[<];
  45081. + ForwardSlash;[/];
  45082. + Text;[script];
  45083. + CloseAngle;[>];
  45084. + MarkupTextLiteral - [65..66)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45085. + Whitespace;[ ];
  45086. + RazorMetaCode - [66..67)::1 - Gen<None> - SpanEditHandler;Accepts:None
  45087. + RightBrace;[}];
  45088. + MarkupTextLiteral - [67..67)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45089. + Marker;[];
  45090. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/CapturesNewlineImmediatelyFollowing.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/CapturesNewlineImmediatelyFollowing.stree.txt
  45091. index 98001e76615..d336694b978 100644
  45092. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/CapturesNewlineImmediatelyFollowing.stree.txt
  45093. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/CapturesNewlineImmediatelyFollowing.stree.txt
  45094. @@ -1,12 +1,16 @@
  45095. -Markup block - Gen<None> - 10 - (0:0,0)
  45096. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  45097. - SyntaxKind.Unknown;[];
  45098. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted} [RZ1015(8:0,8 [2] )]> - 8 - (0:0,0)
  45099. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  45100. - SyntaxKind.Transition;[@];
  45101. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  45102. - SyntaxKind.Identifier;[section];
  45103. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (8:0,8) - Tokens:1
  45104. - SyntaxKind.Unknown;[];
  45105. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:1
  45106. - SyntaxKind.NewLine;[LF];
  45107. +RazorDocument - [0..10)::10 - [@sectionLF]
  45108. + MarkupBlock - [0..10)::10
  45109. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45110. + Marker;[];
  45111. + CSharpCodeBlock - [0..8)::8
  45112. + RazorDirective - [0..8)::8 - Directive:{section;RazorBlock;Unrestricted} [RZ1015(8:0,8 [2] )]
  45113. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  45114. + Transition;[@];
  45115. + RazorDirectiveBody - [1..8)::7
  45116. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  45117. + Identifier;[section];
  45118. + CSharpCodeBlock - [8..8)::0
  45119. + CSharpStatementLiteral - [8..8)::0 - [] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  45120. + Marker;[];
  45121. + MarkupTextLiteral - [8..10)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45122. + NewLine;[LF];
  45123. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/CapturesWhitespaceToEndOfLineInSectionStatementMissingName.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/CapturesWhitespaceToEndOfLineInSectionStatementMissingName.stree.txt
  45124. index 501cdd5ac2a..7f547e81737 100644
  45125. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/CapturesWhitespaceToEndOfLineInSectionStatementMissingName.stree.txt
  45126. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/CapturesWhitespaceToEndOfLineInSectionStatementMissingName.stree.txt
  45127. @@ -1,15 +1,19 @@
  45128. -Markup block - Gen<None> - 23 - (0:0,0)
  45129. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  45130. - SyntaxKind.Unknown;[];
  45131. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted} [RZ1015(17:0,17 [2] )]> - 17 - (0:0,0)
  45132. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  45133. - SyntaxKind.Transition;[@];
  45134. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  45135. - SyntaxKind.Identifier;[section];
  45136. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  45137. - SyntaxKind.Whitespace;[ ];
  45138. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (17:0,17) - Tokens:1
  45139. - SyntaxKind.Unknown;[];
  45140. - Markup span - Gen<Markup> - [LF ] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:2
  45141. - SyntaxKind.NewLine;[LF];
  45142. - SyntaxKind.Whitespace;[ ];
  45143. +RazorDocument - [0..23)::23 - [@section LF ]
  45144. + MarkupBlock - [0..23)::23
  45145. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45146. + Marker;[];
  45147. + CSharpCodeBlock - [0..17)::17
  45148. + RazorDirective - [0..17)::17 - Directive:{section;RazorBlock;Unrestricted} [RZ1015(17:0,17 [2] )]
  45149. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  45150. + Transition;[@];
  45151. + RazorDirectiveBody - [1..17)::16
  45152. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  45153. + Identifier;[section];
  45154. + CSharpCodeBlock - [8..17)::9
  45155. + CSharpStatementLiteral - [8..17)::9 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  45156. + Whitespace;[ ];
  45157. + CSharpStatementLiteral - [17..17)::0 - [] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  45158. + Marker;[];
  45159. + MarkupTextLiteral - [17..23)::6 - [LF ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45160. + NewLine;[LF];
  45161. + Whitespace;[ ];
  45162. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/CapturesWhitespaceToEndOfLineInSectionStatementMissingOpenBrace.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/CapturesWhitespaceToEndOfLineInSectionStatementMissingOpenBrace.stree.txt
  45163. index 46ed3a8aa6a..4a016b636d8 100644
  45164. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/CapturesWhitespaceToEndOfLineInSectionStatementMissingOpenBrace.stree.txt
  45165. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/CapturesWhitespaceToEndOfLineInSectionStatementMissingOpenBrace.stree.txt
  45166. @@ -1,18 +1,22 @@
  45167. -Markup block - Gen<None> - 27 - (0:0,0)
  45168. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  45169. - SyntaxKind.Unknown;[];
  45170. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted} [RZ1012(27:1,4 [1] )]> - 27 - (0:0,0)
  45171. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  45172. - SyntaxKind.Transition;[@];
  45173. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  45174. - SyntaxKind.Identifier;[section];
  45175. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  45176. - SyntaxKind.Whitespace;[ ];
  45177. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [Foo] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  45178. - SyntaxKind.Identifier;[Foo];
  45179. - Markup span - Gen<None> - [ LF ] - SpanEditHandler;Accepts:AllWhitespace - (12:0,12) - Tokens:3
  45180. - SyntaxKind.Whitespace;[ ];
  45181. - SyntaxKind.NewLine;[LF];
  45182. - SyntaxKind.Whitespace;[ ];
  45183. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (27:1,4) - Tokens:1
  45184. - SyntaxKind.Unknown;[];
  45185. +RazorDocument - [0..27)::27 - [@section Foo LF ]
  45186. + MarkupBlock - [0..27)::27
  45187. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45188. + Marker;[];
  45189. + CSharpCodeBlock - [0..27)::27
  45190. + RazorDirective - [0..27)::27 - Directive:{section;RazorBlock;Unrestricted} [RZ1012(27:1,4 [1] )]
  45191. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  45192. + Transition;[@];
  45193. + RazorDirectiveBody - [1..27)::26
  45194. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  45195. + Identifier;[section];
  45196. + CSharpCodeBlock - [8..27)::19
  45197. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  45198. + Whitespace;[ ];
  45199. + CSharpStatementLiteral - [9..12)::3 - [Foo] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  45200. + Identifier;[Foo];
  45201. + MarkupTextLiteral - [12..27)::15 - [ LF ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  45202. + Whitespace;[ ];
  45203. + NewLine;[LF];
  45204. + Whitespace;[ ];
  45205. + MarkupTextLiteral - [27..27)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45206. + Marker;[];
  45207. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/CommentRecoversFromUnclosedTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/CommentRecoversFromUnclosedTag.stree.txt
  45208. index b128a9324c8..d0c86639d6c 100644
  45209. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/CommentRecoversFromUnclosedTag.stree.txt
  45210. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/CommentRecoversFromUnclosedTag.stree.txt
  45211. @@ -1,45 +1,49 @@
  45212. -Markup block - Gen<None> - 33 - (0:0,0)
  45213. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  45214. - SyntaxKind.Unknown;[];
  45215. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted}> - 33 - (0:0,0)
  45216. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  45217. - SyntaxKind.Transition;[@];
  45218. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  45219. - SyntaxKind.Identifier;[section];
  45220. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  45221. - SyntaxKind.Whitespace;[ ];
  45222. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [s] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  45223. - SyntaxKind.Identifier;[s];
  45224. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (10:0,10) - Tokens:1
  45225. - SyntaxKind.Whitespace;[ ];
  45226. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd - (11:0,11) - Tokens:1
  45227. - SyntaxKind.LeftBrace;[{];
  45228. - Markup block - Gen<None> - 20 - (12:0,12)
  45229. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:1
  45230. - SyntaxKind.NewLine;[LF];
  45231. - Tag block - Gen<None> - 4 - (14:1,0)
  45232. - Markup span - Gen<Markup> - [<aLF] - SpanEditHandler;Accepts:Any - (14:1,0) - Tokens:3
  45233. - SyntaxKind.OpenAngle;[<];
  45234. - SyntaxKind.Text;[a];
  45235. - SyntaxKind.NewLine;[LF];
  45236. - HtmlComment block - Gen<None> - 14 - (18:2,0)
  45237. - Markup span - Gen<Markup> - [<!--] - SpanEditHandler;Accepts:None - (18:2,0) - Tokens:3
  45238. - SyntaxKind.OpenAngle;[<];
  45239. - SyntaxKind.Bang;[!];
  45240. - SyntaxKind.DoubleHyphen;[--];
  45241. - Markup span - Gen<Markup> - [ > " '] - SpanEditHandler;Accepts:Whitespace - (22:2,4) - Tokens:6
  45242. - SyntaxKind.Whitespace;[ ];
  45243. - SyntaxKind.CloseAngle;[>];
  45244. - SyntaxKind.Whitespace;[ ];
  45245. - SyntaxKind.DoubleQuote;["];
  45246. - SyntaxKind.Whitespace;[ ];
  45247. - SyntaxKind.SingleQuote;['];
  45248. - Markup span - Gen<Markup> - [-->] - SpanEditHandler;Accepts:None - (29:2,11) - Tokens:2
  45249. - SyntaxKind.DoubleHyphen;[--];
  45250. - SyntaxKind.CloseAngle;[>];
  45251. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (32:2,14) - Tokens:1
  45252. - SyntaxKind.Unknown;[];
  45253. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (32:2,14) - Tokens:1
  45254. - SyntaxKind.RightBrace;[}];
  45255. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (33:2,15) - Tokens:1
  45256. - SyntaxKind.Unknown;[];
  45257. +RazorDocument - [0..33)::33 - [@section s {LF<aLF<!-- > " '-->}]
  45258. + MarkupBlock - [0..33)::33
  45259. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45260. + Marker;[];
  45261. + CSharpCodeBlock - [0..33)::33
  45262. + RazorDirective - [0..33)::33 - Directive:{section;RazorBlock;Unrestricted}
  45263. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  45264. + Transition;[@];
  45265. + RazorDirectiveBody - [1..33)::32
  45266. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  45267. + Identifier;[section];
  45268. + CSharpCodeBlock - [8..33)::25
  45269. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  45270. + Whitespace;[ ];
  45271. + CSharpStatementLiteral - [9..10)::1 - [s] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  45272. + Identifier;[s];
  45273. + MarkupTextLiteral - [10..11)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  45274. + Whitespace;[ ];
  45275. + RazorMetaCode - [11..12)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd
  45276. + LeftBrace;[{];
  45277. + MarkupBlock - [12..32)::20
  45278. + MarkupTextLiteral - [12..14)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45279. + NewLine;[LF];
  45280. + MarkupTagBlock - [14..18)::4 - [<aLF]
  45281. + MarkupTextLiteral - [14..18)::4 - [<aLF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45282. + OpenAngle;[<];
  45283. + Text;[a];
  45284. + NewLine;[LF];
  45285. + MarkupCommentBlock - [18..32)::14
  45286. + MarkupTextLiteral - [18..22)::4 - [<!--] - Gen<Markup> - SpanEditHandler;Accepts:None
  45287. + OpenAngle;[<];
  45288. + Bang;[!];
  45289. + DoubleHyphen;[--];
  45290. + MarkupTextLiteral - [22..29)::7 - [ > " '] - Gen<Markup> - SpanEditHandler;Accepts:Whitespace
  45291. + Whitespace;[ ];
  45292. + CloseAngle;[>];
  45293. + Whitespace;[ ];
  45294. + DoubleQuote;["];
  45295. + Whitespace;[ ];
  45296. + SingleQuote;['];
  45297. + MarkupTextLiteral - [29..32)::3 - [-->] - Gen<Markup> - SpanEditHandler;Accepts:None
  45298. + DoubleHyphen;[--];
  45299. + CloseAngle;[>];
  45300. + MarkupTextLiteral - [32..32)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45301. + Marker;[];
  45302. + RazorMetaCode - [32..33)::1 - Gen<None> - SpanEditHandler;Accepts:None
  45303. + RightBrace;[}];
  45304. + MarkupTextLiteral - [33..33)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45305. + Marker;[];
  45306. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/CorrectlyTerminatesWhenCloseBraceImmediatelyFollowsMarkup.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/CorrectlyTerminatesWhenCloseBraceImmediatelyFollowsMarkup.stree.txt
  45307. index 887190ddb53..3a0384fa912 100644
  45308. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/CorrectlyTerminatesWhenCloseBraceImmediatelyFollowsMarkup.stree.txt
  45309. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/CorrectlyTerminatesWhenCloseBraceImmediatelyFollowsMarkup.stree.txt
  45310. @@ -1,23 +1,27 @@
  45311. -Markup block - Gen<None> - 24 - (0:0,0)
  45312. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  45313. - SyntaxKind.Unknown;[];
  45314. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted}> - 24 - (0:0,0)
  45315. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  45316. - SyntaxKind.Transition;[@];
  45317. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  45318. - SyntaxKind.Identifier;[section];
  45319. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  45320. - SyntaxKind.Whitespace;[ ];
  45321. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [foo] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  45322. - SyntaxKind.Identifier;[foo];
  45323. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (12:0,12) - Tokens:1
  45324. - SyntaxKind.Whitespace;[ ];
  45325. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd - (13:0,13) - Tokens:1
  45326. - SyntaxKind.LeftBrace;[{];
  45327. - Markup block - Gen<None> - 9 - (14:0,14)
  45328. - Markup span - Gen<Markup> - [something] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  45329. - SyntaxKind.Text;[something];
  45330. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (23:0,23) - Tokens:1
  45331. - SyntaxKind.RightBrace;[}];
  45332. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (24:0,24) - Tokens:1
  45333. - SyntaxKind.Unknown;[];
  45334. +RazorDocument - [0..24)::24 - [@section foo {something}]
  45335. + MarkupBlock - [0..24)::24
  45336. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45337. + Marker;[];
  45338. + CSharpCodeBlock - [0..24)::24
  45339. + RazorDirective - [0..24)::24 - Directive:{section;RazorBlock;Unrestricted}
  45340. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  45341. + Transition;[@];
  45342. + RazorDirectiveBody - [1..24)::23
  45343. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  45344. + Identifier;[section];
  45345. + CSharpCodeBlock - [8..24)::16
  45346. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  45347. + Whitespace;[ ];
  45348. + CSharpStatementLiteral - [9..12)::3 - [foo] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  45349. + Identifier;[foo];
  45350. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  45351. + Whitespace;[ ];
  45352. + RazorMetaCode - [13..14)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd
  45353. + LeftBrace;[{];
  45354. + MarkupBlock - [14..23)::9
  45355. + MarkupTextLiteral - [14..23)::9 - [something] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45356. + Text;[something];
  45357. + RazorMetaCode - [23..24)::1 - Gen<None> - SpanEditHandler;Accepts:None
  45358. + RightBrace;[}];
  45359. + MarkupTextLiteral - [24..24)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45360. + Marker;[];
  45361. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/DoesNotRequireSpaceBetweenSectionNameAndOpenBrace.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/DoesNotRequireSpaceBetweenSectionNameAndOpenBrace.stree.txt
  45362. index 86004e805aa..3e031310014 100644
  45363. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/DoesNotRequireSpaceBetweenSectionNameAndOpenBrace.stree.txt
  45364. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/DoesNotRequireSpaceBetweenSectionNameAndOpenBrace.stree.txt
  45365. @@ -1,36 +1,40 @@
  45366. -Markup block - Gen<None> - 26 - (0:0,0)
  45367. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  45368. - SyntaxKind.Unknown;[];
  45369. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted}> - 26 - (0:0,0)
  45370. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  45371. - SyntaxKind.Transition;[@];
  45372. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  45373. - SyntaxKind.Identifier;[section];
  45374. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  45375. - SyntaxKind.Whitespace;[ ];
  45376. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [foo] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  45377. - SyntaxKind.Identifier;[foo];
  45378. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd - (12:0,12) - Tokens:1
  45379. - SyntaxKind.LeftBrace;[{];
  45380. - Markup block - Gen<None> - 12 - (13:0,13)
  45381. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:1
  45382. - SyntaxKind.Whitespace;[ ];
  45383. - Tag block - Gen<None> - 3 - (14:0,14)
  45384. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:3
  45385. - SyntaxKind.OpenAngle;[<];
  45386. - SyntaxKind.Text;[p];
  45387. - SyntaxKind.CloseAngle;[>];
  45388. - SyntaxKind.HtmlTextLiteral - [Foo] - [17..20) - FullWidth: 3 - Slots: 1
  45389. - SyntaxKind.Text;[Foo];
  45390. - Tag block - Gen<None> - 4 - (20:0,20)
  45391. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:4
  45392. - SyntaxKind.OpenAngle;[<];
  45393. - SyntaxKind.ForwardSlash;[/];
  45394. - SyntaxKind.Text;[p];
  45395. - SyntaxKind.CloseAngle;[>];
  45396. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (24:0,24) - Tokens:1
  45397. - SyntaxKind.Whitespace;[ ];
  45398. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (25:0,25) - Tokens:1
  45399. - SyntaxKind.RightBrace;[}];
  45400. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (26:0,26) - Tokens:1
  45401. - SyntaxKind.Unknown;[];
  45402. +RazorDocument - [0..26)::26 - [@section foo{ <p>Foo</p> }]
  45403. + MarkupBlock - [0..26)::26
  45404. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45405. + Marker;[];
  45406. + CSharpCodeBlock - [0..26)::26
  45407. + RazorDirective - [0..26)::26 - Directive:{section;RazorBlock;Unrestricted}
  45408. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  45409. + Transition;[@];
  45410. + RazorDirectiveBody - [1..26)::25
  45411. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  45412. + Identifier;[section];
  45413. + CSharpCodeBlock - [8..26)::18
  45414. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  45415. + Whitespace;[ ];
  45416. + CSharpStatementLiteral - [9..12)::3 - [foo] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  45417. + Identifier;[foo];
  45418. + RazorMetaCode - [12..13)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd
  45419. + LeftBrace;[{];
  45420. + MarkupBlock - [13..25)::12
  45421. + MarkupTextLiteral - [13..14)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45422. + Whitespace;[ ];
  45423. + MarkupTagBlock - [14..17)::3 - [<p>]
  45424. + MarkupTextLiteral - [14..17)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45425. + OpenAngle;[<];
  45426. + Text;[p];
  45427. + CloseAngle;[>];
  45428. + MarkupTextLiteral - [17..20)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45429. + Text;[Foo];
  45430. + MarkupTagBlock - [20..24)::4 - [</p>]
  45431. + MarkupTextLiteral - [20..24)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45432. + OpenAngle;[<];
  45433. + ForwardSlash;[/];
  45434. + Text;[p];
  45435. + CloseAngle;[>];
  45436. + MarkupTextLiteral - [24..25)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45437. + Whitespace;[ ];
  45438. + RazorMetaCode - [25..26)::1 - Gen<None> - SpanEditHandler;Accepts:None
  45439. + RightBrace;[}];
  45440. + MarkupTextLiteral - [26..26)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45441. + Marker;[];
  45442. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesEOFAfterOpenBrace.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesEOFAfterOpenBrace.stree.txt
  45443. index 210e0a990b0..70844ba973b 100644
  45444. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesEOFAfterOpenBrace.stree.txt
  45445. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesEOFAfterOpenBrace.stree.txt
  45446. @@ -1,19 +1,25 @@
  45447. -Markup block - Gen<None> - 14 - (0:0,0)
  45448. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  45449. - SyntaxKind.Unknown;[];
  45450. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted} [RZ1006(13:0,13 [1] )]> - 14 - (0:0,0)
  45451. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  45452. - SyntaxKind.Transition;[@];
  45453. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  45454. - SyntaxKind.Identifier;[section];
  45455. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  45456. - SyntaxKind.Whitespace;[ ];
  45457. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [foo] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  45458. - SyntaxKind.Identifier;[foo];
  45459. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (12:0,12) - Tokens:1
  45460. - SyntaxKind.Whitespace;[ ];
  45461. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd - (13:0,13) - Tokens:1
  45462. - SyntaxKind.LeftBrace;[{];
  45463. - Markup block - Gen<None> - 0 - (14:0,14)
  45464. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  45465. - SyntaxKind.Unknown;[];
  45466. +RazorDocument - [0..14)::14 - [@section foo {]
  45467. + MarkupBlock - [0..14)::14
  45468. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45469. + Marker;[];
  45470. + CSharpCodeBlock - [0..14)::14
  45471. + RazorDirective - [0..14)::14 - Directive:{section;RazorBlock;Unrestricted} [RZ1006(13:0,13 [1] )]
  45472. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  45473. + Transition;[@];
  45474. + RazorDirectiveBody - [1..14)::13
  45475. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  45476. + Identifier;[section];
  45477. + CSharpCodeBlock - [8..14)::6
  45478. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  45479. + Whitespace;[ ];
  45480. + CSharpStatementLiteral - [9..12)::3 - [foo] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  45481. + Identifier;[foo];
  45482. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  45483. + Whitespace;[ ];
  45484. + RazorMetaCode - [13..14)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd
  45485. + LeftBrace;[{];
  45486. + MarkupBlock - [14..14)::0
  45487. + MarkupTextLiteral - [14..14)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45488. + Marker;[];
  45489. + RazorMetaCode - [14..14)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  45490. + RightBrace;[<Missing>];
  45491. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesEOFAfterOpenContent1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesEOFAfterOpenContent1.stree.txt
  45492. index 94ffd5450db..d31d5a60312 100644
  45493. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesEOFAfterOpenContent1.stree.txt
  45494. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesEOFAfterOpenContent1.stree.txt
  45495. @@ -1,19 +1,25 @@
  45496. -Markup block - Gen<None> - 15 - (0:0,0)
  45497. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  45498. - SyntaxKind.Unknown;[];
  45499. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted} [RZ1006(13:0,13 [1] )]> - 15 - (0:0,0)
  45500. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  45501. - SyntaxKind.Transition;[@];
  45502. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  45503. - SyntaxKind.Identifier;[section];
  45504. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  45505. - SyntaxKind.Whitespace;[ ];
  45506. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [foo] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  45507. - SyntaxKind.Identifier;[foo];
  45508. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (12:0,12) - Tokens:1
  45509. - SyntaxKind.Whitespace;[ ];
  45510. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd - (13:0,13) - Tokens:1
  45511. - SyntaxKind.LeftBrace;[{];
  45512. - Markup block - Gen<None> - 1 - (14:0,14)
  45513. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  45514. - SyntaxKind.Whitespace;[ ];
  45515. +RazorDocument - [0..15)::15 - [@section foo { ]
  45516. + MarkupBlock - [0..15)::15
  45517. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45518. + Marker;[];
  45519. + CSharpCodeBlock - [0..15)::15
  45520. + RazorDirective - [0..15)::15 - Directive:{section;RazorBlock;Unrestricted} [RZ1006(13:0,13 [1] )]
  45521. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  45522. + Transition;[@];
  45523. + RazorDirectiveBody - [1..15)::14
  45524. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  45525. + Identifier;[section];
  45526. + CSharpCodeBlock - [8..15)::7
  45527. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  45528. + Whitespace;[ ];
  45529. + CSharpStatementLiteral - [9..12)::3 - [foo] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  45530. + Identifier;[foo];
  45531. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  45532. + Whitespace;[ ];
  45533. + RazorMetaCode - [13..14)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd
  45534. + LeftBrace;[{];
  45535. + MarkupBlock - [14..15)::1
  45536. + MarkupTextLiteral - [14..15)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45537. + Whitespace;[ ];
  45538. + RazorMetaCode - [15..15)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  45539. + RightBrace;[<Missing>];
  45540. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesEOFAfterOpenContent2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesEOFAfterOpenContent2.stree.txt
  45541. index ba6aae139bc..26a88550100 100644
  45542. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesEOFAfterOpenContent2.stree.txt
  45543. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesEOFAfterOpenContent2.stree.txt
  45544. @@ -1,19 +1,25 @@
  45545. -Markup block - Gen<None> - 16 - (0:0,0)
  45546. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  45547. - SyntaxKind.Unknown;[];
  45548. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted} [RZ1006(13:0,13 [1] )]> - 16 - (0:0,0)
  45549. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  45550. - SyntaxKind.Transition;[@];
  45551. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  45552. - SyntaxKind.Identifier;[section];
  45553. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  45554. - SyntaxKind.Whitespace;[ ];
  45555. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [foo] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  45556. - SyntaxKind.Identifier;[foo];
  45557. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (12:0,12) - Tokens:1
  45558. - SyntaxKind.Whitespace;[ ];
  45559. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd - (13:0,13) - Tokens:1
  45560. - SyntaxKind.LeftBrace;[{];
  45561. - Markup block - Gen<None> - 2 - (14:0,14)
  45562. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  45563. - SyntaxKind.NewLine;[LF];
  45564. +RazorDocument - [0..16)::16 - [@section foo {LF]
  45565. + MarkupBlock - [0..16)::16
  45566. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45567. + Marker;[];
  45568. + CSharpCodeBlock - [0..16)::16
  45569. + RazorDirective - [0..16)::16 - Directive:{section;RazorBlock;Unrestricted} [RZ1006(13:0,13 [1] )]
  45570. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  45571. + Transition;[@];
  45572. + RazorDirectiveBody - [1..16)::15
  45573. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  45574. + Identifier;[section];
  45575. + CSharpCodeBlock - [8..16)::8
  45576. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  45577. + Whitespace;[ ];
  45578. + CSharpStatementLiteral - [9..12)::3 - [foo] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  45579. + Identifier;[foo];
  45580. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  45581. + Whitespace;[ ];
  45582. + RazorMetaCode - [13..14)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd
  45583. + LeftBrace;[{];
  45584. + MarkupBlock - [14..16)::2
  45585. + MarkupTextLiteral - [14..16)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45586. + NewLine;[LF];
  45587. + RazorMetaCode - [16..16)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  45588. + RightBrace;[<Missing>];
  45589. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesEOFAfterOpenContent3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesEOFAfterOpenContent3.stree.txt
  45590. index 2bbc778d107..9167042d58a 100644
  45591. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesEOFAfterOpenContent3.stree.txt
  45592. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesEOFAfterOpenContent3.stree.txt
  45593. @@ -1,19 +1,25 @@
  45594. -Markup block - Gen<None> - 17 - (0:0,0)
  45595. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  45596. - SyntaxKind.Unknown;[];
  45597. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted} [RZ1006(13:0,13 [1] )]> - 17 - (0:0,0)
  45598. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  45599. - SyntaxKind.Transition;[@];
  45600. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  45601. - SyntaxKind.Identifier;[section];
  45602. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  45603. - SyntaxKind.Whitespace;[ ];
  45604. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [foo] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  45605. - SyntaxKind.Identifier;[foo];
  45606. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (12:0,12) - Tokens:1
  45607. - SyntaxKind.Whitespace;[ ];
  45608. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd - (13:0,13) - Tokens:1
  45609. - SyntaxKind.LeftBrace;[{];
  45610. - Markup block - Gen<None> - 3 - (14:0,14)
  45611. - Markup span - Gen<Markup> - [abc] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  45612. - SyntaxKind.Text;[abc];
  45613. +RazorDocument - [0..17)::17 - [@section foo {abc]
  45614. + MarkupBlock - [0..17)::17
  45615. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45616. + Marker;[];
  45617. + CSharpCodeBlock - [0..17)::17
  45618. + RazorDirective - [0..17)::17 - Directive:{section;RazorBlock;Unrestricted} [RZ1006(13:0,13 [1] )]
  45619. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  45620. + Transition;[@];
  45621. + RazorDirectiveBody - [1..17)::16
  45622. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  45623. + Identifier;[section];
  45624. + CSharpCodeBlock - [8..17)::9
  45625. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  45626. + Whitespace;[ ];
  45627. + CSharpStatementLiteral - [9..12)::3 - [foo] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  45628. + Identifier;[foo];
  45629. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  45630. + Whitespace;[ ];
  45631. + RazorMetaCode - [13..14)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd
  45632. + LeftBrace;[{];
  45633. + MarkupBlock - [14..17)::3
  45634. + MarkupTextLiteral - [14..17)::3 - [abc] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45635. + Text;[abc];
  45636. + RazorMetaCode - [17..17)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  45637. + RightBrace;[<Missing>];
  45638. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesEOFAfterOpenContent4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesEOFAfterOpenContent4.stree.txt
  45639. index ec24dcca8da..61a64017711 100644
  45640. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesEOFAfterOpenContent4.stree.txt
  45641. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesEOFAfterOpenContent4.stree.txt
  45642. @@ -1,21 +1,27 @@
  45643. -Markup block - Gen<None> - 20 - (0:0,0)
  45644. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  45645. - SyntaxKind.Unknown;[];
  45646. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted} [RZ1006(13:0,13 [1] )]> - 20 - (0:0,0)
  45647. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  45648. - SyntaxKind.Transition;[@];
  45649. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  45650. - SyntaxKind.Identifier;[section];
  45651. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  45652. - SyntaxKind.Whitespace;[ ];
  45653. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [foo] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  45654. - SyntaxKind.Identifier;[foo];
  45655. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (12:0,12) - Tokens:1
  45656. - SyntaxKind.Whitespace;[ ];
  45657. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd - (13:0,13) - Tokens:1
  45658. - SyntaxKind.LeftBrace;[{];
  45659. - Markup block - Gen<None> - 6 - (14:0,14)
  45660. - Markup span - Gen<Markup> - [LF abc] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:3
  45661. - SyntaxKind.NewLine;[LF];
  45662. - SyntaxKind.Whitespace;[ ];
  45663. - SyntaxKind.Text;[abc];
  45664. +RazorDocument - [0..20)::20 - [@section foo {LF abc]
  45665. + MarkupBlock - [0..20)::20
  45666. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45667. + Marker;[];
  45668. + CSharpCodeBlock - [0..20)::20
  45669. + RazorDirective - [0..20)::20 - Directive:{section;RazorBlock;Unrestricted} [RZ1006(13:0,13 [1] )]
  45670. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  45671. + Transition;[@];
  45672. + RazorDirectiveBody - [1..20)::19
  45673. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  45674. + Identifier;[section];
  45675. + CSharpCodeBlock - [8..20)::12
  45676. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  45677. + Whitespace;[ ];
  45678. + CSharpStatementLiteral - [9..12)::3 - [foo] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  45679. + Identifier;[foo];
  45680. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  45681. + Whitespace;[ ];
  45682. + RazorMetaCode - [13..14)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd
  45683. + LeftBrace;[{];
  45684. + MarkupBlock - [14..20)::6
  45685. + MarkupTextLiteral - [14..20)::6 - [LF abc] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45686. + NewLine;[LF];
  45687. + Whitespace;[ ];
  45688. + Text;[abc];
  45689. + RazorMetaCode - [20..20)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  45690. + RightBrace;[<Missing>];
  45691. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesUnterminatedSection.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesUnterminatedSection.stree.txt
  45692. index 967219c4b42..e24841e4e9a 100644
  45693. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesUnterminatedSection.stree.txt
  45694. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesUnterminatedSection.stree.txt
  45695. @@ -1,35 +1,40 @@
  45696. -Markup block - Gen<None> - 27 - (0:0,0)
  45697. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  45698. - SyntaxKind.Unknown;[];
  45699. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted} [RZ1006(13:0,13 [1] )]> - 27 - (0:0,0)
  45700. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  45701. - SyntaxKind.Transition;[@];
  45702. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  45703. - SyntaxKind.Identifier;[section];
  45704. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  45705. - SyntaxKind.Whitespace;[ ];
  45706. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [foo] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  45707. - SyntaxKind.Identifier;[foo];
  45708. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (12:0,12) - Tokens:1
  45709. - SyntaxKind.Whitespace;[ ];
  45710. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd - (13:0,13) - Tokens:1
  45711. - SyntaxKind.LeftBrace;[{];
  45712. - Markup block - Gen<None> - 13 - (14:0,14)
  45713. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  45714. - SyntaxKind.Whitespace;[ ];
  45715. - Tag block - Gen<None> - 3 - (15:0,15)
  45716. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:3
  45717. - SyntaxKind.OpenAngle;[<];
  45718. - SyntaxKind.Text;[p];
  45719. - SyntaxKind.CloseAngle;[>];
  45720. - SyntaxKind.HtmlTextLiteral - [Foo{}] - [18..23) - FullWidth: 5 - Slots: 1
  45721. - SyntaxKind.List - [Foo{}] - [18..23) - FullWidth: 5 - Slots: 3
  45722. - SyntaxKind.Text;[Foo];
  45723. - SyntaxKind.Text;[{];
  45724. - SyntaxKind.Text;[}];
  45725. - Tag block - Gen<None> - 4 - (23:0,23)
  45726. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:4
  45727. - SyntaxKind.OpenAngle;[<];
  45728. - SyntaxKind.ForwardSlash;[/];
  45729. - SyntaxKind.Text;[p];
  45730. - SyntaxKind.CloseAngle;[>];
  45731. +RazorDocument - [0..27)::27 - [@section foo { <p>Foo{}</p>]
  45732. + MarkupBlock - [0..27)::27
  45733. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45734. + Marker;[];
  45735. + CSharpCodeBlock - [0..27)::27
  45736. + RazorDirective - [0..27)::27 - Directive:{section;RazorBlock;Unrestricted} [RZ1006(13:0,13 [1] )]
  45737. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  45738. + Transition;[@];
  45739. + RazorDirectiveBody - [1..27)::26
  45740. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  45741. + Identifier;[section];
  45742. + CSharpCodeBlock - [8..27)::19
  45743. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  45744. + Whitespace;[ ];
  45745. + CSharpStatementLiteral - [9..12)::3 - [foo] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  45746. + Identifier;[foo];
  45747. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  45748. + Whitespace;[ ];
  45749. + RazorMetaCode - [13..14)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd
  45750. + LeftBrace;[{];
  45751. + MarkupBlock - [14..27)::13
  45752. + MarkupTextLiteral - [14..15)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45753. + Whitespace;[ ];
  45754. + MarkupTagBlock - [15..18)::3 - [<p>]
  45755. + MarkupTextLiteral - [15..18)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45756. + OpenAngle;[<];
  45757. + Text;[p];
  45758. + CloseAngle;[>];
  45759. + MarkupTextLiteral - [18..23)::5 - [Foo{}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45760. + Text;[Foo];
  45761. + Text;[{];
  45762. + Text;[}];
  45763. + MarkupTagBlock - [23..27)::4 - [</p>]
  45764. + MarkupTextLiteral - [23..27)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45765. + OpenAngle;[<];
  45766. + ForwardSlash;[/];
  45767. + Text;[p];
  45768. + CloseAngle;[>];
  45769. + RazorMetaCode - [27..27)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  45770. + RightBrace;[<Missing>];
  45771. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesUnterminatedSectionWithNestedIf.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesUnterminatedSectionWithNestedIf.stree.txt
  45772. index 307a32cb638..2b09571d9cc 100644
  45773. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesUnterminatedSectionWithNestedIf.stree.txt
  45774. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/HandlesUnterminatedSectionWithNestedIf.stree.txt
  45775. @@ -1,56 +1,62 @@
  45776. -Markup block - Gen<None> - 73 - (0:0,0)
  45777. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  45778. - SyntaxKind.Unknown;[];
  45779. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted} [RZ1006(15:1,0 [1] )]> - 73 - (0:0,0)
  45780. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  45781. - SyntaxKind.Transition;[@];
  45782. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  45783. - SyntaxKind.Identifier;[section];
  45784. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  45785. - SyntaxKind.Whitespace;[ ];
  45786. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [Test] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  45787. - SyntaxKind.Identifier;[Test];
  45788. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:AllWhitespace - (13:0,13) - Tokens:1
  45789. - SyntaxKind.NewLine;[LF];
  45790. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd - (15:1,0) - Tokens:1
  45791. - SyntaxKind.LeftBrace;[{];
  45792. - Markup block - Gen<None> - 57 - (16:1,1)
  45793. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:Any - (16:1,1) - Tokens:1
  45794. - SyntaxKind.NewLine;[LF];
  45795. - Statement block - Gen<None> - 55 - (18:2,0)
  45796. - Code span - Gen<Stmt> - [ ] - SpanEditHandler;Accepts:Any - (18:2,0) - Tokens:1
  45797. - SyntaxKind.Whitespace;[ ];
  45798. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (22:2,4) - Tokens:1
  45799. - SyntaxKind.Transition;[@];
  45800. - Code span - Gen<Stmt> - [if(true)LF {LF] - SpanEditHandler;Accepts:Any - (23:2,5) - Tokens:8
  45801. - SyntaxKind.Keyword;[if];
  45802. - SyntaxKind.LeftParenthesis;[(];
  45803. - SyntaxKind.Keyword;[true];
  45804. - SyntaxKind.RightParenthesis;[)];
  45805. - SyntaxKind.NewLine;[LF];
  45806. - SyntaxKind.Whitespace;[ ];
  45807. - SyntaxKind.LeftBrace;[{];
  45808. - SyntaxKind.NewLine;[LF];
  45809. - Markup block - Gen<None> - 28 - (40:4,0)
  45810. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (40:4,0) - Tokens:1
  45811. - SyntaxKind.Whitespace;[ ];
  45812. - Tag block - Gen<None> - 3 - (48:4,8)
  45813. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (48:4,8) - Tokens:3
  45814. - SyntaxKind.OpenAngle;[<];
  45815. - SyntaxKind.Text;[p];
  45816. - SyntaxKind.CloseAngle;[>];
  45817. - Markup span - Gen<Markup> - [Hello World] - SpanEditHandler;Accepts:Any - (51:4,11) - Tokens:3
  45818. - SyntaxKind.Text;[Hello];
  45819. - SyntaxKind.Whitespace;[ ];
  45820. - SyntaxKind.Text;[World];
  45821. - Tag block - Gen<None> - 4 - (62:4,22)
  45822. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (62:4,22) - Tokens:4
  45823. - SyntaxKind.OpenAngle;[<];
  45824. - SyntaxKind.ForwardSlash;[/];
  45825. - SyntaxKind.Text;[p];
  45826. - SyntaxKind.CloseAngle;[>];
  45827. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (66:4,26) - Tokens:1
  45828. - SyntaxKind.NewLine;[LF];
  45829. - Code span - Gen<Stmt> - [ }] - SpanEditHandler;Accepts:Any - (68:5,0) - Tokens:2
  45830. - SyntaxKind.Whitespace;[ ];
  45831. - SyntaxKind.RightBrace;[}];
  45832. +RazorDocument - [0..73)::73 - [@section TestLF{LF @if(true)LF {LF <p>Hello World</p>LF }]
  45833. + MarkupBlock - [0..73)::73
  45834. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45835. + Marker;[];
  45836. + CSharpCodeBlock - [0..73)::73
  45837. + RazorDirective - [0..73)::73 - Directive:{section;RazorBlock;Unrestricted} [RZ1006(15:1,0 [1] )]
  45838. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  45839. + Transition;[@];
  45840. + RazorDirectiveBody - [1..73)::72
  45841. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  45842. + Identifier;[section];
  45843. + CSharpCodeBlock - [8..73)::65
  45844. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  45845. + Whitespace;[ ];
  45846. + CSharpStatementLiteral - [9..13)::4 - [Test] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  45847. + Identifier;[Test];
  45848. + MarkupTextLiteral - [13..15)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  45849. + NewLine;[LF];
  45850. + RazorMetaCode - [15..16)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd
  45851. + LeftBrace;[{];
  45852. + MarkupBlock - [16..73)::57
  45853. + MarkupTextLiteral - [16..18)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45854. + NewLine;[LF];
  45855. + CSharpCodeBlock - [18..73)::55
  45856. + CSharpStatementLiteral - [18..22)::4 - [ ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  45857. + Whitespace;[ ];
  45858. + CSharpTransition - [22..23)::1 - Gen<None> - SpanEditHandler;Accepts:None
  45859. + Transition;[@];
  45860. + CSharpStatementLiteral - [23..40)::17 - [if(true)LF {LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  45861. + Keyword;[if];
  45862. + LeftParenthesis;[(];
  45863. + Keyword;[true];
  45864. + RightParenthesis;[)];
  45865. + NewLine;[LF];
  45866. + Whitespace;[ ];
  45867. + LeftBrace;[{];
  45868. + NewLine;[LF];
  45869. + MarkupBlock - [40..68)::28
  45870. + MarkupTextLiteral - [40..48)::8 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45871. + Whitespace;[ ];
  45872. + MarkupTagBlock - [48..51)::3 - [<p>]
  45873. + MarkupTextLiteral - [48..51)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  45874. + OpenAngle;[<];
  45875. + Text;[p];
  45876. + CloseAngle;[>];
  45877. + MarkupTextLiteral - [51..62)::11 - [Hello World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45878. + Text;[Hello];
  45879. + Whitespace;[ ];
  45880. + Text;[World];
  45881. + MarkupTagBlock - [62..66)::4 - [</p>]
  45882. + MarkupTextLiteral - [62..66)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  45883. + OpenAngle;[<];
  45884. + ForwardSlash;[/];
  45885. + Text;[p];
  45886. + CloseAngle;[>];
  45887. + MarkupTextLiteral - [66..68)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  45888. + NewLine;[LF];
  45889. + CSharpStatementLiteral - [68..73)::5 - [ }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  45890. + Whitespace;[ ];
  45891. + RightBrace;[}];
  45892. + RazorMetaCode - [73..73)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  45893. + RightBrace;[<Missing>];
  45894. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/IgnoresSectionUnlessAllLowerCase.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/IgnoresSectionUnlessAllLowerCase.stree.txt
  45895. index 88d59309304..8f8cb089b82 100644
  45896. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/IgnoresSectionUnlessAllLowerCase.stree.txt
  45897. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/IgnoresSectionUnlessAllLowerCase.stree.txt
  45898. @@ -1,11 +1,15 @@
  45899. -Markup block - Gen<None> - 12 - (0:0,0)
  45900. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  45901. - SyntaxKind.Unknown;[];
  45902. - Expression block - Gen<Expr> - 8 - (0:0,0)
  45903. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  45904. - SyntaxKind.Transition;[@];
  45905. - Code span - Gen<Expr> - [Section] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K15 - (1:0,1) - Tokens:1
  45906. - SyntaxKind.Identifier;[Section];
  45907. - Markup span - Gen<Markup> - [ foo] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:2
  45908. - SyntaxKind.Whitespace;[ ];
  45909. - SyntaxKind.Text;[foo];
  45910. +RazorDocument - [0..12)::12 - [@Section foo]
  45911. + MarkupBlock - [0..12)::12
  45912. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45913. + Marker;[];
  45914. + CSharpCodeBlock - [0..8)::8
  45915. + CSharpImplicitExpression - [0..8)::8
  45916. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  45917. + Transition;[@];
  45918. + CSharpImplicitExpressionBody - [1..8)::7
  45919. + CSharpCodeBlock - [1..8)::7
  45920. + CSharpExpressionLiteral - [1..8)::7 - [Section] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K15
  45921. + Identifier;[Section];
  45922. + MarkupTextLiteral - [8..12)::4 - [ foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45923. + Whitespace;[ ];
  45924. + Text;[foo];
  45925. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ParserOutputsErrorOnNestedSections.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ParserOutputsErrorOnNestedSections.stree.txt
  45926. index f5a31332c65..56f2e926711 100644
  45927. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ParserOutputsErrorOnNestedSections.stree.txt
  45928. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ParserOutputsErrorOnNestedSections.stree.txt
  45929. @@ -1,58 +1,65 @@
  45930. -Markup block - Gen<None> - 44 - (0:0,0)
  45931. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  45932. - SyntaxKind.Unknown;[];
  45933. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted}> - 44 - (0:0,0)
  45934. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  45935. - SyntaxKind.Transition;[@];
  45936. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  45937. - SyntaxKind.Identifier;[section];
  45938. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  45939. - SyntaxKind.Whitespace;[ ];
  45940. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [foo] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  45941. - SyntaxKind.Identifier;[foo];
  45942. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (12:0,12) - Tokens:1
  45943. - SyntaxKind.Whitespace;[ ];
  45944. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd - (13:0,13) - Tokens:1
  45945. - SyntaxKind.LeftBrace;[{];
  45946. - Markup block - Gen<None> - 29 - (14:0,14)
  45947. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  45948. - SyntaxKind.Whitespace;[ ];
  45949. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted} [RZ2005(16:0,16 [7] ), RZ2002(15:0,15 [8] )]> - 27 - (15:0,15)
  45950. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:1
  45951. - SyntaxKind.Transition;[@];
  45952. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  45953. - SyntaxKind.Identifier;[section];
  45954. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (23:0,23) - Tokens:1
  45955. - SyntaxKind.Whitespace;[ ];
  45956. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [bar] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (24:0,24) - Tokens:1
  45957. - SyntaxKind.Identifier;[bar];
  45958. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (27:0,27) - Tokens:1
  45959. - SyntaxKind.Whitespace;[ ];
  45960. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd - (28:0,28) - Tokens:1
  45961. - SyntaxKind.LeftBrace;[{];
  45962. - Markup block - Gen<None> - 12 - (29:0,29)
  45963. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (29:0,29) - Tokens:1
  45964. - SyntaxKind.Whitespace;[ ];
  45965. - Tag block - Gen<None> - 3 - (30:0,30)
  45966. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (30:0,30) - Tokens:3
  45967. - SyntaxKind.OpenAngle;[<];
  45968. - SyntaxKind.Text;[p];
  45969. - SyntaxKind.CloseAngle;[>];
  45970. - SyntaxKind.HtmlTextLiteral - [Foo] - [33..36) - FullWidth: 3 - Slots: 1
  45971. - SyntaxKind.Text;[Foo];
  45972. - Tag block - Gen<None> - 4 - (36:0,36)
  45973. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (36:0,36) - Tokens:4
  45974. - SyntaxKind.OpenAngle;[<];
  45975. - SyntaxKind.ForwardSlash;[/];
  45976. - SyntaxKind.Text;[p];
  45977. - SyntaxKind.CloseAngle;[>];
  45978. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (40:0,40) - Tokens:1
  45979. - SyntaxKind.Whitespace;[ ];
  45980. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (41:0,41) - Tokens:1
  45981. - SyntaxKind.RightBrace;[}];
  45982. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (42:0,42) - Tokens:1
  45983. - SyntaxKind.Whitespace;[ ];
  45984. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (43:0,43) - Tokens:1
  45985. - SyntaxKind.RightBrace;[}];
  45986. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (44:0,44) - Tokens:1
  45987. - SyntaxKind.Unknown;[];
  45988. +RazorDocument - [0..44)::44 - [@section foo { @section bar { <p>Foo</p> } }]
  45989. + MarkupBlock - [0..44)::44
  45990. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  45991. + Marker;[];
  45992. + CSharpCodeBlock - [0..44)::44
  45993. + RazorDirective - [0..44)::44 - Directive:{section;RazorBlock;Unrestricted}
  45994. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  45995. + Transition;[@];
  45996. + RazorDirectiveBody - [1..44)::43
  45997. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  45998. + Identifier;[section];
  45999. + CSharpCodeBlock - [8..44)::36
  46000. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  46001. + Whitespace;[ ];
  46002. + CSharpStatementLiteral - [9..12)::3 - [foo] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  46003. + Identifier;[foo];
  46004. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  46005. + Whitespace;[ ];
  46006. + RazorMetaCode - [13..14)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd
  46007. + LeftBrace;[{];
  46008. + MarkupBlock - [14..43)::29
  46009. + MarkupTextLiteral - [14..15)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46010. + Whitespace;[ ];
  46011. + CSharpCodeBlock - [15..42)::27
  46012. + RazorDirective - [15..42)::27 - Directive:{section;RazorBlock;Unrestricted} [RZ2005(16:0,16 [7] ), RZ2002(15:0,15 [8] )]
  46013. + CSharpTransition - [15..16)::1 - Gen<None> - SpanEditHandler;Accepts:None
  46014. + Transition;[@];
  46015. + RazorDirectiveBody - [16..42)::26
  46016. + RazorMetaCode - [16..23)::7 - Gen<None> - SpanEditHandler;Accepts:None
  46017. + Identifier;[section];
  46018. + CSharpCodeBlock - [23..42)::19
  46019. + CSharpStatementLiteral - [23..24)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  46020. + Whitespace;[ ];
  46021. + CSharpStatementLiteral - [24..27)::3 - [bar] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  46022. + Identifier;[bar];
  46023. + MarkupTextLiteral - [27..28)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  46024. + Whitespace;[ ];
  46025. + RazorMetaCode - [28..29)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd
  46026. + LeftBrace;[{];
  46027. + MarkupBlock - [29..41)::12
  46028. + MarkupTextLiteral - [29..30)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46029. + Whitespace;[ ];
  46030. + MarkupTagBlock - [30..33)::3 - [<p>]
  46031. + MarkupTextLiteral - [30..33)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46032. + OpenAngle;[<];
  46033. + Text;[p];
  46034. + CloseAngle;[>];
  46035. + MarkupTextLiteral - [33..36)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46036. + Text;[Foo];
  46037. + MarkupTagBlock - [36..40)::4 - [</p>]
  46038. + MarkupTextLiteral - [36..40)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46039. + OpenAngle;[<];
  46040. + ForwardSlash;[/];
  46041. + Text;[p];
  46042. + CloseAngle;[>];
  46043. + MarkupTextLiteral - [40..41)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46044. + Whitespace;[ ];
  46045. + RazorMetaCode - [41..42)::1 - Gen<None> - SpanEditHandler;Accepts:None
  46046. + RightBrace;[}];
  46047. + MarkupTextLiteral - [42..43)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46048. + Whitespace;[ ];
  46049. + RazorMetaCode - [43..44)::1 - Gen<None> - SpanEditHandler;Accepts:None
  46050. + RightBrace;[}];
  46051. + MarkupTextLiteral - [44..44)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46052. + Marker;[];
  46053. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ParsesComment.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ParsesComment.stree.txt
  46054. index 79ae5a2bf7e..ff9823b96d4 100644
  46055. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ParsesComment.stree.txt
  46056. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ParsesComment.stree.txt
  46057. @@ -1,33 +1,37 @@
  46058. -Markup block - Gen<None> - 21 - (0:0,0)
  46059. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  46060. - SyntaxKind.Unknown;[];
  46061. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted}> - 21 - (0:0,0)
  46062. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  46063. - SyntaxKind.Transition;[@];
  46064. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  46065. - SyntaxKind.Identifier;[section];
  46066. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  46067. - SyntaxKind.Whitespace;[ ];
  46068. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [s] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  46069. - SyntaxKind.Identifier;[s];
  46070. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (10:0,10) - Tokens:1
  46071. - SyntaxKind.Whitespace;[ ];
  46072. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd - (11:0,11) - Tokens:1
  46073. - SyntaxKind.LeftBrace;[{];
  46074. - Markup block - Gen<None> - 8 - (12:0,12)
  46075. - HtmlComment block - Gen<None> - 8 - (12:0,12)
  46076. - Markup span - Gen<Markup> - [<!--] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:3
  46077. - SyntaxKind.OpenAngle;[<];
  46078. - SyntaxKind.Bang;[!];
  46079. - SyntaxKind.DoubleHyphen;[--];
  46080. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Whitespace - (16:0,16) - Tokens:1
  46081. - SyntaxKind.Whitespace;[ ];
  46082. - Markup span - Gen<Markup> - [-->] - SpanEditHandler;Accepts:None - (17:0,17) - Tokens:2
  46083. - SyntaxKind.DoubleHyphen;[--];
  46084. - SyntaxKind.CloseAngle;[>];
  46085. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:1
  46086. - SyntaxKind.Unknown;[];
  46087. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (20:0,20) - Tokens:1
  46088. - SyntaxKind.RightBrace;[}];
  46089. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:1
  46090. - SyntaxKind.Unknown;[];
  46091. +RazorDocument - [0..21)::21 - [@section s {<!-- -->}]
  46092. + MarkupBlock - [0..21)::21
  46093. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46094. + Marker;[];
  46095. + CSharpCodeBlock - [0..21)::21
  46096. + RazorDirective - [0..21)::21 - Directive:{section;RazorBlock;Unrestricted}
  46097. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  46098. + Transition;[@];
  46099. + RazorDirectiveBody - [1..21)::20
  46100. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  46101. + Identifier;[section];
  46102. + CSharpCodeBlock - [8..21)::13
  46103. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  46104. + Whitespace;[ ];
  46105. + CSharpStatementLiteral - [9..10)::1 - [s] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  46106. + Identifier;[s];
  46107. + MarkupTextLiteral - [10..11)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  46108. + Whitespace;[ ];
  46109. + RazorMetaCode - [11..12)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd
  46110. + LeftBrace;[{];
  46111. + MarkupBlock - [12..20)::8
  46112. + MarkupCommentBlock - [12..20)::8
  46113. + MarkupTextLiteral - [12..16)::4 - [<!--] - Gen<Markup> - SpanEditHandler;Accepts:None
  46114. + OpenAngle;[<];
  46115. + Bang;[!];
  46116. + DoubleHyphen;[--];
  46117. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Whitespace
  46118. + Whitespace;[ ];
  46119. + MarkupTextLiteral - [17..20)::3 - [-->] - Gen<Markup> - SpanEditHandler;Accepts:None
  46120. + DoubleHyphen;[--];
  46121. + CloseAngle;[>];
  46122. + MarkupTextLiteral - [20..20)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46123. + Marker;[];
  46124. + RazorMetaCode - [20..21)::1 - Gen<None> - SpanEditHandler;Accepts:None
  46125. + RightBrace;[}];
  46126. + MarkupTextLiteral - [21..21)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46127. + Marker;[];
  46128. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ParsesCommentWithDelimiters.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ParsesCommentWithDelimiters.stree.txt
  46129. index 72698062ec6..414e5b3681b 100644
  46130. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ParsesCommentWithDelimiters.stree.txt
  46131. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ParsesCommentWithDelimiters.stree.txt
  46132. @@ -1,38 +1,42 @@
  46133. -Markup block - Gen<None> - 26 - (0:0,0)
  46134. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  46135. - SyntaxKind.Unknown;[];
  46136. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted}> - 26 - (0:0,0)
  46137. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  46138. - SyntaxKind.Transition;[@];
  46139. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  46140. - SyntaxKind.Identifier;[section];
  46141. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  46142. - SyntaxKind.Whitespace;[ ];
  46143. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [s] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  46144. - SyntaxKind.Identifier;[s];
  46145. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (10:0,10) - Tokens:1
  46146. - SyntaxKind.Whitespace;[ ];
  46147. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd - (11:0,11) - Tokens:1
  46148. - SyntaxKind.LeftBrace;[{];
  46149. - Markup block - Gen<None> - 13 - (12:0,12)
  46150. - HtmlComment block - Gen<None> - 13 - (12:0,12)
  46151. - Markup span - Gen<Markup> - [<!--] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:3
  46152. - SyntaxKind.OpenAngle;[<];
  46153. - SyntaxKind.Bang;[!];
  46154. - SyntaxKind.DoubleHyphen;[--];
  46155. - Markup span - Gen<Markup> - [ > " '] - SpanEditHandler;Accepts:Whitespace - (16:0,16) - Tokens:6
  46156. - SyntaxKind.Whitespace;[ ];
  46157. - SyntaxKind.CloseAngle;[>];
  46158. - SyntaxKind.Whitespace;[ ];
  46159. - SyntaxKind.DoubleQuote;["];
  46160. - SyntaxKind.Whitespace;[ ];
  46161. - SyntaxKind.SingleQuote;['];
  46162. - Markup span - Gen<Markup> - [-->] - SpanEditHandler;Accepts:None - (22:0,22) - Tokens:2
  46163. - SyntaxKind.DoubleHyphen;[--];
  46164. - SyntaxKind.CloseAngle;[>];
  46165. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:1
  46166. - SyntaxKind.Unknown;[];
  46167. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (25:0,25) - Tokens:1
  46168. - SyntaxKind.RightBrace;[}];
  46169. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (26:0,26) - Tokens:1
  46170. - SyntaxKind.Unknown;[];
  46171. +RazorDocument - [0..26)::26 - [@section s {<!-- > " '-->}]
  46172. + MarkupBlock - [0..26)::26
  46173. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46174. + Marker;[];
  46175. + CSharpCodeBlock - [0..26)::26
  46176. + RazorDirective - [0..26)::26 - Directive:{section;RazorBlock;Unrestricted}
  46177. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  46178. + Transition;[@];
  46179. + RazorDirectiveBody - [1..26)::25
  46180. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  46181. + Identifier;[section];
  46182. + CSharpCodeBlock - [8..26)::18
  46183. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  46184. + Whitespace;[ ];
  46185. + CSharpStatementLiteral - [9..10)::1 - [s] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  46186. + Identifier;[s];
  46187. + MarkupTextLiteral - [10..11)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  46188. + Whitespace;[ ];
  46189. + RazorMetaCode - [11..12)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd
  46190. + LeftBrace;[{];
  46191. + MarkupBlock - [12..25)::13
  46192. + MarkupCommentBlock - [12..25)::13
  46193. + MarkupTextLiteral - [12..16)::4 - [<!--] - Gen<Markup> - SpanEditHandler;Accepts:None
  46194. + OpenAngle;[<];
  46195. + Bang;[!];
  46196. + DoubleHyphen;[--];
  46197. + MarkupTextLiteral - [16..22)::6 - [ > " '] - Gen<Markup> - SpanEditHandler;Accepts:Whitespace
  46198. + Whitespace;[ ];
  46199. + CloseAngle;[>];
  46200. + Whitespace;[ ];
  46201. + DoubleQuote;["];
  46202. + Whitespace;[ ];
  46203. + SingleQuote;['];
  46204. + MarkupTextLiteral - [22..25)::3 - [-->] - Gen<Markup> - SpanEditHandler;Accepts:None
  46205. + DoubleHyphen;[--];
  46206. + CloseAngle;[>];
  46207. + MarkupTextLiteral - [25..25)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46208. + Marker;[];
  46209. + RazorMetaCode - [25..26)::1 - Gen<None> - SpanEditHandler;Accepts:None
  46210. + RightBrace;[}];
  46211. + MarkupTextLiteral - [26..26)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46212. + Marker;[];
  46213. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ParsesNamedSectionCorrectly.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ParsesNamedSectionCorrectly.stree.txt
  46214. index be21d3746d4..68d3659c30e 100644
  46215. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ParsesNamedSectionCorrectly.stree.txt
  46216. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ParsesNamedSectionCorrectly.stree.txt
  46217. @@ -1,38 +1,42 @@
  46218. -Markup block - Gen<None> - 27 - (0:0,0)
  46219. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  46220. - SyntaxKind.Unknown;[];
  46221. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted}> - 27 - (0:0,0)
  46222. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  46223. - SyntaxKind.Transition;[@];
  46224. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  46225. - SyntaxKind.Identifier;[section];
  46226. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  46227. - SyntaxKind.Whitespace;[ ];
  46228. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [foo] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  46229. - SyntaxKind.Identifier;[foo];
  46230. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (12:0,12) - Tokens:1
  46231. - SyntaxKind.Whitespace;[ ];
  46232. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd - (13:0,13) - Tokens:1
  46233. - SyntaxKind.LeftBrace;[{];
  46234. - Markup block - Gen<None> - 12 - (14:0,14)
  46235. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  46236. - SyntaxKind.Whitespace;[ ];
  46237. - Tag block - Gen<None> - 3 - (15:0,15)
  46238. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:3
  46239. - SyntaxKind.OpenAngle;[<];
  46240. - SyntaxKind.Text;[p];
  46241. - SyntaxKind.CloseAngle;[>];
  46242. - SyntaxKind.HtmlTextLiteral - [Foo] - [18..21) - FullWidth: 3 - Slots: 1
  46243. - SyntaxKind.Text;[Foo];
  46244. - Tag block - Gen<None> - 4 - (21:0,21)
  46245. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:4
  46246. - SyntaxKind.OpenAngle;[<];
  46247. - SyntaxKind.ForwardSlash;[/];
  46248. - SyntaxKind.Text;[p];
  46249. - SyntaxKind.CloseAngle;[>];
  46250. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:1
  46251. - SyntaxKind.Whitespace;[ ];
  46252. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (26:0,26) - Tokens:1
  46253. - SyntaxKind.RightBrace;[}];
  46254. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (27:0,27) - Tokens:1
  46255. - SyntaxKind.Unknown;[];
  46256. +RazorDocument - [0..27)::27 - [@section foo { <p>Foo</p> }]
  46257. + MarkupBlock - [0..27)::27
  46258. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46259. + Marker;[];
  46260. + CSharpCodeBlock - [0..27)::27
  46261. + RazorDirective - [0..27)::27 - Directive:{section;RazorBlock;Unrestricted}
  46262. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  46263. + Transition;[@];
  46264. + RazorDirectiveBody - [1..27)::26
  46265. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  46266. + Identifier;[section];
  46267. + CSharpCodeBlock - [8..27)::19
  46268. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  46269. + Whitespace;[ ];
  46270. + CSharpStatementLiteral - [9..12)::3 - [foo] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  46271. + Identifier;[foo];
  46272. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  46273. + Whitespace;[ ];
  46274. + RazorMetaCode - [13..14)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd
  46275. + LeftBrace;[{];
  46276. + MarkupBlock - [14..26)::12
  46277. + MarkupTextLiteral - [14..15)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46278. + Whitespace;[ ];
  46279. + MarkupTagBlock - [15..18)::3 - [<p>]
  46280. + MarkupTextLiteral - [15..18)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46281. + OpenAngle;[<];
  46282. + Text;[p];
  46283. + CloseAngle;[>];
  46284. + MarkupTextLiteral - [18..21)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46285. + Text;[Foo];
  46286. + MarkupTagBlock - [21..25)::4 - [</p>]
  46287. + MarkupTextLiteral - [21..25)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46288. + OpenAngle;[<];
  46289. + ForwardSlash;[/];
  46290. + Text;[p];
  46291. + CloseAngle;[>];
  46292. + MarkupTextLiteral - [25..26)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46293. + Whitespace;[ ];
  46294. + RazorMetaCode - [26..27)::1 - Gen<None> - SpanEditHandler;Accepts:None
  46295. + RightBrace;[}];
  46296. + MarkupTextLiteral - [27..27)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46297. + Marker;[];
  46298. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ParsesXmlProcessingInstruction.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ParsesXmlProcessingInstruction.stree.txt
  46299. index 290add3dad2..69ed3ab18b4 100644
  46300. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ParsesXmlProcessingInstruction.stree.txt
  46301. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ParsesXmlProcessingInstruction.stree.txt
  46302. @@ -1,32 +1,36 @@
  46303. -Markup block - Gen<None> - 28 - (0:0,0)
  46304. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  46305. - SyntaxKind.Unknown;[];
  46306. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted}> - 28 - (0:0,0)
  46307. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  46308. - SyntaxKind.Transition;[@];
  46309. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  46310. - SyntaxKind.Identifier;[section];
  46311. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  46312. - SyntaxKind.Whitespace;[ ];
  46313. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [s] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  46314. - SyntaxKind.Identifier;[s];
  46315. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (10:0,10) - Tokens:1
  46316. - SyntaxKind.Whitespace;[ ];
  46317. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd - (11:0,11) - Tokens:1
  46318. - SyntaxKind.LeftBrace;[{];
  46319. - Markup block - Gen<None> - 15 - (12:0,12)
  46320. - Markup span - Gen<Markup> - [ <? xml bleh ?>] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:10
  46321. - SyntaxKind.Whitespace;[ ];
  46322. - SyntaxKind.OpenAngle;[<];
  46323. - SyntaxKind.QuestionMark;[?];
  46324. - SyntaxKind.Whitespace;[ ];
  46325. - SyntaxKind.Text;[xml];
  46326. - SyntaxKind.Whitespace;[ ];
  46327. - SyntaxKind.Text;[bleh];
  46328. - SyntaxKind.Whitespace;[ ];
  46329. - SyntaxKind.QuestionMark;[?];
  46330. - SyntaxKind.CloseAngle;[>];
  46331. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (27:0,27) - Tokens:1
  46332. - SyntaxKind.RightBrace;[}];
  46333. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (28:0,28) - Tokens:1
  46334. - SyntaxKind.Unknown;[];
  46335. +RazorDocument - [0..28)::28 - [@section s { <? xml bleh ?>}]
  46336. + MarkupBlock - [0..28)::28
  46337. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46338. + Marker;[];
  46339. + CSharpCodeBlock - [0..28)::28
  46340. + RazorDirective - [0..28)::28 - Directive:{section;RazorBlock;Unrestricted}
  46341. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  46342. + Transition;[@];
  46343. + RazorDirectiveBody - [1..28)::27
  46344. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  46345. + Identifier;[section];
  46346. + CSharpCodeBlock - [8..28)::20
  46347. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  46348. + Whitespace;[ ];
  46349. + CSharpStatementLiteral - [9..10)::1 - [s] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  46350. + Identifier;[s];
  46351. + MarkupTextLiteral - [10..11)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  46352. + Whitespace;[ ];
  46353. + RazorMetaCode - [11..12)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd
  46354. + LeftBrace;[{];
  46355. + MarkupBlock - [12..27)::15
  46356. + MarkupTextLiteral - [12..27)::15 - [ <? xml bleh ?>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46357. + Whitespace;[ ];
  46358. + OpenAngle;[<];
  46359. + QuestionMark;[?];
  46360. + Whitespace;[ ];
  46361. + Text;[xml];
  46362. + Whitespace;[ ];
  46363. + Text;[bleh];
  46364. + Whitespace;[ ];
  46365. + QuestionMark;[?];
  46366. + CloseAngle;[>];
  46367. + RazorMetaCode - [27..28)::1 - Gen<None> - SpanEditHandler;Accepts:None
  46368. + RightBrace;[}];
  46369. + MarkupTextLiteral - [28..28)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46370. + Marker;[];
  46371. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ReportsErrorAndAcceptsWhitespaceToEOLIfSectionNotFollowedByOpenBrace.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ReportsErrorAndAcceptsWhitespaceToEOLIfSectionNotFollowedByOpenBrace.stree.txt
  46372. index d94e0cb8589..cfb10ee1cab 100644
  46373. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ReportsErrorAndAcceptsWhitespaceToEOLIfSectionNotFollowedByOpenBrace.stree.txt
  46374. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ReportsErrorAndAcceptsWhitespaceToEOLIfSectionNotFollowedByOpenBrace.stree.txt
  46375. @@ -1,17 +1,21 @@
  46376. -Markup block - Gen<None> - 20 - (0:0,0)
  46377. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  46378. - SyntaxKind.Unknown;[];
  46379. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted} [RZ1012(20:1,0 [1] )]> - 20 - (0:0,0)
  46380. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  46381. - SyntaxKind.Transition;[@];
  46382. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  46383. - SyntaxKind.Identifier;[section];
  46384. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  46385. - SyntaxKind.Whitespace;[ ];
  46386. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [foo] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  46387. - SyntaxKind.Identifier;[foo];
  46388. - Markup span - Gen<None> - [ LF] - SpanEditHandler;Accepts:AllWhitespace - (12:0,12) - Tokens:2
  46389. - SyntaxKind.Whitespace;[ ];
  46390. - SyntaxKind.NewLine;[LF];
  46391. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (20:1,0) - Tokens:1
  46392. - SyntaxKind.Unknown;[];
  46393. +RazorDocument - [0..20)::20 - [@section foo LF]
  46394. + MarkupBlock - [0..20)::20
  46395. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46396. + Marker;[];
  46397. + CSharpCodeBlock - [0..20)::20
  46398. + RazorDirective - [0..20)::20 - Directive:{section;RazorBlock;Unrestricted} [RZ1012(20:1,0 [1] )]
  46399. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  46400. + Transition;[@];
  46401. + RazorDirectiveBody - [1..20)::19
  46402. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  46403. + Identifier;[section];
  46404. + CSharpCodeBlock - [8..20)::12
  46405. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  46406. + Whitespace;[ ];
  46407. + CSharpStatementLiteral - [9..12)::3 - [foo] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  46408. + Identifier;[foo];
  46409. + MarkupTextLiteral - [12..20)::8 - [ LF] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  46410. + Whitespace;[ ];
  46411. + NewLine;[LF];
  46412. + MarkupTextLiteral - [20..20)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46413. + Marker;[];
  46414. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ReportsErrorAndTerminatesSectionBlockIfKeywordNotFollowedByIdentifierStartChar.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ReportsErrorAndTerminatesSectionBlockIfKeywordNotFollowedByIdentifierStartChar.stree.txt
  46415. index 35badf14530..194ad66d186 100644
  46416. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ReportsErrorAndTerminatesSectionBlockIfKeywordNotFollowedByIdentifierStartChar.stree.txt
  46417. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ReportsErrorAndTerminatesSectionBlockIfKeywordNotFollowedByIdentifierStartChar.stree.txt
  46418. @@ -1,31 +1,35 @@
  46419. -Markup block - Gen<None> - 25 - (0:0,0)
  46420. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  46421. - SyntaxKind.Unknown;[];
  46422. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted} [RZ1015(9:0,9 [1] )]> - 9 - (0:0,0)
  46423. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  46424. - SyntaxKind.Transition;[@];
  46425. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  46426. - SyntaxKind.Identifier;[section];
  46427. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  46428. - SyntaxKind.Whitespace;[ ];
  46429. - Markup span - Gen<Markup> - [9 { ] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:4
  46430. - SyntaxKind.Text;[9];
  46431. - SyntaxKind.Whitespace;[ ];
  46432. - SyntaxKind.Text;[{];
  46433. - SyntaxKind.Whitespace;[ ];
  46434. - Tag block - Gen<None> - 3 - (13:0,13)
  46435. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:3
  46436. - SyntaxKind.OpenAngle;[<];
  46437. - SyntaxKind.Text;[p];
  46438. - SyntaxKind.CloseAngle;[>];
  46439. - SyntaxKind.HtmlTextLiteral - [Foo] - [16..19) - FullWidth: 3 - Slots: 1
  46440. - SyntaxKind.Text;[Foo];
  46441. - Tag block - Gen<None> - 4 - (19:0,19)
  46442. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:4
  46443. - SyntaxKind.OpenAngle;[<];
  46444. - SyntaxKind.ForwardSlash;[/];
  46445. - SyntaxKind.Text;[p];
  46446. - SyntaxKind.CloseAngle;[>];
  46447. - Markup span - Gen<Markup> - [ }] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:2
  46448. - SyntaxKind.Whitespace;[ ];
  46449. - SyntaxKind.Text;[}];
  46450. +RazorDocument - [0..25)::25 - [@section 9 { <p>Foo</p> }]
  46451. + MarkupBlock - [0..25)::25
  46452. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46453. + Marker;[];
  46454. + CSharpCodeBlock - [0..9)::9
  46455. + RazorDirective - [0..9)::9 - Directive:{section;RazorBlock;Unrestricted} [RZ1015(9:0,9 [1] )]
  46456. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  46457. + Transition;[@];
  46458. + RazorDirectiveBody - [1..9)::8
  46459. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  46460. + Identifier;[section];
  46461. + CSharpCodeBlock - [8..9)::1
  46462. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  46463. + Whitespace;[ ];
  46464. + MarkupTextLiteral - [9..13)::4 - [9 { ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46465. + Text;[9];
  46466. + Whitespace;[ ];
  46467. + Text;[{];
  46468. + Whitespace;[ ];
  46469. + MarkupTagBlock - [13..16)::3 - [<p>]
  46470. + MarkupTextLiteral - [13..16)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46471. + OpenAngle;[<];
  46472. + Text;[p];
  46473. + CloseAngle;[>];
  46474. + MarkupTextLiteral - [16..19)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46475. + Text;[Foo];
  46476. + MarkupTagBlock - [19..23)::4 - [</p>]
  46477. + MarkupTextLiteral - [19..23)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46478. + OpenAngle;[<];
  46479. + ForwardSlash;[/];
  46480. + Text;[p];
  46481. + CloseAngle;[>];
  46482. + MarkupTextLiteral - [23..25)::2 - [ }] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46483. + Whitespace;[ ];
  46484. + Text;[}];
  46485. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ReportsErrorAndTerminatesSectionBlockIfNameNotFollowedByOpenBrace.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ReportsErrorAndTerminatesSectionBlockIfNameNotFollowedByOpenBrace.stree.txt
  46486. index 22d3d989a01..c844cbeeb0c 100644
  46487. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ReportsErrorAndTerminatesSectionBlockIfNameNotFollowedByOpenBrace.stree.txt
  46488. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/ReportsErrorAndTerminatesSectionBlockIfNameNotFollowedByOpenBrace.stree.txt
  46489. @@ -1,33 +1,37 @@
  46490. -Markup block - Gen<None> - 31 - (0:0,0)
  46491. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  46492. - SyntaxKind.Unknown;[];
  46493. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted} [RZ1017(12:0,12 [1] )]> - 12 - (0:0,0)
  46494. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  46495. - SyntaxKind.Transition;[@];
  46496. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  46497. - SyntaxKind.Identifier;[section];
  46498. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  46499. - SyntaxKind.Whitespace;[ ];
  46500. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [foo] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  46501. - SyntaxKind.Identifier;[foo];
  46502. - Markup span - Gen<Markup> - [-bar { ] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:4
  46503. - SyntaxKind.Text;[-bar];
  46504. - SyntaxKind.Whitespace;[ ];
  46505. - SyntaxKind.Text;[{];
  46506. - SyntaxKind.Whitespace;[ ];
  46507. - Tag block - Gen<None> - 3 - (19:0,19)
  46508. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:3
  46509. - SyntaxKind.OpenAngle;[<];
  46510. - SyntaxKind.Text;[p];
  46511. - SyntaxKind.CloseAngle;[>];
  46512. - SyntaxKind.HtmlTextLiteral - [Foo] - [22..25) - FullWidth: 3 - Slots: 1
  46513. - SyntaxKind.Text;[Foo];
  46514. - Tag block - Gen<None> - 4 - (25:0,25)
  46515. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:4
  46516. - SyntaxKind.OpenAngle;[<];
  46517. - SyntaxKind.ForwardSlash;[/];
  46518. - SyntaxKind.Text;[p];
  46519. - SyntaxKind.CloseAngle;[>];
  46520. - Markup span - Gen<Markup> - [ }] - SpanEditHandler;Accepts:Any - (29:0,29) - Tokens:2
  46521. - SyntaxKind.Whitespace;[ ];
  46522. - SyntaxKind.Text;[}];
  46523. +RazorDocument - [0..31)::31 - [@section foo-bar { <p>Foo</p> }]
  46524. + MarkupBlock - [0..31)::31
  46525. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46526. + Marker;[];
  46527. + CSharpCodeBlock - [0..12)::12
  46528. + RazorDirective - [0..12)::12 - Directive:{section;RazorBlock;Unrestricted} [RZ1017(12:0,12 [1] )]
  46529. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  46530. + Transition;[@];
  46531. + RazorDirectiveBody - [1..12)::11
  46532. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  46533. + Identifier;[section];
  46534. + CSharpCodeBlock - [8..12)::4
  46535. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  46536. + Whitespace;[ ];
  46537. + CSharpStatementLiteral - [9..12)::3 - [foo] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  46538. + Identifier;[foo];
  46539. + MarkupTextLiteral - [12..19)::7 - [-bar { ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46540. + Text;[-bar];
  46541. + Whitespace;[ ];
  46542. + Text;[{];
  46543. + Whitespace;[ ];
  46544. + MarkupTagBlock - [19..22)::3 - [<p>]
  46545. + MarkupTextLiteral - [19..22)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46546. + OpenAngle;[<];
  46547. + Text;[p];
  46548. + CloseAngle;[>];
  46549. + MarkupTextLiteral - [22..25)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46550. + Text;[Foo];
  46551. + MarkupTagBlock - [25..29)::4 - [</p>]
  46552. + MarkupTextLiteral - [25..29)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46553. + OpenAngle;[<];
  46554. + ForwardSlash;[/];
  46555. + Text;[p];
  46556. + CloseAngle;[>];
  46557. + MarkupTextLiteral - [29..31)::2 - [ }] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46558. + Whitespace;[ ];
  46559. + Text;[}];
  46560. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/SectionCorrectlyTerminatedWhenCloseBraceFollowsCodeBlockNoWhitespace.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/SectionCorrectlyTerminatedWhenCloseBraceFollowsCodeBlockNoWhitespace.stree.txt
  46561. index 4f36cca4c76..21ee945f254 100644
  46562. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/SectionCorrectlyTerminatedWhenCloseBraceFollowsCodeBlockNoWhitespace.stree.txt
  46563. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/SectionCorrectlyTerminatedWhenCloseBraceFollowsCodeBlockNoWhitespace.stree.txt
  46564. @@ -1,35 +1,39 @@
  46565. -Markup block - Gen<None> - 31 - (0:0,0)
  46566. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  46567. - SyntaxKind.Unknown;[];
  46568. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted}> - 31 - (0:0,0)
  46569. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  46570. - SyntaxKind.Transition;[@];
  46571. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  46572. - SyntaxKind.Identifier;[section];
  46573. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  46574. - SyntaxKind.Whitespace;[ ];
  46575. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [Foo] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  46576. - SyntaxKind.Identifier;[Foo];
  46577. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (12:0,12) - Tokens:1
  46578. - SyntaxKind.Whitespace;[ ];
  46579. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd - (13:0,13) - Tokens:1
  46580. - SyntaxKind.LeftBrace;[{];
  46581. - Markup block - Gen<None> - 16 - (14:0,14)
  46582. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  46583. - SyntaxKind.NewLine;[LF];
  46584. - Statement block - Gen<None> - 14 - (16:1,0)
  46585. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (16:1,0) - Tokens:1
  46586. - SyntaxKind.Transition;[@];
  46587. - Code span - Gen<Stmt> - [if(true) {LF}] - SpanEditHandler;Accepts:Any - (17:1,1) - Tokens:8
  46588. - SyntaxKind.Keyword;[if];
  46589. - SyntaxKind.LeftParenthesis;[(];
  46590. - SyntaxKind.Keyword;[true];
  46591. - SyntaxKind.RightParenthesis;[)];
  46592. - SyntaxKind.Whitespace;[ ];
  46593. - SyntaxKind.LeftBrace;[{];
  46594. - SyntaxKind.NewLine;[LF];
  46595. - SyntaxKind.RightBrace;[}];
  46596. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (30:2,1) - Tokens:1
  46597. - SyntaxKind.RightBrace;[}];
  46598. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (31:2,2) - Tokens:1
  46599. - SyntaxKind.Unknown;[];
  46600. +RazorDocument - [0..31)::31 - [@section Foo {LF@if(true) {LF}}]
  46601. + MarkupBlock - [0..31)::31
  46602. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46603. + Marker;[];
  46604. + CSharpCodeBlock - [0..31)::31
  46605. + RazorDirective - [0..31)::31 - Directive:{section;RazorBlock;Unrestricted}
  46606. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  46607. + Transition;[@];
  46608. + RazorDirectiveBody - [1..31)::30
  46609. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  46610. + Identifier;[section];
  46611. + CSharpCodeBlock - [8..31)::23
  46612. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  46613. + Whitespace;[ ];
  46614. + CSharpStatementLiteral - [9..12)::3 - [Foo] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  46615. + Identifier;[Foo];
  46616. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  46617. + Whitespace;[ ];
  46618. + RazorMetaCode - [13..14)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd
  46619. + LeftBrace;[{];
  46620. + MarkupBlock - [14..30)::16
  46621. + MarkupTextLiteral - [14..16)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46622. + NewLine;[LF];
  46623. + CSharpCodeBlock - [16..30)::14
  46624. + CSharpTransition - [16..17)::1 - Gen<None> - SpanEditHandler;Accepts:None
  46625. + Transition;[@];
  46626. + CSharpStatementLiteral - [17..30)::13 - [if(true) {LF}] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  46627. + Keyword;[if];
  46628. + LeftParenthesis;[(];
  46629. + Keyword;[true];
  46630. + RightParenthesis;[)];
  46631. + Whitespace;[ ];
  46632. + LeftBrace;[{];
  46633. + NewLine;[LF];
  46634. + RightBrace;[}];
  46635. + RazorMetaCode - [30..31)::1 - Gen<None> - SpanEditHandler;Accepts:None
  46636. + RightBrace;[}];
  46637. + MarkupTextLiteral - [31..31)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46638. + Marker;[];
  46639. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/SectionIsCorrectlyTerminatedWhenCloseBraceImmediatelyFollowsCodeBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/SectionIsCorrectlyTerminatedWhenCloseBraceImmediatelyFollowsCodeBlock.stree.txt
  46640. index d536400d5ff..5ceee908d23 100644
  46641. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/SectionIsCorrectlyTerminatedWhenCloseBraceImmediatelyFollowsCodeBlock.stree.txt
  46642. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/SectionIsCorrectlyTerminatedWhenCloseBraceImmediatelyFollowsCodeBlock.stree.txt
  46643. @@ -1,36 +1,40 @@
  46644. -Markup block - Gen<None> - 33 - (0:0,0)
  46645. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  46646. - SyntaxKind.Unknown;[];
  46647. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted}> - 33 - (0:0,0)
  46648. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  46649. - SyntaxKind.Transition;[@];
  46650. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  46651. - SyntaxKind.Identifier;[section];
  46652. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  46653. - SyntaxKind.Whitespace;[ ];
  46654. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [Foo] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  46655. - SyntaxKind.Identifier;[Foo];
  46656. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (12:0,12) - Tokens:1
  46657. - SyntaxKind.Whitespace;[ ];
  46658. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd - (13:0,13) - Tokens:1
  46659. - SyntaxKind.LeftBrace;[{];
  46660. - Markup block - Gen<None> - 18 - (14:0,14)
  46661. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  46662. - SyntaxKind.NewLine;[LF];
  46663. - Statement block - Gen<None> - 16 - (16:1,0)
  46664. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (16:1,0) - Tokens:1
  46665. - SyntaxKind.Transition;[@];
  46666. - Code span - Gen<Stmt> - [if(true) {LF}LF] - SpanEditHandler;Accepts:Any - (17:1,1) - Tokens:9
  46667. - SyntaxKind.Keyword;[if];
  46668. - SyntaxKind.LeftParenthesis;[(];
  46669. - SyntaxKind.Keyword;[true];
  46670. - SyntaxKind.RightParenthesis;[)];
  46671. - SyntaxKind.Whitespace;[ ];
  46672. - SyntaxKind.LeftBrace;[{];
  46673. - SyntaxKind.NewLine;[LF];
  46674. - SyntaxKind.RightBrace;[}];
  46675. - SyntaxKind.NewLine;[LF];
  46676. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (32:3,0) - Tokens:1
  46677. - SyntaxKind.RightBrace;[}];
  46678. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (33:3,1) - Tokens:1
  46679. - SyntaxKind.Unknown;[];
  46680. +RazorDocument - [0..33)::33 - [@section Foo {LF@if(true) {LF}LF}]
  46681. + MarkupBlock - [0..33)::33
  46682. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46683. + Marker;[];
  46684. + CSharpCodeBlock - [0..33)::33
  46685. + RazorDirective - [0..33)::33 - Directive:{section;RazorBlock;Unrestricted}
  46686. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  46687. + Transition;[@];
  46688. + RazorDirectiveBody - [1..33)::32
  46689. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  46690. + Identifier;[section];
  46691. + CSharpCodeBlock - [8..33)::25
  46692. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  46693. + Whitespace;[ ];
  46694. + CSharpStatementLiteral - [9..12)::3 - [Foo] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  46695. + Identifier;[Foo];
  46696. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  46697. + Whitespace;[ ];
  46698. + RazorMetaCode - [13..14)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd
  46699. + LeftBrace;[{];
  46700. + MarkupBlock - [14..32)::18
  46701. + MarkupTextLiteral - [14..16)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46702. + NewLine;[LF];
  46703. + CSharpCodeBlock - [16..32)::16
  46704. + CSharpTransition - [16..17)::1 - Gen<None> - SpanEditHandler;Accepts:None
  46705. + Transition;[@];
  46706. + CSharpStatementLiteral - [17..32)::15 - [if(true) {LF}LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  46707. + Keyword;[if];
  46708. + LeftParenthesis;[(];
  46709. + Keyword;[true];
  46710. + RightParenthesis;[)];
  46711. + Whitespace;[ ];
  46712. + LeftBrace;[{];
  46713. + NewLine;[LF];
  46714. + RightBrace;[}];
  46715. + NewLine;[LF];
  46716. + RazorMetaCode - [32..33)::1 - Gen<None> - SpanEditHandler;Accepts:None
  46717. + RightBrace;[}];
  46718. + MarkupTextLiteral - [33..33)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46719. + Marker;[];
  46720. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/_WithDoubleTransition1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/_WithDoubleTransition1.stree.txt
  46721. index df9f966f047..17e8f806f07 100644
  46722. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/_WithDoubleTransition1.stree.txt
  46723. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/_WithDoubleTransition1.stree.txt
  46724. @@ -1,42 +1,49 @@
  46725. -Markup block - Gen<None> - 30 - (0:0,0)
  46726. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  46727. - SyntaxKind.Unknown;[];
  46728. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted}> - 30 - (0:0,0)
  46729. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  46730. - SyntaxKind.Transition;[@];
  46731. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  46732. - SyntaxKind.Identifier;[section];
  46733. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  46734. - SyntaxKind.Whitespace;[ ];
  46735. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [s] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  46736. - SyntaxKind.Identifier;[s];
  46737. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (10:0,10) - Tokens:1
  46738. - SyntaxKind.Whitespace;[ ];
  46739. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd - (11:0,11) - Tokens:1
  46740. - SyntaxKind.LeftBrace;[{];
  46741. - Markup block - Gen<None> - 17 - (12:0,12)
  46742. - Tag block - Gen<None> - 17 - (12:0,12)
  46743. - Markup span - Gen<Markup> - [<span] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:2
  46744. - SyntaxKind.OpenAngle;[<];
  46745. - SyntaxKind.Text;[span];
  46746. - Markup block - Gen<Attr:foo, foo='@(17:0,17),'@(25:0,25)> - 9 - (17:0,17)
  46747. - Markup span - Gen<None> - [ foo='] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:4
  46748. - SyntaxKind.Whitespace;[ ];
  46749. - SyntaxKind.Text;[foo];
  46750. - SyntaxKind.Equals;[=];
  46751. - SyntaxKind.SingleQuote;['];
  46752. - Markup block - Gen<None> - 2 - (23:0,23)
  46753. - Markup span - Gen<LitAttr:@(23:0,23)> - [@] - SpanEditHandler;Accepts:None - (23:0,23) - Tokens:1
  46754. - SyntaxKind.Transition;[@];
  46755. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (24:0,24) - Tokens:1
  46756. - SyntaxKind.Transition;[@];
  46757. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:1
  46758. - SyntaxKind.SingleQuote;['];
  46759. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:Any - (26:0,26) - Tokens:3
  46760. - SyntaxKind.Whitespace;[ ];
  46761. - SyntaxKind.ForwardSlash;[/];
  46762. - SyntaxKind.CloseAngle;[>];
  46763. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (29:0,29) - Tokens:1
  46764. - SyntaxKind.RightBrace;[}];
  46765. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (30:0,30) - Tokens:1
  46766. - SyntaxKind.Unknown;[];
  46767. +RazorDocument - [0..30)::30 - [@section s {<span foo='@@' />}]
  46768. + MarkupBlock - [0..30)::30
  46769. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46770. + Marker;[];
  46771. + CSharpCodeBlock - [0..30)::30
  46772. + RazorDirective - [0..30)::30 - Directive:{section;RazorBlock;Unrestricted}
  46773. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  46774. + Transition;[@];
  46775. + RazorDirectiveBody - [1..30)::29
  46776. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  46777. + Identifier;[section];
  46778. + CSharpCodeBlock - [8..30)::22
  46779. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  46780. + Whitespace;[ ];
  46781. + CSharpStatementLiteral - [9..10)::1 - [s] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  46782. + Identifier;[s];
  46783. + MarkupTextLiteral - [10..11)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  46784. + Whitespace;[ ];
  46785. + RazorMetaCode - [11..12)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd
  46786. + LeftBrace;[{];
  46787. + MarkupBlock - [12..29)::17
  46788. + MarkupTagBlock - [12..29)::17 - [<span foo='@@' />]
  46789. + MarkupTextLiteral - [12..17)::5 - [<span] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46790. + OpenAngle;[<];
  46791. + Text;[span];
  46792. + MarkupAttributeBlock - [17..26)::9 - [ foo='@@']
  46793. + MarkupTextLiteral - [17..18)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46794. + Whitespace;[ ];
  46795. + MarkupTextLiteral - [18..21)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46796. + Text;[foo];
  46797. + Equals;[=];
  46798. + MarkupTextLiteral - [22..23)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  46799. + SingleQuote;['];
  46800. + GenericBlock - [23..25)::2
  46801. + MarkupBlock - [23..25)::2
  46802. + MarkupTextLiteral - [23..24)::1 - [@] - Gen<LitAttr:@(23:0,23)> - SpanEditHandler;Accepts:None
  46803. + Transition;[@];
  46804. + MarkupEphemeralTextLiteral - [24..25)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  46805. + Transition;[@];
  46806. + MarkupTextLiteral - [25..26)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  46807. + SingleQuote;['];
  46808. + MarkupTextLiteral - [26..29)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46809. + Whitespace;[ ];
  46810. + ForwardSlash;[/];
  46811. + CloseAngle;[>];
  46812. + RazorMetaCode - [29..30)::1 - Gen<None> - SpanEditHandler;Accepts:None
  46813. + RightBrace;[}];
  46814. + MarkupTextLiteral - [30..30)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46815. + Marker;[];
  46816. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/_WithDoubleTransition2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/_WithDoubleTransition2.stree.txt
  46817. index 32ae46f825c..da412d6aaf8 100644
  46818. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/_WithDoubleTransition2.stree.txt
  46819. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSectionTest/_WithDoubleTransition2.stree.txt
  46820. @@ -1,51 +1,62 @@
  46821. -Markup block - Gen<None> - 44 - (0:0,0)
  46822. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  46823. - SyntaxKind.Unknown;[];
  46824. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted}> - 44 - (0:0,0)
  46825. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  46826. - SyntaxKind.Transition;[@];
  46827. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  46828. - SyntaxKind.Identifier;[section];
  46829. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  46830. - SyntaxKind.Whitespace;[ ];
  46831. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [s] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  46832. - SyntaxKind.Identifier;[s];
  46833. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (10:0,10) - Tokens:1
  46834. - SyntaxKind.Whitespace;[ ];
  46835. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd - (11:0,11) - Tokens:1
  46836. - SyntaxKind.LeftBrace;[{];
  46837. - Markup block - Gen<None> - 31 - (12:0,12)
  46838. - Tag block - Gen<None> - 31 - (12:0,12)
  46839. - Markup span - Gen<Markup> - [<span] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:2
  46840. - SyntaxKind.OpenAngle;[<];
  46841. - SyntaxKind.Text;[span];
  46842. - Markup block - Gen<Attr:foo, foo='@(17:0,17),'@(39:0,39)> - 23 - (17:0,17)
  46843. - Markup span - Gen<None> - [ foo='] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:4
  46844. - SyntaxKind.Whitespace;[ ];
  46845. - SyntaxKind.Text;[foo];
  46846. - SyntaxKind.Equals;[=];
  46847. - SyntaxKind.SingleQuote;['];
  46848. - Markup block - Gen<DynAttr:@(23:0,23)> - 13 - (23:0,23)
  46849. - Expression block - Gen<Expr> - 13 - (23:0,23)
  46850. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (23:0,23) - Tokens:1
  46851. - SyntaxKind.Transition;[@];
  46852. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K15 - (24:0,24) - Tokens:3
  46853. - SyntaxKind.Identifier;[DateTime];
  46854. - SyntaxKind.Dot;[.];
  46855. - SyntaxKind.Identifier;[Now];
  46856. - Markup block - Gen<None> - 3 - (36:0,36)
  46857. - Markup span - Gen<LitAttr: @(36:0,36)> - [ @] - SpanEditHandler;Accepts:None - (36:0,36) - Tokens:2
  46858. - SyntaxKind.Whitespace;[ ];
  46859. - SyntaxKind.Transition;[@];
  46860. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (38:0,38) - Tokens:1
  46861. - SyntaxKind.Transition;[@];
  46862. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (39:0,39) - Tokens:1
  46863. - SyntaxKind.SingleQuote;['];
  46864. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:Any - (40:0,40) - Tokens:3
  46865. - SyntaxKind.Whitespace;[ ];
  46866. - SyntaxKind.ForwardSlash;[/];
  46867. - SyntaxKind.CloseAngle;[>];
  46868. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (43:0,43) - Tokens:1
  46869. - SyntaxKind.RightBrace;[}];
  46870. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (44:0,44) - Tokens:1
  46871. - SyntaxKind.Unknown;[];
  46872. +RazorDocument - [0..44)::44 - [@section s {<span foo='@DateTime.Now @@' />}]
  46873. + MarkupBlock - [0..44)::44
  46874. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46875. + Marker;[];
  46876. + CSharpCodeBlock - [0..44)::44
  46877. + RazorDirective - [0..44)::44 - Directive:{section;RazorBlock;Unrestricted}
  46878. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  46879. + Transition;[@];
  46880. + RazorDirectiveBody - [1..44)::43
  46881. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  46882. + Identifier;[section];
  46883. + CSharpCodeBlock - [8..44)::36
  46884. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  46885. + Whitespace;[ ];
  46886. + CSharpStatementLiteral - [9..10)::1 - [s] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  46887. + Identifier;[s];
  46888. + MarkupTextLiteral - [10..11)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  46889. + Whitespace;[ ];
  46890. + RazorMetaCode - [11..12)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd
  46891. + LeftBrace;[{];
  46892. + MarkupBlock - [12..43)::31
  46893. + MarkupTagBlock - [12..43)::31 - [<span foo='@DateTime.Now @@' />]
  46894. + MarkupTextLiteral - [12..17)::5 - [<span] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46895. + OpenAngle;[<];
  46896. + Text;[span];
  46897. + MarkupAttributeBlock - [17..40)::23 - [ foo='@DateTime.Now @@']
  46898. + MarkupTextLiteral - [17..18)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46899. + Whitespace;[ ];
  46900. + MarkupTextLiteral - [18..21)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46901. + Text;[foo];
  46902. + Equals;[=];
  46903. + MarkupTextLiteral - [22..23)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  46904. + SingleQuote;['];
  46905. + GenericBlock - [23..39)::16
  46906. + MarkupDynamicAttributeValue - [23..36)::13 - [@DateTime.Now]
  46907. + GenericBlock - [23..36)::13
  46908. + CSharpCodeBlock - [23..36)::13
  46909. + CSharpImplicitExpression - [23..36)::13
  46910. + CSharpTransition - [23..24)::1 - Gen<None> - SpanEditHandler;Accepts:None
  46911. + Transition;[@];
  46912. + CSharpImplicitExpressionBody - [24..36)::12
  46913. + CSharpCodeBlock - [24..36)::12
  46914. + CSharpExpressionLiteral - [24..36)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K15
  46915. + Identifier;[DateTime];
  46916. + Dot;[.];
  46917. + Identifier;[Now];
  46918. + MarkupBlock - [36..39)::3
  46919. + MarkupTextLiteral - [36..38)::2 - [ @] - Gen<LitAttr: @(36:0,36)> - SpanEditHandler;Accepts:None
  46920. + Whitespace;[ ];
  46921. + Transition;[@];
  46922. + MarkupEphemeralTextLiteral - [38..39)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  46923. + Transition;[@];
  46924. + MarkupTextLiteral - [39..40)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  46925. + SingleQuote;['];
  46926. + MarkupTextLiteral - [40..43)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46927. + Whitespace;[ ];
  46928. + ForwardSlash;[/];
  46929. + CloseAngle;[>];
  46930. + RazorMetaCode - [43..44)::1 - Gen<None> - SpanEditHandler;Accepts:None
  46931. + RightBrace;[}];
  46932. + MarkupTextLiteral - [44..44)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  46933. + Marker;[];
  46934. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/BalancesBracesOutsideStringsIfFirstCharIsBraceAndReturnsSpanOfTypeCode.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/BalancesBracesOutsideStringsIfFirstCharIsBraceAndReturnsSpanOfTypeCode.stree.txt
  46935. index ec75baf7a5c..78700a99c81 100644
  46936. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/BalancesBracesOutsideStringsIfFirstCharIsBraceAndReturnsSpanOfTypeCode.stree.txt
  46937. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/BalancesBracesOutsideStringsIfFirstCharIsBraceAndReturnsSpanOfTypeCode.stree.txt
  46938. @@ -1,26 +1,31 @@
  46939. -Statement block - Gen<None> - 52 - (0:0,0)
  46940. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  46941. - SyntaxKind.LeftBrace;[{];
  46942. - Code span - Gen<Stmt> - [foo"b}ar" if(condition) { string.Format("{0}"); } ] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:20
  46943. - SyntaxKind.Identifier;[foo];
  46944. - SyntaxKind.StringLiteral;["b}ar"];
  46945. - SyntaxKind.Whitespace;[ ];
  46946. - SyntaxKind.Keyword;[if];
  46947. - SyntaxKind.LeftParenthesis;[(];
  46948. - SyntaxKind.Identifier;[condition];
  46949. - SyntaxKind.RightParenthesis;[)];
  46950. - SyntaxKind.Whitespace;[ ];
  46951. - SyntaxKind.LeftBrace;[{];
  46952. - SyntaxKind.Whitespace;[ ];
  46953. - SyntaxKind.Keyword;[string];
  46954. - SyntaxKind.Dot;[.];
  46955. - SyntaxKind.Identifier;[Format];
  46956. - SyntaxKind.LeftParenthesis;[(];
  46957. - SyntaxKind.StringLiteral;["{0}"];
  46958. - SyntaxKind.RightParenthesis;[)];
  46959. - SyntaxKind.Semicolon;[;];
  46960. - SyntaxKind.Whitespace;[ ];
  46961. - SyntaxKind.RightBrace;[}];
  46962. - SyntaxKind.Whitespace;[ ];
  46963. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (51:0,51) - Tokens:1
  46964. - SyntaxKind.RightBrace;[}];
  46965. +CSharpCodeBlock - [0..52)::52 - [{foo"b}ar" if(condition) { string.Format("{0}"); } }]
  46966. + CSharpStatement - [0..52)::52
  46967. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  46968. + Transition;[<Missing>];
  46969. + CSharpStatementBody - [0..52)::52
  46970. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  46971. + LeftBrace;[{];
  46972. + CSharpCodeBlock - [1..51)::50
  46973. + CSharpStatementLiteral - [1..51)::50 - [foo"b}ar" if(condition) { string.Format("{0}"); } ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  46974. + Identifier;[foo];
  46975. + StringLiteral;["b}ar"];
  46976. + Whitespace;[ ];
  46977. + Keyword;[if];
  46978. + LeftParenthesis;[(];
  46979. + Identifier;[condition];
  46980. + RightParenthesis;[)];
  46981. + Whitespace;[ ];
  46982. + LeftBrace;[{];
  46983. + Whitespace;[ ];
  46984. + Keyword;[string];
  46985. + Dot;[.];
  46986. + Identifier;[Format];
  46987. + LeftParenthesis;[(];
  46988. + StringLiteral;["{0}"];
  46989. + RightParenthesis;[)];
  46990. + Semicolon;[;];
  46991. + Whitespace;[ ];
  46992. + RightBrace;[}];
  46993. + Whitespace;[ ];
  46994. + RazorMetaCode - [51..52)::1 - Gen<None> - SpanEditHandler;Accepts:None
  46995. + RightBrace;[}];
  46996. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/BalancesParensOutsideStringsIfFirstCharIsParenAndReturnsSpanOfTypeExpr.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/BalancesParensOutsideStringsIfFirstCharIsParenAndReturnsSpanOfTypeExpr.stree.txt
  46997. index 91c655daaa7..8da45d9d0be 100644
  46998. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/BalancesParensOutsideStringsIfFirstCharIsParenAndReturnsSpanOfTypeExpr.stree.txt
  46999. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/BalancesParensOutsideStringsIfFirstCharIsParenAndReturnsSpanOfTypeExpr.stree.txt
  47000. @@ -1,26 +1,31 @@
  47001. -Expression block - Gen<Expr> - 52 - (0:0,0)
  47002. - MetaCode span - Gen<None> - [(] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  47003. - SyntaxKind.LeftParenthesis;[(];
  47004. - Code span - Gen<Expr> - [foo"b)ar" if(condition) { string.Format("{0}"); } ] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:20
  47005. - SyntaxKind.Identifier;[foo];
  47006. - SyntaxKind.StringLiteral;["b)ar"];
  47007. - SyntaxKind.Whitespace;[ ];
  47008. - SyntaxKind.Keyword;[if];
  47009. - SyntaxKind.LeftParenthesis;[(];
  47010. - SyntaxKind.Identifier;[condition];
  47011. - SyntaxKind.RightParenthesis;[)];
  47012. - SyntaxKind.Whitespace;[ ];
  47013. - SyntaxKind.LeftBrace;[{];
  47014. - SyntaxKind.Whitespace;[ ];
  47015. - SyntaxKind.Keyword;[string];
  47016. - SyntaxKind.Dot;[.];
  47017. - SyntaxKind.Identifier;[Format];
  47018. - SyntaxKind.LeftParenthesis;[(];
  47019. - SyntaxKind.StringLiteral;["{0}"];
  47020. - SyntaxKind.RightParenthesis;[)];
  47021. - SyntaxKind.Semicolon;[;];
  47022. - SyntaxKind.Whitespace;[ ];
  47023. - SyntaxKind.RightBrace;[}];
  47024. - SyntaxKind.Whitespace;[ ];
  47025. - MetaCode span - Gen<None> - [)] - SpanEditHandler;Accepts:None - (51:0,51) - Tokens:1
  47026. - SyntaxKind.RightParenthesis;[)];
  47027. +CSharpCodeBlock - [0..52)::52 - [(foo"b)ar" if(condition) { string.Format("{0}"); } )]
  47028. + CSharpExplicitExpression - [0..52)::52
  47029. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  47030. + Transition;[<Missing>];
  47031. + CSharpExplicitExpressionBody - [0..52)::52
  47032. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  47033. + LeftParenthesis;[(];
  47034. + CSharpCodeBlock - [1..51)::50
  47035. + CSharpExpressionLiteral - [1..51)::50 - [foo"b)ar" if(condition) { string.Format("{0}"); } ] - Gen<Expr> - SpanEditHandler;Accepts:Any
  47036. + Identifier;[foo];
  47037. + StringLiteral;["b)ar"];
  47038. + Whitespace;[ ];
  47039. + Keyword;[if];
  47040. + LeftParenthesis;[(];
  47041. + Identifier;[condition];
  47042. + RightParenthesis;[)];
  47043. + Whitespace;[ ];
  47044. + LeftBrace;[{];
  47045. + Whitespace;[ ];
  47046. + Keyword;[string];
  47047. + Dot;[.];
  47048. + Identifier;[Format];
  47049. + LeftParenthesis;[(];
  47050. + StringLiteral;["{0}"];
  47051. + RightParenthesis;[)];
  47052. + Semicolon;[;];
  47053. + Whitespace;[ ];
  47054. + RightBrace;[}];
  47055. + Whitespace;[ ];
  47056. + RazorMetaCode - [51..52)::1 - Gen<None> - SpanEditHandler;Accepts:None
  47057. + RightParenthesis;[)];
  47058. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/NamespaceImportInsideCodeBlockCausesError.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/NamespaceImportInsideCodeBlockCausesError.stree.txt
  47059. index 7c4b8764f24..444e68553f6 100644
  47060. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/NamespaceImportInsideCodeBlockCausesError.stree.txt
  47061. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/NamespaceImportInsideCodeBlockCausesError.stree.txt
  47062. @@ -1,25 +1,30 @@
  47063. -Statement block - Gen<None> - 37 - (0:0,0)
  47064. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  47065. - SyntaxKind.LeftBrace;[{];
  47066. - Code span - Gen<Stmt> - [ using Foo.Bar.Baz; var foo = bar; ] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:19
  47067. - SyntaxKind.Whitespace;[ ];
  47068. - SyntaxKind.Keyword;[using];
  47069. - SyntaxKind.Whitespace;[ ];
  47070. - SyntaxKind.Identifier;[Foo];
  47071. - SyntaxKind.Dot;[.];
  47072. - SyntaxKind.Identifier;[Bar];
  47073. - SyntaxKind.Dot;[.];
  47074. - SyntaxKind.Identifier;[Baz];
  47075. - SyntaxKind.Semicolon;[;];
  47076. - SyntaxKind.Whitespace;[ ];
  47077. - SyntaxKind.Identifier;[var];
  47078. - SyntaxKind.Whitespace;[ ];
  47079. - SyntaxKind.Identifier;[foo];
  47080. - SyntaxKind.Whitespace;[ ];
  47081. - SyntaxKind.Assign;[=];
  47082. - SyntaxKind.Whitespace;[ ];
  47083. - SyntaxKind.Identifier;[bar];
  47084. - SyntaxKind.Semicolon;[;];
  47085. - SyntaxKind.Whitespace;[ ];
  47086. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (36:0,36) - Tokens:1
  47087. - SyntaxKind.RightBrace;[}];
  47088. +CSharpCodeBlock - [0..37)::37 - [{ using Foo.Bar.Baz; var foo = bar; }]
  47089. + CSharpStatement - [0..37)::37
  47090. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  47091. + Transition;[<Missing>];
  47092. + CSharpStatementBody - [0..37)::37
  47093. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  47094. + LeftBrace;[{];
  47095. + CSharpCodeBlock - [1..36)::35
  47096. + CSharpStatementLiteral - [1..36)::35 - [ using Foo.Bar.Baz; var foo = bar; ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  47097. + Whitespace;[ ];
  47098. + Keyword;[using];
  47099. + Whitespace;[ ];
  47100. + Identifier;[Foo];
  47101. + Dot;[.];
  47102. + Identifier;[Bar];
  47103. + Dot;[.];
  47104. + Identifier;[Baz];
  47105. + Semicolon;[;];
  47106. + Whitespace;[ ];
  47107. + Identifier;[var];
  47108. + Whitespace;[ ];
  47109. + Identifier;[foo];
  47110. + Whitespace;[ ];
  47111. + Assign;[=];
  47112. + Whitespace;[ ];
  47113. + Identifier;[bar];
  47114. + Semicolon;[;];
  47115. + Whitespace;[ ];
  47116. + RazorMetaCode - [36..37)::1 - Gen<None> - SpanEditHandler;Accepts:None
  47117. + RightBrace;[}];
  47118. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/NonKeywordStatementInCodeBlockIsHandledCorrectly.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/NonKeywordStatementInCodeBlockIsHandledCorrectly.stree.txt
  47119. index d11ffc889a9..2d82057e40e 100644
  47120. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/NonKeywordStatementInCodeBlockIsHandledCorrectly.stree.txt
  47121. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/NonKeywordStatementInCodeBlockIsHandledCorrectly.stree.txt
  47122. @@ -1,26 +1,31 @@
  47123. -Statement block - Gen<None> - 56 - (0:0,0)
  47124. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  47125. - SyntaxKind.LeftBrace;[{];
  47126. - Code span - Gen<Stmt> - [LF List<dynamic> photos = gallery.Photo.ToList();LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:20
  47127. - SyntaxKind.NewLine;[LF];
  47128. - SyntaxKind.Whitespace;[ ];
  47129. - SyntaxKind.Identifier;[List];
  47130. - SyntaxKind.LessThan;[<];
  47131. - SyntaxKind.Identifier;[dynamic];
  47132. - SyntaxKind.GreaterThan;[>];
  47133. - SyntaxKind.Whitespace;[ ];
  47134. - SyntaxKind.Identifier;[photos];
  47135. - SyntaxKind.Whitespace;[ ];
  47136. - SyntaxKind.Assign;[=];
  47137. - SyntaxKind.Whitespace;[ ];
  47138. - SyntaxKind.Identifier;[gallery];
  47139. - SyntaxKind.Dot;[.];
  47140. - SyntaxKind.Identifier;[Photo];
  47141. - SyntaxKind.Dot;[.];
  47142. - SyntaxKind.Identifier;[ToList];
  47143. - SyntaxKind.LeftParenthesis;[(];
  47144. - SyntaxKind.RightParenthesis;[)];
  47145. - SyntaxKind.Semicolon;[;];
  47146. - SyntaxKind.NewLine;[LF];
  47147. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (55:2,0) - Tokens:1
  47148. - SyntaxKind.RightBrace;[}];
  47149. +CSharpCodeBlock - [0..56)::56 - [{LF List<dynamic> photos = gallery.Photo.ToList();LF}]
  47150. + CSharpStatement - [0..56)::56
  47151. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  47152. + Transition;[<Missing>];
  47153. + CSharpStatementBody - [0..56)::56
  47154. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  47155. + LeftBrace;[{];
  47156. + CSharpCodeBlock - [1..55)::54
  47157. + CSharpStatementLiteral - [1..55)::54 - [LF List<dynamic> photos = gallery.Photo.ToList();LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  47158. + NewLine;[LF];
  47159. + Whitespace;[ ];
  47160. + Identifier;[List];
  47161. + LessThan;[<];
  47162. + Identifier;[dynamic];
  47163. + GreaterThan;[>];
  47164. + Whitespace;[ ];
  47165. + Identifier;[photos];
  47166. + Whitespace;[ ];
  47167. + Assign;[=];
  47168. + Whitespace;[ ];
  47169. + Identifier;[gallery];
  47170. + Dot;[.];
  47171. + Identifier;[Photo];
  47172. + Dot;[.];
  47173. + Identifier;[ToList];
  47174. + LeftParenthesis;[(];
  47175. + RightParenthesis;[)];
  47176. + Semicolon;[;];
  47177. + NewLine;[LF];
  47178. + RazorMetaCode - [55..56)::1 - Gen<None> - SpanEditHandler;Accepts:None
  47179. + RightBrace;[}];
  47180. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/ParseBlockIgnoresSingleSlashAtStart.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/ParseBlockIgnoresSingleSlashAtStart.stree.txt
  47181. index 40da231bf0f..ba1a0451b32 100644
  47182. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/ParseBlockIgnoresSingleSlashAtStart.stree.txt
  47183. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/ParseBlockIgnoresSingleSlashAtStart.stree.txt
  47184. @@ -1,5 +1,8 @@
  47185. -Expression block - Gen<Expr> - 1 - (0:0,0)
  47186. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  47187. - SyntaxKind.Transition;[@];
  47188. - Code span - Gen<Expr> - [] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:1
  47189. - SyntaxKind.Unknown;[];
  47190. +CSharpCodeBlock - [0..1)::1 - [@]
  47191. + CSharpImplicitExpression - [0..1)::1
  47192. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  47193. + Transition;[@];
  47194. + CSharpImplicitExpressionBody - [1..1)::0
  47195. + CSharpCodeBlock - [1..1)::0
  47196. + CSharpExpressionLiteral - [1..1)::0 - [] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  47197. + Marker;[];
  47198. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/ParseBlockTerminatesSingleLineCommentAtEndOfLine.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/ParseBlockTerminatesSingleLineCommentAtEndOfLine.stree.txt
  47199. index 82895580508..ffb5683f61a 100644
  47200. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/ParseBlockTerminatesSingleLineCommentAtEndOfLine.stree.txt
  47201. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/ParseBlockTerminatesSingleLineCommentAtEndOfLine.stree.txt
  47202. @@ -1,38 +1,40 @@
  47203. -Statement block - Gen<None> - 48 - (0:0,0)
  47204. - Code span - Gen<Stmt> - [if(!false) {LF // FooLF] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:11
  47205. - SyntaxKind.Keyword;[if];
  47206. - SyntaxKind.LeftParenthesis;[(];
  47207. - SyntaxKind.Not;[!];
  47208. - SyntaxKind.Keyword;[false];
  47209. - SyntaxKind.RightParenthesis;[)];
  47210. - SyntaxKind.Whitespace;[ ];
  47211. - SyntaxKind.LeftBrace;[{];
  47212. - SyntaxKind.NewLine;[LF];
  47213. - SyntaxKind.Whitespace;[ ];
  47214. - SyntaxKind.CSharpComment;[// Foo];
  47215. - SyntaxKind.NewLine;[LF];
  47216. - Markup block - Gen<None> - 21 - (26:2,0)
  47217. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (26:2,0) - Tokens:1
  47218. - SyntaxKind.Whitespace;[ ];
  47219. - Tag block - Gen<None> - 3 - (27:2,1)
  47220. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (27:2,1) - Tokens:3
  47221. - SyntaxKind.OpenAngle;[<];
  47222. - SyntaxKind.Text;[p];
  47223. - SyntaxKind.CloseAngle;[>];
  47224. - Markup span - Gen<Markup> - [A real tag!] - SpanEditHandler;Accepts:Any - (30:2,4) - Tokens:6
  47225. - SyntaxKind.Text;[A];
  47226. - SyntaxKind.Whitespace;[ ];
  47227. - SyntaxKind.Text;[real];
  47228. - SyntaxKind.Whitespace;[ ];
  47229. - SyntaxKind.Text;[tag];
  47230. - SyntaxKind.Bang;[!];
  47231. - Tag block - Gen<None> - 4 - (41:2,15)
  47232. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (41:2,15) - Tokens:4
  47233. - SyntaxKind.OpenAngle;[<];
  47234. - SyntaxKind.ForwardSlash;[/];
  47235. - SyntaxKind.Text;[p];
  47236. - SyntaxKind.CloseAngle;[>];
  47237. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (45:2,19) - Tokens:1
  47238. - SyntaxKind.NewLine;[LF];
  47239. - Code span - Gen<Stmt> - [}] - SpanEditHandler;Accepts:Any - (47:3,0) - Tokens:1
  47240. - SyntaxKind.RightBrace;[}];
  47241. +CSharpCodeBlock - [0..48)::48 - [if(!false) {LF // FooLF <p>A real tag!</p>LF}]
  47242. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  47243. + Transition;[<Missing>];
  47244. + CSharpStatementLiteral - [0..26)::26 - [if(!false) {LF // FooLF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  47245. + Keyword;[if];
  47246. + LeftParenthesis;[(];
  47247. + Not;[!];
  47248. + Keyword;[false];
  47249. + RightParenthesis;[)];
  47250. + Whitespace;[ ];
  47251. + LeftBrace;[{];
  47252. + NewLine;[LF];
  47253. + Whitespace;[ ];
  47254. + CSharpComment;[// Foo];
  47255. + NewLine;[LF];
  47256. + MarkupBlock - [26..47)::21
  47257. + MarkupTextLiteral - [26..27)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  47258. + Whitespace;[ ];
  47259. + MarkupTagBlock - [27..30)::3 - [<p>]
  47260. + MarkupTextLiteral - [27..30)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  47261. + OpenAngle;[<];
  47262. + Text;[p];
  47263. + CloseAngle;[>];
  47264. + MarkupTextLiteral - [30..41)::11 - [A real tag!] - Gen<Markup> - SpanEditHandler;Accepts:Any
  47265. + Text;[A];
  47266. + Whitespace;[ ];
  47267. + Text;[real];
  47268. + Whitespace;[ ];
  47269. + Text;[tag];
  47270. + Bang;[!];
  47271. + MarkupTagBlock - [41..45)::4 - [</p>]
  47272. + MarkupTextLiteral - [41..45)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  47273. + OpenAngle;[<];
  47274. + ForwardSlash;[/];
  47275. + Text;[p];
  47276. + CloseAngle;[>];
  47277. + MarkupTextLiteral - [45..47)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  47278. + NewLine;[LF];
  47279. + CSharpStatementLiteral - [47..48)::1 - [}] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  47280. + RightBrace;[}];
  47281. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/TypeAliasInsideCodeBlockIsNotHandledSpecially.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/TypeAliasInsideCodeBlockIsNotHandledSpecially.stree.txt
  47282. index 566c40d08d3..a4f2cecf5d7 100644
  47283. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/TypeAliasInsideCodeBlockIsNotHandledSpecially.stree.txt
  47284. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpSpecialBlockTest/TypeAliasInsideCodeBlockIsNotHandledSpecially.stree.txt
  47285. @@ -1,27 +1,32 @@
  47286. -Statement block - Gen<None> - 39 - (0:0,0)
  47287. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  47288. - SyntaxKind.LeftBrace;[{];
  47289. - Code span - Gen<Stmt> - [ using Foo = Bar.Baz; var foo = bar; ] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:21
  47290. - SyntaxKind.Whitespace;[ ];
  47291. - SyntaxKind.Keyword;[using];
  47292. - SyntaxKind.Whitespace;[ ];
  47293. - SyntaxKind.Identifier;[Foo];
  47294. - SyntaxKind.Whitespace;[ ];
  47295. - SyntaxKind.Assign;[=];
  47296. - SyntaxKind.Whitespace;[ ];
  47297. - SyntaxKind.Identifier;[Bar];
  47298. - SyntaxKind.Dot;[.];
  47299. - SyntaxKind.Identifier;[Baz];
  47300. - SyntaxKind.Semicolon;[;];
  47301. - SyntaxKind.Whitespace;[ ];
  47302. - SyntaxKind.Identifier;[var];
  47303. - SyntaxKind.Whitespace;[ ];
  47304. - SyntaxKind.Identifier;[foo];
  47305. - SyntaxKind.Whitespace;[ ];
  47306. - SyntaxKind.Assign;[=];
  47307. - SyntaxKind.Whitespace;[ ];
  47308. - SyntaxKind.Identifier;[bar];
  47309. - SyntaxKind.Semicolon;[;];
  47310. - SyntaxKind.Whitespace;[ ];
  47311. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (38:0,38) - Tokens:1
  47312. - SyntaxKind.RightBrace;[}];
  47313. +CSharpCodeBlock - [0..39)::39 - [{ using Foo = Bar.Baz; var foo = bar; }]
  47314. + CSharpStatement - [0..39)::39
  47315. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  47316. + Transition;[<Missing>];
  47317. + CSharpStatementBody - [0..39)::39
  47318. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  47319. + LeftBrace;[{];
  47320. + CSharpCodeBlock - [1..38)::37
  47321. + CSharpStatementLiteral - [1..38)::37 - [ using Foo = Bar.Baz; var foo = bar; ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  47322. + Whitespace;[ ];
  47323. + Keyword;[using];
  47324. + Whitespace;[ ];
  47325. + Identifier;[Foo];
  47326. + Whitespace;[ ];
  47327. + Assign;[=];
  47328. + Whitespace;[ ];
  47329. + Identifier;[Bar];
  47330. + Dot;[.];
  47331. + Identifier;[Baz];
  47332. + Semicolon;[;];
  47333. + Whitespace;[ ];
  47334. + Identifier;[var];
  47335. + Whitespace;[ ];
  47336. + Identifier;[foo];
  47337. + Whitespace;[ ];
  47338. + Assign;[=];
  47339. + Whitespace;[ ];
  47340. + Identifier;[bar];
  47341. + Semicolon;[;];
  47342. + Whitespace;[ ];
  47343. + RazorMetaCode - [38..39)::1 - Gen<None> - SpanEditHandler;Accepts:None
  47344. + RightBrace;[}];
  47345. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/CatchClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/CatchClause.stree.txt
  47346. index bd9e33585e7..0083bef987f 100644
  47347. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/CatchClause.stree.txt
  47348. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/CatchClause.stree.txt
  47349. @@ -1,46 +1,46 @@
  47350. -Statement block - Gen<None> - 94 - (0:0,0)
  47351. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  47352. - SyntaxKind.Transition;[@];
  47353. - Code span - Gen<Stmt> - [try { foo(); } catch(IOException ioex) { handleIO(); } catch(Exception ex) { handleOther(); }] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:42
  47354. - SyntaxKind.Keyword;[try];
  47355. - SyntaxKind.Whitespace;[ ];
  47356. - SyntaxKind.LeftBrace;[{];
  47357. - SyntaxKind.Whitespace;[ ];
  47358. - SyntaxKind.Identifier;[foo];
  47359. - SyntaxKind.LeftParenthesis;[(];
  47360. - SyntaxKind.RightParenthesis;[)];
  47361. - SyntaxKind.Semicolon;[;];
  47362. - SyntaxKind.Whitespace;[ ];
  47363. - SyntaxKind.RightBrace;[}];
  47364. - SyntaxKind.Whitespace;[ ];
  47365. - SyntaxKind.Keyword;[catch];
  47366. - SyntaxKind.LeftParenthesis;[(];
  47367. - SyntaxKind.Identifier;[IOException];
  47368. - SyntaxKind.Whitespace;[ ];
  47369. - SyntaxKind.Identifier;[ioex];
  47370. - SyntaxKind.RightParenthesis;[)];
  47371. - SyntaxKind.Whitespace;[ ];
  47372. - SyntaxKind.LeftBrace;[{];
  47373. - SyntaxKind.Whitespace;[ ];
  47374. - SyntaxKind.Identifier;[handleIO];
  47375. - SyntaxKind.LeftParenthesis;[(];
  47376. - SyntaxKind.RightParenthesis;[)];
  47377. - SyntaxKind.Semicolon;[;];
  47378. - SyntaxKind.Whitespace;[ ];
  47379. - SyntaxKind.RightBrace;[}];
  47380. - SyntaxKind.Whitespace;[ ];
  47381. - SyntaxKind.Keyword;[catch];
  47382. - SyntaxKind.LeftParenthesis;[(];
  47383. - SyntaxKind.Identifier;[Exception];
  47384. - SyntaxKind.Whitespace;[ ];
  47385. - SyntaxKind.Identifier;[ex];
  47386. - SyntaxKind.RightParenthesis;[)];
  47387. - SyntaxKind.Whitespace;[ ];
  47388. - SyntaxKind.LeftBrace;[{];
  47389. - SyntaxKind.Whitespace;[ ];
  47390. - SyntaxKind.Identifier;[handleOther];
  47391. - SyntaxKind.LeftParenthesis;[(];
  47392. - SyntaxKind.RightParenthesis;[)];
  47393. - SyntaxKind.Semicolon;[;];
  47394. - SyntaxKind.Whitespace;[ ];
  47395. - SyntaxKind.RightBrace;[}];
  47396. +CSharpCodeBlock - [0..94)::94 - [@try { foo(); } catch(IOException ioex) { handleIO(); } catch(Exception ex) { handleOther(); }]
  47397. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  47398. + Transition;[@];
  47399. + CSharpStatementLiteral - [1..94)::93 - [try { foo(); } catch(IOException ioex) { handleIO(); } catch(Exception ex) { handleOther(); }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  47400. + Keyword;[try];
  47401. + Whitespace;[ ];
  47402. + LeftBrace;[{];
  47403. + Whitespace;[ ];
  47404. + Identifier;[foo];
  47405. + LeftParenthesis;[(];
  47406. + RightParenthesis;[)];
  47407. + Semicolon;[;];
  47408. + Whitespace;[ ];
  47409. + RightBrace;[}];
  47410. + Whitespace;[ ];
  47411. + Keyword;[catch];
  47412. + LeftParenthesis;[(];
  47413. + Identifier;[IOException];
  47414. + Whitespace;[ ];
  47415. + Identifier;[ioex];
  47416. + RightParenthesis;[)];
  47417. + Whitespace;[ ];
  47418. + LeftBrace;[{];
  47419. + Whitespace;[ ];
  47420. + Identifier;[handleIO];
  47421. + LeftParenthesis;[(];
  47422. + RightParenthesis;[)];
  47423. + Semicolon;[;];
  47424. + Whitespace;[ ];
  47425. + RightBrace;[}];
  47426. + Whitespace;[ ];
  47427. + Keyword;[catch];
  47428. + LeftParenthesis;[(];
  47429. + Identifier;[Exception];
  47430. + Whitespace;[ ];
  47431. + Identifier;[ex];
  47432. + RightParenthesis;[)];
  47433. + Whitespace;[ ];
  47434. + LeftBrace;[{];
  47435. + Whitespace;[ ];
  47436. + Identifier;[handleOther];
  47437. + LeftParenthesis;[(];
  47438. + RightParenthesis;[)];
  47439. + Semicolon;[;];
  47440. + Whitespace;[ ];
  47441. + RightBrace;[}];
  47442. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/DoStatement.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/DoStatement.stree.txt
  47443. index 864f9a5c116..b0cc1c3e561 100644
  47444. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/DoStatement.stree.txt
  47445. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/DoStatement.stree.txt
  47446. @@ -1,20 +1,20 @@
  47447. -Statement block - Gen<None> - 27 - (0:0,0)
  47448. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  47449. - SyntaxKind.Transition;[@];
  47450. - Code span - Gen<Stmt> - [do { foo(); } while(true);] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:16
  47451. - SyntaxKind.Keyword;[do];
  47452. - SyntaxKind.Whitespace;[ ];
  47453. - SyntaxKind.LeftBrace;[{];
  47454. - SyntaxKind.Whitespace;[ ];
  47455. - SyntaxKind.Identifier;[foo];
  47456. - SyntaxKind.LeftParenthesis;[(];
  47457. - SyntaxKind.RightParenthesis;[)];
  47458. - SyntaxKind.Semicolon;[;];
  47459. - SyntaxKind.Whitespace;[ ];
  47460. - SyntaxKind.RightBrace;[}];
  47461. - SyntaxKind.Whitespace;[ ];
  47462. - SyntaxKind.Keyword;[while];
  47463. - SyntaxKind.LeftParenthesis;[(];
  47464. - SyntaxKind.Keyword;[true];
  47465. - SyntaxKind.RightParenthesis;[)];
  47466. - SyntaxKind.Semicolon;[;];
  47467. +CSharpCodeBlock - [0..27)::27 - [@do { foo(); } while(true);]
  47468. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  47469. + Transition;[@];
  47470. + CSharpStatementLiteral - [1..27)::26 - [do { foo(); } while(true);] - Gen<Stmt> - SpanEditHandler;Accepts:None
  47471. + Keyword;[do];
  47472. + Whitespace;[ ];
  47473. + LeftBrace;[{];
  47474. + Whitespace;[ ];
  47475. + Identifier;[foo];
  47476. + LeftParenthesis;[(];
  47477. + RightParenthesis;[)];
  47478. + Semicolon;[;];
  47479. + Whitespace;[ ];
  47480. + RightBrace;[}];
  47481. + Whitespace;[ ];
  47482. + Keyword;[while];
  47483. + LeftParenthesis;[(];
  47484. + Keyword;[true];
  47485. + RightParenthesis;[)];
  47486. + Semicolon;[;];
  47487. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ElseClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ElseClause.stree.txt
  47488. index 9e2f4273e00..e59ccec394c 100644
  47489. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ElseClause.stree.txt
  47490. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ElseClause.stree.txt
  47491. @@ -1,28 +1,28 @@
  47492. -Statement block - Gen<None> - 36 - (0:0,0)
  47493. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  47494. - SyntaxKind.Transition;[@];
  47495. - Code span - Gen<Stmt> - [if(true) { foo(); } else { foo(); }] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:24
  47496. - SyntaxKind.Keyword;[if];
  47497. - SyntaxKind.LeftParenthesis;[(];
  47498. - SyntaxKind.Keyword;[true];
  47499. - SyntaxKind.RightParenthesis;[)];
  47500. - SyntaxKind.Whitespace;[ ];
  47501. - SyntaxKind.LeftBrace;[{];
  47502. - SyntaxKind.Whitespace;[ ];
  47503. - SyntaxKind.Identifier;[foo];
  47504. - SyntaxKind.LeftParenthesis;[(];
  47505. - SyntaxKind.RightParenthesis;[)];
  47506. - SyntaxKind.Semicolon;[;];
  47507. - SyntaxKind.Whitespace;[ ];
  47508. - SyntaxKind.RightBrace;[}];
  47509. - SyntaxKind.Whitespace;[ ];
  47510. - SyntaxKind.Keyword;[else];
  47511. - SyntaxKind.Whitespace;[ ];
  47512. - SyntaxKind.LeftBrace;[{];
  47513. - SyntaxKind.Whitespace;[ ];
  47514. - SyntaxKind.Identifier;[foo];
  47515. - SyntaxKind.LeftParenthesis;[(];
  47516. - SyntaxKind.RightParenthesis;[)];
  47517. - SyntaxKind.Semicolon;[;];
  47518. - SyntaxKind.Whitespace;[ ];
  47519. - SyntaxKind.RightBrace;[}];
  47520. +CSharpCodeBlock - [0..36)::36 - [@if(true) { foo(); } else { foo(); }]
  47521. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  47522. + Transition;[@];
  47523. + CSharpStatementLiteral - [1..36)::35 - [if(true) { foo(); } else { foo(); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  47524. + Keyword;[if];
  47525. + LeftParenthesis;[(];
  47526. + Keyword;[true];
  47527. + RightParenthesis;[)];
  47528. + Whitespace;[ ];
  47529. + LeftBrace;[{];
  47530. + Whitespace;[ ];
  47531. + Identifier;[foo];
  47532. + LeftParenthesis;[(];
  47533. + RightParenthesis;[)];
  47534. + Semicolon;[;];
  47535. + Whitespace;[ ];
  47536. + RightBrace;[}];
  47537. + Whitespace;[ ];
  47538. + Keyword;[else];
  47539. + Whitespace;[ ];
  47540. + LeftBrace;[{];
  47541. + Whitespace;[ ];
  47542. + Identifier;[foo];
  47543. + LeftParenthesis;[(];
  47544. + RightParenthesis;[)];
  47545. + Semicolon;[;];
  47546. + Whitespace;[ ];
  47547. + RightBrace;[}];
  47548. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ElseIfClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ElseIfClause.stree.txt
  47549. index 736d35fc5d9..ffbd6b3e2b8 100644
  47550. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ElseIfClause.stree.txt
  47551. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ElseIfClause.stree.txt
  47552. @@ -1,50 +1,50 @@
  47553. -Statement block - Gen<None> - 73 - (0:0,0)
  47554. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  47555. - SyntaxKind.Transition;[@];
  47556. - Code span - Gen<Stmt> - [if(true) { foo(); } else if(false) { foo(); } else if(!false) { foo(); }] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:46
  47557. - SyntaxKind.Keyword;[if];
  47558. - SyntaxKind.LeftParenthesis;[(];
  47559. - SyntaxKind.Keyword;[true];
  47560. - SyntaxKind.RightParenthesis;[)];
  47561. - SyntaxKind.Whitespace;[ ];
  47562. - SyntaxKind.LeftBrace;[{];
  47563. - SyntaxKind.Whitespace;[ ];
  47564. - SyntaxKind.Identifier;[foo];
  47565. - SyntaxKind.LeftParenthesis;[(];
  47566. - SyntaxKind.RightParenthesis;[)];
  47567. - SyntaxKind.Semicolon;[;];
  47568. - SyntaxKind.Whitespace;[ ];
  47569. - SyntaxKind.RightBrace;[}];
  47570. - SyntaxKind.Whitespace;[ ];
  47571. - SyntaxKind.Keyword;[else];
  47572. - SyntaxKind.Whitespace;[ ];
  47573. - SyntaxKind.Keyword;[if];
  47574. - SyntaxKind.LeftParenthesis;[(];
  47575. - SyntaxKind.Keyword;[false];
  47576. - SyntaxKind.RightParenthesis;[)];
  47577. - SyntaxKind.Whitespace;[ ];
  47578. - SyntaxKind.LeftBrace;[{];
  47579. - SyntaxKind.Whitespace;[ ];
  47580. - SyntaxKind.Identifier;[foo];
  47581. - SyntaxKind.LeftParenthesis;[(];
  47582. - SyntaxKind.RightParenthesis;[)];
  47583. - SyntaxKind.Semicolon;[;];
  47584. - SyntaxKind.Whitespace;[ ];
  47585. - SyntaxKind.RightBrace;[}];
  47586. - SyntaxKind.Whitespace;[ ];
  47587. - SyntaxKind.Keyword;[else];
  47588. - SyntaxKind.Whitespace;[ ];
  47589. - SyntaxKind.Keyword;[if];
  47590. - SyntaxKind.LeftParenthesis;[(];
  47591. - SyntaxKind.Not;[!];
  47592. - SyntaxKind.Keyword;[false];
  47593. - SyntaxKind.RightParenthesis;[)];
  47594. - SyntaxKind.Whitespace;[ ];
  47595. - SyntaxKind.LeftBrace;[{];
  47596. - SyntaxKind.Whitespace;[ ];
  47597. - SyntaxKind.Identifier;[foo];
  47598. - SyntaxKind.LeftParenthesis;[(];
  47599. - SyntaxKind.RightParenthesis;[)];
  47600. - SyntaxKind.Semicolon;[;];
  47601. - SyntaxKind.Whitespace;[ ];
  47602. - SyntaxKind.RightBrace;[}];
  47603. +CSharpCodeBlock - [0..73)::73 - [@if(true) { foo(); } else if(false) { foo(); } else if(!false) { foo(); }]
  47604. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  47605. + Transition;[@];
  47606. + CSharpStatementLiteral - [1..73)::72 - [if(true) { foo(); } else if(false) { foo(); } else if(!false) { foo(); }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  47607. + Keyword;[if];
  47608. + LeftParenthesis;[(];
  47609. + Keyword;[true];
  47610. + RightParenthesis;[)];
  47611. + Whitespace;[ ];
  47612. + LeftBrace;[{];
  47613. + Whitespace;[ ];
  47614. + Identifier;[foo];
  47615. + LeftParenthesis;[(];
  47616. + RightParenthesis;[)];
  47617. + Semicolon;[;];
  47618. + Whitespace;[ ];
  47619. + RightBrace;[}];
  47620. + Whitespace;[ ];
  47621. + Keyword;[else];
  47622. + Whitespace;[ ];
  47623. + Keyword;[if];
  47624. + LeftParenthesis;[(];
  47625. + Keyword;[false];
  47626. + RightParenthesis;[)];
  47627. + Whitespace;[ ];
  47628. + LeftBrace;[{];
  47629. + Whitespace;[ ];
  47630. + Identifier;[foo];
  47631. + LeftParenthesis;[(];
  47632. + RightParenthesis;[)];
  47633. + Semicolon;[;];
  47634. + Whitespace;[ ];
  47635. + RightBrace;[}];
  47636. + Whitespace;[ ];
  47637. + Keyword;[else];
  47638. + Whitespace;[ ];
  47639. + Keyword;[if];
  47640. + LeftParenthesis;[(];
  47641. + Not;[!];
  47642. + Keyword;[false];
  47643. + RightParenthesis;[)];
  47644. + Whitespace;[ ];
  47645. + LeftBrace;[{];
  47646. + Whitespace;[ ];
  47647. + Identifier;[foo];
  47648. + LeftParenthesis;[(];
  47649. + RightParenthesis;[)];
  47650. + Semicolon;[;];
  47651. + Whitespace;[ ];
  47652. + RightBrace;[}];
  47653. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilterError_TryCatchWhen_InCompleteBody.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilterError_TryCatchWhen_InCompleteBody.stree.txt
  47654. index 09016c9a8ec..0d29de909a7 100644
  47655. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilterError_TryCatchWhen_InCompleteBody.stree.txt
  47656. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilterError_TryCatchWhen_InCompleteBody.stree.txt
  47657. @@ -1,27 +1,27 @@
  47658. -Statement block - Gen<None> - 53 - (0:0,0)
  47659. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  47660. - SyntaxKind.Transition;[@];
  47661. - Code span - Gen<Stmt> - [try { someMethod(); } catch(Exception) when (true) {] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:23
  47662. - SyntaxKind.Keyword;[try];
  47663. - SyntaxKind.Whitespace;[ ];
  47664. - SyntaxKind.LeftBrace;[{];
  47665. - SyntaxKind.Whitespace;[ ];
  47666. - SyntaxKind.Identifier;[someMethod];
  47667. - SyntaxKind.LeftParenthesis;[(];
  47668. - SyntaxKind.RightParenthesis;[)];
  47669. - SyntaxKind.Semicolon;[;];
  47670. - SyntaxKind.Whitespace;[ ];
  47671. - SyntaxKind.RightBrace;[}];
  47672. - SyntaxKind.Whitespace;[ ];
  47673. - SyntaxKind.Keyword;[catch];
  47674. - SyntaxKind.LeftParenthesis;[(];
  47675. - SyntaxKind.Identifier;[Exception];
  47676. - SyntaxKind.RightParenthesis;[)];
  47677. - SyntaxKind.Whitespace;[ ];
  47678. - SyntaxKind.Keyword;[when];
  47679. - SyntaxKind.Whitespace;[ ];
  47680. - SyntaxKind.LeftParenthesis;[(];
  47681. - SyntaxKind.Keyword;[true];
  47682. - SyntaxKind.RightParenthesis;[)];
  47683. - SyntaxKind.Whitespace;[ ];
  47684. - SyntaxKind.LeftBrace;[{];
  47685. +CSharpCodeBlock - [0..53)::53 - [@try { someMethod(); } catch(Exception) when (true) {]
  47686. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  47687. + Transition;[@];
  47688. + CSharpStatementLiteral - [1..53)::52 - [try { someMethod(); } catch(Exception) when (true) {] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  47689. + Keyword;[try];
  47690. + Whitespace;[ ];
  47691. + LeftBrace;[{];
  47692. + Whitespace;[ ];
  47693. + Identifier;[someMethod];
  47694. + LeftParenthesis;[(];
  47695. + RightParenthesis;[)];
  47696. + Semicolon;[;];
  47697. + Whitespace;[ ];
  47698. + RightBrace;[}];
  47699. + Whitespace;[ ];
  47700. + Keyword;[catch];
  47701. + LeftParenthesis;[(];
  47702. + Identifier;[Exception];
  47703. + RightParenthesis;[)];
  47704. + Whitespace;[ ];
  47705. + Keyword;[when];
  47706. + Whitespace;[ ];
  47707. + LeftParenthesis;[(];
  47708. + Keyword;[true];
  47709. + RightParenthesis;[)];
  47710. + Whitespace;[ ];
  47711. + LeftBrace;[{];
  47712. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilterError_TryCatchWhen_InCompleteCondition.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilterError_TryCatchWhen_InCompleteCondition.stree.txt
  47713. index 25415c2f951..04f717693f9 100644
  47714. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilterError_TryCatchWhen_InCompleteCondition.stree.txt
  47715. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilterError_TryCatchWhen_InCompleteCondition.stree.txt
  47716. @@ -1,23 +1,23 @@
  47717. -Statement block - Gen<None> - 46 - (0:0,0)
  47718. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  47719. - SyntaxKind.Transition;[@];
  47720. - Code span - Gen<Stmt> - [try { someMethod(); } catch(Exception) when (] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:19
  47721. - SyntaxKind.Keyword;[try];
  47722. - SyntaxKind.Whitespace;[ ];
  47723. - SyntaxKind.LeftBrace;[{];
  47724. - SyntaxKind.Whitespace;[ ];
  47725. - SyntaxKind.Identifier;[someMethod];
  47726. - SyntaxKind.LeftParenthesis;[(];
  47727. - SyntaxKind.RightParenthesis;[)];
  47728. - SyntaxKind.Semicolon;[;];
  47729. - SyntaxKind.Whitespace;[ ];
  47730. - SyntaxKind.RightBrace;[}];
  47731. - SyntaxKind.Whitespace;[ ];
  47732. - SyntaxKind.Keyword;[catch];
  47733. - SyntaxKind.LeftParenthesis;[(];
  47734. - SyntaxKind.Identifier;[Exception];
  47735. - SyntaxKind.RightParenthesis;[)];
  47736. - SyntaxKind.Whitespace;[ ];
  47737. - SyntaxKind.Keyword;[when];
  47738. - SyntaxKind.Whitespace;[ ];
  47739. - SyntaxKind.LeftParenthesis;[(];
  47740. +CSharpCodeBlock - [0..46)::46 - [@try { someMethod(); } catch(Exception) when (]
  47741. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  47742. + Transition;[@];
  47743. + CSharpStatementLiteral - [1..46)::45 - [try { someMethod(); } catch(Exception) when (] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  47744. + Keyword;[try];
  47745. + Whitespace;[ ];
  47746. + LeftBrace;[{];
  47747. + Whitespace;[ ];
  47748. + Identifier;[someMethod];
  47749. + LeftParenthesis;[(];
  47750. + RightParenthesis;[)];
  47751. + Semicolon;[;];
  47752. + Whitespace;[ ];
  47753. + RightBrace;[}];
  47754. + Whitespace;[ ];
  47755. + Keyword;[catch];
  47756. + LeftParenthesis;[(];
  47757. + Identifier;[Exception];
  47758. + RightParenthesis;[)];
  47759. + Whitespace;[ ];
  47760. + Keyword;[when];
  47761. + Whitespace;[ ];
  47762. + LeftParenthesis;[(];
  47763. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_IncompleteTryCatchNoBodyWhen.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_IncompleteTryCatchNoBodyWhen.stree.txt
  47764. index 2b4fbb308af..1ea6c97bc32 100644
  47765. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_IncompleteTryCatchNoBodyWhen.stree.txt
  47766. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_IncompleteTryCatchNoBodyWhen.stree.txt
  47767. @@ -1,30 +1,30 @@
  47768. -Statement block - Gen<None> - 65 - (0:0,0)
  47769. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  47770. - SyntaxKind.Transition;[@];
  47771. - Code span - Gen<Stmt> - [try { someMethod(); } catch(Exception) when { anotherMethod(); }] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:26
  47772. - SyntaxKind.Keyword;[try];
  47773. - SyntaxKind.Whitespace;[ ];
  47774. - SyntaxKind.LeftBrace;[{];
  47775. - SyntaxKind.Whitespace;[ ];
  47776. - SyntaxKind.Identifier;[someMethod];
  47777. - SyntaxKind.LeftParenthesis;[(];
  47778. - SyntaxKind.RightParenthesis;[)];
  47779. - SyntaxKind.Semicolon;[;];
  47780. - SyntaxKind.Whitespace;[ ];
  47781. - SyntaxKind.RightBrace;[}];
  47782. - SyntaxKind.Whitespace;[ ];
  47783. - SyntaxKind.Keyword;[catch];
  47784. - SyntaxKind.LeftParenthesis;[(];
  47785. - SyntaxKind.Identifier;[Exception];
  47786. - SyntaxKind.RightParenthesis;[)];
  47787. - SyntaxKind.Whitespace;[ ];
  47788. - SyntaxKind.Keyword;[when];
  47789. - SyntaxKind.Whitespace;[ ];
  47790. - SyntaxKind.LeftBrace;[{];
  47791. - SyntaxKind.Whitespace;[ ];
  47792. - SyntaxKind.Identifier;[anotherMethod];
  47793. - SyntaxKind.LeftParenthesis;[(];
  47794. - SyntaxKind.RightParenthesis;[)];
  47795. - SyntaxKind.Semicolon;[;];
  47796. - SyntaxKind.Whitespace;[ ];
  47797. - SyntaxKind.RightBrace;[}];
  47798. +CSharpCodeBlock - [0..65)::65 - [@try { someMethod(); } catch(Exception) when { anotherMethod(); }]
  47799. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  47800. + Transition;[@];
  47801. + CSharpStatementLiteral - [1..65)::64 - [try { someMethod(); } catch(Exception) when { anotherMethod(); }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  47802. + Keyword;[try];
  47803. + Whitespace;[ ];
  47804. + LeftBrace;[{];
  47805. + Whitespace;[ ];
  47806. + Identifier;[someMethod];
  47807. + LeftParenthesis;[(];
  47808. + RightParenthesis;[)];
  47809. + Semicolon;[;];
  47810. + Whitespace;[ ];
  47811. + RightBrace;[}];
  47812. + Whitespace;[ ];
  47813. + Keyword;[catch];
  47814. + LeftParenthesis;[(];
  47815. + Identifier;[Exception];
  47816. + RightParenthesis;[)];
  47817. + Whitespace;[ ];
  47818. + Keyword;[when];
  47819. + Whitespace;[ ];
  47820. + LeftBrace;[{];
  47821. + Whitespace;[ ];
  47822. + Identifier;[anotherMethod];
  47823. + LeftParenthesis;[(];
  47824. + RightParenthesis;[)];
  47825. + Semicolon;[;];
  47826. + Whitespace;[ ];
  47827. + RightBrace;[}];
  47828. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_IncompleteTryCatchWhen.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_IncompleteTryCatchWhen.stree.txt
  47829. index 4bcac7751c3..4dbd4c9b4da 100644
  47830. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_IncompleteTryCatchWhen.stree.txt
  47831. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_IncompleteTryCatchWhen.stree.txt
  47832. @@ -1,21 +1,21 @@
  47833. -Statement block - Gen<None> - 44 - (0:0,0)
  47834. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  47835. - SyntaxKind.Transition;[@];
  47836. - Code span - Gen<Stmt> - [try { someMethod(); } catch(Exception) when] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:17
  47837. - SyntaxKind.Keyword;[try];
  47838. - SyntaxKind.Whitespace;[ ];
  47839. - SyntaxKind.LeftBrace;[{];
  47840. - SyntaxKind.Whitespace;[ ];
  47841. - SyntaxKind.Identifier;[someMethod];
  47842. - SyntaxKind.LeftParenthesis;[(];
  47843. - SyntaxKind.RightParenthesis;[)];
  47844. - SyntaxKind.Semicolon;[;];
  47845. - SyntaxKind.Whitespace;[ ];
  47846. - SyntaxKind.RightBrace;[}];
  47847. - SyntaxKind.Whitespace;[ ];
  47848. - SyntaxKind.Keyword;[catch];
  47849. - SyntaxKind.LeftParenthesis;[(];
  47850. - SyntaxKind.Identifier;[Exception];
  47851. - SyntaxKind.RightParenthesis;[)];
  47852. - SyntaxKind.Whitespace;[ ];
  47853. - SyntaxKind.Keyword;[when];
  47854. +CSharpCodeBlock - [0..44)::44 - [@try { someMethod(); } catch(Exception) when]
  47855. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  47856. + Transition;[@];
  47857. + CSharpStatementLiteral - [1..44)::43 - [try { someMethod(); } catch(Exception) when] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  47858. + Keyword;[try];
  47859. + Whitespace;[ ];
  47860. + LeftBrace;[{];
  47861. + Whitespace;[ ];
  47862. + Identifier;[someMethod];
  47863. + LeftParenthesis;[(];
  47864. + RightParenthesis;[)];
  47865. + Semicolon;[;];
  47866. + Whitespace;[ ];
  47867. + RightBrace;[}];
  47868. + Whitespace;[ ];
  47869. + Keyword;[catch];
  47870. + LeftParenthesis;[(];
  47871. + Identifier;[Exception];
  47872. + RightParenthesis;[)];
  47873. + Whitespace;[ ];
  47874. + Keyword;[when];
  47875. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_IncompleteTryCatchWhenNoBodies.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_IncompleteTryCatchWhenNoBodies.stree.txt
  47876. index 807d4bf6b63..028b8678689 100644
  47877. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_IncompleteTryCatchWhenNoBodies.stree.txt
  47878. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_IncompleteTryCatchWhenNoBodies.stree.txt
  47879. @@ -1,25 +1,25 @@
  47880. -Statement block - Gen<None> - 51 - (0:0,0)
  47881. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  47882. - SyntaxKind.Transition;[@];
  47883. - Code span - Gen<Stmt> - [try { someMethod(); } catch(Exception) when (true)] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:21
  47884. - SyntaxKind.Keyword;[try];
  47885. - SyntaxKind.Whitespace;[ ];
  47886. - SyntaxKind.LeftBrace;[{];
  47887. - SyntaxKind.Whitespace;[ ];
  47888. - SyntaxKind.Identifier;[someMethod];
  47889. - SyntaxKind.LeftParenthesis;[(];
  47890. - SyntaxKind.RightParenthesis;[)];
  47891. - SyntaxKind.Semicolon;[;];
  47892. - SyntaxKind.Whitespace;[ ];
  47893. - SyntaxKind.RightBrace;[}];
  47894. - SyntaxKind.Whitespace;[ ];
  47895. - SyntaxKind.Keyword;[catch];
  47896. - SyntaxKind.LeftParenthesis;[(];
  47897. - SyntaxKind.Identifier;[Exception];
  47898. - SyntaxKind.RightParenthesis;[)];
  47899. - SyntaxKind.Whitespace;[ ];
  47900. - SyntaxKind.Keyword;[when];
  47901. - SyntaxKind.Whitespace;[ ];
  47902. - SyntaxKind.LeftParenthesis;[(];
  47903. - SyntaxKind.Keyword;[true];
  47904. - SyntaxKind.RightParenthesis;[)];
  47905. +CSharpCodeBlock - [0..51)::51 - [@try { someMethod(); } catch(Exception) when (true)]
  47906. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  47907. + Transition;[@];
  47908. + CSharpStatementLiteral - [1..51)::50 - [try { someMethod(); } catch(Exception) when (true)] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  47909. + Keyword;[try];
  47910. + Whitespace;[ ];
  47911. + LeftBrace;[{];
  47912. + Whitespace;[ ];
  47913. + Identifier;[someMethod];
  47914. + LeftParenthesis;[(];
  47915. + RightParenthesis;[)];
  47916. + Semicolon;[;];
  47917. + Whitespace;[ ];
  47918. + RightBrace;[}];
  47919. + Whitespace;[ ];
  47920. + Keyword;[catch];
  47921. + LeftParenthesis;[(];
  47922. + Identifier;[Exception];
  47923. + RightParenthesis;[)];
  47924. + Whitespace;[ ];
  47925. + Keyword;[when];
  47926. + Whitespace;[ ];
  47927. + LeftParenthesis;[(];
  47928. + Keyword;[true];
  47929. + RightParenthesis;[)];
  47930. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_IncompleteTryWhen.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_IncompleteTryWhen.stree.txt
  47931. index de0038c43e2..a4716915f79 100644
  47932. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_IncompleteTryWhen.stree.txt
  47933. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_IncompleteTryWhen.stree.txt
  47934. @@ -1,14 +1,14 @@
  47935. -Statement block - Gen<None> - 22 - (0:0,0)
  47936. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  47937. - SyntaxKind.Transition;[@];
  47938. - Code span - Gen<Stmt> - [try { someMethod(); }] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:10
  47939. - SyntaxKind.Keyword;[try];
  47940. - SyntaxKind.Whitespace;[ ];
  47941. - SyntaxKind.LeftBrace;[{];
  47942. - SyntaxKind.Whitespace;[ ];
  47943. - SyntaxKind.Identifier;[someMethod];
  47944. - SyntaxKind.LeftParenthesis;[(];
  47945. - SyntaxKind.RightParenthesis;[)];
  47946. - SyntaxKind.Semicolon;[;];
  47947. - SyntaxKind.Whitespace;[ ];
  47948. - SyntaxKind.RightBrace;[}];
  47949. +CSharpCodeBlock - [0..22)::22 - [@try { someMethod(); }]
  47950. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  47951. + Transition;[@];
  47952. + CSharpStatementLiteral - [1..22)::21 - [try { someMethod(); }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  47953. + Keyword;[try];
  47954. + Whitespace;[ ];
  47955. + LeftBrace;[{];
  47956. + Whitespace;[ ];
  47957. + Identifier;[someMethod];
  47958. + LeftParenthesis;[(];
  47959. + RightParenthesis;[)];
  47960. + Semicolon;[;];
  47961. + Whitespace;[ ];
  47962. + RightBrace;[}];
  47963. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_MultiLine.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_MultiLine.stree.txt
  47964. index 89b302ea0ef..47032c337d0 100644
  47965. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_MultiLine.stree.txt
  47966. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_MultiLine.stree.txt
  47967. @@ -1,54 +1,54 @@
  47968. -Statement block - Gen<None> - 103 - (0:0,0)
  47969. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  47970. - SyntaxKind.Transition;[@];
  47971. - Code span - Gen<Stmt> - [tryLF{LFA();LF}LFcatch(Exception) when (true)LF{LFB();LF}LFcatch(IOException) when (false)LF{LFC();LF}] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:50
  47972. - SyntaxKind.Keyword;[try];
  47973. - SyntaxKind.NewLine;[LF];
  47974. - SyntaxKind.LeftBrace;[{];
  47975. - SyntaxKind.NewLine;[LF];
  47976. - SyntaxKind.Identifier;[A];
  47977. - SyntaxKind.LeftParenthesis;[(];
  47978. - SyntaxKind.RightParenthesis;[)];
  47979. - SyntaxKind.Semicolon;[;];
  47980. - SyntaxKind.NewLine;[LF];
  47981. - SyntaxKind.RightBrace;[}];
  47982. - SyntaxKind.NewLine;[LF];
  47983. - SyntaxKind.Keyword;[catch];
  47984. - SyntaxKind.LeftParenthesis;[(];
  47985. - SyntaxKind.Identifier;[Exception];
  47986. - SyntaxKind.RightParenthesis;[)];
  47987. - SyntaxKind.Whitespace;[ ];
  47988. - SyntaxKind.Keyword;[when];
  47989. - SyntaxKind.Whitespace;[ ];
  47990. - SyntaxKind.LeftParenthesis;[(];
  47991. - SyntaxKind.Keyword;[true];
  47992. - SyntaxKind.RightParenthesis;[)];
  47993. - SyntaxKind.NewLine;[LF];
  47994. - SyntaxKind.LeftBrace;[{];
  47995. - SyntaxKind.NewLine;[LF];
  47996. - SyntaxKind.Identifier;[B];
  47997. - SyntaxKind.LeftParenthesis;[(];
  47998. - SyntaxKind.RightParenthesis;[)];
  47999. - SyntaxKind.Semicolon;[;];
  48000. - SyntaxKind.NewLine;[LF];
  48001. - SyntaxKind.RightBrace;[}];
  48002. - SyntaxKind.NewLine;[LF];
  48003. - SyntaxKind.Keyword;[catch];
  48004. - SyntaxKind.LeftParenthesis;[(];
  48005. - SyntaxKind.Identifier;[IOException];
  48006. - SyntaxKind.RightParenthesis;[)];
  48007. - SyntaxKind.Whitespace;[ ];
  48008. - SyntaxKind.Keyword;[when];
  48009. - SyntaxKind.Whitespace;[ ];
  48010. - SyntaxKind.LeftParenthesis;[(];
  48011. - SyntaxKind.Keyword;[false];
  48012. - SyntaxKind.RightParenthesis;[)];
  48013. - SyntaxKind.NewLine;[LF];
  48014. - SyntaxKind.LeftBrace;[{];
  48015. - SyntaxKind.NewLine;[LF];
  48016. - SyntaxKind.Identifier;[C];
  48017. - SyntaxKind.LeftParenthesis;[(];
  48018. - SyntaxKind.RightParenthesis;[)];
  48019. - SyntaxKind.Semicolon;[;];
  48020. - SyntaxKind.NewLine;[LF];
  48021. - SyntaxKind.RightBrace;[}];
  48022. +CSharpCodeBlock - [0..103)::103 - [@tryLF{LFA();LF}LFcatch(Exception) when (true)LF{LFB();LF}LFcatch(IOException) when (false)LF{LFC();LF}]
  48023. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  48024. + Transition;[@];
  48025. + CSharpStatementLiteral - [1..103)::102 - [tryLF{LFA();LF}LFcatch(Exception) when (true)LF{LFB();LF}LFcatch(IOException) when (false)LF{LFC();LF}] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  48026. + Keyword;[try];
  48027. + NewLine;[LF];
  48028. + LeftBrace;[{];
  48029. + NewLine;[LF];
  48030. + Identifier;[A];
  48031. + LeftParenthesis;[(];
  48032. + RightParenthesis;[)];
  48033. + Semicolon;[;];
  48034. + NewLine;[LF];
  48035. + RightBrace;[}];
  48036. + NewLine;[LF];
  48037. + Keyword;[catch];
  48038. + LeftParenthesis;[(];
  48039. + Identifier;[Exception];
  48040. + RightParenthesis;[)];
  48041. + Whitespace;[ ];
  48042. + Keyword;[when];
  48043. + Whitespace;[ ];
  48044. + LeftParenthesis;[(];
  48045. + Keyword;[true];
  48046. + RightParenthesis;[)];
  48047. + NewLine;[LF];
  48048. + LeftBrace;[{];
  48049. + NewLine;[LF];
  48050. + Identifier;[B];
  48051. + LeftParenthesis;[(];
  48052. + RightParenthesis;[)];
  48053. + Semicolon;[;];
  48054. + NewLine;[LF];
  48055. + RightBrace;[}];
  48056. + NewLine;[LF];
  48057. + Keyword;[catch];
  48058. + LeftParenthesis;[(];
  48059. + Identifier;[IOException];
  48060. + RightParenthesis;[)];
  48061. + Whitespace;[ ];
  48062. + Keyword;[when];
  48063. + Whitespace;[ ];
  48064. + LeftParenthesis;[(];
  48065. + Keyword;[false];
  48066. + RightParenthesis;[)];
  48067. + NewLine;[LF];
  48068. + LeftBrace;[{];
  48069. + NewLine;[LF];
  48070. + Identifier;[C];
  48071. + LeftParenthesis;[(];
  48072. + RightParenthesis;[)];
  48073. + Semicolon;[;];
  48074. + NewLine;[LF];
  48075. + RightBrace;[}];
  48076. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_NestedTryCatchWhen.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_NestedTryCatchWhen.stree.txt
  48077. index f6d20f2485d..0f8443577f5 100644
  48078. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_NestedTryCatchWhen.stree.txt
  48079. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_NestedTryCatchWhen.stree.txt
  48080. @@ -1,38 +1,41 @@
  48081. -Statement block - Gen<None> - 69 - (0:0,0)
  48082. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  48083. - SyntaxKind.Transition;[@];
  48084. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  48085. - SyntaxKind.LeftBrace;[{];
  48086. - Code span - Gen<Stmt> - [try { someMethod(); } catch(Exception) when (true) { handleIO(); }] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (2:0,2) - Tokens:30
  48087. - SyntaxKind.Keyword;[try];
  48088. - SyntaxKind.Whitespace;[ ];
  48089. - SyntaxKind.LeftBrace;[{];
  48090. - SyntaxKind.Whitespace;[ ];
  48091. - SyntaxKind.Identifier;[someMethod];
  48092. - SyntaxKind.LeftParenthesis;[(];
  48093. - SyntaxKind.RightParenthesis;[)];
  48094. - SyntaxKind.Semicolon;[;];
  48095. - SyntaxKind.Whitespace;[ ];
  48096. - SyntaxKind.RightBrace;[}];
  48097. - SyntaxKind.Whitespace;[ ];
  48098. - SyntaxKind.Keyword;[catch];
  48099. - SyntaxKind.LeftParenthesis;[(];
  48100. - SyntaxKind.Identifier;[Exception];
  48101. - SyntaxKind.RightParenthesis;[)];
  48102. - SyntaxKind.Whitespace;[ ];
  48103. - SyntaxKind.Keyword;[when];
  48104. - SyntaxKind.Whitespace;[ ];
  48105. - SyntaxKind.LeftParenthesis;[(];
  48106. - SyntaxKind.Keyword;[true];
  48107. - SyntaxKind.RightParenthesis;[)];
  48108. - SyntaxKind.Whitespace;[ ];
  48109. - SyntaxKind.LeftBrace;[{];
  48110. - SyntaxKind.Whitespace;[ ];
  48111. - SyntaxKind.Identifier;[handleIO];
  48112. - SyntaxKind.LeftParenthesis;[(];
  48113. - SyntaxKind.RightParenthesis;[)];
  48114. - SyntaxKind.Semicolon;[;];
  48115. - SyntaxKind.Whitespace;[ ];
  48116. - SyntaxKind.RightBrace;[}];
  48117. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (68:0,68) - Tokens:1
  48118. - SyntaxKind.RightBrace;[}];
  48119. +CSharpCodeBlock - [0..69)::69 - [@{try { someMethod(); } catch(Exception) when (true) { handleIO(); }}]
  48120. + CSharpStatement - [0..69)::69
  48121. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  48122. + Transition;[@];
  48123. + CSharpStatementBody - [1..69)::68
  48124. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  48125. + LeftBrace;[{];
  48126. + CSharpCodeBlock - [2..68)::66
  48127. + CSharpStatementLiteral - [2..68)::66 - [try { someMethod(); } catch(Exception) when (true) { handleIO(); }] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  48128. + Keyword;[try];
  48129. + Whitespace;[ ];
  48130. + LeftBrace;[{];
  48131. + Whitespace;[ ];
  48132. + Identifier;[someMethod];
  48133. + LeftParenthesis;[(];
  48134. + RightParenthesis;[)];
  48135. + Semicolon;[;];
  48136. + Whitespace;[ ];
  48137. + RightBrace;[}];
  48138. + Whitespace;[ ];
  48139. + Keyword;[catch];
  48140. + LeftParenthesis;[(];
  48141. + Identifier;[Exception];
  48142. + RightParenthesis;[)];
  48143. + Whitespace;[ ];
  48144. + Keyword;[when];
  48145. + Whitespace;[ ];
  48146. + LeftParenthesis;[(];
  48147. + Keyword;[true];
  48148. + RightParenthesis;[)];
  48149. + Whitespace;[ ];
  48150. + LeftBrace;[{];
  48151. + Whitespace;[ ];
  48152. + Identifier;[handleIO];
  48153. + LeftParenthesis;[(];
  48154. + RightParenthesis;[)];
  48155. + Semicolon;[;];
  48156. + Whitespace;[ ];
  48157. + RightBrace;[}];
  48158. + RazorMetaCode - [68..69)::1 - Gen<None> - SpanEditHandler;Accepts:None
  48159. + RightBrace;[}];
  48160. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_TryCatchWhenCatchWhenComplete_SingleLine.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_TryCatchWhenCatchWhenComplete_SingleLine.stree.txt
  48161. index 5f93680e4d9..05378ee5c54 100644
  48162. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_TryCatchWhenCatchWhenComplete_SingleLine.stree.txt
  48163. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_TryCatchWhenCatchWhenComplete_SingleLine.stree.txt
  48164. @@ -1,54 +1,54 @@
  48165. -Statement block - Gen<None> - 92 - (0:0,0)
  48166. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  48167. - SyntaxKind.Transition;[@];
  48168. - Code span - Gen<Stmt> - [try { A(); } catch(Exception) when (true) { B(); } catch(IOException) when (false) { C(); }] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:50
  48169. - SyntaxKind.Keyword;[try];
  48170. - SyntaxKind.Whitespace;[ ];
  48171. - SyntaxKind.LeftBrace;[{];
  48172. - SyntaxKind.Whitespace;[ ];
  48173. - SyntaxKind.Identifier;[A];
  48174. - SyntaxKind.LeftParenthesis;[(];
  48175. - SyntaxKind.RightParenthesis;[)];
  48176. - SyntaxKind.Semicolon;[;];
  48177. - SyntaxKind.Whitespace;[ ];
  48178. - SyntaxKind.RightBrace;[}];
  48179. - SyntaxKind.Whitespace;[ ];
  48180. - SyntaxKind.Keyword;[catch];
  48181. - SyntaxKind.LeftParenthesis;[(];
  48182. - SyntaxKind.Identifier;[Exception];
  48183. - SyntaxKind.RightParenthesis;[)];
  48184. - SyntaxKind.Whitespace;[ ];
  48185. - SyntaxKind.Keyword;[when];
  48186. - SyntaxKind.Whitespace;[ ];
  48187. - SyntaxKind.LeftParenthesis;[(];
  48188. - SyntaxKind.Keyword;[true];
  48189. - SyntaxKind.RightParenthesis;[)];
  48190. - SyntaxKind.Whitespace;[ ];
  48191. - SyntaxKind.LeftBrace;[{];
  48192. - SyntaxKind.Whitespace;[ ];
  48193. - SyntaxKind.Identifier;[B];
  48194. - SyntaxKind.LeftParenthesis;[(];
  48195. - SyntaxKind.RightParenthesis;[)];
  48196. - SyntaxKind.Semicolon;[;];
  48197. - SyntaxKind.Whitespace;[ ];
  48198. - SyntaxKind.RightBrace;[}];
  48199. - SyntaxKind.Whitespace;[ ];
  48200. - SyntaxKind.Keyword;[catch];
  48201. - SyntaxKind.LeftParenthesis;[(];
  48202. - SyntaxKind.Identifier;[IOException];
  48203. - SyntaxKind.RightParenthesis;[)];
  48204. - SyntaxKind.Whitespace;[ ];
  48205. - SyntaxKind.Keyword;[when];
  48206. - SyntaxKind.Whitespace;[ ];
  48207. - SyntaxKind.LeftParenthesis;[(];
  48208. - SyntaxKind.Keyword;[false];
  48209. - SyntaxKind.RightParenthesis;[)];
  48210. - SyntaxKind.Whitespace;[ ];
  48211. - SyntaxKind.LeftBrace;[{];
  48212. - SyntaxKind.Whitespace;[ ];
  48213. - SyntaxKind.Identifier;[C];
  48214. - SyntaxKind.LeftParenthesis;[(];
  48215. - SyntaxKind.RightParenthesis;[)];
  48216. - SyntaxKind.Semicolon;[;];
  48217. - SyntaxKind.Whitespace;[ ];
  48218. - SyntaxKind.RightBrace;[}];
  48219. +CSharpCodeBlock - [0..92)::92 - [@try { A(); } catch(Exception) when (true) { B(); } catch(IOException) when (false) { C(); }]
  48220. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  48221. + Transition;[@];
  48222. + CSharpStatementLiteral - [1..92)::91 - [try { A(); } catch(Exception) when (true) { B(); } catch(IOException) when (false) { C(); }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  48223. + Keyword;[try];
  48224. + Whitespace;[ ];
  48225. + LeftBrace;[{];
  48226. + Whitespace;[ ];
  48227. + Identifier;[A];
  48228. + LeftParenthesis;[(];
  48229. + RightParenthesis;[)];
  48230. + Semicolon;[;];
  48231. + Whitespace;[ ];
  48232. + RightBrace;[}];
  48233. + Whitespace;[ ];
  48234. + Keyword;[catch];
  48235. + LeftParenthesis;[(];
  48236. + Identifier;[Exception];
  48237. + RightParenthesis;[)];
  48238. + Whitespace;[ ];
  48239. + Keyword;[when];
  48240. + Whitespace;[ ];
  48241. + LeftParenthesis;[(];
  48242. + Keyword;[true];
  48243. + RightParenthesis;[)];
  48244. + Whitespace;[ ];
  48245. + LeftBrace;[{];
  48246. + Whitespace;[ ];
  48247. + Identifier;[B];
  48248. + LeftParenthesis;[(];
  48249. + RightParenthesis;[)];
  48250. + Semicolon;[;];
  48251. + Whitespace;[ ];
  48252. + RightBrace;[}];
  48253. + Whitespace;[ ];
  48254. + Keyword;[catch];
  48255. + LeftParenthesis;[(];
  48256. + Identifier;[IOException];
  48257. + RightParenthesis;[)];
  48258. + Whitespace;[ ];
  48259. + Keyword;[when];
  48260. + Whitespace;[ ];
  48261. + LeftParenthesis;[(];
  48262. + Keyword;[false];
  48263. + RightParenthesis;[)];
  48264. + Whitespace;[ ];
  48265. + LeftBrace;[{];
  48266. + Whitespace;[ ];
  48267. + Identifier;[C];
  48268. + LeftParenthesis;[(];
  48269. + RightParenthesis;[)];
  48270. + Semicolon;[;];
  48271. + Whitespace;[ ];
  48272. + RightBrace;[}];
  48273. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_TryCatchWhenComplete_SingleLine.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_TryCatchWhenComplete_SingleLine.stree.txt
  48274. index c0714338772..d17ac8b9d9c 100644
  48275. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_TryCatchWhenComplete_SingleLine.stree.txt
  48276. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_TryCatchWhenComplete_SingleLine.stree.txt
  48277. @@ -1,34 +1,34 @@
  48278. -Statement block - Gen<None> - 67 - (0:0,0)
  48279. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  48280. - SyntaxKind.Transition;[@];
  48281. - Code span - Gen<Stmt> - [try { someMethod(); } catch(Exception) when (true) { handleIO(); }] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:30
  48282. - SyntaxKind.Keyword;[try];
  48283. - SyntaxKind.Whitespace;[ ];
  48284. - SyntaxKind.LeftBrace;[{];
  48285. - SyntaxKind.Whitespace;[ ];
  48286. - SyntaxKind.Identifier;[someMethod];
  48287. - SyntaxKind.LeftParenthesis;[(];
  48288. - SyntaxKind.RightParenthesis;[)];
  48289. - SyntaxKind.Semicolon;[;];
  48290. - SyntaxKind.Whitespace;[ ];
  48291. - SyntaxKind.RightBrace;[}];
  48292. - SyntaxKind.Whitespace;[ ];
  48293. - SyntaxKind.Keyword;[catch];
  48294. - SyntaxKind.LeftParenthesis;[(];
  48295. - SyntaxKind.Identifier;[Exception];
  48296. - SyntaxKind.RightParenthesis;[)];
  48297. - SyntaxKind.Whitespace;[ ];
  48298. - SyntaxKind.Keyword;[when];
  48299. - SyntaxKind.Whitespace;[ ];
  48300. - SyntaxKind.LeftParenthesis;[(];
  48301. - SyntaxKind.Keyword;[true];
  48302. - SyntaxKind.RightParenthesis;[)];
  48303. - SyntaxKind.Whitespace;[ ];
  48304. - SyntaxKind.LeftBrace;[{];
  48305. - SyntaxKind.Whitespace;[ ];
  48306. - SyntaxKind.Identifier;[handleIO];
  48307. - SyntaxKind.LeftParenthesis;[(];
  48308. - SyntaxKind.RightParenthesis;[)];
  48309. - SyntaxKind.Semicolon;[;];
  48310. - SyntaxKind.Whitespace;[ ];
  48311. - SyntaxKind.RightBrace;[}];
  48312. +CSharpCodeBlock - [0..67)::67 - [@try { someMethod(); } catch(Exception) when (true) { handleIO(); }]
  48313. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  48314. + Transition;[@];
  48315. + CSharpStatementLiteral - [1..67)::66 - [try { someMethod(); } catch(Exception) when (true) { handleIO(); }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  48316. + Keyword;[try];
  48317. + Whitespace;[ ];
  48318. + LeftBrace;[{];
  48319. + Whitespace;[ ];
  48320. + Identifier;[someMethod];
  48321. + LeftParenthesis;[(];
  48322. + RightParenthesis;[)];
  48323. + Semicolon;[;];
  48324. + Whitespace;[ ];
  48325. + RightBrace;[}];
  48326. + Whitespace;[ ];
  48327. + Keyword;[catch];
  48328. + LeftParenthesis;[(];
  48329. + Identifier;[Exception];
  48330. + RightParenthesis;[)];
  48331. + Whitespace;[ ];
  48332. + Keyword;[when];
  48333. + Whitespace;[ ];
  48334. + LeftParenthesis;[(];
  48335. + Keyword;[true];
  48336. + RightParenthesis;[)];
  48337. + Whitespace;[ ];
  48338. + LeftBrace;[{];
  48339. + Whitespace;[ ];
  48340. + Identifier;[handleIO];
  48341. + LeftParenthesis;[(];
  48342. + RightParenthesis;[)];
  48343. + Semicolon;[;];
  48344. + Whitespace;[ ];
  48345. + RightBrace;[}];
  48346. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_TryCatchWhenFinallyComplete_SingleLine.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_TryCatchWhenFinallyComplete_SingleLine.stree.txt
  48347. index 0e280680998..7d1cb95bb20 100644
  48348. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_TryCatchWhenFinallyComplete_SingleLine.stree.txt
  48349. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ExceptionFilter_TryCatchWhenFinallyComplete_SingleLine.stree.txt
  48350. @@ -1,45 +1,45 @@
  48351. -Statement block - Gen<None> - 68 - (0:0,0)
  48352. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  48353. - SyntaxKind.Transition;[@];
  48354. - Code span - Gen<Stmt> - [try { A(); } catch(Exception) when (true) { B(); } finally { C(); }] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:41
  48355. - SyntaxKind.Keyword;[try];
  48356. - SyntaxKind.Whitespace;[ ];
  48357. - SyntaxKind.LeftBrace;[{];
  48358. - SyntaxKind.Whitespace;[ ];
  48359. - SyntaxKind.Identifier;[A];
  48360. - SyntaxKind.LeftParenthesis;[(];
  48361. - SyntaxKind.RightParenthesis;[)];
  48362. - SyntaxKind.Semicolon;[;];
  48363. - SyntaxKind.Whitespace;[ ];
  48364. - SyntaxKind.RightBrace;[}];
  48365. - SyntaxKind.Whitespace;[ ];
  48366. - SyntaxKind.Keyword;[catch];
  48367. - SyntaxKind.LeftParenthesis;[(];
  48368. - SyntaxKind.Identifier;[Exception];
  48369. - SyntaxKind.RightParenthesis;[)];
  48370. - SyntaxKind.Whitespace;[ ];
  48371. - SyntaxKind.Keyword;[when];
  48372. - SyntaxKind.Whitespace;[ ];
  48373. - SyntaxKind.LeftParenthesis;[(];
  48374. - SyntaxKind.Keyword;[true];
  48375. - SyntaxKind.RightParenthesis;[)];
  48376. - SyntaxKind.Whitespace;[ ];
  48377. - SyntaxKind.LeftBrace;[{];
  48378. - SyntaxKind.Whitespace;[ ];
  48379. - SyntaxKind.Identifier;[B];
  48380. - SyntaxKind.LeftParenthesis;[(];
  48381. - SyntaxKind.RightParenthesis;[)];
  48382. - SyntaxKind.Semicolon;[;];
  48383. - SyntaxKind.Whitespace;[ ];
  48384. - SyntaxKind.RightBrace;[}];
  48385. - SyntaxKind.Whitespace;[ ];
  48386. - SyntaxKind.Keyword;[finally];
  48387. - SyntaxKind.Whitespace;[ ];
  48388. - SyntaxKind.LeftBrace;[{];
  48389. - SyntaxKind.Whitespace;[ ];
  48390. - SyntaxKind.Identifier;[C];
  48391. - SyntaxKind.LeftParenthesis;[(];
  48392. - SyntaxKind.RightParenthesis;[)];
  48393. - SyntaxKind.Semicolon;[;];
  48394. - SyntaxKind.Whitespace;[ ];
  48395. - SyntaxKind.RightBrace;[}];
  48396. +CSharpCodeBlock - [0..68)::68 - [@try { A(); } catch(Exception) when (true) { B(); } finally { C(); }]
  48397. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  48398. + Transition;[@];
  48399. + CSharpStatementLiteral - [1..68)::67 - [try { A(); } catch(Exception) when (true) { B(); } finally { C(); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  48400. + Keyword;[try];
  48401. + Whitespace;[ ];
  48402. + LeftBrace;[{];
  48403. + Whitespace;[ ];
  48404. + Identifier;[A];
  48405. + LeftParenthesis;[(];
  48406. + RightParenthesis;[)];
  48407. + Semicolon;[;];
  48408. + Whitespace;[ ];
  48409. + RightBrace;[}];
  48410. + Whitespace;[ ];
  48411. + Keyword;[catch];
  48412. + LeftParenthesis;[(];
  48413. + Identifier;[Exception];
  48414. + RightParenthesis;[)];
  48415. + Whitespace;[ ];
  48416. + Keyword;[when];
  48417. + Whitespace;[ ];
  48418. + LeftParenthesis;[(];
  48419. + Keyword;[true];
  48420. + RightParenthesis;[)];
  48421. + Whitespace;[ ];
  48422. + LeftBrace;[{];
  48423. + Whitespace;[ ];
  48424. + Identifier;[B];
  48425. + LeftParenthesis;[(];
  48426. + RightParenthesis;[)];
  48427. + Semicolon;[;];
  48428. + Whitespace;[ ];
  48429. + RightBrace;[}];
  48430. + Whitespace;[ ];
  48431. + Keyword;[finally];
  48432. + Whitespace;[ ];
  48433. + LeftBrace;[{];
  48434. + Whitespace;[ ];
  48435. + Identifier;[C];
  48436. + LeftParenthesis;[(];
  48437. + RightParenthesis;[)];
  48438. + Semicolon;[;];
  48439. + Whitespace;[ ];
  48440. + RightBrace;[}];
  48441. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/FinallyClause.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/FinallyClause.stree.txt
  48442. index 82427e55669..dc961589828 100644
  48443. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/FinallyClause.stree.txt
  48444. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/FinallyClause.stree.txt
  48445. @@ -1,25 +1,25 @@
  48446. -Statement block - Gen<None> - 38 - (0:0,0)
  48447. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  48448. - SyntaxKind.Transition;[@];
  48449. - Code span - Gen<Stmt> - [try { foo(); } finally { Dispose(); }] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:21
  48450. - SyntaxKind.Keyword;[try];
  48451. - SyntaxKind.Whitespace;[ ];
  48452. - SyntaxKind.LeftBrace;[{];
  48453. - SyntaxKind.Whitespace;[ ];
  48454. - SyntaxKind.Identifier;[foo];
  48455. - SyntaxKind.LeftParenthesis;[(];
  48456. - SyntaxKind.RightParenthesis;[)];
  48457. - SyntaxKind.Semicolon;[;];
  48458. - SyntaxKind.Whitespace;[ ];
  48459. - SyntaxKind.RightBrace;[}];
  48460. - SyntaxKind.Whitespace;[ ];
  48461. - SyntaxKind.Keyword;[finally];
  48462. - SyntaxKind.Whitespace;[ ];
  48463. - SyntaxKind.LeftBrace;[{];
  48464. - SyntaxKind.Whitespace;[ ];
  48465. - SyntaxKind.Identifier;[Dispose];
  48466. - SyntaxKind.LeftParenthesis;[(];
  48467. - SyntaxKind.RightParenthesis;[)];
  48468. - SyntaxKind.Semicolon;[;];
  48469. - SyntaxKind.Whitespace;[ ];
  48470. - SyntaxKind.RightBrace;[}];
  48471. +CSharpCodeBlock - [0..38)::38 - [@try { foo(); } finally { Dispose(); }]
  48472. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  48473. + Transition;[@];
  48474. + CSharpStatementLiteral - [1..38)::37 - [try { foo(); } finally { Dispose(); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  48475. + Keyword;[try];
  48476. + Whitespace;[ ];
  48477. + LeftBrace;[{];
  48478. + Whitespace;[ ];
  48479. + Identifier;[foo];
  48480. + LeftParenthesis;[(];
  48481. + RightParenthesis;[)];
  48482. + Semicolon;[;];
  48483. + Whitespace;[ ];
  48484. + RightBrace;[}];
  48485. + Whitespace;[ ];
  48486. + Keyword;[finally];
  48487. + Whitespace;[ ];
  48488. + LeftBrace;[{];
  48489. + Whitespace;[ ];
  48490. + Identifier;[Dispose];
  48491. + LeftParenthesis;[(];
  48492. + RightParenthesis;[)];
  48493. + Semicolon;[;];
  48494. + Whitespace;[ ];
  48495. + RightBrace;[}];
  48496. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ForEachStatement.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ForEachStatement.stree.txt
  48497. index df4a2559f1d..ec6233e29e9 100644
  48498. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ForEachStatement.stree.txt
  48499. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ForEachStatement.stree.txt
  48500. @@ -1,23 +1,23 @@
  48501. -Statement block - Gen<None> - 35 - (0:0,0)
  48502. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  48503. - SyntaxKind.Transition;[@];
  48504. - Code span - Gen<Stmt> - [foreach(var foo in bar) { foo(); }] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:19
  48505. - SyntaxKind.Keyword;[foreach];
  48506. - SyntaxKind.LeftParenthesis;[(];
  48507. - SyntaxKind.Identifier;[var];
  48508. - SyntaxKind.Whitespace;[ ];
  48509. - SyntaxKind.Identifier;[foo];
  48510. - SyntaxKind.Whitespace;[ ];
  48511. - SyntaxKind.Keyword;[in];
  48512. - SyntaxKind.Whitespace;[ ];
  48513. - SyntaxKind.Identifier;[bar];
  48514. - SyntaxKind.RightParenthesis;[)];
  48515. - SyntaxKind.Whitespace;[ ];
  48516. - SyntaxKind.LeftBrace;[{];
  48517. - SyntaxKind.Whitespace;[ ];
  48518. - SyntaxKind.Identifier;[foo];
  48519. - SyntaxKind.LeftParenthesis;[(];
  48520. - SyntaxKind.RightParenthesis;[)];
  48521. - SyntaxKind.Semicolon;[;];
  48522. - SyntaxKind.Whitespace;[ ];
  48523. - SyntaxKind.RightBrace;[}];
  48524. +CSharpCodeBlock - [0..35)::35 - [@foreach(var foo in bar) { foo(); }]
  48525. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  48526. + Transition;[@];
  48527. + CSharpStatementLiteral - [1..35)::34 - [foreach(var foo in bar) { foo(); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  48528. + Keyword;[foreach];
  48529. + LeftParenthesis;[(];
  48530. + Identifier;[var];
  48531. + Whitespace;[ ];
  48532. + Identifier;[foo];
  48533. + Whitespace;[ ];
  48534. + Keyword;[in];
  48535. + Whitespace;[ ];
  48536. + Identifier;[bar];
  48537. + RightParenthesis;[)];
  48538. + Whitespace;[ ];
  48539. + LeftBrace;[{];
  48540. + Whitespace;[ ];
  48541. + Identifier;[foo];
  48542. + LeftParenthesis;[(];
  48543. + RightParenthesis;[)];
  48544. + Semicolon;[;];
  48545. + Whitespace;[ ];
  48546. + RightBrace;[}];
  48547. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ForStatement.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ForStatement.stree.txt
  48548. index 7453adeb1c8..fdf8533dbab 100644
  48549. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ForStatement.stree.txt
  48550. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/ForStatement.stree.txt
  48551. @@ -1,34 +1,34 @@
  48552. -Statement block - Gen<None> - 43 - (0:0,0)
  48553. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  48554. - SyntaxKind.Transition;[@];
  48555. - Code span - Gen<Stmt> - [for(int i = 0; i++; i < length) { foo(); }] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:30
  48556. - SyntaxKind.Keyword;[for];
  48557. - SyntaxKind.LeftParenthesis;[(];
  48558. - SyntaxKind.Keyword;[int];
  48559. - SyntaxKind.Whitespace;[ ];
  48560. - SyntaxKind.Identifier;[i];
  48561. - SyntaxKind.Whitespace;[ ];
  48562. - SyntaxKind.Assign;[=];
  48563. - SyntaxKind.Whitespace;[ ];
  48564. - SyntaxKind.IntegerLiteral;[0];
  48565. - SyntaxKind.Semicolon;[;];
  48566. - SyntaxKind.Whitespace;[ ];
  48567. - SyntaxKind.Identifier;[i];
  48568. - SyntaxKind.Increment;[++];
  48569. - SyntaxKind.Semicolon;[;];
  48570. - SyntaxKind.Whitespace;[ ];
  48571. - SyntaxKind.Identifier;[i];
  48572. - SyntaxKind.Whitespace;[ ];
  48573. - SyntaxKind.LessThan;[<];
  48574. - SyntaxKind.Whitespace;[ ];
  48575. - SyntaxKind.Identifier;[length];
  48576. - SyntaxKind.RightParenthesis;[)];
  48577. - SyntaxKind.Whitespace;[ ];
  48578. - SyntaxKind.LeftBrace;[{];
  48579. - SyntaxKind.Whitespace;[ ];
  48580. - SyntaxKind.Identifier;[foo];
  48581. - SyntaxKind.LeftParenthesis;[(];
  48582. - SyntaxKind.RightParenthesis;[)];
  48583. - SyntaxKind.Semicolon;[;];
  48584. - SyntaxKind.Whitespace;[ ];
  48585. - SyntaxKind.RightBrace;[}];
  48586. +CSharpCodeBlock - [0..43)::43 - [@for(int i = 0; i++; i < length) { foo(); }]
  48587. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  48588. + Transition;[@];
  48589. + CSharpStatementLiteral - [1..43)::42 - [for(int i = 0; i++; i < length) { foo(); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  48590. + Keyword;[for];
  48591. + LeftParenthesis;[(];
  48592. + Keyword;[int];
  48593. + Whitespace;[ ];
  48594. + Identifier;[i];
  48595. + Whitespace;[ ];
  48596. + Assign;[=];
  48597. + Whitespace;[ ];
  48598. + IntegerLiteral;[0];
  48599. + Semicolon;[;];
  48600. + Whitespace;[ ];
  48601. + Identifier;[i];
  48602. + Increment;[++];
  48603. + Semicolon;[;];
  48604. + Whitespace;[ ];
  48605. + Identifier;[i];
  48606. + Whitespace;[ ];
  48607. + LessThan;[<];
  48608. + Whitespace;[ ];
  48609. + Identifier;[length];
  48610. + RightParenthesis;[)];
  48611. + Whitespace;[ ];
  48612. + LeftBrace;[{];
  48613. + Whitespace;[ ];
  48614. + Identifier;[foo];
  48615. + LeftParenthesis;[(];
  48616. + RightParenthesis;[)];
  48617. + Semicolon;[;];
  48618. + Whitespace;[ ];
  48619. + RightBrace;[}];
  48620. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/IfStatement.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/IfStatement.stree.txt
  48621. index 6d997458951..1e5dc0955da 100644
  48622. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/IfStatement.stree.txt
  48623. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/IfStatement.stree.txt
  48624. @@ -1,17 +1,17 @@
  48625. -Statement block - Gen<None> - 20 - (0:0,0)
  48626. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  48627. - SyntaxKind.Transition;[@];
  48628. - Code span - Gen<Stmt> - [if(true) { foo(); }] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:13
  48629. - SyntaxKind.Keyword;[if];
  48630. - SyntaxKind.LeftParenthesis;[(];
  48631. - SyntaxKind.Keyword;[true];
  48632. - SyntaxKind.RightParenthesis;[)];
  48633. - SyntaxKind.Whitespace;[ ];
  48634. - SyntaxKind.LeftBrace;[{];
  48635. - SyntaxKind.Whitespace;[ ];
  48636. - SyntaxKind.Identifier;[foo];
  48637. - SyntaxKind.LeftParenthesis;[(];
  48638. - SyntaxKind.RightParenthesis;[)];
  48639. - SyntaxKind.Semicolon;[;];
  48640. - SyntaxKind.Whitespace;[ ];
  48641. - SyntaxKind.RightBrace;[}];
  48642. +CSharpCodeBlock - [0..20)::20 - [@if(true) { foo(); }]
  48643. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  48644. + Transition;[@];
  48645. + CSharpStatementLiteral - [1..20)::19 - [if(true) { foo(); }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  48646. + Keyword;[if];
  48647. + LeftParenthesis;[(];
  48648. + Keyword;[true];
  48649. + RightParenthesis;[)];
  48650. + Whitespace;[ ];
  48651. + LeftBrace;[{];
  48652. + Whitespace;[ ];
  48653. + Identifier;[foo];
  48654. + LeftParenthesis;[(];
  48655. + RightParenthesis;[)];
  48656. + Semicolon;[;];
  48657. + Whitespace;[ ];
  48658. + RightBrace;[}];
  48659. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/LockStatement.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/LockStatement.stree.txt
  48660. index eddbbb0fc79..97d8f9ff476 100644
  48661. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/LockStatement.stree.txt
  48662. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/LockStatement.stree.txt
  48663. @@ -1,17 +1,17 @@
  48664. -Statement block - Gen<None> - 21 - (0:0,0)
  48665. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  48666. - SyntaxKind.Transition;[@];
  48667. - Code span - Gen<Stmt> - [lock(baz) { foo(); }] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:13
  48668. - SyntaxKind.Keyword;[lock];
  48669. - SyntaxKind.LeftParenthesis;[(];
  48670. - SyntaxKind.Identifier;[baz];
  48671. - SyntaxKind.RightParenthesis;[)];
  48672. - SyntaxKind.Whitespace;[ ];
  48673. - SyntaxKind.LeftBrace;[{];
  48674. - SyntaxKind.Whitespace;[ ];
  48675. - SyntaxKind.Identifier;[foo];
  48676. - SyntaxKind.LeftParenthesis;[(];
  48677. - SyntaxKind.RightParenthesis;[)];
  48678. - SyntaxKind.Semicolon;[;];
  48679. - SyntaxKind.Whitespace;[ ];
  48680. - SyntaxKind.RightBrace;[}];
  48681. +CSharpCodeBlock - [0..21)::21 - [@lock(baz) { foo(); }]
  48682. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  48683. + Transition;[@];
  48684. + CSharpStatementLiteral - [1..21)::20 - [lock(baz) { foo(); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  48685. + Keyword;[lock];
  48686. + LeftParenthesis;[(];
  48687. + Identifier;[baz];
  48688. + RightParenthesis;[)];
  48689. + Whitespace;[ ];
  48690. + LeftBrace;[{];
  48691. + Whitespace;[ ];
  48692. + Identifier;[foo];
  48693. + LeftParenthesis;[(];
  48694. + RightParenthesis;[)];
  48695. + Semicolon;[;];
  48696. + Whitespace;[ ];
  48697. + RightBrace;[}];
  48698. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/NonBlockKeywordTreatedAsImplicitExpression.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/NonBlockKeywordTreatedAsImplicitExpression.stree.txt
  48699. index 7b91a6e3667..96e3d8c857c 100644
  48700. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/NonBlockKeywordTreatedAsImplicitExpression.stree.txt
  48701. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/NonBlockKeywordTreatedAsImplicitExpression.stree.txt
  48702. @@ -1,5 +1,8 @@
  48703. -Expression block - Gen<Expr> - 3 - (0:0,0)
  48704. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  48705. - SyntaxKind.Transition;[@];
  48706. - Code span - Gen<Expr> - [is] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:1
  48707. - SyntaxKind.Keyword;[is];
  48708. +CSharpCodeBlock - [0..3)::3 - [@is]
  48709. + CSharpImplicitExpression - [0..3)::3
  48710. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  48711. + Transition;[@];
  48712. + CSharpImplicitExpressionBody - [1..3)::2
  48713. + CSharpCodeBlock - [1..3)::2
  48714. + CSharpExpressionLiteral - [1..3)::2 - [is] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  48715. + Keyword;[is];
  48716. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/StaticUsing_Complete_Spaced.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/StaticUsing_Complete_Spaced.stree.txt
  48717. index 659aa732fa9..d3cb56db95d 100644
  48718. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/StaticUsing_Complete_Spaced.stree.txt
  48719. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/StaticUsing_Complete_Spaced.stree.txt
  48720. @@ -1,13 +1,15 @@
  48721. -Directive block - Gen<None> - 40 - (0:0,0)
  48722. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  48723. - SyntaxKind.Transition;[@];
  48724. - Code span - Gen<Import: static global::System.Console;> - [using static global::System.Console] - SpanEditHandler;Accepts:AnyExceptNewline - (1:0,1) - Tokens:9
  48725. - SyntaxKind.Keyword;[using];
  48726. - SyntaxKind.Whitespace;[ ];
  48727. - SyntaxKind.Keyword;[static];
  48728. - SyntaxKind.Whitespace;[ ];
  48729. - SyntaxKind.Identifier;[global];
  48730. - SyntaxKind.DoubleColon;[::];
  48731. - SyntaxKind.Identifier;[System];
  48732. - SyntaxKind.Dot;[.];
  48733. - SyntaxKind.Identifier;[Console];
  48734. +CSharpCodeBlock - [0..40)::40 - [@using static global::System.Console]
  48735. + RazorDirective - [0..40)::40
  48736. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  48737. + Transition;[@];
  48738. + RazorDirectiveBody - [1..40)::39
  48739. + CSharpStatementLiteral - [1..40)::39 - [using static global::System.Console] - Gen<Import: static global::System.Console;> - SpanEditHandler;Accepts:AnyExceptNewline
  48740. + Keyword;[using];
  48741. + Whitespace;[ ];
  48742. + Keyword;[static];
  48743. + Whitespace;[ ];
  48744. + Identifier;[global];
  48745. + DoubleColon;[::];
  48746. + Identifier;[System];
  48747. + Dot;[.];
  48748. + Identifier;[Console];
  48749. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/StaticUsing_GlobalPrefix.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/StaticUsing_GlobalPrefix.stree.txt
  48750. index ca4687394ab..38c128b5201 100644
  48751. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/StaticUsing_GlobalPrefix.stree.txt
  48752. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/StaticUsing_GlobalPrefix.stree.txt
  48753. @@ -1,13 +1,15 @@
  48754. -Directive block - Gen<None> - 36 - (0:0,0)
  48755. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  48756. - SyntaxKind.Transition;[@];
  48757. - Code span - Gen<Import: static global::System.Console;> - [using static global::System.Console] - SpanEditHandler;Accepts:AnyExceptNewline - (1:0,1) - Tokens:9
  48758. - SyntaxKind.Keyword;[using];
  48759. - SyntaxKind.Whitespace;[ ];
  48760. - SyntaxKind.Keyword;[static];
  48761. - SyntaxKind.Whitespace;[ ];
  48762. - SyntaxKind.Identifier;[global];
  48763. - SyntaxKind.DoubleColon;[::];
  48764. - SyntaxKind.Identifier;[System];
  48765. - SyntaxKind.Dot;[.];
  48766. - SyntaxKind.Identifier;[Console];
  48767. +CSharpCodeBlock - [0..36)::36 - [@using static global::System.Console]
  48768. + RazorDirective - [0..36)::36
  48769. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  48770. + Transition;[@];
  48771. + RazorDirectiveBody - [1..36)::35
  48772. + CSharpStatementLiteral - [1..36)::35 - [using static global::System.Console] - Gen<Import: static global::System.Console;> - SpanEditHandler;Accepts:AnyExceptNewline
  48773. + Keyword;[using];
  48774. + Whitespace;[ ];
  48775. + Keyword;[static];
  48776. + Whitespace;[ ];
  48777. + Identifier;[global];
  48778. + DoubleColon;[::];
  48779. + Identifier;[System];
  48780. + Dot;[.];
  48781. + Identifier;[Console];
  48782. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/StaticUsing_MultipleIdentifiers.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/StaticUsing_MultipleIdentifiers.stree.txt
  48783. index fb3e4bc3295..9c24375956f 100644
  48784. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/StaticUsing_MultipleIdentifiers.stree.txt
  48785. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/StaticUsing_MultipleIdentifiers.stree.txt
  48786. @@ -1,11 +1,13 @@
  48787. -Directive block - Gen<None> - 28 - (0:0,0)
  48788. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  48789. - SyntaxKind.Transition;[@];
  48790. - Code span - Gen<Import: static System.Console;> - [using static System.Console] - SpanEditHandler;Accepts:AnyExceptNewline - (1:0,1) - Tokens:7
  48791. - SyntaxKind.Keyword;[using];
  48792. - SyntaxKind.Whitespace;[ ];
  48793. - SyntaxKind.Keyword;[static];
  48794. - SyntaxKind.Whitespace;[ ];
  48795. - SyntaxKind.Identifier;[System];
  48796. - SyntaxKind.Dot;[.];
  48797. - SyntaxKind.Identifier;[Console];
  48798. +CSharpCodeBlock - [0..28)::28 - [@using static System.Console]
  48799. + RazorDirective - [0..28)::28
  48800. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  48801. + Transition;[@];
  48802. + RazorDirectiveBody - [1..28)::27
  48803. + CSharpStatementLiteral - [1..28)::27 - [using static System.Console] - Gen<Import: static System.Console;> - SpanEditHandler;Accepts:AnyExceptNewline
  48804. + Keyword;[using];
  48805. + Whitespace;[ ];
  48806. + Keyword;[static];
  48807. + Whitespace;[ ];
  48808. + Identifier;[System];
  48809. + Dot;[.];
  48810. + Identifier;[Console];
  48811. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/StaticUsing_NoUsing.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/StaticUsing_NoUsing.stree.txt
  48812. index 8c7fe292aa1..1cd305cdac0 100644
  48813. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/StaticUsing_NoUsing.stree.txt
  48814. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/StaticUsing_NoUsing.stree.txt
  48815. @@ -1,7 +1,9 @@
  48816. -Directive block - Gen<None> - 13 - (0:0,0)
  48817. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  48818. - SyntaxKind.Transition;[@];
  48819. - Code span - Gen<Import: static;> - [using static] - SpanEditHandler;Accepts:AnyExceptNewline - (1:0,1) - Tokens:3
  48820. - SyntaxKind.Keyword;[using];
  48821. - SyntaxKind.Whitespace;[ ];
  48822. - SyntaxKind.Keyword;[static];
  48823. +CSharpCodeBlock - [0..13)::13 - [@using static]
  48824. + RazorDirective - [0..13)::13
  48825. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  48826. + Transition;[@];
  48827. + RazorDirectiveBody - [1..13)::12
  48828. + CSharpStatementLiteral - [1..13)::12 - [using static] - Gen<Import: static;> - SpanEditHandler;Accepts:AnyExceptNewline
  48829. + Keyword;[using];
  48830. + Whitespace;[ ];
  48831. + Keyword;[static];
  48832. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/StaticUsing_SingleIdentifier.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/StaticUsing_SingleIdentifier.stree.txt
  48833. index d618dfba5d2..d3679a82762 100644
  48834. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/StaticUsing_SingleIdentifier.stree.txt
  48835. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/StaticUsing_SingleIdentifier.stree.txt
  48836. @@ -1,9 +1,11 @@
  48837. -Directive block - Gen<None> - 20 - (0:0,0)
  48838. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  48839. - SyntaxKind.Transition;[@];
  48840. - Code span - Gen<Import: static System;> - [using static System] - SpanEditHandler;Accepts:AnyExceptNewline - (1:0,1) - Tokens:5
  48841. - SyntaxKind.Keyword;[using];
  48842. - SyntaxKind.Whitespace;[ ];
  48843. - SyntaxKind.Keyword;[static];
  48844. - SyntaxKind.Whitespace;[ ];
  48845. - SyntaxKind.Identifier;[System];
  48846. +CSharpCodeBlock - [0..20)::20 - [@using static System]
  48847. + RazorDirective - [0..20)::20
  48848. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  48849. + Transition;[@];
  48850. + RazorDirectiveBody - [1..20)::19
  48851. + CSharpStatementLiteral - [1..20)::19 - [using static System] - Gen<Import: static System;> - SpanEditHandler;Accepts:AnyExceptNewline
  48852. + Keyword;[using];
  48853. + Whitespace;[ ];
  48854. + Keyword;[static];
  48855. + Whitespace;[ ];
  48856. + Identifier;[System];
  48857. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/SwitchStatement.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/SwitchStatement.stree.txt
  48858. index 74740937b01..6ef926a783d 100644
  48859. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/SwitchStatement.stree.txt
  48860. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/SwitchStatement.stree.txt
  48861. @@ -1,17 +1,17 @@
  48862. -Statement block - Gen<None> - 23 - (0:0,0)
  48863. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  48864. - SyntaxKind.Transition;[@];
  48865. - Code span - Gen<Stmt> - [switch(foo) { foo(); }] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:13
  48866. - SyntaxKind.Keyword;[switch];
  48867. - SyntaxKind.LeftParenthesis;[(];
  48868. - SyntaxKind.Identifier;[foo];
  48869. - SyntaxKind.RightParenthesis;[)];
  48870. - SyntaxKind.Whitespace;[ ];
  48871. - SyntaxKind.LeftBrace;[{];
  48872. - SyntaxKind.Whitespace;[ ];
  48873. - SyntaxKind.Identifier;[foo];
  48874. - SyntaxKind.LeftParenthesis;[(];
  48875. - SyntaxKind.RightParenthesis;[)];
  48876. - SyntaxKind.Semicolon;[;];
  48877. - SyntaxKind.Whitespace;[ ];
  48878. - SyntaxKind.RightBrace;[}];
  48879. +CSharpCodeBlock - [0..23)::23 - [@switch(foo) { foo(); }]
  48880. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  48881. + Transition;[@];
  48882. + CSharpStatementLiteral - [1..23)::22 - [switch(foo) { foo(); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  48883. + Keyword;[switch];
  48884. + LeftParenthesis;[(];
  48885. + Identifier;[foo];
  48886. + RightParenthesis;[)];
  48887. + Whitespace;[ ];
  48888. + LeftBrace;[{];
  48889. + Whitespace;[ ];
  48890. + Identifier;[foo];
  48891. + LeftParenthesis;[(];
  48892. + RightParenthesis;[)];
  48893. + Semicolon;[;];
  48894. + Whitespace;[ ];
  48895. + RightBrace;[}];
  48896. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/TryStatement.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/TryStatement.stree.txt
  48897. index 96b61f4e110..30c1079603e 100644
  48898. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/TryStatement.stree.txt
  48899. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/TryStatement.stree.txt
  48900. @@ -1,14 +1,14 @@
  48901. -Statement block - Gen<None> - 15 - (0:0,0)
  48902. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  48903. - SyntaxKind.Transition;[@];
  48904. - Code span - Gen<Stmt> - [try { foo(); }] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:10
  48905. - SyntaxKind.Keyword;[try];
  48906. - SyntaxKind.Whitespace;[ ];
  48907. - SyntaxKind.LeftBrace;[{];
  48908. - SyntaxKind.Whitespace;[ ];
  48909. - SyntaxKind.Identifier;[foo];
  48910. - SyntaxKind.LeftParenthesis;[(];
  48911. - SyntaxKind.RightParenthesis;[)];
  48912. - SyntaxKind.Semicolon;[;];
  48913. - SyntaxKind.Whitespace;[ ];
  48914. - SyntaxKind.RightBrace;[}];
  48915. +CSharpCodeBlock - [0..15)::15 - [@try { foo(); }]
  48916. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  48917. + Transition;[@];
  48918. + CSharpStatementLiteral - [1..15)::14 - [try { foo(); }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  48919. + Keyword;[try];
  48920. + Whitespace;[ ];
  48921. + LeftBrace;[{];
  48922. + Whitespace;[ ];
  48923. + Identifier;[foo];
  48924. + LeftParenthesis;[(];
  48925. + RightParenthesis;[)];
  48926. + Semicolon;[;];
  48927. + Whitespace;[ ];
  48928. + RightBrace;[}];
  48929. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/UsingNamespaceImport.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/UsingNamespaceImport.stree.txt
  48930. index a99f6b2bc49..46b7c77895f 100644
  48931. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/UsingNamespaceImport.stree.txt
  48932. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/UsingNamespaceImport.stree.txt
  48933. @@ -1,13 +1,15 @@
  48934. -Directive block - Gen<None> - 41 - (0:0,0)
  48935. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  48936. - SyntaxKind.Transition;[@];
  48937. - Code span - Gen<Import: System.Text.Encoding.ASCIIEncoding;> - [using System.Text.Encoding.ASCIIEncoding] - SpanEditHandler;Accepts:AnyExceptNewline - (1:0,1) - Tokens:9
  48938. - SyntaxKind.Keyword;[using];
  48939. - SyntaxKind.Whitespace;[ ];
  48940. - SyntaxKind.Identifier;[System];
  48941. - SyntaxKind.Dot;[.];
  48942. - SyntaxKind.Identifier;[Text];
  48943. - SyntaxKind.Dot;[.];
  48944. - SyntaxKind.Identifier;[Encoding];
  48945. - SyntaxKind.Dot;[.];
  48946. - SyntaxKind.Identifier;[ASCIIEncoding];
  48947. +CSharpCodeBlock - [0..41)::41 - [@using System.Text.Encoding.ASCIIEncoding]
  48948. + RazorDirective - [0..41)::41
  48949. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  48950. + Transition;[@];
  48951. + RazorDirectiveBody - [1..41)::40
  48952. + CSharpStatementLiteral - [1..41)::40 - [using System.Text.Encoding.ASCIIEncoding] - Gen<Import: System.Text.Encoding.ASCIIEncoding;> - SpanEditHandler;Accepts:AnyExceptNewline
  48953. + Keyword;[using];
  48954. + Whitespace;[ ];
  48955. + Identifier;[System];
  48956. + Dot;[.];
  48957. + Identifier;[Text];
  48958. + Dot;[.];
  48959. + Identifier;[Encoding];
  48960. + Dot;[.];
  48961. + Identifier;[ASCIIEncoding];
  48962. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/UsingStatement.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/UsingStatement.stree.txt
  48963. index 652d8c2a38e..2dcb752ea31 100644
  48964. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/UsingStatement.stree.txt
  48965. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/UsingStatement.stree.txt
  48966. @@ -1,29 +1,29 @@
  48967. -Statement block - Gen<None> - 42 - (0:0,0)
  48968. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  48969. - SyntaxKind.Transition;[@];
  48970. - Code span - Gen<Stmt> - [using(var foo = new Foo()) { foo.Bar(); }] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:25
  48971. - SyntaxKind.Keyword;[using];
  48972. - SyntaxKind.LeftParenthesis;[(];
  48973. - SyntaxKind.Identifier;[var];
  48974. - SyntaxKind.Whitespace;[ ];
  48975. - SyntaxKind.Identifier;[foo];
  48976. - SyntaxKind.Whitespace;[ ];
  48977. - SyntaxKind.Assign;[=];
  48978. - SyntaxKind.Whitespace;[ ];
  48979. - SyntaxKind.Keyword;[new];
  48980. - SyntaxKind.Whitespace;[ ];
  48981. - SyntaxKind.Identifier;[Foo];
  48982. - SyntaxKind.LeftParenthesis;[(];
  48983. - SyntaxKind.RightParenthesis;[)];
  48984. - SyntaxKind.RightParenthesis;[)];
  48985. - SyntaxKind.Whitespace;[ ];
  48986. - SyntaxKind.LeftBrace;[{];
  48987. - SyntaxKind.Whitespace;[ ];
  48988. - SyntaxKind.Identifier;[foo];
  48989. - SyntaxKind.Dot;[.];
  48990. - SyntaxKind.Identifier;[Bar];
  48991. - SyntaxKind.LeftParenthesis;[(];
  48992. - SyntaxKind.RightParenthesis;[)];
  48993. - SyntaxKind.Semicolon;[;];
  48994. - SyntaxKind.Whitespace;[ ];
  48995. - SyntaxKind.RightBrace;[}];
  48996. +CSharpCodeBlock - [0..42)::42 - [@using(var foo = new Foo()) { foo.Bar(); }]
  48997. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  48998. + Transition;[@];
  48999. + CSharpStatementLiteral - [1..42)::41 - [using(var foo = new Foo()) { foo.Bar(); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  49000. + Keyword;[using];
  49001. + LeftParenthesis;[(];
  49002. + Identifier;[var];
  49003. + Whitespace;[ ];
  49004. + Identifier;[foo];
  49005. + Whitespace;[ ];
  49006. + Assign;[=];
  49007. + Whitespace;[ ];
  49008. + Keyword;[new];
  49009. + Whitespace;[ ];
  49010. + Identifier;[Foo];
  49011. + LeftParenthesis;[(];
  49012. + RightParenthesis;[)];
  49013. + RightParenthesis;[)];
  49014. + Whitespace;[ ];
  49015. + LeftBrace;[{];
  49016. + Whitespace;[ ];
  49017. + Identifier;[foo];
  49018. + Dot;[.];
  49019. + Identifier;[Bar];
  49020. + LeftParenthesis;[(];
  49021. + RightParenthesis;[)];
  49022. + Semicolon;[;];
  49023. + Whitespace;[ ];
  49024. + RightBrace;[}];
  49025. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/UsingTypeAlias.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/UsingTypeAlias.stree.txt
  49026. index 3940d00b6e2..09a89260562 100644
  49027. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/UsingTypeAlias.stree.txt
  49028. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/UsingTypeAlias.stree.txt
  49029. @@ -1,23 +1,25 @@
  49030. -Directive block - Gen<None> - 79 - (0:0,0)
  49031. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  49032. - SyntaxKind.Transition;[@];
  49033. - Code span - Gen<Import: StringDictionary = System.Collections.Generic.Dictionary<string, string>;> - [using StringDictionary = System.Collections.Generic.Dictionary<string, string>] - SpanEditHandler;Accepts:AnyExceptNewline - (1:0,1) - Tokens:19
  49034. - SyntaxKind.Keyword;[using];
  49035. - SyntaxKind.Whitespace;[ ];
  49036. - SyntaxKind.Identifier;[StringDictionary];
  49037. - SyntaxKind.Whitespace;[ ];
  49038. - SyntaxKind.Assign;[=];
  49039. - SyntaxKind.Whitespace;[ ];
  49040. - SyntaxKind.Identifier;[System];
  49041. - SyntaxKind.Dot;[.];
  49042. - SyntaxKind.Identifier;[Collections];
  49043. - SyntaxKind.Dot;[.];
  49044. - SyntaxKind.Identifier;[Generic];
  49045. - SyntaxKind.Dot;[.];
  49046. - SyntaxKind.Identifier;[Dictionary];
  49047. - SyntaxKind.LessThan;[<];
  49048. - SyntaxKind.Keyword;[string];
  49049. - SyntaxKind.Comma;[,];
  49050. - SyntaxKind.Whitespace;[ ];
  49051. - SyntaxKind.Keyword;[string];
  49052. - SyntaxKind.GreaterThan;[>];
  49053. +CSharpCodeBlock - [0..79)::79 - [@using StringDictionary = System.Collections.Generic.Dictionary<string, string>]
  49054. + RazorDirective - [0..79)::79
  49055. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49056. + Transition;[@];
  49057. + RazorDirectiveBody - [1..79)::78
  49058. + CSharpStatementLiteral - [1..79)::78 - [using StringDictionary = System.Collections.Generic.Dictionary<string, string>] - Gen<Import: StringDictionary = System.Collections.Generic.Dictionary<string, string>;> - SpanEditHandler;Accepts:AnyExceptNewline
  49059. + Keyword;[using];
  49060. + Whitespace;[ ];
  49061. + Identifier;[StringDictionary];
  49062. + Whitespace;[ ];
  49063. + Assign;[=];
  49064. + Whitespace;[ ];
  49065. + Identifier;[System];
  49066. + Dot;[.];
  49067. + Identifier;[Collections];
  49068. + Dot;[.];
  49069. + Identifier;[Generic];
  49070. + Dot;[.];
  49071. + Identifier;[Dictionary];
  49072. + LessThan;[<];
  49073. + Keyword;[string];
  49074. + Comma;[,];
  49075. + Whitespace;[ ];
  49076. + Keyword;[string];
  49077. + GreaterThan;[>];
  49078. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/WhileStatement.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/WhileStatement.stree.txt
  49079. index 9c3cab81534..b80423d15c8 100644
  49080. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/WhileStatement.stree.txt
  49081. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpStatementTest/WhileStatement.stree.txt
  49082. @@ -1,17 +1,17 @@
  49083. -Statement block - Gen<None> - 23 - (0:0,0)
  49084. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  49085. - SyntaxKind.Transition;[@];
  49086. - Code span - Gen<Stmt> - [while(true) { foo(); }] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:13
  49087. - SyntaxKind.Keyword;[while];
  49088. - SyntaxKind.LeftParenthesis;[(];
  49089. - SyntaxKind.Keyword;[true];
  49090. - SyntaxKind.RightParenthesis;[)];
  49091. - SyntaxKind.Whitespace;[ ];
  49092. - SyntaxKind.LeftBrace;[{];
  49093. - SyntaxKind.Whitespace;[ ];
  49094. - SyntaxKind.Identifier;[foo];
  49095. - SyntaxKind.LeftParenthesis;[(];
  49096. - SyntaxKind.RightParenthesis;[)];
  49097. - SyntaxKind.Semicolon;[;];
  49098. - SyntaxKind.Whitespace;[ ];
  49099. - SyntaxKind.RightBrace;[}];
  49100. +CSharpCodeBlock - [0..23)::23 - [@while(true) { foo(); }]
  49101. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49102. + Transition;[@];
  49103. + CSharpStatementLiteral - [1..23)::22 - [while(true) { foo(); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  49104. + Keyword;[while];
  49105. + LeftParenthesis;[(];
  49106. + Keyword;[true];
  49107. + RightParenthesis;[)];
  49108. + Whitespace;[ ];
  49109. + LeftBrace;[{];
  49110. + Whitespace;[ ];
  49111. + Identifier;[foo];
  49112. + LeftParenthesis;[(];
  49113. + RightParenthesis;[)];
  49114. + Semicolon;[;];
  49115. + Whitespace;[ ];
  49116. + RightBrace;[}];
  49117. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesSimpleTemplateInExplicitExpressionParens.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesSimpleTemplateInExplicitExpressionParens.stree.txt
  49118. index 497fa3ec8ec..bf9bec131ce 100644
  49119. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesSimpleTemplateInExplicitExpressionParens.stree.txt
  49120. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesSimpleTemplateInExplicitExpressionParens.stree.txt
  49121. @@ -1,39 +1,47 @@
  49122. -Expression block - Gen<Expr> - 37 - (0:0,0)
  49123. - MetaCode span - Gen<None> - [(] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  49124. - SyntaxKind.LeftParenthesis;[(];
  49125. - Code span - Gen<Expr> - [Html.Repeat(10, ] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:7
  49126. - SyntaxKind.Identifier;[Html];
  49127. - SyntaxKind.Dot;[.];
  49128. - SyntaxKind.Identifier;[Repeat];
  49129. - SyntaxKind.LeftParenthesis;[(];
  49130. - SyntaxKind.IntegerLiteral;[10];
  49131. - SyntaxKind.Comma;[,];
  49132. - SyntaxKind.Whitespace;[ ];
  49133. - Template block - Gen<Template> - 18 - (17:0,17)
  49134. - Markup block - Gen<None> - 18 - (17:0,17)
  49135. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (17:0,17) - Tokens:1
  49136. - SyntaxKind.Transition;[@];
  49137. - Tag block - Gen<None> - 3 - (18:0,18)
  49138. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (18:0,18) - Tokens:3
  49139. - SyntaxKind.OpenAngle;[<];
  49140. - SyntaxKind.Text;[p];
  49141. - SyntaxKind.CloseAngle;[>];
  49142. - Markup span - Gen<Markup> - [Foo #] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:3
  49143. - SyntaxKind.Text;[Foo];
  49144. - SyntaxKind.Whitespace;[ ];
  49145. - SyntaxKind.Text;[#];
  49146. - Expression block - Gen<Expr> - 5 - (26:0,26)
  49147. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (26:0,26) - Tokens:1
  49148. - SyntaxKind.Transition;[@];
  49149. - Code span - Gen<Expr> - [item] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (27:0,27) - Tokens:1
  49150. - SyntaxKind.Identifier;[item];
  49151. - Tag block - Gen<None> - 4 - (31:0,31)
  49152. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (31:0,31) - Tokens:4
  49153. - SyntaxKind.OpenAngle;[<];
  49154. - SyntaxKind.ForwardSlash;[/];
  49155. - SyntaxKind.Text;[p];
  49156. - SyntaxKind.CloseAngle;[>];
  49157. - Code span - Gen<Expr> - [)] - SpanEditHandler;Accepts:Any - (35:0,35) - Tokens:1
  49158. - SyntaxKind.RightParenthesis;[)];
  49159. - MetaCode span - Gen<None> - [)] - SpanEditHandler;Accepts:None - (36:0,36) - Tokens:1
  49160. - SyntaxKind.RightParenthesis;[)];
  49161. +CSharpCodeBlock - [0..37)::37 - [(Html.Repeat(10, @<p>Foo #@item</p>))]
  49162. + CSharpExplicitExpression - [0..37)::37
  49163. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  49164. + Transition;[<Missing>];
  49165. + CSharpExplicitExpressionBody - [0..37)::37
  49166. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49167. + LeftParenthesis;[(];
  49168. + CSharpCodeBlock - [1..36)::35
  49169. + CSharpExpressionLiteral - [1..17)::16 - [Html.Repeat(10, ] - Gen<Expr> - SpanEditHandler;Accepts:Any
  49170. + Identifier;[Html];
  49171. + Dot;[.];
  49172. + Identifier;[Repeat];
  49173. + LeftParenthesis;[(];
  49174. + IntegerLiteral;[10];
  49175. + Comma;[,];
  49176. + Whitespace;[ ];
  49177. + CSharpTemplateBlock - [17..35)::18
  49178. + MarkupBlock - [17..35)::18
  49179. + MarkupTransition - [17..18)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49180. + Transition;[@];
  49181. + MarkupTagBlock - [18..21)::3 - [<p>]
  49182. + MarkupTextLiteral - [18..21)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  49183. + OpenAngle;[<];
  49184. + Text;[p];
  49185. + CloseAngle;[>];
  49186. + MarkupTextLiteral - [21..26)::5 - [Foo #] - Gen<Markup> - SpanEditHandler;Accepts:Any
  49187. + Text;[Foo];
  49188. + Whitespace;[ ];
  49189. + Text;[#];
  49190. + CSharpCodeBlock - [26..31)::5
  49191. + CSharpImplicitExpression - [26..31)::5
  49192. + CSharpTransition - [26..27)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49193. + Transition;[@];
  49194. + CSharpImplicitExpressionBody - [27..31)::4
  49195. + CSharpCodeBlock - [27..31)::4
  49196. + CSharpExpressionLiteral - [27..31)::4 - [item] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  49197. + Identifier;[item];
  49198. + MarkupTagBlock - [31..35)::4 - [</p>]
  49199. + MarkupTextLiteral - [31..35)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  49200. + OpenAngle;[<];
  49201. + ForwardSlash;[/];
  49202. + Text;[p];
  49203. + CloseAngle;[>];
  49204. + CSharpExpressionLiteral - [35..36)::1 - [)] - Gen<Expr> - SpanEditHandler;Accepts:Any
  49205. + RightParenthesis;[)];
  49206. + RazorMetaCode - [36..37)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49207. + RightParenthesis;[)];
  49208. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesSimpleTemplateInImplicitExpressionParens.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesSimpleTemplateInImplicitExpressionParens.stree.txt
  49209. index 18342060a61..9109bad89c3 100644
  49210. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesSimpleTemplateInImplicitExpressionParens.stree.txt
  49211. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesSimpleTemplateInImplicitExpressionParens.stree.txt
  49212. @@ -1,35 +1,43 @@
  49213. -Expression block - Gen<Expr> - 35 - (0:0,0)
  49214. - Code span - Gen<Expr> - [Html.Repeat(10, ] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (0:0,0) - Tokens:7
  49215. - SyntaxKind.Identifier;[Html];
  49216. - SyntaxKind.Dot;[.];
  49217. - SyntaxKind.Identifier;[Repeat];
  49218. - SyntaxKind.LeftParenthesis;[(];
  49219. - SyntaxKind.IntegerLiteral;[10];
  49220. - SyntaxKind.Comma;[,];
  49221. - SyntaxKind.Whitespace;[ ];
  49222. - Template block - Gen<Template> - 18 - (16:0,16)
  49223. - Markup block - Gen<None> - 18 - (16:0,16)
  49224. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  49225. - SyntaxKind.Transition;[@];
  49226. - Tag block - Gen<None> - 3 - (17:0,17)
  49227. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (17:0,17) - Tokens:3
  49228. - SyntaxKind.OpenAngle;[<];
  49229. - SyntaxKind.Text;[p];
  49230. - SyntaxKind.CloseAngle;[>];
  49231. - Markup span - Gen<Markup> - [Foo #] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:3
  49232. - SyntaxKind.Text;[Foo];
  49233. - SyntaxKind.Whitespace;[ ];
  49234. - SyntaxKind.Text;[#];
  49235. - Expression block - Gen<Expr> - 5 - (25:0,25)
  49236. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (25:0,25) - Tokens:1
  49237. - SyntaxKind.Transition;[@];
  49238. - Code span - Gen<Expr> - [item] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (26:0,26) - Tokens:1
  49239. - SyntaxKind.Identifier;[item];
  49240. - Tag block - Gen<None> - 4 - (30:0,30)
  49241. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (30:0,30) - Tokens:4
  49242. - SyntaxKind.OpenAngle;[<];
  49243. - SyntaxKind.ForwardSlash;[/];
  49244. - SyntaxKind.Text;[p];
  49245. - SyntaxKind.CloseAngle;[>];
  49246. - Code span - Gen<Expr> - [)] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (34:0,34) - Tokens:1
  49247. - SyntaxKind.RightParenthesis;[)];
  49248. +CSharpCodeBlock - [0..35)::35 - [Html.Repeat(10, @<p>Foo #@item</p>)]
  49249. + CSharpImplicitExpression - [0..35)::35
  49250. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  49251. + Transition;[<Missing>];
  49252. + CSharpImplicitExpressionBody - [0..35)::35
  49253. + CSharpCodeBlock - [0..35)::35
  49254. + CSharpExpressionLiteral - [0..16)::16 - [Html.Repeat(10, ] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14
  49255. + Identifier;[Html];
  49256. + Dot;[.];
  49257. + Identifier;[Repeat];
  49258. + LeftParenthesis;[(];
  49259. + IntegerLiteral;[10];
  49260. + Comma;[,];
  49261. + Whitespace;[ ];
  49262. + CSharpTemplateBlock - [16..34)::18
  49263. + MarkupBlock - [16..34)::18
  49264. + MarkupTransition - [16..17)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49265. + Transition;[@];
  49266. + MarkupTagBlock - [17..20)::3 - [<p>]
  49267. + MarkupTextLiteral - [17..20)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  49268. + OpenAngle;[<];
  49269. + Text;[p];
  49270. + CloseAngle;[>];
  49271. + MarkupTextLiteral - [20..25)::5 - [Foo #] - Gen<Markup> - SpanEditHandler;Accepts:Any
  49272. + Text;[Foo];
  49273. + Whitespace;[ ];
  49274. + Text;[#];
  49275. + CSharpCodeBlock - [25..30)::5
  49276. + CSharpImplicitExpression - [25..30)::5
  49277. + CSharpTransition - [25..26)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49278. + Transition;[@];
  49279. + CSharpImplicitExpressionBody - [26..30)::4
  49280. + CSharpCodeBlock - [26..30)::4
  49281. + CSharpExpressionLiteral - [26..30)::4 - [item] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  49282. + Identifier;[item];
  49283. + MarkupTagBlock - [30..34)::4 - [</p>]
  49284. + MarkupTextLiteral - [30..34)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  49285. + OpenAngle;[<];
  49286. + ForwardSlash;[/];
  49287. + Text;[p];
  49288. + CloseAngle;[>];
  49289. + CSharpExpressionLiteral - [34..35)::1 - [)] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  49290. + RightParenthesis;[)];
  49291. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesSimpleTemplateInStatementWithinCodeBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesSimpleTemplateInStatementWithinCodeBlock.stree.txt
  49292. index 29d208eb7b2..4c3c794e1e7 100644
  49293. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesSimpleTemplateInStatementWithinCodeBlock.stree.txt
  49294. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesSimpleTemplateInStatementWithinCodeBlock.stree.txt
  49295. @@ -1,49 +1,54 @@
  49296. -Statement block - Gen<None> - 70 - (0:0,0)
  49297. - Code span - Gen<Stmt> - [foreach(foo in Bar) { Html.ExecuteTemplate(foo, ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:18
  49298. - SyntaxKind.Keyword;[foreach];
  49299. - SyntaxKind.LeftParenthesis;[(];
  49300. - SyntaxKind.Identifier;[foo];
  49301. - SyntaxKind.Whitespace;[ ];
  49302. - SyntaxKind.Keyword;[in];
  49303. - SyntaxKind.Whitespace;[ ];
  49304. - SyntaxKind.Identifier;[Bar];
  49305. - SyntaxKind.RightParenthesis;[)];
  49306. - SyntaxKind.Whitespace;[ ];
  49307. - SyntaxKind.LeftBrace;[{];
  49308. - SyntaxKind.Whitespace;[ ];
  49309. - SyntaxKind.Identifier;[Html];
  49310. - SyntaxKind.Dot;[.];
  49311. - SyntaxKind.Identifier;[ExecuteTemplate];
  49312. - SyntaxKind.LeftParenthesis;[(];
  49313. - SyntaxKind.Identifier;[foo];
  49314. - SyntaxKind.Comma;[,];
  49315. - SyntaxKind.Whitespace;[ ];
  49316. - Template block - Gen<Template> - 18 - (48:0,48)
  49317. - Markup block - Gen<None> - 18 - (48:0,48)
  49318. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (48:0,48) - Tokens:1
  49319. - SyntaxKind.Transition;[@];
  49320. - Tag block - Gen<None> - 3 - (49:0,49)
  49321. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (49:0,49) - Tokens:3
  49322. - SyntaxKind.OpenAngle;[<];
  49323. - SyntaxKind.Text;[p];
  49324. - SyntaxKind.CloseAngle;[>];
  49325. - Markup span - Gen<Markup> - [Foo #] - SpanEditHandler;Accepts:Any - (52:0,52) - Tokens:3
  49326. - SyntaxKind.Text;[Foo];
  49327. - SyntaxKind.Whitespace;[ ];
  49328. - SyntaxKind.Text;[#];
  49329. - Expression block - Gen<Expr> - 5 - (57:0,57)
  49330. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (57:0,57) - Tokens:1
  49331. - SyntaxKind.Transition;[@];
  49332. - Code span - Gen<Expr> - [item] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (58:0,58) - Tokens:1
  49333. - SyntaxKind.Identifier;[item];
  49334. - Tag block - Gen<None> - 4 - (62:0,62)
  49335. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (62:0,62) - Tokens:4
  49336. - SyntaxKind.OpenAngle;[<];
  49337. - SyntaxKind.ForwardSlash;[/];
  49338. - SyntaxKind.Text;[p];
  49339. - SyntaxKind.CloseAngle;[>];
  49340. - Code span - Gen<Stmt> - [); }] - SpanEditHandler;Accepts:None - (66:0,66) - Tokens:4
  49341. - SyntaxKind.RightParenthesis;[)];
  49342. - SyntaxKind.Semicolon;[;];
  49343. - SyntaxKind.Whitespace;[ ];
  49344. - SyntaxKind.RightBrace;[}];
  49345. +CSharpCodeBlock - [0..70)::70 - [foreach(foo in Bar) { Html.ExecuteTemplate(foo, @<p>Foo #@item</p>); }]
  49346. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  49347. + Transition;[<Missing>];
  49348. + CSharpStatementLiteral - [0..48)::48 - [foreach(foo in Bar) { Html.ExecuteTemplate(foo, ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  49349. + Keyword;[foreach];
  49350. + LeftParenthesis;[(];
  49351. + Identifier;[foo];
  49352. + Whitespace;[ ];
  49353. + Keyword;[in];
  49354. + Whitespace;[ ];
  49355. + Identifier;[Bar];
  49356. + RightParenthesis;[)];
  49357. + Whitespace;[ ];
  49358. + LeftBrace;[{];
  49359. + Whitespace;[ ];
  49360. + Identifier;[Html];
  49361. + Dot;[.];
  49362. + Identifier;[ExecuteTemplate];
  49363. + LeftParenthesis;[(];
  49364. + Identifier;[foo];
  49365. + Comma;[,];
  49366. + Whitespace;[ ];
  49367. + CSharpTemplateBlock - [48..66)::18
  49368. + MarkupBlock - [48..66)::18
  49369. + MarkupTransition - [48..49)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49370. + Transition;[@];
  49371. + MarkupTagBlock - [49..52)::3 - [<p>]
  49372. + MarkupTextLiteral - [49..52)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  49373. + OpenAngle;[<];
  49374. + Text;[p];
  49375. + CloseAngle;[>];
  49376. + MarkupTextLiteral - [52..57)::5 - [Foo #] - Gen<Markup> - SpanEditHandler;Accepts:Any
  49377. + Text;[Foo];
  49378. + Whitespace;[ ];
  49379. + Text;[#];
  49380. + CSharpCodeBlock - [57..62)::5
  49381. + CSharpImplicitExpression - [57..62)::5
  49382. + CSharpTransition - [57..58)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49383. + Transition;[@];
  49384. + CSharpImplicitExpressionBody - [58..62)::4
  49385. + CSharpCodeBlock - [58..62)::4
  49386. + CSharpExpressionLiteral - [58..62)::4 - [item] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  49387. + Identifier;[item];
  49388. + MarkupTagBlock - [62..66)::4 - [</p>]
  49389. + MarkupTextLiteral - [62..66)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  49390. + OpenAngle;[<];
  49391. + ForwardSlash;[/];
  49392. + Text;[p];
  49393. + CloseAngle;[>];
  49394. + CSharpStatementLiteral - [66..70)::4 - [); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  49395. + RightParenthesis;[)];
  49396. + Semicolon;[;];
  49397. + Whitespace;[ ];
  49398. + RightBrace;[}];
  49399. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesSimpleTemplateInStatementWithinStatementBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesSimpleTemplateInStatementWithinStatementBlock.stree.txt
  49400. index 70a5a0dab28..01cbdb5b02c 100644
  49401. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesSimpleTemplateInStatementWithinStatementBlock.stree.txt
  49402. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesSimpleTemplateInStatementWithinStatementBlock.stree.txt
  49403. @@ -1,51 +1,59 @@
  49404. -Statement block - Gen<None> - 65 - (0:0,0)
  49405. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  49406. - SyntaxKind.LeftBrace;[{];
  49407. - Code span - Gen<Stmt> - [ var foo = bar; Html.ExecuteTemplate(foo, ] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:17
  49408. - SyntaxKind.Whitespace;[ ];
  49409. - SyntaxKind.Identifier;[var];
  49410. - SyntaxKind.Whitespace;[ ];
  49411. - SyntaxKind.Identifier;[foo];
  49412. - SyntaxKind.Whitespace;[ ];
  49413. - SyntaxKind.Assign;[=];
  49414. - SyntaxKind.Whitespace;[ ];
  49415. - SyntaxKind.Identifier;[bar];
  49416. - SyntaxKind.Semicolon;[;];
  49417. - SyntaxKind.Whitespace;[ ];
  49418. - SyntaxKind.Identifier;[Html];
  49419. - SyntaxKind.Dot;[.];
  49420. - SyntaxKind.Identifier;[ExecuteTemplate];
  49421. - SyntaxKind.LeftParenthesis;[(];
  49422. - SyntaxKind.Identifier;[foo];
  49423. - SyntaxKind.Comma;[,];
  49424. - SyntaxKind.Whitespace;[ ];
  49425. - Template block - Gen<Template> - 18 - (43:0,43)
  49426. - Markup block - Gen<None> - 18 - (43:0,43)
  49427. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (43:0,43) - Tokens:1
  49428. - SyntaxKind.Transition;[@];
  49429. - Tag block - Gen<None> - 3 - (44:0,44)
  49430. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (44:0,44) - Tokens:3
  49431. - SyntaxKind.OpenAngle;[<];
  49432. - SyntaxKind.Text;[p];
  49433. - SyntaxKind.CloseAngle;[>];
  49434. - Markup span - Gen<Markup> - [Foo #] - SpanEditHandler;Accepts:Any - (47:0,47) - Tokens:3
  49435. - SyntaxKind.Text;[Foo];
  49436. - SyntaxKind.Whitespace;[ ];
  49437. - SyntaxKind.Text;[#];
  49438. - Expression block - Gen<Expr> - 5 - (52:0,52)
  49439. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (52:0,52) - Tokens:1
  49440. - SyntaxKind.Transition;[@];
  49441. - Code span - Gen<Expr> - [item] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (53:0,53) - Tokens:1
  49442. - SyntaxKind.Identifier;[item];
  49443. - Tag block - Gen<None> - 4 - (57:0,57)
  49444. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (57:0,57) - Tokens:4
  49445. - SyntaxKind.OpenAngle;[<];
  49446. - SyntaxKind.ForwardSlash;[/];
  49447. - SyntaxKind.Text;[p];
  49448. - SyntaxKind.CloseAngle;[>];
  49449. - Code span - Gen<Stmt> - [); ] - SpanEditHandler;Accepts:Any - (61:0,61) - Tokens:3
  49450. - SyntaxKind.RightParenthesis;[)];
  49451. - SyntaxKind.Semicolon;[;];
  49452. - SyntaxKind.Whitespace;[ ];
  49453. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (64:0,64) - Tokens:1
  49454. - SyntaxKind.RightBrace;[}];
  49455. +CSharpCodeBlock - [0..65)::65 - [{ var foo = bar; Html.ExecuteTemplate(foo, @<p>Foo #@item</p>); }]
  49456. + CSharpStatement - [0..65)::65
  49457. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  49458. + Transition;[<Missing>];
  49459. + CSharpStatementBody - [0..65)::65
  49460. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49461. + LeftBrace;[{];
  49462. + CSharpCodeBlock - [1..64)::63
  49463. + CSharpStatementLiteral - [1..43)::42 - [ var foo = bar; Html.ExecuteTemplate(foo, ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  49464. + Whitespace;[ ];
  49465. + Identifier;[var];
  49466. + Whitespace;[ ];
  49467. + Identifier;[foo];
  49468. + Whitespace;[ ];
  49469. + Assign;[=];
  49470. + Whitespace;[ ];
  49471. + Identifier;[bar];
  49472. + Semicolon;[;];
  49473. + Whitespace;[ ];
  49474. + Identifier;[Html];
  49475. + Dot;[.];
  49476. + Identifier;[ExecuteTemplate];
  49477. + LeftParenthesis;[(];
  49478. + Identifier;[foo];
  49479. + Comma;[,];
  49480. + Whitespace;[ ];
  49481. + CSharpTemplateBlock - [43..61)::18
  49482. + MarkupBlock - [43..61)::18
  49483. + MarkupTransition - [43..44)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49484. + Transition;[@];
  49485. + MarkupTagBlock - [44..47)::3 - [<p>]
  49486. + MarkupTextLiteral - [44..47)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  49487. + OpenAngle;[<];
  49488. + Text;[p];
  49489. + CloseAngle;[>];
  49490. + MarkupTextLiteral - [47..52)::5 - [Foo #] - Gen<Markup> - SpanEditHandler;Accepts:Any
  49491. + Text;[Foo];
  49492. + Whitespace;[ ];
  49493. + Text;[#];
  49494. + CSharpCodeBlock - [52..57)::5
  49495. + CSharpImplicitExpression - [52..57)::5
  49496. + CSharpTransition - [52..53)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49497. + Transition;[@];
  49498. + CSharpImplicitExpressionBody - [53..57)::4
  49499. + CSharpCodeBlock - [53..57)::4
  49500. + CSharpExpressionLiteral - [53..57)::4 - [item] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  49501. + Identifier;[item];
  49502. + MarkupTagBlock - [57..61)::4 - [</p>]
  49503. + MarkupTextLiteral - [57..61)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  49504. + OpenAngle;[<];
  49505. + ForwardSlash;[/];
  49506. + Text;[p];
  49507. + CloseAngle;[>];
  49508. + CSharpStatementLiteral - [61..64)::3 - [); ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  49509. + RightParenthesis;[)];
  49510. + Semicolon;[;];
  49511. + Whitespace;[ ];
  49512. + RazorMetaCode - [64..65)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49513. + RightBrace;[}];
  49514. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesSingleLineImmediatelyFollowingStatementChar.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesSingleLineImmediatelyFollowingStatementChar.stree.txt
  49515. index 2abc04cd937..5ef76fe3899 100644
  49516. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesSingleLineImmediatelyFollowingStatementChar.stree.txt
  49517. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesSingleLineImmediatelyFollowingStatementChar.stree.txt
  49518. @@ -1,19 +1,24 @@
  49519. -Statement block - Gen<None> - 11 - (0:0,0)
  49520. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  49521. - SyntaxKind.LeftBrace;[{];
  49522. - Code span - Gen<Stmt> - [i] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:1
  49523. - SyntaxKind.Identifier;[i];
  49524. - Template block - Gen<Template> - 8 - (2:0,2)
  49525. - Markup block - Gen<None> - 8 - (2:0,2)
  49526. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (2:0,2) - Tokens:1
  49527. - SyntaxKind.Transition;[@];
  49528. - MetaCode span - Gen<None> - [:] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:1
  49529. - SyntaxKind.Colon;[:];
  49530. - Markup span - Gen<Markup> - [ barLF] - SpanEditHandler;Accepts:None - (4:0,4) - Tokens:3
  49531. - SyntaxKind.Whitespace;[ ];
  49532. - SyntaxKind.Text;[bar];
  49533. - SyntaxKind.NewLine;[LF];
  49534. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (10:1,0) - Tokens:1
  49535. - SyntaxKind.Unknown;[];
  49536. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (10:1,0) - Tokens:1
  49537. - SyntaxKind.RightBrace;[}];
  49538. +CSharpCodeBlock - [0..11)::11 - [{i@: barLF}]
  49539. + CSharpStatement - [0..11)::11
  49540. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  49541. + Transition;[<Missing>];
  49542. + CSharpStatementBody - [0..11)::11
  49543. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49544. + LeftBrace;[{];
  49545. + CSharpCodeBlock - [1..10)::9
  49546. + CSharpStatementLiteral - [1..2)::1 - [i] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  49547. + Identifier;[i];
  49548. + CSharpTemplateBlock - [2..10)::8
  49549. + MarkupBlock - [2..10)::8
  49550. + MarkupTransition - [2..3)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49551. + Transition;[@];
  49552. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:Any
  49553. + Colon;[:];
  49554. + MarkupTextLiteral - [4..10)::6 - [ barLF] - Gen<Markup> - SpanEditHandler;Accepts:None
  49555. + Whitespace;[ ];
  49556. + Text;[bar];
  49557. + NewLine;[LF];
  49558. + CSharpStatementLiteral - [10..10)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  49559. + Marker;[];
  49560. + RazorMetaCode - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49561. + RightBrace;[}];
  49562. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesSingleLineTemplate.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesSingleLineTemplate.stree.txt
  49563. index d96697daa49..f9657adc19f 100644
  49564. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesSingleLineTemplate.stree.txt
  49565. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesSingleLineTemplate.stree.txt
  49566. @@ -1,26 +1,31 @@
  49567. -Statement block - Gen<None> - 23 - (0:0,0)
  49568. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  49569. - SyntaxKind.LeftBrace;[{];
  49570. - Code span - Gen<Stmt> - [ var foo = ] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:7
  49571. - SyntaxKind.Whitespace;[ ];
  49572. - SyntaxKind.Identifier;[var];
  49573. - SyntaxKind.Whitespace;[ ];
  49574. - SyntaxKind.Identifier;[foo];
  49575. - SyntaxKind.Whitespace;[ ];
  49576. - SyntaxKind.Assign;[=];
  49577. - SyntaxKind.Whitespace;[ ];
  49578. - Template block - Gen<Template> - 8 - (12:0,12)
  49579. - Markup block - Gen<None> - 8 - (12:0,12)
  49580. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:1
  49581. - SyntaxKind.Transition;[@];
  49582. - MetaCode span - Gen<None> - [:] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:1
  49583. - SyntaxKind.Colon;[:];
  49584. - Markup span - Gen<Markup> - [ barLF] - SpanEditHandler;Accepts:None - (14:0,14) - Tokens:3
  49585. - SyntaxKind.Whitespace;[ ];
  49586. - SyntaxKind.Text;[bar];
  49587. - SyntaxKind.NewLine;[LF];
  49588. - Code span - Gen<Stmt> - [; ] - SpanEditHandler;Accepts:Any - (20:1,0) - Tokens:2
  49589. - SyntaxKind.Semicolon;[;];
  49590. - SyntaxKind.Whitespace;[ ];
  49591. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (22:1,2) - Tokens:1
  49592. - SyntaxKind.RightBrace;[}];
  49593. +CSharpCodeBlock - [0..23)::23 - [{ var foo = @: barLF; }]
  49594. + CSharpStatement - [0..23)::23
  49595. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  49596. + Transition;[<Missing>];
  49597. + CSharpStatementBody - [0..23)::23
  49598. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49599. + LeftBrace;[{];
  49600. + CSharpCodeBlock - [1..22)::21
  49601. + CSharpStatementLiteral - [1..12)::11 - [ var foo = ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  49602. + Whitespace;[ ];
  49603. + Identifier;[var];
  49604. + Whitespace;[ ];
  49605. + Identifier;[foo];
  49606. + Whitespace;[ ];
  49607. + Assign;[=];
  49608. + Whitespace;[ ];
  49609. + CSharpTemplateBlock - [12..20)::8
  49610. + MarkupBlock - [12..20)::8
  49611. + MarkupTransition - [12..13)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49612. + Transition;[@];
  49613. + RazorMetaCode - [13..14)::1 - Gen<None> - SpanEditHandler;Accepts:Any
  49614. + Colon;[:];
  49615. + MarkupTextLiteral - [14..20)::6 - [ barLF] - Gen<Markup> - SpanEditHandler;Accepts:None
  49616. + Whitespace;[ ];
  49617. + Text;[bar];
  49618. + NewLine;[LF];
  49619. + CSharpStatementLiteral - [20..22)::2 - [; ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  49620. + Semicolon;[;];
  49621. + Whitespace;[ ];
  49622. + RazorMetaCode - [22..23)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49623. + RightBrace;[}];
  49624. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesTwoTemplatesInImplicitExpressionParens.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesTwoTemplatesInImplicitExpressionParens.stree.txt
  49625. index 97790938b09..1ce1f3ebeaa 100644
  49626. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesTwoTemplatesInImplicitExpressionParens.stree.txt
  49627. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesTwoTemplatesInImplicitExpressionParens.stree.txt
  49628. @@ -1,62 +1,73 @@
  49629. -Expression block - Gen<Expr> - 55 - (0:0,0)
  49630. - Code span - Gen<Expr> - [Html.Repeat(10, ] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (0:0,0) - Tokens:7
  49631. - SyntaxKind.Identifier;[Html];
  49632. - SyntaxKind.Dot;[.];
  49633. - SyntaxKind.Identifier;[Repeat];
  49634. - SyntaxKind.LeftParenthesis;[(];
  49635. - SyntaxKind.IntegerLiteral;[10];
  49636. - SyntaxKind.Comma;[,];
  49637. - SyntaxKind.Whitespace;[ ];
  49638. - Template block - Gen<Template> - 18 - (16:0,16)
  49639. - Markup block - Gen<None> - 18 - (16:0,16)
  49640. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  49641. - SyntaxKind.Transition;[@];
  49642. - Tag block - Gen<None> - 3 - (17:0,17)
  49643. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (17:0,17) - Tokens:3
  49644. - SyntaxKind.OpenAngle;[<];
  49645. - SyntaxKind.Text;[p];
  49646. - SyntaxKind.CloseAngle;[>];
  49647. - Markup span - Gen<Markup> - [Foo #] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:3
  49648. - SyntaxKind.Text;[Foo];
  49649. - SyntaxKind.Whitespace;[ ];
  49650. - SyntaxKind.Text;[#];
  49651. - Expression block - Gen<Expr> - 5 - (25:0,25)
  49652. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (25:0,25) - Tokens:1
  49653. - SyntaxKind.Transition;[@];
  49654. - Code span - Gen<Expr> - [item] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (26:0,26) - Tokens:1
  49655. - SyntaxKind.Identifier;[item];
  49656. - Tag block - Gen<None> - 4 - (30:0,30)
  49657. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (30:0,30) - Tokens:4
  49658. - SyntaxKind.OpenAngle;[<];
  49659. - SyntaxKind.ForwardSlash;[/];
  49660. - SyntaxKind.Text;[p];
  49661. - SyntaxKind.CloseAngle;[>];
  49662. - Code span - Gen<Expr> - [, ] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (34:0,34) - Tokens:2
  49663. - SyntaxKind.Comma;[,];
  49664. - SyntaxKind.Whitespace;[ ];
  49665. - Template block - Gen<Template> - 18 - (36:0,36)
  49666. - Markup block - Gen<None> - 18 - (36:0,36)
  49667. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (36:0,36) - Tokens:1
  49668. - SyntaxKind.Transition;[@];
  49669. - Tag block - Gen<None> - 3 - (37:0,37)
  49670. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (37:0,37) - Tokens:3
  49671. - SyntaxKind.OpenAngle;[<];
  49672. - SyntaxKind.Text;[p];
  49673. - SyntaxKind.CloseAngle;[>];
  49674. - Markup span - Gen<Markup> - [Foo #] - SpanEditHandler;Accepts:Any - (40:0,40) - Tokens:3
  49675. - SyntaxKind.Text;[Foo];
  49676. - SyntaxKind.Whitespace;[ ];
  49677. - SyntaxKind.Text;[#];
  49678. - Expression block - Gen<Expr> - 5 - (45:0,45)
  49679. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (45:0,45) - Tokens:1
  49680. - SyntaxKind.Transition;[@];
  49681. - Code span - Gen<Expr> - [item] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (46:0,46) - Tokens:1
  49682. - SyntaxKind.Identifier;[item];
  49683. - Tag block - Gen<None> - 4 - (50:0,50)
  49684. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (50:0,50) - Tokens:4
  49685. - SyntaxKind.OpenAngle;[<];
  49686. - SyntaxKind.ForwardSlash;[/];
  49687. - SyntaxKind.Text;[p];
  49688. - SyntaxKind.CloseAngle;[>];
  49689. - Code span - Gen<Expr> - [)] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (54:0,54) - Tokens:1
  49690. - SyntaxKind.RightParenthesis;[)];
  49691. +CSharpCodeBlock - [0..55)::55 - [Html.Repeat(10, @<p>Foo #@item</p>, @<p>Foo #@item</p>)]
  49692. + CSharpImplicitExpression - [0..55)::55
  49693. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  49694. + Transition;[<Missing>];
  49695. + CSharpImplicitExpressionBody - [0..55)::55
  49696. + CSharpCodeBlock - [0..55)::55
  49697. + CSharpExpressionLiteral - [0..16)::16 - [Html.Repeat(10, ] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14
  49698. + Identifier;[Html];
  49699. + Dot;[.];
  49700. + Identifier;[Repeat];
  49701. + LeftParenthesis;[(];
  49702. + IntegerLiteral;[10];
  49703. + Comma;[,];
  49704. + Whitespace;[ ];
  49705. + CSharpTemplateBlock - [16..34)::18
  49706. + MarkupBlock - [16..34)::18
  49707. + MarkupTransition - [16..17)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49708. + Transition;[@];
  49709. + MarkupTagBlock - [17..20)::3 - [<p>]
  49710. + MarkupTextLiteral - [17..20)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  49711. + OpenAngle;[<];
  49712. + Text;[p];
  49713. + CloseAngle;[>];
  49714. + MarkupTextLiteral - [20..25)::5 - [Foo #] - Gen<Markup> - SpanEditHandler;Accepts:Any
  49715. + Text;[Foo];
  49716. + Whitespace;[ ];
  49717. + Text;[#];
  49718. + CSharpCodeBlock - [25..30)::5
  49719. + CSharpImplicitExpression - [25..30)::5
  49720. + CSharpTransition - [25..26)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49721. + Transition;[@];
  49722. + CSharpImplicitExpressionBody - [26..30)::4
  49723. + CSharpCodeBlock - [26..30)::4
  49724. + CSharpExpressionLiteral - [26..30)::4 - [item] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  49725. + Identifier;[item];
  49726. + MarkupTagBlock - [30..34)::4 - [</p>]
  49727. + MarkupTextLiteral - [30..34)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  49728. + OpenAngle;[<];
  49729. + ForwardSlash;[/];
  49730. + Text;[p];
  49731. + CloseAngle;[>];
  49732. + CSharpExpressionLiteral - [34..36)::2 - [, ] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14
  49733. + Comma;[,];
  49734. + Whitespace;[ ];
  49735. + CSharpTemplateBlock - [36..54)::18
  49736. + MarkupBlock - [36..54)::18
  49737. + MarkupTransition - [36..37)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49738. + Transition;[@];
  49739. + MarkupTagBlock - [37..40)::3 - [<p>]
  49740. + MarkupTextLiteral - [37..40)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  49741. + OpenAngle;[<];
  49742. + Text;[p];
  49743. + CloseAngle;[>];
  49744. + MarkupTextLiteral - [40..45)::5 - [Foo #] - Gen<Markup> - SpanEditHandler;Accepts:Any
  49745. + Text;[Foo];
  49746. + Whitespace;[ ];
  49747. + Text;[#];
  49748. + CSharpCodeBlock - [45..50)::5
  49749. + CSharpImplicitExpression - [45..50)::5
  49750. + CSharpTransition - [45..46)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49751. + Transition;[@];
  49752. + CSharpImplicitExpressionBody - [46..50)::4
  49753. + CSharpCodeBlock - [46..50)::4
  49754. + CSharpExpressionLiteral - [46..50)::4 - [item] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  49755. + Identifier;[item];
  49756. + MarkupTagBlock - [50..54)::4 - [</p>]
  49757. + MarkupTextLiteral - [50..54)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  49758. + OpenAngle;[<];
  49759. + ForwardSlash;[/];
  49760. + Text;[p];
  49761. + CloseAngle;[>];
  49762. + CSharpExpressionLiteral - [54..55)::1 - [)] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  49763. + RightParenthesis;[)];
  49764. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesTwoTemplatesInStatementWithinCodeBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesTwoTemplatesInStatementWithinCodeBlock.stree.txt
  49765. index b6ecfae21c3..24d9f69fb74 100644
  49766. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesTwoTemplatesInStatementWithinCodeBlock.stree.txt
  49767. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlesTwoTemplatesInStatementWithinCodeBlock.stree.txt
  49768. @@ -1,76 +1,84 @@
  49769. -Statement block - Gen<None> - 90 - (0:0,0)
  49770. - Code span - Gen<Stmt> - [foreach(foo in Bar) { Html.ExecuteTemplate(foo, ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:18
  49771. - SyntaxKind.Keyword;[foreach];
  49772. - SyntaxKind.LeftParenthesis;[(];
  49773. - SyntaxKind.Identifier;[foo];
  49774. - SyntaxKind.Whitespace;[ ];
  49775. - SyntaxKind.Keyword;[in];
  49776. - SyntaxKind.Whitespace;[ ];
  49777. - SyntaxKind.Identifier;[Bar];
  49778. - SyntaxKind.RightParenthesis;[)];
  49779. - SyntaxKind.Whitespace;[ ];
  49780. - SyntaxKind.LeftBrace;[{];
  49781. - SyntaxKind.Whitespace;[ ];
  49782. - SyntaxKind.Identifier;[Html];
  49783. - SyntaxKind.Dot;[.];
  49784. - SyntaxKind.Identifier;[ExecuteTemplate];
  49785. - SyntaxKind.LeftParenthesis;[(];
  49786. - SyntaxKind.Identifier;[foo];
  49787. - SyntaxKind.Comma;[,];
  49788. - SyntaxKind.Whitespace;[ ];
  49789. - Template block - Gen<Template> - 18 - (48:0,48)
  49790. - Markup block - Gen<None> - 18 - (48:0,48)
  49791. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (48:0,48) - Tokens:1
  49792. - SyntaxKind.Transition;[@];
  49793. - Tag block - Gen<None> - 3 - (49:0,49)
  49794. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (49:0,49) - Tokens:3
  49795. - SyntaxKind.OpenAngle;[<];
  49796. - SyntaxKind.Text;[p];
  49797. - SyntaxKind.CloseAngle;[>];
  49798. - Markup span - Gen<Markup> - [Foo #] - SpanEditHandler;Accepts:Any - (52:0,52) - Tokens:3
  49799. - SyntaxKind.Text;[Foo];
  49800. - SyntaxKind.Whitespace;[ ];
  49801. - SyntaxKind.Text;[#];
  49802. - Expression block - Gen<Expr> - 5 - (57:0,57)
  49803. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (57:0,57) - Tokens:1
  49804. - SyntaxKind.Transition;[@];
  49805. - Code span - Gen<Expr> - [item] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (58:0,58) - Tokens:1
  49806. - SyntaxKind.Identifier;[item];
  49807. - Tag block - Gen<None> - 4 - (62:0,62)
  49808. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (62:0,62) - Tokens:4
  49809. - SyntaxKind.OpenAngle;[<];
  49810. - SyntaxKind.ForwardSlash;[/];
  49811. - SyntaxKind.Text;[p];
  49812. - SyntaxKind.CloseAngle;[>];
  49813. - Code span - Gen<Stmt> - [, ] - SpanEditHandler;Accepts:Any - (66:0,66) - Tokens:2
  49814. - SyntaxKind.Comma;[,];
  49815. - SyntaxKind.Whitespace;[ ];
  49816. - Template block - Gen<Template> - 18 - (68:0,68)
  49817. - Markup block - Gen<None> - 18 - (68:0,68)
  49818. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (68:0,68) - Tokens:1
  49819. - SyntaxKind.Transition;[@];
  49820. - Tag block - Gen<None> - 3 - (69:0,69)
  49821. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (69:0,69) - Tokens:3
  49822. - SyntaxKind.OpenAngle;[<];
  49823. - SyntaxKind.Text;[p];
  49824. - SyntaxKind.CloseAngle;[>];
  49825. - Markup span - Gen<Markup> - [Foo #] - SpanEditHandler;Accepts:Any - (72:0,72) - Tokens:3
  49826. - SyntaxKind.Text;[Foo];
  49827. - SyntaxKind.Whitespace;[ ];
  49828. - SyntaxKind.Text;[#];
  49829. - Expression block - Gen<Expr> - 5 - (77:0,77)
  49830. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (77:0,77) - Tokens:1
  49831. - SyntaxKind.Transition;[@];
  49832. - Code span - Gen<Expr> - [item] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (78:0,78) - Tokens:1
  49833. - SyntaxKind.Identifier;[item];
  49834. - Tag block - Gen<None> - 4 - (82:0,82)
  49835. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (82:0,82) - Tokens:4
  49836. - SyntaxKind.OpenAngle;[<];
  49837. - SyntaxKind.ForwardSlash;[/];
  49838. - SyntaxKind.Text;[p];
  49839. - SyntaxKind.CloseAngle;[>];
  49840. - Code span - Gen<Stmt> - [); }] - SpanEditHandler;Accepts:None - (86:0,86) - Tokens:4
  49841. - SyntaxKind.RightParenthesis;[)];
  49842. - SyntaxKind.Semicolon;[;];
  49843. - SyntaxKind.Whitespace;[ ];
  49844. - SyntaxKind.RightBrace;[}];
  49845. +CSharpCodeBlock - [0..90)::90 - [foreach(foo in Bar) { Html.ExecuteTemplate(foo, @<p>Foo #@item</p>, @<p>Foo #@item</p>); }]
  49846. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  49847. + Transition;[<Missing>];
  49848. + CSharpStatementLiteral - [0..48)::48 - [foreach(foo in Bar) { Html.ExecuteTemplate(foo, ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  49849. + Keyword;[foreach];
  49850. + LeftParenthesis;[(];
  49851. + Identifier;[foo];
  49852. + Whitespace;[ ];
  49853. + Keyword;[in];
  49854. + Whitespace;[ ];
  49855. + Identifier;[Bar];
  49856. + RightParenthesis;[)];
  49857. + Whitespace;[ ];
  49858. + LeftBrace;[{];
  49859. + Whitespace;[ ];
  49860. + Identifier;[Html];
  49861. + Dot;[.];
  49862. + Identifier;[ExecuteTemplate];
  49863. + LeftParenthesis;[(];
  49864. + Identifier;[foo];
  49865. + Comma;[,];
  49866. + Whitespace;[ ];
  49867. + CSharpTemplateBlock - [48..66)::18
  49868. + MarkupBlock - [48..66)::18
  49869. + MarkupTransition - [48..49)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49870. + Transition;[@];
  49871. + MarkupTagBlock - [49..52)::3 - [<p>]
  49872. + MarkupTextLiteral - [49..52)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  49873. + OpenAngle;[<];
  49874. + Text;[p];
  49875. + CloseAngle;[>];
  49876. + MarkupTextLiteral - [52..57)::5 - [Foo #] - Gen<Markup> - SpanEditHandler;Accepts:Any
  49877. + Text;[Foo];
  49878. + Whitespace;[ ];
  49879. + Text;[#];
  49880. + CSharpCodeBlock - [57..62)::5
  49881. + CSharpImplicitExpression - [57..62)::5
  49882. + CSharpTransition - [57..58)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49883. + Transition;[@];
  49884. + CSharpImplicitExpressionBody - [58..62)::4
  49885. + CSharpCodeBlock - [58..62)::4
  49886. + CSharpExpressionLiteral - [58..62)::4 - [item] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  49887. + Identifier;[item];
  49888. + MarkupTagBlock - [62..66)::4 - [</p>]
  49889. + MarkupTextLiteral - [62..66)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  49890. + OpenAngle;[<];
  49891. + ForwardSlash;[/];
  49892. + Text;[p];
  49893. + CloseAngle;[>];
  49894. + CSharpStatementLiteral - [66..68)::2 - [, ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  49895. + Comma;[,];
  49896. + Whitespace;[ ];
  49897. + CSharpTemplateBlock - [68..86)::18
  49898. + MarkupBlock - [68..86)::18
  49899. + MarkupTransition - [68..69)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49900. + Transition;[@];
  49901. + MarkupTagBlock - [69..72)::3 - [<p>]
  49902. + MarkupTextLiteral - [69..72)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  49903. + OpenAngle;[<];
  49904. + Text;[p];
  49905. + CloseAngle;[>];
  49906. + MarkupTextLiteral - [72..77)::5 - [Foo #] - Gen<Markup> - SpanEditHandler;Accepts:Any
  49907. + Text;[Foo];
  49908. + Whitespace;[ ];
  49909. + Text;[#];
  49910. + CSharpCodeBlock - [77..82)::5
  49911. + CSharpImplicitExpression - [77..82)::5
  49912. + CSharpTransition - [77..78)::1 - Gen<None> - SpanEditHandler;Accepts:None
  49913. + Transition;[@];
  49914. + CSharpImplicitExpressionBody - [78..82)::4
  49915. + CSharpCodeBlock - [78..82)::4
  49916. + CSharpExpressionLiteral - [78..82)::4 - [item] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  49917. + Identifier;[item];
  49918. + MarkupTagBlock - [82..86)::4 - [</p>]
  49919. + MarkupTextLiteral - [82..86)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  49920. + OpenAngle;[<];
  49921. + ForwardSlash;[/];
  49922. + Text;[p];
  49923. + CloseAngle;[>];
  49924. + CSharpStatementLiteral - [86..90)::4 - [); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  49925. + RightParenthesis;[)];
  49926. + Semicolon;[;];
  49927. + Whitespace;[ ];
  49928. + RightBrace;[}];
  49929. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlessTwoTemplatesInStatementWithinStatementBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlessTwoTemplatesInStatementWithinStatementBlock.stree.txt
  49930. index 63cb4d3d9e0..80066eeca6a 100644
  49931. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlessTwoTemplatesInStatementWithinStatementBlock.stree.txt
  49932. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/HandlessTwoTemplatesInStatementWithinStatementBlock.stree.txt
  49933. @@ -1,78 +1,89 @@
  49934. -Statement block - Gen<None> - 85 - (0:0,0)
  49935. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  49936. - SyntaxKind.LeftBrace;[{];
  49937. - Code span - Gen<Stmt> - [ var foo = bar; Html.ExecuteTemplate(foo, ] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:17
  49938. - SyntaxKind.Whitespace;[ ];
  49939. - SyntaxKind.Identifier;[var];
  49940. - SyntaxKind.Whitespace;[ ];
  49941. - SyntaxKind.Identifier;[foo];
  49942. - SyntaxKind.Whitespace;[ ];
  49943. - SyntaxKind.Assign;[=];
  49944. - SyntaxKind.Whitespace;[ ];
  49945. - SyntaxKind.Identifier;[bar];
  49946. - SyntaxKind.Semicolon;[;];
  49947. - SyntaxKind.Whitespace;[ ];
  49948. - SyntaxKind.Identifier;[Html];
  49949. - SyntaxKind.Dot;[.];
  49950. - SyntaxKind.Identifier;[ExecuteTemplate];
  49951. - SyntaxKind.LeftParenthesis;[(];
  49952. - SyntaxKind.Identifier;[foo];
  49953. - SyntaxKind.Comma;[,];
  49954. - SyntaxKind.Whitespace;[ ];
  49955. - Template block - Gen<Template> - 18 - (43:0,43)
  49956. - Markup block - Gen<None> - 18 - (43:0,43)
  49957. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (43:0,43) - Tokens:1
  49958. - SyntaxKind.Transition;[@];
  49959. - Tag block - Gen<None> - 3 - (44:0,44)
  49960. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (44:0,44) - Tokens:3
  49961. - SyntaxKind.OpenAngle;[<];
  49962. - SyntaxKind.Text;[p];
  49963. - SyntaxKind.CloseAngle;[>];
  49964. - Markup span - Gen<Markup> - [Foo #] - SpanEditHandler;Accepts:Any - (47:0,47) - Tokens:3
  49965. - SyntaxKind.Text;[Foo];
  49966. - SyntaxKind.Whitespace;[ ];
  49967. - SyntaxKind.Text;[#];
  49968. - Expression block - Gen<Expr> - 5 - (52:0,52)
  49969. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (52:0,52) - Tokens:1
  49970. - SyntaxKind.Transition;[@];
  49971. - Code span - Gen<Expr> - [item] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (53:0,53) - Tokens:1
  49972. - SyntaxKind.Identifier;[item];
  49973. - Tag block - Gen<None> - 4 - (57:0,57)
  49974. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (57:0,57) - Tokens:4
  49975. - SyntaxKind.OpenAngle;[<];
  49976. - SyntaxKind.ForwardSlash;[/];
  49977. - SyntaxKind.Text;[p];
  49978. - SyntaxKind.CloseAngle;[>];
  49979. - Code span - Gen<Stmt> - [, ] - SpanEditHandler;Accepts:Any - (61:0,61) - Tokens:2
  49980. - SyntaxKind.Comma;[,];
  49981. - SyntaxKind.Whitespace;[ ];
  49982. - Template block - Gen<Template> - 18 - (63:0,63)
  49983. - Markup block - Gen<None> - 18 - (63:0,63)
  49984. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (63:0,63) - Tokens:1
  49985. - SyntaxKind.Transition;[@];
  49986. - Tag block - Gen<None> - 3 - (64:0,64)
  49987. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (64:0,64) - Tokens:3
  49988. - SyntaxKind.OpenAngle;[<];
  49989. - SyntaxKind.Text;[p];
  49990. - SyntaxKind.CloseAngle;[>];
  49991. - Markup span - Gen<Markup> - [Foo #] - SpanEditHandler;Accepts:Any - (67:0,67) - Tokens:3
  49992. - SyntaxKind.Text;[Foo];
  49993. - SyntaxKind.Whitespace;[ ];
  49994. - SyntaxKind.Text;[#];
  49995. - Expression block - Gen<Expr> - 5 - (72:0,72)
  49996. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (72:0,72) - Tokens:1
  49997. - SyntaxKind.Transition;[@];
  49998. - Code span - Gen<Expr> - [item] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (73:0,73) - Tokens:1
  49999. - SyntaxKind.Identifier;[item];
  50000. - Tag block - Gen<None> - 4 - (77:0,77)
  50001. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (77:0,77) - Tokens:4
  50002. - SyntaxKind.OpenAngle;[<];
  50003. - SyntaxKind.ForwardSlash;[/];
  50004. - SyntaxKind.Text;[p];
  50005. - SyntaxKind.CloseAngle;[>];
  50006. - Code span - Gen<Stmt> - [); ] - SpanEditHandler;Accepts:Any - (81:0,81) - Tokens:3
  50007. - SyntaxKind.RightParenthesis;[)];
  50008. - SyntaxKind.Semicolon;[;];
  50009. - SyntaxKind.Whitespace;[ ];
  50010. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (84:0,84) - Tokens:1
  50011. - SyntaxKind.RightBrace;[}];
  50012. +CSharpCodeBlock - [0..85)::85 - [{ var foo = bar; Html.ExecuteTemplate(foo, @<p>Foo #@item</p>, @<p>Foo #@item</p>); }]
  50013. + CSharpStatement - [0..85)::85
  50014. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  50015. + Transition;[<Missing>];
  50016. + CSharpStatementBody - [0..85)::85
  50017. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  50018. + LeftBrace;[{];
  50019. + CSharpCodeBlock - [1..84)::83
  50020. + CSharpStatementLiteral - [1..43)::42 - [ var foo = bar; Html.ExecuteTemplate(foo, ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  50021. + Whitespace;[ ];
  50022. + Identifier;[var];
  50023. + Whitespace;[ ];
  50024. + Identifier;[foo];
  50025. + Whitespace;[ ];
  50026. + Assign;[=];
  50027. + Whitespace;[ ];
  50028. + Identifier;[bar];
  50029. + Semicolon;[;];
  50030. + Whitespace;[ ];
  50031. + Identifier;[Html];
  50032. + Dot;[.];
  50033. + Identifier;[ExecuteTemplate];
  50034. + LeftParenthesis;[(];
  50035. + Identifier;[foo];
  50036. + Comma;[,];
  50037. + Whitespace;[ ];
  50038. + CSharpTemplateBlock - [43..61)::18
  50039. + MarkupBlock - [43..61)::18
  50040. + MarkupTransition - [43..44)::1 - Gen<None> - SpanEditHandler;Accepts:None
  50041. + Transition;[@];
  50042. + MarkupTagBlock - [44..47)::3 - [<p>]
  50043. + MarkupTextLiteral - [44..47)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  50044. + OpenAngle;[<];
  50045. + Text;[p];
  50046. + CloseAngle;[>];
  50047. + MarkupTextLiteral - [47..52)::5 - [Foo #] - Gen<Markup> - SpanEditHandler;Accepts:Any
  50048. + Text;[Foo];
  50049. + Whitespace;[ ];
  50050. + Text;[#];
  50051. + CSharpCodeBlock - [52..57)::5
  50052. + CSharpImplicitExpression - [52..57)::5
  50053. + CSharpTransition - [52..53)::1 - Gen<None> - SpanEditHandler;Accepts:None
  50054. + Transition;[@];
  50055. + CSharpImplicitExpressionBody - [53..57)::4
  50056. + CSharpCodeBlock - [53..57)::4
  50057. + CSharpExpressionLiteral - [53..57)::4 - [item] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  50058. + Identifier;[item];
  50059. + MarkupTagBlock - [57..61)::4 - [</p>]
  50060. + MarkupTextLiteral - [57..61)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  50061. + OpenAngle;[<];
  50062. + ForwardSlash;[/];
  50063. + Text;[p];
  50064. + CloseAngle;[>];
  50065. + CSharpStatementLiteral - [61..63)::2 - [, ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  50066. + Comma;[,];
  50067. + Whitespace;[ ];
  50068. + CSharpTemplateBlock - [63..81)::18
  50069. + MarkupBlock - [63..81)::18
  50070. + MarkupTransition - [63..64)::1 - Gen<None> - SpanEditHandler;Accepts:None
  50071. + Transition;[@];
  50072. + MarkupTagBlock - [64..67)::3 - [<p>]
  50073. + MarkupTextLiteral - [64..67)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  50074. + OpenAngle;[<];
  50075. + Text;[p];
  50076. + CloseAngle;[>];
  50077. + MarkupTextLiteral - [67..72)::5 - [Foo #] - Gen<Markup> - SpanEditHandler;Accepts:Any
  50078. + Text;[Foo];
  50079. + Whitespace;[ ];
  50080. + Text;[#];
  50081. + CSharpCodeBlock - [72..77)::5
  50082. + CSharpImplicitExpression - [72..77)::5
  50083. + CSharpTransition - [72..73)::1 - Gen<None> - SpanEditHandler;Accepts:None
  50084. + Transition;[@];
  50085. + CSharpImplicitExpressionBody - [73..77)::4
  50086. + CSharpCodeBlock - [73..77)::4
  50087. + CSharpExpressionLiteral - [73..77)::4 - [item] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  50088. + Identifier;[item];
  50089. + MarkupTagBlock - [77..81)::4 - [</p>]
  50090. + MarkupTextLiteral - [77..81)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  50091. + OpenAngle;[<];
  50092. + ForwardSlash;[/];
  50093. + Text;[p];
  50094. + CloseAngle;[>];
  50095. + CSharpStatementLiteral - [81..84)::3 - [); ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  50096. + RightParenthesis;[)];
  50097. + Semicolon;[;];
  50098. + Whitespace;[ ];
  50099. + RazorMetaCode - [84..85)::1 - Gen<None> - SpanEditHandler;Accepts:None
  50100. + RightBrace;[}];
  50101. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ProducesErrorButCorrectlyParsesNestedTemplateInImplicitExprParens.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ProducesErrorButCorrectlyParsesNestedTemplateInImplicitExprParens.stree.txt
  50102. index 7eb9b4a01f2..1b38b90203d 100644
  50103. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ProducesErrorButCorrectlyParsesNestedTemplateInImplicitExprParens.stree.txt
  50104. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ProducesErrorButCorrectlyParsesNestedTemplateInImplicitExprParens.stree.txt
  50105. @@ -1,65 +1,76 @@
  50106. -Expression block - Gen<Expr> - 61 - (0:0,0)
  50107. - Code span - Gen<Expr> - [Html.Repeat(10, ] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (0:0,0) - Tokens:7
  50108. - SyntaxKind.Identifier;[Html];
  50109. - SyntaxKind.Dot;[.];
  50110. - SyntaxKind.Identifier;[Repeat];
  50111. - SyntaxKind.LeftParenthesis;[(];
  50112. - SyntaxKind.IntegerLiteral;[10];
  50113. - SyntaxKind.Comma;[,];
  50114. - SyntaxKind.Whitespace;[ ];
  50115. - Template block - Gen<Template> - 44 - (16:0,16)
  50116. - Markup block - Gen<None> - 44 - (16:0,16)
  50117. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  50118. - SyntaxKind.Transition;[@];
  50119. - Tag block - Gen<None> - 3 - (17:0,17)
  50120. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (17:0,17) - Tokens:3
  50121. - SyntaxKind.OpenAngle;[<];
  50122. - SyntaxKind.Text;[p];
  50123. - SyntaxKind.CloseAngle;[>];
  50124. - Markup span - Gen<Markup> - [Foo #] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:3
  50125. - SyntaxKind.Text;[Foo];
  50126. - SyntaxKind.Whitespace;[ ];
  50127. - SyntaxKind.Text;[#];
  50128. - Expression block - Gen<Expr> - 31 - (25:0,25)
  50129. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (25:0,25) - Tokens:1
  50130. - SyntaxKind.Transition;[@];
  50131. - Code span - Gen<Expr> - [Html.Repeat(10, ] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (26:0,26) - Tokens:7
  50132. - SyntaxKind.Identifier;[Html];
  50133. - SyntaxKind.Dot;[.];
  50134. - SyntaxKind.Identifier;[Repeat];
  50135. - SyntaxKind.LeftParenthesis;[(];
  50136. - SyntaxKind.IntegerLiteral;[10];
  50137. - SyntaxKind.Comma;[,];
  50138. - SyntaxKind.Whitespace;[ ];
  50139. - Template block - Gen<Template> - 13 - (42:0,42)
  50140. - Markup block - Gen<None> - 13 - (42:0,42)
  50141. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (42:0,42) - Tokens:1
  50142. - SyntaxKind.Transition;[@];
  50143. - Tag block - Gen<None> - 3 - (43:0,43)
  50144. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (43:0,43) - Tokens:3
  50145. - SyntaxKind.OpenAngle;[<];
  50146. - SyntaxKind.Text;[p];
  50147. - SyntaxKind.CloseAngle;[>];
  50148. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (46:0,46) - Tokens:1
  50149. - SyntaxKind.Unknown;[];
  50150. - Expression block - Gen<Expr> - 5 - (46:0,46)
  50151. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (46:0,46) - Tokens:1
  50152. - SyntaxKind.Transition;[@];
  50153. - Code span - Gen<Expr> - [item] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (47:0,47) - Tokens:1
  50154. - SyntaxKind.Identifier;[item];
  50155. - Tag block - Gen<None> - 4 - (51:0,51)
  50156. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (51:0,51) - Tokens:4
  50157. - SyntaxKind.OpenAngle;[<];
  50158. - SyntaxKind.ForwardSlash;[/];
  50159. - SyntaxKind.Text;[p];
  50160. - SyntaxKind.CloseAngle;[>];
  50161. - Code span - Gen<Expr> - [)] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (55:0,55) - Tokens:1
  50162. - SyntaxKind.RightParenthesis;[)];
  50163. - Tag block - Gen<None> - 4 - (56:0,56)
  50164. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (56:0,56) - Tokens:4
  50165. - SyntaxKind.OpenAngle;[<];
  50166. - SyntaxKind.ForwardSlash;[/];
  50167. - SyntaxKind.Text;[p];
  50168. - SyntaxKind.CloseAngle;[>];
  50169. - Code span - Gen<Expr> - [)] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (60:0,60) - Tokens:1
  50170. - SyntaxKind.RightParenthesis;[)];
  50171. +CSharpCodeBlock - [0..61)::61 - [Html.Repeat(10, @<p>Foo #@Html.Repeat(10, @<p>@item</p>)</p>)]
  50172. + CSharpImplicitExpression - [0..61)::61
  50173. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  50174. + Transition;[<Missing>];
  50175. + CSharpImplicitExpressionBody - [0..61)::61
  50176. + CSharpCodeBlock - [0..61)::61
  50177. + CSharpExpressionLiteral - [0..16)::16 - [Html.Repeat(10, ] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14
  50178. + Identifier;[Html];
  50179. + Dot;[.];
  50180. + Identifier;[Repeat];
  50181. + LeftParenthesis;[(];
  50182. + IntegerLiteral;[10];
  50183. + Comma;[,];
  50184. + Whitespace;[ ];
  50185. + CSharpTemplateBlock - [16..60)::44
  50186. + MarkupBlock - [16..60)::44
  50187. + MarkupTransition - [16..17)::1 - Gen<None> - SpanEditHandler;Accepts:None
  50188. + Transition;[@];
  50189. + MarkupTagBlock - [17..20)::3 - [<p>]
  50190. + MarkupTextLiteral - [17..20)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  50191. + OpenAngle;[<];
  50192. + Text;[p];
  50193. + CloseAngle;[>];
  50194. + MarkupTextLiteral - [20..25)::5 - [Foo #] - Gen<Markup> - SpanEditHandler;Accepts:Any
  50195. + Text;[Foo];
  50196. + Whitespace;[ ];
  50197. + Text;[#];
  50198. + CSharpCodeBlock - [25..56)::31
  50199. + CSharpImplicitExpression - [25..56)::31
  50200. + CSharpTransition - [25..26)::1 - Gen<None> - SpanEditHandler;Accepts:None
  50201. + Transition;[@];
  50202. + CSharpImplicitExpressionBody - [26..56)::30
  50203. + CSharpCodeBlock - [26..56)::30
  50204. + CSharpExpressionLiteral - [26..42)::16 - [Html.Repeat(10, ] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14
  50205. + Identifier;[Html];
  50206. + Dot;[.];
  50207. + Identifier;[Repeat];
  50208. + LeftParenthesis;[(];
  50209. + IntegerLiteral;[10];
  50210. + Comma;[,];
  50211. + Whitespace;[ ];
  50212. + CSharpTemplateBlock - [42..55)::13
  50213. + MarkupBlock - [42..55)::13
  50214. + MarkupTransition - [42..43)::1 - Gen<None> - SpanEditHandler;Accepts:None
  50215. + Transition;[@];
  50216. + MarkupTagBlock - [43..46)::3 - [<p>]
  50217. + MarkupTextLiteral - [43..46)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  50218. + OpenAngle;[<];
  50219. + Text;[p];
  50220. + CloseAngle;[>];
  50221. + MarkupTextLiteral - [46..46)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  50222. + Marker;[];
  50223. + CSharpCodeBlock - [46..51)::5
  50224. + CSharpImplicitExpression - [46..51)::5
  50225. + CSharpTransition - [46..47)::1 - Gen<None> - SpanEditHandler;Accepts:None
  50226. + Transition;[@];
  50227. + CSharpImplicitExpressionBody - [47..51)::4
  50228. + CSharpCodeBlock - [47..51)::4
  50229. + CSharpExpressionLiteral - [47..51)::4 - [item] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  50230. + Identifier;[item];
  50231. + MarkupTagBlock - [51..55)::4 - [</p>]
  50232. + MarkupTextLiteral - [51..55)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  50233. + OpenAngle;[<];
  50234. + ForwardSlash;[/];
  50235. + Text;[p];
  50236. + CloseAngle;[>];
  50237. + CSharpExpressionLiteral - [55..56)::1 - [)] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  50238. + RightParenthesis;[)];
  50239. + MarkupTagBlock - [56..60)::4 - [</p>]
  50240. + MarkupTextLiteral - [56..60)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  50241. + OpenAngle;[<];
  50242. + ForwardSlash;[/];
  50243. + Text;[p];
  50244. + CloseAngle;[>];
  50245. + CSharpExpressionLiteral - [60..61)::1 - [)] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  50246. + RightParenthesis;[)];
  50247. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ProducesErrorButCorrectlyParsesNestedTemplateInStmtWithinCodeBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ProducesErrorButCorrectlyParsesNestedTemplateInStmtWithinCodeBlock.stree.txt
  50248. index eb0dc723d2c..96f4194268c 100644
  50249. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ProducesErrorButCorrectlyParsesNestedTemplateInStmtWithinCodeBlock.stree.txt
  50250. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ProducesErrorButCorrectlyParsesNestedTemplateInStmtWithinCodeBlock.stree.txt
  50251. @@ -1,79 +1,87 @@
  50252. -Statement block - Gen<None> - 96 - (0:0,0)
  50253. - Code span - Gen<Stmt> - [foreach(foo in Bar) { Html.ExecuteTemplate(foo, ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:18
  50254. - SyntaxKind.Keyword;[foreach];
  50255. - SyntaxKind.LeftParenthesis;[(];
  50256. - SyntaxKind.Identifier;[foo];
  50257. - SyntaxKind.Whitespace;[ ];
  50258. - SyntaxKind.Keyword;[in];
  50259. - SyntaxKind.Whitespace;[ ];
  50260. - SyntaxKind.Identifier;[Bar];
  50261. - SyntaxKind.RightParenthesis;[)];
  50262. - SyntaxKind.Whitespace;[ ];
  50263. - SyntaxKind.LeftBrace;[{];
  50264. - SyntaxKind.Whitespace;[ ];
  50265. - SyntaxKind.Identifier;[Html];
  50266. - SyntaxKind.Dot;[.];
  50267. - SyntaxKind.Identifier;[ExecuteTemplate];
  50268. - SyntaxKind.LeftParenthesis;[(];
  50269. - SyntaxKind.Identifier;[foo];
  50270. - SyntaxKind.Comma;[,];
  50271. - SyntaxKind.Whitespace;[ ];
  50272. - Template block - Gen<Template> - 44 - (48:0,48)
  50273. - Markup block - Gen<None> - 44 - (48:0,48)
  50274. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (48:0,48) - Tokens:1
  50275. - SyntaxKind.Transition;[@];
  50276. - Tag block - Gen<None> - 3 - (49:0,49)
  50277. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (49:0,49) - Tokens:3
  50278. - SyntaxKind.OpenAngle;[<];
  50279. - SyntaxKind.Text;[p];
  50280. - SyntaxKind.CloseAngle;[>];
  50281. - Markup span - Gen<Markup> - [Foo #] - SpanEditHandler;Accepts:Any - (52:0,52) - Tokens:3
  50282. - SyntaxKind.Text;[Foo];
  50283. - SyntaxKind.Whitespace;[ ];
  50284. - SyntaxKind.Text;[#];
  50285. - Expression block - Gen<Expr> - 31 - (57:0,57)
  50286. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (57:0,57) - Tokens:1
  50287. - SyntaxKind.Transition;[@];
  50288. - Code span - Gen<Expr> - [Html.Repeat(10, ] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (58:0,58) - Tokens:7
  50289. - SyntaxKind.Identifier;[Html];
  50290. - SyntaxKind.Dot;[.];
  50291. - SyntaxKind.Identifier;[Repeat];
  50292. - SyntaxKind.LeftParenthesis;[(];
  50293. - SyntaxKind.IntegerLiteral;[10];
  50294. - SyntaxKind.Comma;[,];
  50295. - SyntaxKind.Whitespace;[ ];
  50296. - Template block - Gen<Template> - 13 - (74:0,74)
  50297. - Markup block - Gen<None> - 13 - (74:0,74)
  50298. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (74:0,74) - Tokens:1
  50299. - SyntaxKind.Transition;[@];
  50300. - Tag block - Gen<None> - 3 - (75:0,75)
  50301. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (75:0,75) - Tokens:3
  50302. - SyntaxKind.OpenAngle;[<];
  50303. - SyntaxKind.Text;[p];
  50304. - SyntaxKind.CloseAngle;[>];
  50305. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (78:0,78) - Tokens:1
  50306. - SyntaxKind.Unknown;[];
  50307. - Expression block - Gen<Expr> - 5 - (78:0,78)
  50308. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (78:0,78) - Tokens:1
  50309. - SyntaxKind.Transition;[@];
  50310. - Code span - Gen<Expr> - [item] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (79:0,79) - Tokens:1
  50311. - SyntaxKind.Identifier;[item];
  50312. - Tag block - Gen<None> - 4 - (83:0,83)
  50313. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (83:0,83) - Tokens:4
  50314. - SyntaxKind.OpenAngle;[<];
  50315. - SyntaxKind.ForwardSlash;[/];
  50316. - SyntaxKind.Text;[p];
  50317. - SyntaxKind.CloseAngle;[>];
  50318. - Code span - Gen<Expr> - [)] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (87:0,87) - Tokens:1
  50319. - SyntaxKind.RightParenthesis;[)];
  50320. - Tag block - Gen<None> - 4 - (88:0,88)
  50321. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (88:0,88) - Tokens:4
  50322. - SyntaxKind.OpenAngle;[<];
  50323. - SyntaxKind.ForwardSlash;[/];
  50324. - SyntaxKind.Text;[p];
  50325. - SyntaxKind.CloseAngle;[>];
  50326. - Code span - Gen<Stmt> - [); }] - SpanEditHandler;Accepts:None - (92:0,92) - Tokens:4
  50327. - SyntaxKind.RightParenthesis;[)];
  50328. - SyntaxKind.Semicolon;[;];
  50329. - SyntaxKind.Whitespace;[ ];
  50330. - SyntaxKind.RightBrace;[}];
  50331. +CSharpCodeBlock - [0..96)::96 - [foreach(foo in Bar) { Html.ExecuteTemplate(foo, @<p>Foo #@Html.Repeat(10, @<p>@item</p>)</p>); }]
  50332. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  50333. + Transition;[<Missing>];
  50334. + CSharpStatementLiteral - [0..48)::48 - [foreach(foo in Bar) { Html.ExecuteTemplate(foo, ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  50335. + Keyword;[foreach];
  50336. + LeftParenthesis;[(];
  50337. + Identifier;[foo];
  50338. + Whitespace;[ ];
  50339. + Keyword;[in];
  50340. + Whitespace;[ ];
  50341. + Identifier;[Bar];
  50342. + RightParenthesis;[)];
  50343. + Whitespace;[ ];
  50344. + LeftBrace;[{];
  50345. + Whitespace;[ ];
  50346. + Identifier;[Html];
  50347. + Dot;[.];
  50348. + Identifier;[ExecuteTemplate];
  50349. + LeftParenthesis;[(];
  50350. + Identifier;[foo];
  50351. + Comma;[,];
  50352. + Whitespace;[ ];
  50353. + CSharpTemplateBlock - [48..92)::44
  50354. + MarkupBlock - [48..92)::44
  50355. + MarkupTransition - [48..49)::1 - Gen<None> - SpanEditHandler;Accepts:None
  50356. + Transition;[@];
  50357. + MarkupTagBlock - [49..52)::3 - [<p>]
  50358. + MarkupTextLiteral - [49..52)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  50359. + OpenAngle;[<];
  50360. + Text;[p];
  50361. + CloseAngle;[>];
  50362. + MarkupTextLiteral - [52..57)::5 - [Foo #] - Gen<Markup> - SpanEditHandler;Accepts:Any
  50363. + Text;[Foo];
  50364. + Whitespace;[ ];
  50365. + Text;[#];
  50366. + CSharpCodeBlock - [57..88)::31
  50367. + CSharpImplicitExpression - [57..88)::31
  50368. + CSharpTransition - [57..58)::1 - Gen<None> - SpanEditHandler;Accepts:None
  50369. + Transition;[@];
  50370. + CSharpImplicitExpressionBody - [58..88)::30
  50371. + CSharpCodeBlock - [58..88)::30
  50372. + CSharpExpressionLiteral - [58..74)::16 - [Html.Repeat(10, ] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14
  50373. + Identifier;[Html];
  50374. + Dot;[.];
  50375. + Identifier;[Repeat];
  50376. + LeftParenthesis;[(];
  50377. + IntegerLiteral;[10];
  50378. + Comma;[,];
  50379. + Whitespace;[ ];
  50380. + CSharpTemplateBlock - [74..87)::13
  50381. + MarkupBlock - [74..87)::13
  50382. + MarkupTransition - [74..75)::1 - Gen<None> - SpanEditHandler;Accepts:None
  50383. + Transition;[@];
  50384. + MarkupTagBlock - [75..78)::3 - [<p>]
  50385. + MarkupTextLiteral - [75..78)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  50386. + OpenAngle;[<];
  50387. + Text;[p];
  50388. + CloseAngle;[>];
  50389. + MarkupTextLiteral - [78..78)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  50390. + Marker;[];
  50391. + CSharpCodeBlock - [78..83)::5
  50392. + CSharpImplicitExpression - [78..83)::5
  50393. + CSharpTransition - [78..79)::1 - Gen<None> - SpanEditHandler;Accepts:None
  50394. + Transition;[@];
  50395. + CSharpImplicitExpressionBody - [79..83)::4
  50396. + CSharpCodeBlock - [79..83)::4
  50397. + CSharpExpressionLiteral - [79..83)::4 - [item] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  50398. + Identifier;[item];
  50399. + MarkupTagBlock - [83..87)::4 - [</p>]
  50400. + MarkupTextLiteral - [83..87)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  50401. + OpenAngle;[<];
  50402. + ForwardSlash;[/];
  50403. + Text;[p];
  50404. + CloseAngle;[>];
  50405. + CSharpExpressionLiteral - [87..88)::1 - [)] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  50406. + RightParenthesis;[)];
  50407. + MarkupTagBlock - [88..92)::4 - [</p>]
  50408. + MarkupTextLiteral - [88..92)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  50409. + OpenAngle;[<];
  50410. + ForwardSlash;[/];
  50411. + Text;[p];
  50412. + CloseAngle;[>];
  50413. + CSharpStatementLiteral - [92..96)::4 - [); }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  50414. + RightParenthesis;[)];
  50415. + Semicolon;[;];
  50416. + Whitespace;[ ];
  50417. + RightBrace;[}];
  50418. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ProducesErrorButCorrectlyParsesNestedTemplateInStmtWithinStmtBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ProducesErrorButCorrectlyParsesNestedTemplateInStmtWithinStmtBlock.stree.txt
  50419. index 724044dc9be..c794cc57128 100644
  50420. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ProducesErrorButCorrectlyParsesNestedTemplateInStmtWithinStmtBlock.stree.txt
  50421. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ProducesErrorButCorrectlyParsesNestedTemplateInStmtWithinStmtBlock.stree.txt
  50422. @@ -1,81 +1,92 @@
  50423. -Statement block - Gen<None> - 91 - (0:0,0)
  50424. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  50425. - SyntaxKind.LeftBrace;[{];
  50426. - Code span - Gen<Stmt> - [ var foo = bar; Html.ExecuteTemplate(foo, ] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:17
  50427. - SyntaxKind.Whitespace;[ ];
  50428. - SyntaxKind.Identifier;[var];
  50429. - SyntaxKind.Whitespace;[ ];
  50430. - SyntaxKind.Identifier;[foo];
  50431. - SyntaxKind.Whitespace;[ ];
  50432. - SyntaxKind.Assign;[=];
  50433. - SyntaxKind.Whitespace;[ ];
  50434. - SyntaxKind.Identifier;[bar];
  50435. - SyntaxKind.Semicolon;[;];
  50436. - SyntaxKind.Whitespace;[ ];
  50437. - SyntaxKind.Identifier;[Html];
  50438. - SyntaxKind.Dot;[.];
  50439. - SyntaxKind.Identifier;[ExecuteTemplate];
  50440. - SyntaxKind.LeftParenthesis;[(];
  50441. - SyntaxKind.Identifier;[foo];
  50442. - SyntaxKind.Comma;[,];
  50443. - SyntaxKind.Whitespace;[ ];
  50444. - Template block - Gen<Template> - 44 - (43:0,43)
  50445. - Markup block - Gen<None> - 44 - (43:0,43)
  50446. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (43:0,43) - Tokens:1
  50447. - SyntaxKind.Transition;[@];
  50448. - Tag block - Gen<None> - 3 - (44:0,44)
  50449. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (44:0,44) - Tokens:3
  50450. - SyntaxKind.OpenAngle;[<];
  50451. - SyntaxKind.Text;[p];
  50452. - SyntaxKind.CloseAngle;[>];
  50453. - Markup span - Gen<Markup> - [Foo #] - SpanEditHandler;Accepts:Any - (47:0,47) - Tokens:3
  50454. - SyntaxKind.Text;[Foo];
  50455. - SyntaxKind.Whitespace;[ ];
  50456. - SyntaxKind.Text;[#];
  50457. - Expression block - Gen<Expr> - 31 - (52:0,52)
  50458. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (52:0,52) - Tokens:1
  50459. - SyntaxKind.Transition;[@];
  50460. - Code span - Gen<Expr> - [Html.Repeat(10, ] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (53:0,53) - Tokens:7
  50461. - SyntaxKind.Identifier;[Html];
  50462. - SyntaxKind.Dot;[.];
  50463. - SyntaxKind.Identifier;[Repeat];
  50464. - SyntaxKind.LeftParenthesis;[(];
  50465. - SyntaxKind.IntegerLiteral;[10];
  50466. - SyntaxKind.Comma;[,];
  50467. - SyntaxKind.Whitespace;[ ];
  50468. - Template block - Gen<Template> - 13 - (69:0,69)
  50469. - Markup block - Gen<None> - 13 - (69:0,69)
  50470. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (69:0,69) - Tokens:1
  50471. - SyntaxKind.Transition;[@];
  50472. - Tag block - Gen<None> - 3 - (70:0,70)
  50473. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (70:0,70) - Tokens:3
  50474. - SyntaxKind.OpenAngle;[<];
  50475. - SyntaxKind.Text;[p];
  50476. - SyntaxKind.CloseAngle;[>];
  50477. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (73:0,73) - Tokens:1
  50478. - SyntaxKind.Unknown;[];
  50479. - Expression block - Gen<Expr> - 5 - (73:0,73)
  50480. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (73:0,73) - Tokens:1
  50481. - SyntaxKind.Transition;[@];
  50482. - Code span - Gen<Expr> - [item] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (74:0,74) - Tokens:1
  50483. - SyntaxKind.Identifier;[item];
  50484. - Tag block - Gen<None> - 4 - (78:0,78)
  50485. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (78:0,78) - Tokens:4
  50486. - SyntaxKind.OpenAngle;[<];
  50487. - SyntaxKind.ForwardSlash;[/];
  50488. - SyntaxKind.Text;[p];
  50489. - SyntaxKind.CloseAngle;[>];
  50490. - Code span - Gen<Expr> - [)] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (82:0,82) - Tokens:1
  50491. - SyntaxKind.RightParenthesis;[)];
  50492. - Tag block - Gen<None> - 4 - (83:0,83)
  50493. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (83:0,83) - Tokens:4
  50494. - SyntaxKind.OpenAngle;[<];
  50495. - SyntaxKind.ForwardSlash;[/];
  50496. - SyntaxKind.Text;[p];
  50497. - SyntaxKind.CloseAngle;[>];
  50498. - Code span - Gen<Stmt> - [); ] - SpanEditHandler;Accepts:Any - (87:0,87) - Tokens:3
  50499. - SyntaxKind.RightParenthesis;[)];
  50500. - SyntaxKind.Semicolon;[;];
  50501. - SyntaxKind.Whitespace;[ ];
  50502. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (90:0,90) - Tokens:1
  50503. - SyntaxKind.RightBrace;[}];
  50504. +CSharpCodeBlock - [0..91)::91 - [{ var foo = bar; Html.ExecuteTemplate(foo, @<p>Foo #@Html.Repeat(10, @<p>@item</p>)</p>); }]
  50505. + CSharpStatement - [0..91)::91
  50506. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  50507. + Transition;[<Missing>];
  50508. + CSharpStatementBody - [0..91)::91
  50509. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  50510. + LeftBrace;[{];
  50511. + CSharpCodeBlock - [1..90)::89
  50512. + CSharpStatementLiteral - [1..43)::42 - [ var foo = bar; Html.ExecuteTemplate(foo, ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  50513. + Whitespace;[ ];
  50514. + Identifier;[var];
  50515. + Whitespace;[ ];
  50516. + Identifier;[foo];
  50517. + Whitespace;[ ];
  50518. + Assign;[=];
  50519. + Whitespace;[ ];
  50520. + Identifier;[bar];
  50521. + Semicolon;[;];
  50522. + Whitespace;[ ];
  50523. + Identifier;[Html];
  50524. + Dot;[.];
  50525. + Identifier;[ExecuteTemplate];
  50526. + LeftParenthesis;[(];
  50527. + Identifier;[foo];
  50528. + Comma;[,];
  50529. + Whitespace;[ ];
  50530. + CSharpTemplateBlock - [43..87)::44
  50531. + MarkupBlock - [43..87)::44
  50532. + MarkupTransition - [43..44)::1 - Gen<None> - SpanEditHandler;Accepts:None
  50533. + Transition;[@];
  50534. + MarkupTagBlock - [44..47)::3 - [<p>]
  50535. + MarkupTextLiteral - [44..47)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  50536. + OpenAngle;[<];
  50537. + Text;[p];
  50538. + CloseAngle;[>];
  50539. + MarkupTextLiteral - [47..52)::5 - [Foo #] - Gen<Markup> - SpanEditHandler;Accepts:Any
  50540. + Text;[Foo];
  50541. + Whitespace;[ ];
  50542. + Text;[#];
  50543. + CSharpCodeBlock - [52..83)::31
  50544. + CSharpImplicitExpression - [52..83)::31
  50545. + CSharpTransition - [52..53)::1 - Gen<None> - SpanEditHandler;Accepts:None
  50546. + Transition;[@];
  50547. + CSharpImplicitExpressionBody - [53..83)::30
  50548. + CSharpCodeBlock - [53..83)::30
  50549. + CSharpExpressionLiteral - [53..69)::16 - [Html.Repeat(10, ] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14
  50550. + Identifier;[Html];
  50551. + Dot;[.];
  50552. + Identifier;[Repeat];
  50553. + LeftParenthesis;[(];
  50554. + IntegerLiteral;[10];
  50555. + Comma;[,];
  50556. + Whitespace;[ ];
  50557. + CSharpTemplateBlock - [69..82)::13
  50558. + MarkupBlock - [69..82)::13
  50559. + MarkupTransition - [69..70)::1 - Gen<None> - SpanEditHandler;Accepts:None
  50560. + Transition;[@];
  50561. + MarkupTagBlock - [70..73)::3 - [<p>]
  50562. + MarkupTextLiteral - [70..73)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  50563. + OpenAngle;[<];
  50564. + Text;[p];
  50565. + CloseAngle;[>];
  50566. + MarkupTextLiteral - [73..73)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  50567. + Marker;[];
  50568. + CSharpCodeBlock - [73..78)::5
  50569. + CSharpImplicitExpression - [73..78)::5
  50570. + CSharpTransition - [73..74)::1 - Gen<None> - SpanEditHandler;Accepts:None
  50571. + Transition;[@];
  50572. + CSharpImplicitExpressionBody - [74..78)::4
  50573. + CSharpCodeBlock - [74..78)::4
  50574. + CSharpExpressionLiteral - [74..78)::4 - [item] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  50575. + Identifier;[item];
  50576. + MarkupTagBlock - [78..82)::4 - [</p>]
  50577. + MarkupTextLiteral - [78..82)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  50578. + OpenAngle;[<];
  50579. + ForwardSlash;[/];
  50580. + Text;[p];
  50581. + CloseAngle;[>];
  50582. + CSharpExpressionLiteral - [82..83)::1 - [)] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  50583. + RightParenthesis;[)];
  50584. + MarkupTagBlock - [83..87)::4 - [</p>]
  50585. + MarkupTextLiteral - [83..87)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  50586. + OpenAngle;[<];
  50587. + ForwardSlash;[/];
  50588. + Text;[p];
  50589. + CloseAngle;[>];
  50590. + CSharpStatementLiteral - [87..90)::3 - [); ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  50591. + RightParenthesis;[)];
  50592. + Semicolon;[;];
  50593. + Whitespace;[ ];
  50594. + RazorMetaCode - [90..91)::1 - Gen<None> - SpanEditHandler;Accepts:None
  50595. + RightBrace;[}];
  50596. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/_WithDoubleTransition_DoesNotThrow.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/_WithDoubleTransition_DoesNotThrow.stree.txt
  50597. index 4ffe92d5ade..5959baab4ff 100644
  50598. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/_WithDoubleTransition_DoesNotThrow.stree.txt
  50599. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/_WithDoubleTransition_DoesNotThrow.stree.txt
  50600. @@ -1,65 +1,76 @@
  50601. -Statement block - Gen<None> - 74 - (0:0,0)
  50602. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  50603. - SyntaxKind.LeftBrace;[{];
  50604. - Code span - Gen<Stmt> - [ var foo = bar; Html.ExecuteTemplate(foo, ] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:17
  50605. - SyntaxKind.Whitespace;[ ];
  50606. - SyntaxKind.Identifier;[var];
  50607. - SyntaxKind.Whitespace;[ ];
  50608. - SyntaxKind.Identifier;[foo];
  50609. - SyntaxKind.Whitespace;[ ];
  50610. - SyntaxKind.Assign;[=];
  50611. - SyntaxKind.Whitespace;[ ];
  50612. - SyntaxKind.Identifier;[bar];
  50613. - SyntaxKind.Semicolon;[;];
  50614. - SyntaxKind.Whitespace;[ ];
  50615. - SyntaxKind.Identifier;[Html];
  50616. - SyntaxKind.Dot;[.];
  50617. - SyntaxKind.Identifier;[ExecuteTemplate];
  50618. - SyntaxKind.LeftParenthesis;[(];
  50619. - SyntaxKind.Identifier;[foo];
  50620. - SyntaxKind.Comma;[,];
  50621. - SyntaxKind.Whitespace;[ ];
  50622. - Template block - Gen<Template> - 27 - (43:0,43)
  50623. - Markup block - Gen<None> - 27 - (43:0,43)
  50624. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (43:0,43) - Tokens:1
  50625. - SyntaxKind.Transition;[@];
  50626. - Tag block - Gen<None> - 12 - (44:0,44)
  50627. - Markup span - Gen<Markup> - [<p] - SpanEditHandler;Accepts:Any - (44:0,44) - Tokens:2
  50628. - SyntaxKind.OpenAngle;[<];
  50629. - SyntaxKind.Text;[p];
  50630. - Markup block - Gen<Attr:foo, foo='@(46:0,46),'@(54:0,54)> - 9 - (46:0,46)
  50631. - Markup span - Gen<None> - [ foo='] - SpanEditHandler;Accepts:Any - (46:0,46) - Tokens:4
  50632. - SyntaxKind.Whitespace;[ ];
  50633. - SyntaxKind.Text;[foo];
  50634. - SyntaxKind.Equals;[=];
  50635. - SyntaxKind.SingleQuote;['];
  50636. - Markup block - Gen<None> - 2 - (52:0,52)
  50637. - Markup span - Gen<LitAttr:@(52:0,52)> - [@] - SpanEditHandler;Accepts:None - (52:0,52) - Tokens:1
  50638. - SyntaxKind.Transition;[@];
  50639. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (53:0,53) - Tokens:1
  50640. - SyntaxKind.Transition;[@];
  50641. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (54:0,54) - Tokens:1
  50642. - SyntaxKind.SingleQuote;['];
  50643. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:None - (55:0,55) - Tokens:1
  50644. - SyntaxKind.CloseAngle;[>];
  50645. - Markup span - Gen<Markup> - [Foo #] - SpanEditHandler;Accepts:Any - (56:0,56) - Tokens:3
  50646. - SyntaxKind.Text;[Foo];
  50647. - SyntaxKind.Whitespace;[ ];
  50648. - SyntaxKind.Text;[#];
  50649. - Expression block - Gen<Expr> - 5 - (61:0,61)
  50650. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (61:0,61) - Tokens:1
  50651. - SyntaxKind.Transition;[@];
  50652. - Code span - Gen<Expr> - [item] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (62:0,62) - Tokens:1
  50653. - SyntaxKind.Identifier;[item];
  50654. - Tag block - Gen<None> - 4 - (66:0,66)
  50655. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (66:0,66) - Tokens:4
  50656. - SyntaxKind.OpenAngle;[<];
  50657. - SyntaxKind.ForwardSlash;[/];
  50658. - SyntaxKind.Text;[p];
  50659. - SyntaxKind.CloseAngle;[>];
  50660. - Code span - Gen<Stmt> - [); ] - SpanEditHandler;Accepts:Any - (70:0,70) - Tokens:3
  50661. - SyntaxKind.RightParenthesis;[)];
  50662. - SyntaxKind.Semicolon;[;];
  50663. - SyntaxKind.Whitespace;[ ];
  50664. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (73:0,73) - Tokens:1
  50665. - SyntaxKind.RightBrace;[}];
  50666. +CSharpCodeBlock - [0..74)::74 - [{ var foo = bar; Html.ExecuteTemplate(foo, @<p foo='@@'>Foo #@item</p>); }]
  50667. + CSharpStatement - [0..74)::74
  50668. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  50669. + Transition;[<Missing>];
  50670. + CSharpStatementBody - [0..74)::74
  50671. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  50672. + LeftBrace;[{];
  50673. + CSharpCodeBlock - [1..73)::72
  50674. + CSharpStatementLiteral - [1..43)::42 - [ var foo = bar; Html.ExecuteTemplate(foo, ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  50675. + Whitespace;[ ];
  50676. + Identifier;[var];
  50677. + Whitespace;[ ];
  50678. + Identifier;[foo];
  50679. + Whitespace;[ ];
  50680. + Assign;[=];
  50681. + Whitespace;[ ];
  50682. + Identifier;[bar];
  50683. + Semicolon;[;];
  50684. + Whitespace;[ ];
  50685. + Identifier;[Html];
  50686. + Dot;[.];
  50687. + Identifier;[ExecuteTemplate];
  50688. + LeftParenthesis;[(];
  50689. + Identifier;[foo];
  50690. + Comma;[,];
  50691. + Whitespace;[ ];
  50692. + CSharpTemplateBlock - [43..70)::27
  50693. + MarkupBlock - [43..70)::27
  50694. + MarkupTransition - [43..44)::1 - Gen<None> - SpanEditHandler;Accepts:None
  50695. + Transition;[@];
  50696. + MarkupTagBlock - [44..56)::12 - [<p foo='@@'>]
  50697. + MarkupTextLiteral - [44..46)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  50698. + OpenAngle;[<];
  50699. + Text;[p];
  50700. + MarkupAttributeBlock - [46..55)::9 - [ foo='@@']
  50701. + MarkupTextLiteral - [46..47)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  50702. + Whitespace;[ ];
  50703. + MarkupTextLiteral - [47..50)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  50704. + Text;[foo];
  50705. + Equals;[=];
  50706. + MarkupTextLiteral - [51..52)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  50707. + SingleQuote;['];
  50708. + GenericBlock - [52..54)::2
  50709. + MarkupBlock - [52..54)::2
  50710. + MarkupTextLiteral - [52..53)::1 - [@] - Gen<LitAttr:@(52:0,52)> - SpanEditHandler;Accepts:None
  50711. + Transition;[@];
  50712. + MarkupEphemeralTextLiteral - [53..54)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  50713. + Transition;[@];
  50714. + MarkupTextLiteral - [54..55)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  50715. + SingleQuote;['];
  50716. + MarkupTextLiteral - [55..56)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  50717. + CloseAngle;[>];
  50718. + MarkupTextLiteral - [56..61)::5 - [Foo #] - Gen<Markup> - SpanEditHandler;Accepts:Any
  50719. + Text;[Foo];
  50720. + Whitespace;[ ];
  50721. + Text;[#];
  50722. + CSharpCodeBlock - [61..66)::5
  50723. + CSharpImplicitExpression - [61..66)::5
  50724. + CSharpTransition - [61..62)::1 - Gen<None> - SpanEditHandler;Accepts:None
  50725. + Transition;[@];
  50726. + CSharpImplicitExpressionBody - [62..66)::4
  50727. + CSharpCodeBlock - [62..66)::4
  50728. + CSharpExpressionLiteral - [62..66)::4 - [item] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  50729. + Identifier;[item];
  50730. + MarkupTagBlock - [66..70)::4 - [</p>]
  50731. + MarkupTextLiteral - [66..70)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  50732. + OpenAngle;[<];
  50733. + ForwardSlash;[/];
  50734. + Text;[p];
  50735. + CloseAngle;[>];
  50736. + CSharpStatementLiteral - [70..73)::3 - [); ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  50737. + RightParenthesis;[)];
  50738. + Semicolon;[;];
  50739. + Whitespace;[ ];
  50740. + RazorMetaCode - [73..74)::1 - Gen<None> - SpanEditHandler;Accepts:None
  50741. + RightBrace;[}];
  50742. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/AllowsMarkupInIfBodyWithBraces.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/AllowsMarkupInIfBodyWithBraces.stree.txt
  50743. index 4cadb3f814c..5fb2f311b60 100644
  50744. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/AllowsMarkupInIfBodyWithBraces.stree.txt
  50745. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/AllowsMarkupInIfBodyWithBraces.stree.txt
  50746. @@ -1,81 +1,83 @@
  50747. -Statement block - Gen<None> - 70 - (0:0,0)
  50748. - Code span - Gen<Stmt> - [if(foo) {] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:6
  50749. - SyntaxKind.Keyword;[if];
  50750. - SyntaxKind.LeftParenthesis;[(];
  50751. - SyntaxKind.Identifier;[foo];
  50752. - SyntaxKind.RightParenthesis;[)];
  50753. - SyntaxKind.Whitespace;[ ];
  50754. - SyntaxKind.LeftBrace;[{];
  50755. - Markup block - Gen<None> - 12 - (9:0,9)
  50756. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:1
  50757. - SyntaxKind.Whitespace;[ ];
  50758. - Tag block - Gen<None> - 3 - (10:0,10)
  50759. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:3
  50760. - SyntaxKind.OpenAngle;[<];
  50761. - SyntaxKind.Text;[p];
  50762. - SyntaxKind.CloseAngle;[>];
  50763. - Markup span - Gen<Markup> - [Bar] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:1
  50764. - SyntaxKind.Text;[Bar];
  50765. - Tag block - Gen<None> - 4 - (16:0,16)
  50766. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:4
  50767. - SyntaxKind.OpenAngle;[<];
  50768. - SyntaxKind.ForwardSlash;[/];
  50769. - SyntaxKind.Text;[p];
  50770. - SyntaxKind.CloseAngle;[>];
  50771. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (20:0,20) - Tokens:1
  50772. - SyntaxKind.Whitespace;[ ];
  50773. - Code span - Gen<Stmt> - [} else if(bar) {] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:10
  50774. - SyntaxKind.RightBrace;[}];
  50775. - SyntaxKind.Whitespace;[ ];
  50776. - SyntaxKind.Keyword;[else];
  50777. - SyntaxKind.Whitespace;[ ];
  50778. - SyntaxKind.Keyword;[if];
  50779. - SyntaxKind.LeftParenthesis;[(];
  50780. - SyntaxKind.Identifier;[bar];
  50781. - SyntaxKind.RightParenthesis;[)];
  50782. - SyntaxKind.Whitespace;[ ];
  50783. - SyntaxKind.LeftBrace;[{];
  50784. - Markup block - Gen<None> - 12 - (37:0,37)
  50785. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (37:0,37) - Tokens:1
  50786. - SyntaxKind.Whitespace;[ ];
  50787. - Tag block - Gen<None> - 3 - (38:0,38)
  50788. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (38:0,38) - Tokens:3
  50789. - SyntaxKind.OpenAngle;[<];
  50790. - SyntaxKind.Text;[p];
  50791. - SyntaxKind.CloseAngle;[>];
  50792. - Markup span - Gen<Markup> - [Baz] - SpanEditHandler;Accepts:Any - (41:0,41) - Tokens:1
  50793. - SyntaxKind.Text;[Baz];
  50794. - Tag block - Gen<None> - 4 - (44:0,44)
  50795. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (44:0,44) - Tokens:4
  50796. - SyntaxKind.OpenAngle;[<];
  50797. - SyntaxKind.ForwardSlash;[/];
  50798. - SyntaxKind.Text;[p];
  50799. - SyntaxKind.CloseAngle;[>];
  50800. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (48:0,48) - Tokens:1
  50801. - SyntaxKind.Whitespace;[ ];
  50802. - Code span - Gen<Stmt> - [} else {] - SpanEditHandler;Accepts:Any - (49:0,49) - Tokens:5
  50803. - SyntaxKind.RightBrace;[}];
  50804. - SyntaxKind.Whitespace;[ ];
  50805. - SyntaxKind.Keyword;[else];
  50806. - SyntaxKind.Whitespace;[ ];
  50807. - SyntaxKind.LeftBrace;[{];
  50808. - Markup block - Gen<None> - 12 - (57:0,57)
  50809. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (57:0,57) - Tokens:1
  50810. - SyntaxKind.Whitespace;[ ];
  50811. - Tag block - Gen<None> - 3 - (58:0,58)
  50812. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (58:0,58) - Tokens:3
  50813. - SyntaxKind.OpenAngle;[<];
  50814. - SyntaxKind.Text;[p];
  50815. - SyntaxKind.CloseAngle;[>];
  50816. - Markup span - Gen<Markup> - [Boz] - SpanEditHandler;Accepts:Any - (61:0,61) - Tokens:1
  50817. - SyntaxKind.Text;[Boz];
  50818. - Tag block - Gen<None> - 4 - (64:0,64)
  50819. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (64:0,64) - Tokens:4
  50820. - SyntaxKind.OpenAngle;[<];
  50821. - SyntaxKind.ForwardSlash;[/];
  50822. - SyntaxKind.Text;[p];
  50823. - SyntaxKind.CloseAngle;[>];
  50824. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (68:0,68) - Tokens:1
  50825. - SyntaxKind.Whitespace;[ ];
  50826. - Code span - Gen<Stmt> - [}] - SpanEditHandler;Accepts:None - (69:0,69) - Tokens:1
  50827. - SyntaxKind.RightBrace;[}];
  50828. +CSharpCodeBlock - [0..70)::70 - [if(foo) { <p>Bar</p> } else if(bar) { <p>Baz</p> } else { <p>Boz</p> }]
  50829. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  50830. + Transition;[<Missing>];
  50831. + CSharpStatementLiteral - [0..9)::9 - [if(foo) {] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  50832. + Keyword;[if];
  50833. + LeftParenthesis;[(];
  50834. + Identifier;[foo];
  50835. + RightParenthesis;[)];
  50836. + Whitespace;[ ];
  50837. + LeftBrace;[{];
  50838. + MarkupBlock - [9..21)::12
  50839. + MarkupTextLiteral - [9..10)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  50840. + Whitespace;[ ];
  50841. + MarkupTagBlock - [10..13)::3 - [<p>]
  50842. + MarkupTextLiteral - [10..13)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  50843. + OpenAngle;[<];
  50844. + Text;[p];
  50845. + CloseAngle;[>];
  50846. + MarkupTextLiteral - [13..16)::3 - [Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  50847. + Text;[Bar];
  50848. + MarkupTagBlock - [16..20)::4 - [</p>]
  50849. + MarkupTextLiteral - [16..20)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  50850. + OpenAngle;[<];
  50851. + ForwardSlash;[/];
  50852. + Text;[p];
  50853. + CloseAngle;[>];
  50854. + MarkupTextLiteral - [20..21)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  50855. + Whitespace;[ ];
  50856. + CSharpStatementLiteral - [21..37)::16 - [} else if(bar) {] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  50857. + RightBrace;[}];
  50858. + Whitespace;[ ];
  50859. + Keyword;[else];
  50860. + Whitespace;[ ];
  50861. + Keyword;[if];
  50862. + LeftParenthesis;[(];
  50863. + Identifier;[bar];
  50864. + RightParenthesis;[)];
  50865. + Whitespace;[ ];
  50866. + LeftBrace;[{];
  50867. + MarkupBlock - [37..49)::12
  50868. + MarkupTextLiteral - [37..38)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  50869. + Whitespace;[ ];
  50870. + MarkupTagBlock - [38..41)::3 - [<p>]
  50871. + MarkupTextLiteral - [38..41)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  50872. + OpenAngle;[<];
  50873. + Text;[p];
  50874. + CloseAngle;[>];
  50875. + MarkupTextLiteral - [41..44)::3 - [Baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  50876. + Text;[Baz];
  50877. + MarkupTagBlock - [44..48)::4 - [</p>]
  50878. + MarkupTextLiteral - [44..48)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  50879. + OpenAngle;[<];
  50880. + ForwardSlash;[/];
  50881. + Text;[p];
  50882. + CloseAngle;[>];
  50883. + MarkupTextLiteral - [48..49)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  50884. + Whitespace;[ ];
  50885. + CSharpStatementLiteral - [49..57)::8 - [} else {] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  50886. + RightBrace;[}];
  50887. + Whitespace;[ ];
  50888. + Keyword;[else];
  50889. + Whitespace;[ ];
  50890. + LeftBrace;[{];
  50891. + MarkupBlock - [57..69)::12
  50892. + MarkupTextLiteral - [57..58)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  50893. + Whitespace;[ ];
  50894. + MarkupTagBlock - [58..61)::3 - [<p>]
  50895. + MarkupTextLiteral - [58..61)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  50896. + OpenAngle;[<];
  50897. + Text;[p];
  50898. + CloseAngle;[>];
  50899. + MarkupTextLiteral - [61..64)::3 - [Boz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  50900. + Text;[Boz];
  50901. + MarkupTagBlock - [64..68)::4 - [</p>]
  50902. + MarkupTextLiteral - [64..68)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  50903. + OpenAngle;[<];
  50904. + ForwardSlash;[/];
  50905. + Text;[p];
  50906. + CloseAngle;[>];
  50907. + MarkupTextLiteral - [68..69)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  50908. + Whitespace;[ ];
  50909. + CSharpStatementLiteral - [69..70)::1 - [}] - Gen<Stmt> - SpanEditHandler;Accepts:None
  50910. + RightBrace;[}];
  50911. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/AllowsMarkupInIfBodyWithBracesWithinCodeBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/AllowsMarkupInIfBodyWithBracesWithinCodeBlock.stree.txt
  50912. index 3dc1b191bd3..b9b0a9174f9 100644
  50913. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/AllowsMarkupInIfBodyWithBracesWithinCodeBlock.stree.txt
  50914. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/AllowsMarkupInIfBodyWithBracesWithinCodeBlock.stree.txt
  50915. @@ -1,87 +1,92 @@
  50916. -Statement block - Gen<None> - 74 - (0:0,0)
  50917. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  50918. - SyntaxKind.LeftBrace;[{];
  50919. - Code span - Gen<Stmt> - [ if(foo) {] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:7
  50920. - SyntaxKind.Whitespace;[ ];
  50921. - SyntaxKind.Keyword;[if];
  50922. - SyntaxKind.LeftParenthesis;[(];
  50923. - SyntaxKind.Identifier;[foo];
  50924. - SyntaxKind.RightParenthesis;[)];
  50925. - SyntaxKind.Whitespace;[ ];
  50926. - SyntaxKind.LeftBrace;[{];
  50927. - Markup block - Gen<None> - 12 - (11:0,11)
  50928. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:1
  50929. - SyntaxKind.Whitespace;[ ];
  50930. - Tag block - Gen<None> - 3 - (12:0,12)
  50931. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:3
  50932. - SyntaxKind.OpenAngle;[<];
  50933. - SyntaxKind.Text;[p];
  50934. - SyntaxKind.CloseAngle;[>];
  50935. - Markup span - Gen<Markup> - [Bar] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:1
  50936. - SyntaxKind.Text;[Bar];
  50937. - Tag block - Gen<None> - 4 - (18:0,18)
  50938. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (18:0,18) - Tokens:4
  50939. - SyntaxKind.OpenAngle;[<];
  50940. - SyntaxKind.ForwardSlash;[/];
  50941. - SyntaxKind.Text;[p];
  50942. - SyntaxKind.CloseAngle;[>];
  50943. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (22:0,22) - Tokens:1
  50944. - SyntaxKind.Whitespace;[ ];
  50945. - Code span - Gen<Stmt> - [} else if(bar) {] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:10
  50946. - SyntaxKind.RightBrace;[}];
  50947. - SyntaxKind.Whitespace;[ ];
  50948. - SyntaxKind.Keyword;[else];
  50949. - SyntaxKind.Whitespace;[ ];
  50950. - SyntaxKind.Keyword;[if];
  50951. - SyntaxKind.LeftParenthesis;[(];
  50952. - SyntaxKind.Identifier;[bar];
  50953. - SyntaxKind.RightParenthesis;[)];
  50954. - SyntaxKind.Whitespace;[ ];
  50955. - SyntaxKind.LeftBrace;[{];
  50956. - Markup block - Gen<None> - 12 - (39:0,39)
  50957. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (39:0,39) - Tokens:1
  50958. - SyntaxKind.Whitespace;[ ];
  50959. - Tag block - Gen<None> - 3 - (40:0,40)
  50960. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (40:0,40) - Tokens:3
  50961. - SyntaxKind.OpenAngle;[<];
  50962. - SyntaxKind.Text;[p];
  50963. - SyntaxKind.CloseAngle;[>];
  50964. - Markup span - Gen<Markup> - [Baz] - SpanEditHandler;Accepts:Any - (43:0,43) - Tokens:1
  50965. - SyntaxKind.Text;[Baz];
  50966. - Tag block - Gen<None> - 4 - (46:0,46)
  50967. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (46:0,46) - Tokens:4
  50968. - SyntaxKind.OpenAngle;[<];
  50969. - SyntaxKind.ForwardSlash;[/];
  50970. - SyntaxKind.Text;[p];
  50971. - SyntaxKind.CloseAngle;[>];
  50972. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (50:0,50) - Tokens:1
  50973. - SyntaxKind.Whitespace;[ ];
  50974. - Code span - Gen<Stmt> - [} else {] - SpanEditHandler;Accepts:Any - (51:0,51) - Tokens:5
  50975. - SyntaxKind.RightBrace;[}];
  50976. - SyntaxKind.Whitespace;[ ];
  50977. - SyntaxKind.Keyword;[else];
  50978. - SyntaxKind.Whitespace;[ ];
  50979. - SyntaxKind.LeftBrace;[{];
  50980. - Markup block - Gen<None> - 12 - (59:0,59)
  50981. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (59:0,59) - Tokens:1
  50982. - SyntaxKind.Whitespace;[ ];
  50983. - Tag block - Gen<None> - 3 - (60:0,60)
  50984. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (60:0,60) - Tokens:3
  50985. - SyntaxKind.OpenAngle;[<];
  50986. - SyntaxKind.Text;[p];
  50987. - SyntaxKind.CloseAngle;[>];
  50988. - Markup span - Gen<Markup> - [Boz] - SpanEditHandler;Accepts:Any - (63:0,63) - Tokens:1
  50989. - SyntaxKind.Text;[Boz];
  50990. - Tag block - Gen<None> - 4 - (66:0,66)
  50991. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (66:0,66) - Tokens:4
  50992. - SyntaxKind.OpenAngle;[<];
  50993. - SyntaxKind.ForwardSlash;[/];
  50994. - SyntaxKind.Text;[p];
  50995. - SyntaxKind.CloseAngle;[>];
  50996. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (70:0,70) - Tokens:1
  50997. - SyntaxKind.Whitespace;[ ];
  50998. - Code span - Gen<Stmt> - [} ] - SpanEditHandler;Accepts:Any - (71:0,71) - Tokens:2
  50999. - SyntaxKind.RightBrace;[}];
  51000. - SyntaxKind.Whitespace;[ ];
  51001. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (73:0,73) - Tokens:1
  51002. - SyntaxKind.RightBrace;[}];
  51003. +CSharpCodeBlock - [0..74)::74 - [{ if(foo) { <p>Bar</p> } else if(bar) { <p>Baz</p> } else { <p>Boz</p> } }]
  51004. + CSharpStatement - [0..74)::74
  51005. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  51006. + Transition;[<Missing>];
  51007. + CSharpStatementBody - [0..74)::74
  51008. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  51009. + LeftBrace;[{];
  51010. + CSharpCodeBlock - [1..73)::72
  51011. + CSharpStatementLiteral - [1..11)::10 - [ if(foo) {] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  51012. + Whitespace;[ ];
  51013. + Keyword;[if];
  51014. + LeftParenthesis;[(];
  51015. + Identifier;[foo];
  51016. + RightParenthesis;[)];
  51017. + Whitespace;[ ];
  51018. + LeftBrace;[{];
  51019. + MarkupBlock - [11..23)::12
  51020. + MarkupTextLiteral - [11..12)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  51021. + Whitespace;[ ];
  51022. + MarkupTagBlock - [12..15)::3 - [<p>]
  51023. + MarkupTextLiteral - [12..15)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  51024. + OpenAngle;[<];
  51025. + Text;[p];
  51026. + CloseAngle;[>];
  51027. + MarkupTextLiteral - [15..18)::3 - [Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  51028. + Text;[Bar];
  51029. + MarkupTagBlock - [18..22)::4 - [</p>]
  51030. + MarkupTextLiteral - [18..22)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  51031. + OpenAngle;[<];
  51032. + ForwardSlash;[/];
  51033. + Text;[p];
  51034. + CloseAngle;[>];
  51035. + MarkupTextLiteral - [22..23)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  51036. + Whitespace;[ ];
  51037. + CSharpStatementLiteral - [23..39)::16 - [} else if(bar) {] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  51038. + RightBrace;[}];
  51039. + Whitespace;[ ];
  51040. + Keyword;[else];
  51041. + Whitespace;[ ];
  51042. + Keyword;[if];
  51043. + LeftParenthesis;[(];
  51044. + Identifier;[bar];
  51045. + RightParenthesis;[)];
  51046. + Whitespace;[ ];
  51047. + LeftBrace;[{];
  51048. + MarkupBlock - [39..51)::12
  51049. + MarkupTextLiteral - [39..40)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  51050. + Whitespace;[ ];
  51051. + MarkupTagBlock - [40..43)::3 - [<p>]
  51052. + MarkupTextLiteral - [40..43)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  51053. + OpenAngle;[<];
  51054. + Text;[p];
  51055. + CloseAngle;[>];
  51056. + MarkupTextLiteral - [43..46)::3 - [Baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  51057. + Text;[Baz];
  51058. + MarkupTagBlock - [46..50)::4 - [</p>]
  51059. + MarkupTextLiteral - [46..50)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  51060. + OpenAngle;[<];
  51061. + ForwardSlash;[/];
  51062. + Text;[p];
  51063. + CloseAngle;[>];
  51064. + MarkupTextLiteral - [50..51)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  51065. + Whitespace;[ ];
  51066. + CSharpStatementLiteral - [51..59)::8 - [} else {] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  51067. + RightBrace;[}];
  51068. + Whitespace;[ ];
  51069. + Keyword;[else];
  51070. + Whitespace;[ ];
  51071. + LeftBrace;[{];
  51072. + MarkupBlock - [59..71)::12
  51073. + MarkupTextLiteral - [59..60)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  51074. + Whitespace;[ ];
  51075. + MarkupTagBlock - [60..63)::3 - [<p>]
  51076. + MarkupTextLiteral - [60..63)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  51077. + OpenAngle;[<];
  51078. + Text;[p];
  51079. + CloseAngle;[>];
  51080. + MarkupTextLiteral - [63..66)::3 - [Boz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  51081. + Text;[Boz];
  51082. + MarkupTagBlock - [66..70)::4 - [</p>]
  51083. + MarkupTextLiteral - [66..70)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  51084. + OpenAngle;[<];
  51085. + ForwardSlash;[/];
  51086. + Text;[p];
  51087. + CloseAngle;[>];
  51088. + MarkupTextLiteral - [70..71)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  51089. + Whitespace;[ ];
  51090. + CSharpStatementLiteral - [71..73)::2 - [} ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  51091. + RightBrace;[}];
  51092. + Whitespace;[ ];
  51093. + RazorMetaCode - [73..74)::1 - Gen<None> - SpanEditHandler;Accepts:None
  51094. + RightBrace;[}];
  51095. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/CorrectlyReturnsFromMarkupBlockWithPseudoTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/CorrectlyReturnsFromMarkupBlockWithPseudoTag.stree.txt
  51096. index f418dc5deb7..63d05c98c45 100644
  51097. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/CorrectlyReturnsFromMarkupBlockWithPseudoTag.stree.txt
  51098. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/CorrectlyReturnsFromMarkupBlockWithPseudoTag.stree.txt
  51099. @@ -1,31 +1,33 @@
  51100. -Statement block - Gen<None> - 29 - (0:0,0)
  51101. - Code span - Gen<Stmt> - [if (i > 0) { ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:12
  51102. - SyntaxKind.Keyword;[if];
  51103. - SyntaxKind.Whitespace;[ ];
  51104. - SyntaxKind.LeftParenthesis;[(];
  51105. - SyntaxKind.Identifier;[i];
  51106. - SyntaxKind.Whitespace;[ ];
  51107. - SyntaxKind.GreaterThan;[>];
  51108. - SyntaxKind.Whitespace;[ ];
  51109. - SyntaxKind.IntegerLiteral;[0];
  51110. - SyntaxKind.RightParenthesis;[)];
  51111. - SyntaxKind.Whitespace;[ ];
  51112. - SyntaxKind.LeftBrace;[{];
  51113. - SyntaxKind.Whitespace;[ ];
  51114. - Markup block - Gen<None> - 14 - (13:0,13)
  51115. - Tag block - Gen<None> - 6 - (13:0,13)
  51116. - Transition span - Gen<None> - [<text>] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:3
  51117. - SyntaxKind.OpenAngle;[<];
  51118. - SyntaxKind.Text;[text];
  51119. - SyntaxKind.CloseAngle;[>];
  51120. - Markup span - Gen<Markup> - [;] - SpanEditHandler;Accepts:None - (19:0,19) - Tokens:1
  51121. - SyntaxKind.Text;[;];
  51122. - Tag block - Gen<None> - 7 - (20:0,20)
  51123. - Transition span - Gen<None> - [</text>] - SpanEditHandler;Accepts:None - (20:0,20) - Tokens:4
  51124. - SyntaxKind.OpenAngle;[<];
  51125. - SyntaxKind.ForwardSlash;[/];
  51126. - SyntaxKind.Text;[text];
  51127. - SyntaxKind.CloseAngle;[>];
  51128. - Code span - Gen<Stmt> - [ }] - SpanEditHandler;Accepts:Any - (27:0,27) - Tokens:2
  51129. - SyntaxKind.Whitespace;[ ];
  51130. - SyntaxKind.RightBrace;[}];
  51131. +CSharpCodeBlock - [0..29)::29 - [if (i > 0) { <text>;</text> }]
  51132. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  51133. + Transition;[<Missing>];
  51134. + CSharpStatementLiteral - [0..13)::13 - [if (i > 0) { ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  51135. + Keyword;[if];
  51136. + Whitespace;[ ];
  51137. + LeftParenthesis;[(];
  51138. + Identifier;[i];
  51139. + Whitespace;[ ];
  51140. + GreaterThan;[>];
  51141. + Whitespace;[ ];
  51142. + IntegerLiteral;[0];
  51143. + RightParenthesis;[)];
  51144. + Whitespace;[ ];
  51145. + LeftBrace;[{];
  51146. + Whitespace;[ ];
  51147. + MarkupBlock - [13..27)::14
  51148. + MarkupTagBlock - [13..19)::6 - [<text>]
  51149. + MarkupTransition - [13..19)::6 - Gen<None> - SpanEditHandler;Accepts:None
  51150. + OpenAngle;[<];
  51151. + Text;[text];
  51152. + CloseAngle;[>];
  51153. + MarkupTextLiteral - [19..20)::1 - [;] - Gen<Markup> - SpanEditHandler;Accepts:None
  51154. + Text;[;];
  51155. + MarkupTagBlock - [20..27)::7 - [</text>]
  51156. + MarkupTransition - [20..27)::7 - Gen<None> - SpanEditHandler;Accepts:None
  51157. + OpenAngle;[<];
  51158. + ForwardSlash;[/];
  51159. + Text;[text];
  51160. + CloseAngle;[>];
  51161. + CSharpStatementLiteral - [27..29)::2 - [ }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  51162. + Whitespace;[ ];
  51163. + RightBrace;[}];
  51164. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/CorrectlyReturnsFromMarkupBlockWithPseudoTagInCodeBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/CorrectlyReturnsFromMarkupBlockWithPseudoTagInCodeBlock.stree.txt
  51165. index ac6e672b3be..db9961a4880 100644
  51166. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/CorrectlyReturnsFromMarkupBlockWithPseudoTagInCodeBlock.stree.txt
  51167. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/CorrectlyReturnsFromMarkupBlockWithPseudoTagInCodeBlock.stree.txt
  51168. @@ -1,37 +1,42 @@
  51169. -Statement block - Gen<None> - 33 - (0:0,0)
  51170. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  51171. - SyntaxKind.LeftBrace;[{];
  51172. - Code span - Gen<Stmt> - [ if (i > 0) { ] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:13
  51173. - SyntaxKind.Whitespace;[ ];
  51174. - SyntaxKind.Keyword;[if];
  51175. - SyntaxKind.Whitespace;[ ];
  51176. - SyntaxKind.LeftParenthesis;[(];
  51177. - SyntaxKind.Identifier;[i];
  51178. - SyntaxKind.Whitespace;[ ];
  51179. - SyntaxKind.GreaterThan;[>];
  51180. - SyntaxKind.Whitespace;[ ];
  51181. - SyntaxKind.IntegerLiteral;[0];
  51182. - SyntaxKind.RightParenthesis;[)];
  51183. - SyntaxKind.Whitespace;[ ];
  51184. - SyntaxKind.LeftBrace;[{];
  51185. - SyntaxKind.Whitespace;[ ];
  51186. - Markup block - Gen<None> - 14 - (15:0,15)
  51187. - Tag block - Gen<None> - 6 - (15:0,15)
  51188. - Transition span - Gen<None> - [<text>] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:3
  51189. - SyntaxKind.OpenAngle;[<];
  51190. - SyntaxKind.Text;[text];
  51191. - SyntaxKind.CloseAngle;[>];
  51192. - Markup span - Gen<Markup> - [;] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:1
  51193. - SyntaxKind.Text;[;];
  51194. - Tag block - Gen<None> - 7 - (22:0,22)
  51195. - Transition span - Gen<None> - [</text>] - SpanEditHandler;Accepts:None - (22:0,22) - Tokens:4
  51196. - SyntaxKind.OpenAngle;[<];
  51197. - SyntaxKind.ForwardSlash;[/];
  51198. - SyntaxKind.Text;[text];
  51199. - SyntaxKind.CloseAngle;[>];
  51200. - Code span - Gen<Stmt> - [ } ] - SpanEditHandler;Accepts:Any - (29:0,29) - Tokens:3
  51201. - SyntaxKind.Whitespace;[ ];
  51202. - SyntaxKind.RightBrace;[}];
  51203. - SyntaxKind.Whitespace;[ ];
  51204. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (32:0,32) - Tokens:1
  51205. - SyntaxKind.RightBrace;[}];
  51206. +CSharpCodeBlock - [0..33)::33 - [{ if (i > 0) { <text>;</text> } }]
  51207. + CSharpStatement - [0..33)::33
  51208. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  51209. + Transition;[<Missing>];
  51210. + CSharpStatementBody - [0..33)::33
  51211. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  51212. + LeftBrace;[{];
  51213. + CSharpCodeBlock - [1..32)::31
  51214. + CSharpStatementLiteral - [1..15)::14 - [ if (i > 0) { ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  51215. + Whitespace;[ ];
  51216. + Keyword;[if];
  51217. + Whitespace;[ ];
  51218. + LeftParenthesis;[(];
  51219. + Identifier;[i];
  51220. + Whitespace;[ ];
  51221. + GreaterThan;[>];
  51222. + Whitespace;[ ];
  51223. + IntegerLiteral;[0];
  51224. + RightParenthesis;[)];
  51225. + Whitespace;[ ];
  51226. + LeftBrace;[{];
  51227. + Whitespace;[ ];
  51228. + MarkupBlock - [15..29)::14
  51229. + MarkupTagBlock - [15..21)::6 - [<text>]
  51230. + MarkupTransition - [15..21)::6 - Gen<None> - SpanEditHandler;Accepts:None
  51231. + OpenAngle;[<];
  51232. + Text;[text];
  51233. + CloseAngle;[>];
  51234. + MarkupTextLiteral - [21..22)::1 - [;] - Gen<Markup> - SpanEditHandler;Accepts:None
  51235. + Text;[;];
  51236. + MarkupTagBlock - [22..29)::7 - [</text>]
  51237. + MarkupTransition - [22..29)::7 - Gen<None> - SpanEditHandler;Accepts:None
  51238. + OpenAngle;[<];
  51239. + ForwardSlash;[/];
  51240. + Text;[text];
  51241. + CloseAngle;[>];
  51242. + CSharpStatementLiteral - [29..32)::3 - [ } ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  51243. + Whitespace;[ ];
  51244. + RightBrace;[}];
  51245. + Whitespace;[ ];
  51246. + RazorMetaCode - [32..33)::1 - Gen<None> - SpanEditHandler;Accepts:None
  51247. + RightBrace;[}];
  51248. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesAllWhitespaceOnSameLineWithTrailingNewLineToMarkupExclPreceedingNewline.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesAllWhitespaceOnSameLineWithTrailingNewLineToMarkupExclPreceedingNewline.cspans.txt
  51249. index 0d63ee3423c..aa7044c6d1b 100644
  51250. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesAllWhitespaceOnSameLineWithTrailingNewLineToMarkupExclPreceedingNewline.cspans.txt
  51251. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesAllWhitespaceOnSameLineWithTrailingNewLineToMarkupExclPreceedingNewline.cspans.txt
  51252. @@ -2,9 +2,9 @@ Code span at (0:0,0 [80] ) (Accepts:Any) - Parent: Statement block at (0:0,0 [16
  51253. Markup span at (80:2,0 [4] ) (Accepts:Any) - Parent: Markup block at (80:2,0 [46] )
  51254. Markup span at (84:2,4 [3] ) (Accepts:None) - Parent: Tag block at (84:2,4 [3] )
  51255. Markup span at (87:2,7 [15] ) (Accepts:Any) - Parent: Markup block at (80:2,0 [46] )
  51256. -Code span at (102:4,0 [8] ) (Accepts:Any) - Parent: Expression block at (102:4,0 [12] )
  51257. -Transition span at (110:4,8 [1] ) (Accepts:None) - Parent: Expression block at (102:4,0 [12] )
  51258. -Code span at (111:4,9 [3] ) (Accepts:NonWhitespace) - Parent: Expression block at (102:4,0 [12] )
  51259. +Code span at (102:4,0 [8] ) (Accepts:Any) - Parent: Statement block at (102:4,0 [12] )
  51260. +Transition span at (110:4,8 [1] ) (Accepts:None) - Parent: Expression block at (110:4,8 [4] )
  51261. +Code span at (111:4,9 [3] ) (Accepts:NonWhitespace) - Parent: Expression block at (110:4,8 [4] )
  51262. Markup span at (114:4,12 [6] ) (Accepts:Any) - Parent: Markup block at (80:2,0 [46] )
  51263. Markup span at (120:5,4 [4] ) (Accepts:None) - Parent: Tag block at (120:5,4 [4] )
  51264. Markup span at (124:5,8 [2] ) (Accepts:None) - Parent: Markup block at (80:2,0 [46] )
  51265. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesAllWhitespaceOnSameLineWithTrailingNewLineToMarkupExclPreceedingNewline.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesAllWhitespaceOnSameLineWithTrailingNewLineToMarkupExclPreceedingNewline.stree.txt
  51266. index 640b2a05482..2579466a4a5 100644
  51267. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesAllWhitespaceOnSameLineWithTrailingNewLineToMarkupExclPreceedingNewline.stree.txt
  51268. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesAllWhitespaceOnSameLineWithTrailingNewLineToMarkupExclPreceedingNewline.stree.txt
  51269. @@ -1,74 +1,79 @@
  51270. -Statement block - Gen<None> - 161 - (0:0,0)
  51271. - Code span - Gen<Stmt> - [if(foo) {LF var foo = "After this statement there are 10 spaces"; LF] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:18
  51272. - SyntaxKind.Keyword;[if];
  51273. - SyntaxKind.LeftParenthesis;[(];
  51274. - SyntaxKind.Identifier;[foo];
  51275. - SyntaxKind.RightParenthesis;[)];
  51276. - SyntaxKind.Whitespace;[ ];
  51277. - SyntaxKind.LeftBrace;[{];
  51278. - SyntaxKind.NewLine;[LF];
  51279. - SyntaxKind.Whitespace;[ ];
  51280. - SyntaxKind.Identifier;[var];
  51281. - SyntaxKind.Whitespace;[ ];
  51282. - SyntaxKind.Identifier;[foo];
  51283. - SyntaxKind.Whitespace;[ ];
  51284. - SyntaxKind.Assign;[=];
  51285. - SyntaxKind.Whitespace;[ ];
  51286. - SyntaxKind.StringLiteral;["After this statement there are 10 spaces"];
  51287. - SyntaxKind.Semicolon;[;];
  51288. - SyntaxKind.Whitespace;[ ];
  51289. - SyntaxKind.NewLine;[LF];
  51290. - Markup block - Gen<None> - 46 - (80:2,0)
  51291. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (80:2,0) - Tokens:1
  51292. - SyntaxKind.Whitespace;[ ];
  51293. - Tag block - Gen<None> - 3 - (84:2,4)
  51294. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (84:2,4) - Tokens:3
  51295. - SyntaxKind.OpenAngle;[<];
  51296. - SyntaxKind.Text;[p];
  51297. - SyntaxKind.CloseAngle;[>];
  51298. - Markup span - Gen<Markup> - [LF FooLF] - SpanEditHandler;Accepts:Any - (87:2,7) - Tokens:4
  51299. - SyntaxKind.NewLine;[LF];
  51300. - SyntaxKind.Whitespace;[ ];
  51301. - SyntaxKind.Text;[Foo];
  51302. - SyntaxKind.NewLine;[LF];
  51303. - Expression block - Gen<Expr> - 12 - (102:4,0)
  51304. - Code span - Gen<Stmt> - [ ] - SpanEditHandler;Accepts:Any - (102:4,0) - Tokens:1
  51305. - SyntaxKind.Whitespace;[ ];
  51306. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (110:4,8) - Tokens:1
  51307. - SyntaxKind.Transition;[@];
  51308. - Code span - Gen<Expr> - [bar] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (111:4,9) - Tokens:1
  51309. - SyntaxKind.Identifier;[bar];
  51310. - Markup span - Gen<Markup> - [LF ] - SpanEditHandler;Accepts:Any - (114:4,12) - Tokens:2
  51311. - SyntaxKind.NewLine;[LF];
  51312. - SyntaxKind.Whitespace;[ ];
  51313. - Tag block - Gen<None> - 4 - (120:5,4)
  51314. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (120:5,4) - Tokens:4
  51315. - SyntaxKind.OpenAngle;[<];
  51316. - SyntaxKind.ForwardSlash;[/];
  51317. - SyntaxKind.Text;[p];
  51318. - SyntaxKind.CloseAngle;[>];
  51319. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (124:5,8) - Tokens:1
  51320. - SyntaxKind.NewLine;[LF];
  51321. - Markup block - Gen<None> - 14 - (126:6,0)
  51322. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (126:6,0) - Tokens:1
  51323. - SyntaxKind.Whitespace;[ ];
  51324. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (130:6,4) - Tokens:1
  51325. - SyntaxKind.Transition;[@];
  51326. - MetaCode span - Gen<None> - [:] - SpanEditHandler;Accepts:Any - (131:6,5) - Tokens:1
  51327. - SyntaxKind.Colon;[:];
  51328. - Markup span - Gen<Markup> - [Hello!LF] - SpanEditHandler;Accepts:None - (132:6,6) - Tokens:3
  51329. - SyntaxKind.Text;[Hello];
  51330. - SyntaxKind.Bang;[!];
  51331. - SyntaxKind.NewLine;[LF];
  51332. - Code span - Gen<Stmt> - [ var biz = boz;LF}] - SpanEditHandler;Accepts:Any - (140:7,0) - Tokens:11
  51333. - SyntaxKind.Whitespace;[ ];
  51334. - SyntaxKind.Identifier;[var];
  51335. - SyntaxKind.Whitespace;[ ];
  51336. - SyntaxKind.Identifier;[biz];
  51337. - SyntaxKind.Whitespace;[ ];
  51338. - SyntaxKind.Assign;[=];
  51339. - SyntaxKind.Whitespace;[ ];
  51340. - SyntaxKind.Identifier;[boz];
  51341. - SyntaxKind.Semicolon;[;];
  51342. - SyntaxKind.NewLine;[LF];
  51343. - SyntaxKind.RightBrace;[}];
  51344. +CSharpCodeBlock - [0..161)::161 - [if(foo) {LF var foo = "After this statement there are 10 spaces"; LF <p>LF FooLF @barLF </p>LF @:Hello!LF var biz = boz;LF}]
  51345. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  51346. + Transition;[<Missing>];
  51347. + CSharpStatementLiteral - [0..80)::80 - [if(foo) {LF var foo = "After this statement there are 10 spaces"; LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  51348. + Keyword;[if];
  51349. + LeftParenthesis;[(];
  51350. + Identifier;[foo];
  51351. + RightParenthesis;[)];
  51352. + Whitespace;[ ];
  51353. + LeftBrace;[{];
  51354. + NewLine;[LF];
  51355. + Whitespace;[ ];
  51356. + Identifier;[var];
  51357. + Whitespace;[ ];
  51358. + Identifier;[foo];
  51359. + Whitespace;[ ];
  51360. + Assign;[=];
  51361. + Whitespace;[ ];
  51362. + StringLiteral;["After this statement there are 10 spaces"];
  51363. + Semicolon;[;];
  51364. + Whitespace;[ ];
  51365. + NewLine;[LF];
  51366. + MarkupBlock - [80..126)::46
  51367. + MarkupTextLiteral - [80..84)::4 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  51368. + Whitespace;[ ];
  51369. + MarkupTagBlock - [84..87)::3 - [<p>]
  51370. + MarkupTextLiteral - [84..87)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  51371. + OpenAngle;[<];
  51372. + Text;[p];
  51373. + CloseAngle;[>];
  51374. + MarkupTextLiteral - [87..102)::15 - [LF FooLF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  51375. + NewLine;[LF];
  51376. + Whitespace;[ ];
  51377. + Text;[Foo];
  51378. + NewLine;[LF];
  51379. + CSharpCodeBlock - [102..114)::12
  51380. + CSharpStatementLiteral - [102..110)::8 - [ ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  51381. + Whitespace;[ ];
  51382. + CSharpImplicitExpression - [110..114)::4
  51383. + CSharpTransition - [110..111)::1 - Gen<None> - SpanEditHandler;Accepts:None
  51384. + Transition;[@];
  51385. + CSharpImplicitExpressionBody - [111..114)::3
  51386. + CSharpCodeBlock - [111..114)::3
  51387. + CSharpExpressionLiteral - [111..114)::3 - [bar] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  51388. + Identifier;[bar];
  51389. + MarkupTextLiteral - [114..120)::6 - [LF ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  51390. + NewLine;[LF];
  51391. + Whitespace;[ ];
  51392. + MarkupTagBlock - [120..124)::4 - [</p>]
  51393. + MarkupTextLiteral - [120..124)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  51394. + OpenAngle;[<];
  51395. + ForwardSlash;[/];
  51396. + Text;[p];
  51397. + CloseAngle;[>];
  51398. + MarkupTextLiteral - [124..126)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  51399. + NewLine;[LF];
  51400. + MarkupBlock - [126..140)::14
  51401. + MarkupTextLiteral - [126..130)::4 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  51402. + Whitespace;[ ];
  51403. + MarkupTransition - [130..131)::1 - Gen<None> - SpanEditHandler;Accepts:None
  51404. + Transition;[@];
  51405. + RazorMetaCode - [131..132)::1 - Gen<None> - SpanEditHandler;Accepts:Any
  51406. + Colon;[:];
  51407. + MarkupTextLiteral - [132..140)::8 - [Hello!LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  51408. + Text;[Hello];
  51409. + Bang;[!];
  51410. + NewLine;[LF];
  51411. + CSharpStatementLiteral - [140..161)::21 - [ var biz = boz;LF}] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  51412. + Whitespace;[ ];
  51413. + Identifier;[var];
  51414. + Whitespace;[ ];
  51415. + Identifier;[biz];
  51416. + Whitespace;[ ];
  51417. + Assign;[=];
  51418. + Whitespace;[ ];
  51419. + Identifier;[boz];
  51420. + Semicolon;[;];
  51421. + NewLine;[LF];
  51422. + RightBrace;[}];
  51423. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesSpacesToCodeOnAtColonTemplateTransitionInDesignTimeMode.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesSpacesToCodeOnAtColonTemplateTransitionInDesignTimeMode.stree.txt
  51424. index 030532c5cba..e336a480f8e 100644
  51425. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesSpacesToCodeOnAtColonTemplateTransitionInDesignTimeMode.stree.txt
  51426. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesSpacesToCodeOnAtColonTemplateTransitionInDesignTimeMode.stree.txt
  51427. @@ -1,25 +1,30 @@
  51428. -Expression block - Gen<Expr> - 29 - (0:0,0)
  51429. - Code span - Gen<Expr> - [Foo( LF] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (0:0,0) - Tokens:4
  51430. - SyntaxKind.Identifier;[Foo];
  51431. - SyntaxKind.LeftParenthesis;[(];
  51432. - SyntaxKind.Whitespace;[ ];
  51433. - SyntaxKind.NewLine;[LF];
  51434. - Template block - Gen<Template> - 18 - (10:1,0)
  51435. - Markup block - Gen<None> - 18 - (10:1,0)
  51436. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (10:1,0) - Tokens:1
  51437. - SyntaxKind.Transition;[@];
  51438. - MetaCode span - Gen<None> - [:] - SpanEditHandler;Accepts:Any - (11:1,1) - Tokens:1
  51439. - SyntaxKind.Colon;[:];
  51440. - Markup span - Gen<Markup> - [<p>Foo</p> LF] - SpanEditHandler;Accepts:None - (12:1,2) - Tokens:10
  51441. - SyntaxKind.OpenAngle;[<];
  51442. - SyntaxKind.Text;[p];
  51443. - SyntaxKind.CloseAngle;[>];
  51444. - SyntaxKind.Text;[Foo];
  51445. - SyntaxKind.OpenAngle;[<];
  51446. - SyntaxKind.ForwardSlash;[/];
  51447. - SyntaxKind.Text;[p];
  51448. - SyntaxKind.CloseAngle;[>];
  51449. - SyntaxKind.Whitespace;[ ];
  51450. - SyntaxKind.NewLine;[LF];
  51451. - Code span - Gen<Expr> - [)] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (28:2,0) - Tokens:1
  51452. - SyntaxKind.RightParenthesis;[)];
  51453. +CSharpCodeBlock - [0..29)::29 - [Foo( LF@:<p>Foo</p> LF)]
  51454. + CSharpImplicitExpression - [0..29)::29
  51455. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  51456. + Transition;[<Missing>];
  51457. + CSharpImplicitExpressionBody - [0..29)::29
  51458. + CSharpCodeBlock - [0..29)::29
  51459. + CSharpExpressionLiteral - [0..10)::10 - [Foo( LF] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14
  51460. + Identifier;[Foo];
  51461. + LeftParenthesis;[(];
  51462. + Whitespace;[ ];
  51463. + NewLine;[LF];
  51464. + CSharpTemplateBlock - [10..28)::18
  51465. + MarkupBlock - [10..28)::18
  51466. + MarkupTransition - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  51467. + Transition;[@];
  51468. + RazorMetaCode - [11..12)::1 - Gen<None> - SpanEditHandler;Accepts:Any
  51469. + Colon;[:];
  51470. + MarkupTextLiteral - [12..28)::16 - [<p>Foo</p> LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  51471. + OpenAngle;[<];
  51472. + Text;[p];
  51473. + CloseAngle;[>];
  51474. + Text;[Foo];
  51475. + OpenAngle;[<];
  51476. + ForwardSlash;[/];
  51477. + Text;[p];
  51478. + CloseAngle;[>];
  51479. + Whitespace;[ ];
  51480. + NewLine;[LF];
  51481. + CSharpExpressionLiteral - [28..29)::1 - [)] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  51482. + RightParenthesis;[)];
  51483. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesSpacesToCodeOnAtColonTransitionInDesignTimeMode.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesSpacesToCodeOnAtColonTransitionInDesignTimeMode.stree.txt
  51484. index 41817dc722b..c3f77cd91d7 100644
  51485. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesSpacesToCodeOnAtColonTransitionInDesignTimeMode.stree.txt
  51486. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesSpacesToCodeOnAtColonTransitionInDesignTimeMode.stree.txt
  51487. @@ -1,26 +1,31 @@
  51488. -Statement block - Gen<None> - 26 - (0:0,0)
  51489. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  51490. - SyntaxKind.LeftBrace;[{];
  51491. - Code span - Gen<Stmt> - [LF ] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:2
  51492. - SyntaxKind.NewLine;[LF];
  51493. - SyntaxKind.Whitespace;[ ];
  51494. - Markup block - Gen<None> - 18 - (7:1,4)
  51495. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (7:1,4) - Tokens:1
  51496. - SyntaxKind.Transition;[@];
  51497. - MetaCode span - Gen<None> - [:] - SpanEditHandler;Accepts:Any - (8:1,5) - Tokens:1
  51498. - SyntaxKind.Colon;[:];
  51499. - Markup span - Gen<Markup> - [<p>Foo</p> LF] - SpanEditHandler;Accepts:None - (9:1,6) - Tokens:10
  51500. - SyntaxKind.OpenAngle;[<];
  51501. - SyntaxKind.Text;[p];
  51502. - SyntaxKind.CloseAngle;[>];
  51503. - SyntaxKind.Text;[Foo];
  51504. - SyntaxKind.OpenAngle;[<];
  51505. - SyntaxKind.ForwardSlash;[/];
  51506. - SyntaxKind.Text;[p];
  51507. - SyntaxKind.CloseAngle;[>];
  51508. - SyntaxKind.Whitespace;[ ];
  51509. - SyntaxKind.NewLine;[LF];
  51510. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (25:2,0) - Tokens:1
  51511. - SyntaxKind.Unknown;[];
  51512. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (25:2,0) - Tokens:1
  51513. - SyntaxKind.RightBrace;[}];
  51514. +CSharpCodeBlock - [0..26)::26 - [{LF @:<p>Foo</p> LF}]
  51515. + CSharpStatement - [0..26)::26
  51516. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  51517. + Transition;[<Missing>];
  51518. + CSharpStatementBody - [0..26)::26
  51519. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  51520. + LeftBrace;[{];
  51521. + CSharpCodeBlock - [1..25)::24
  51522. + CSharpStatementLiteral - [1..7)::6 - [LF ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  51523. + NewLine;[LF];
  51524. + Whitespace;[ ];
  51525. + MarkupBlock - [7..25)::18
  51526. + MarkupTransition - [7..8)::1 - Gen<None> - SpanEditHandler;Accepts:None
  51527. + Transition;[@];
  51528. + RazorMetaCode - [8..9)::1 - Gen<None> - SpanEditHandler;Accepts:Any
  51529. + Colon;[:];
  51530. + MarkupTextLiteral - [9..25)::16 - [<p>Foo</p> LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  51531. + OpenAngle;[<];
  51532. + Text;[p];
  51533. + CloseAngle;[>];
  51534. + Text;[Foo];
  51535. + OpenAngle;[<];
  51536. + ForwardSlash;[/];
  51537. + Text;[p];
  51538. + CloseAngle;[>];
  51539. + Whitespace;[ ];
  51540. + NewLine;[LF];
  51541. + CSharpStatementLiteral - [25..25)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  51542. + Marker;[];
  51543. + RazorMetaCode - [25..26)::1 - Gen<None> - SpanEditHandler;Accepts:None
  51544. + RightBrace;[}];
  51545. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesSpacesToCodeOnAtTagTemplateTransitionInDesignTimeMode.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesSpacesToCodeOnAtTagTemplateTransitionInDesignTimeMode.stree.txt
  51546. index c3effa93afb..654f6fa14ee 100644
  51547. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesSpacesToCodeOnAtTagTemplateTransitionInDesignTimeMode.stree.txt
  51548. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesSpacesToCodeOnAtTagTemplateTransitionInDesignTimeMode.stree.txt
  51549. @@ -1,25 +1,30 @@
  51550. -Expression block - Gen<Expr> - 24 - (0:0,0)
  51551. - Code span - Gen<Expr> - [Foo( ] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (0:0,0) - Tokens:3
  51552. - SyntaxKind.Identifier;[Foo];
  51553. - SyntaxKind.LeftParenthesis;[(];
  51554. - SyntaxKind.Whitespace;[ ];
  51555. - Template block - Gen<Template> - 11 - (8:0,8)
  51556. - Markup block - Gen<None> - 11 - (8:0,8)
  51557. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (8:0,8) - Tokens:1
  51558. - SyntaxKind.Transition;[@];
  51559. - Tag block - Gen<None> - 3 - (9:0,9)
  51560. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (9:0,9) - Tokens:3
  51561. - SyntaxKind.OpenAngle;[<];
  51562. - SyntaxKind.Text;[p];
  51563. - SyntaxKind.CloseAngle;[>];
  51564. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:1
  51565. - SyntaxKind.Text;[Foo];
  51566. - Tag block - Gen<None> - 4 - (15:0,15)
  51567. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:4
  51568. - SyntaxKind.OpenAngle;[<];
  51569. - SyntaxKind.ForwardSlash;[/];
  51570. - SyntaxKind.Text;[p];
  51571. - SyntaxKind.CloseAngle;[>];
  51572. - Code span - Gen<Expr> - [ )] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (19:0,19) - Tokens:2
  51573. - SyntaxKind.Whitespace;[ ];
  51574. - SyntaxKind.RightParenthesis;[)];
  51575. +CSharpCodeBlock - [0..24)::24 - [Foo( @<p>Foo</p> )]
  51576. + CSharpImplicitExpression - [0..24)::24
  51577. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  51578. + Transition;[<Missing>];
  51579. + CSharpImplicitExpressionBody - [0..24)::24
  51580. + CSharpCodeBlock - [0..24)::24
  51581. + CSharpExpressionLiteral - [0..8)::8 - [Foo( ] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14
  51582. + Identifier;[Foo];
  51583. + LeftParenthesis;[(];
  51584. + Whitespace;[ ];
  51585. + CSharpTemplateBlock - [8..19)::11
  51586. + MarkupBlock - [8..19)::11
  51587. + MarkupTransition - [8..9)::1 - Gen<None> - SpanEditHandler;Accepts:None
  51588. + Transition;[@];
  51589. + MarkupTagBlock - [9..12)::3 - [<p>]
  51590. + MarkupTextLiteral - [9..12)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  51591. + OpenAngle;[<];
  51592. + Text;[p];
  51593. + CloseAngle;[>];
  51594. + MarkupTextLiteral - [12..15)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  51595. + Text;[Foo];
  51596. + MarkupTagBlock - [15..19)::4 - [</p>]
  51597. + MarkupTextLiteral - [15..19)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  51598. + OpenAngle;[<];
  51599. + ForwardSlash;[/];
  51600. + Text;[p];
  51601. + CloseAngle;[>];
  51602. + CSharpExpressionLiteral - [19..24)::5 - [ )] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  51603. + Whitespace;[ ];
  51604. + RightParenthesis;[)];
  51605. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesSpacesToCodeOnInvalidAtTagTransitionInDesignTimeMode.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesSpacesToCodeOnInvalidAtTagTransitionInDesignTimeMode.stree.txt
  51606. index 7318fe68e1c..105ba18f274 100644
  51607. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesSpacesToCodeOnInvalidAtTagTransitionInDesignTimeMode.stree.txt
  51608. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesSpacesToCodeOnInvalidAtTagTransitionInDesignTimeMode.stree.txt
  51609. @@ -1,27 +1,32 @@
  51610. -Statement block - Gen<None> - 25 - (0:0,0)
  51611. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  51612. - SyntaxKind.LeftBrace;[{];
  51613. - Code span - Gen<Stmt> - [LF ] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:2
  51614. - SyntaxKind.NewLine;[LF];
  51615. - SyntaxKind.Whitespace;[ ];
  51616. - Markup block - Gen<None> - 11 - (7:1,4)
  51617. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (7:1,4) - Tokens:1
  51618. - SyntaxKind.Transition;[@];
  51619. - Tag block - Gen<None> - 3 - (8:1,5)
  51620. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (8:1,5) - Tokens:3
  51621. - SyntaxKind.OpenAngle;[<];
  51622. - SyntaxKind.Text;[p];
  51623. - SyntaxKind.CloseAngle;[>];
  51624. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:Any - (11:1,8) - Tokens:1
  51625. - SyntaxKind.Text;[Foo];
  51626. - Tag block - Gen<None> - 4 - (14:1,11)
  51627. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (14:1,11) - Tokens:4
  51628. - SyntaxKind.OpenAngle;[<];
  51629. - SyntaxKind.ForwardSlash;[/];
  51630. - SyntaxKind.Text;[p];
  51631. - SyntaxKind.CloseAngle;[>];
  51632. - Code span - Gen<Stmt> - [ LF] - SpanEditHandler;Accepts:Any - (18:1,15) - Tokens:2
  51633. - SyntaxKind.Whitespace;[ ];
  51634. - SyntaxKind.NewLine;[LF];
  51635. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (24:2,0) - Tokens:1
  51636. - SyntaxKind.RightBrace;[}];
  51637. +CSharpCodeBlock - [0..25)::25 - [{LF @<p>Foo</p> LF}]
  51638. + CSharpStatement - [0..25)::25
  51639. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  51640. + Transition;[<Missing>];
  51641. + CSharpStatementBody - [0..25)::25
  51642. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  51643. + LeftBrace;[{];
  51644. + CSharpCodeBlock - [1..24)::23
  51645. + CSharpStatementLiteral - [1..7)::6 - [LF ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  51646. + NewLine;[LF];
  51647. + Whitespace;[ ];
  51648. + MarkupBlock - [7..18)::11
  51649. + MarkupTransition - [7..8)::1 - Gen<None> - SpanEditHandler;Accepts:None
  51650. + Transition;[@];
  51651. + MarkupTagBlock - [8..11)::3 - [<p>]
  51652. + MarkupTextLiteral - [8..11)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  51653. + OpenAngle;[<];
  51654. + Text;[p];
  51655. + CloseAngle;[>];
  51656. + MarkupTextLiteral - [11..14)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  51657. + Text;[Foo];
  51658. + MarkupTagBlock - [14..18)::4 - [</p>]
  51659. + MarkupTextLiteral - [14..18)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  51660. + OpenAngle;[<];
  51661. + ForwardSlash;[/];
  51662. + Text;[p];
  51663. + CloseAngle;[>];
  51664. + CSharpStatementLiteral - [18..24)::6 - [ LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  51665. + Whitespace;[ ];
  51666. + NewLine;[LF];
  51667. + RazorMetaCode - [24..25)::1 - Gen<None> - SpanEditHandler;Accepts:None
  51668. + RightBrace;[}];
  51669. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesSpacesToCodeOnTagTransitionInDesignTimeMode.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesSpacesToCodeOnTagTransitionInDesignTimeMode.stree.txt
  51670. index d99b7b83ba6..8396f9205ae 100644
  51671. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesSpacesToCodeOnTagTransitionInDesignTimeMode.stree.txt
  51672. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/GivesSpacesToCodeOnTagTransitionInDesignTimeMode.stree.txt
  51673. @@ -1,25 +1,30 @@
  51674. -Statement block - Gen<None> - 24 - (0:0,0)
  51675. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  51676. - SyntaxKind.LeftBrace;[{];
  51677. - Code span - Gen<Stmt> - [LF ] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:2
  51678. - SyntaxKind.NewLine;[LF];
  51679. - SyntaxKind.Whitespace;[ ];
  51680. - Markup block - Gen<None> - 10 - (7:1,4)
  51681. - Tag block - Gen<None> - 3 - (7:1,4)
  51682. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (7:1,4) - Tokens:3
  51683. - SyntaxKind.OpenAngle;[<];
  51684. - SyntaxKind.Text;[p];
  51685. - SyntaxKind.CloseAngle;[>];
  51686. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:Any - (10:1,7) - Tokens:1
  51687. - SyntaxKind.Text;[Foo];
  51688. - Tag block - Gen<None> - 4 - (13:1,10)
  51689. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (13:1,10) - Tokens:4
  51690. - SyntaxKind.OpenAngle;[<];
  51691. - SyntaxKind.ForwardSlash;[/];
  51692. - SyntaxKind.Text;[p];
  51693. - SyntaxKind.CloseAngle;[>];
  51694. - Code span - Gen<Stmt> - [ LF] - SpanEditHandler;Accepts:Any - (17:1,14) - Tokens:2
  51695. - SyntaxKind.Whitespace;[ ];
  51696. - SyntaxKind.NewLine;[LF];
  51697. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (23:2,0) - Tokens:1
  51698. - SyntaxKind.RightBrace;[}];
  51699. +CSharpCodeBlock - [0..24)::24 - [{LF <p>Foo</p> LF}]
  51700. + CSharpStatement - [0..24)::24
  51701. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  51702. + Transition;[<Missing>];
  51703. + CSharpStatementBody - [0..24)::24
  51704. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  51705. + LeftBrace;[{];
  51706. + CSharpCodeBlock - [1..23)::22
  51707. + CSharpStatementLiteral - [1..7)::6 - [LF ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  51708. + NewLine;[LF];
  51709. + Whitespace;[ ];
  51710. + MarkupBlock - [7..17)::10
  51711. + MarkupTagBlock - [7..10)::3 - [<p>]
  51712. + MarkupTextLiteral - [7..10)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  51713. + OpenAngle;[<];
  51714. + Text;[p];
  51715. + CloseAngle;[>];
  51716. + MarkupTextLiteral - [10..13)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  51717. + Text;[Foo];
  51718. + MarkupTagBlock - [13..17)::4 - [</p>]
  51719. + MarkupTextLiteral - [13..17)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  51720. + OpenAngle;[<];
  51721. + ForwardSlash;[/];
  51722. + Text;[p];
  51723. + CloseAngle;[>];
  51724. + CSharpStatementLiteral - [17..23)::6 - [ LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  51725. + Whitespace;[ ];
  51726. + NewLine;[LF];
  51727. + RazorMetaCode - [23..24)::1 - Gen<None> - SpanEditHandler;Accepts:None
  51728. + RightBrace;[}];
  51729. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ParsesMarkupStatementOnOpenAngleBracket.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ParsesMarkupStatementOnOpenAngleBracket.stree.txt
  51730. index a9897535d37..8c41ae9d7aa 100644
  51731. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ParsesMarkupStatementOnOpenAngleBracket.stree.txt
  51732. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ParsesMarkupStatementOnOpenAngleBracket.stree.txt
  51733. @@ -1,45 +1,47 @@
  51734. -Statement block - Gen<None> - 42 - (0:0,0)
  51735. - Code span - Gen<Stmt> - [for(int i = 0; i < 10; i++) {] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:23
  51736. - SyntaxKind.Keyword;[for];
  51737. - SyntaxKind.LeftParenthesis;[(];
  51738. - SyntaxKind.Keyword;[int];
  51739. - SyntaxKind.Whitespace;[ ];
  51740. - SyntaxKind.Identifier;[i];
  51741. - SyntaxKind.Whitespace;[ ];
  51742. - SyntaxKind.Assign;[=];
  51743. - SyntaxKind.Whitespace;[ ];
  51744. - SyntaxKind.IntegerLiteral;[0];
  51745. - SyntaxKind.Semicolon;[;];
  51746. - SyntaxKind.Whitespace;[ ];
  51747. - SyntaxKind.Identifier;[i];
  51748. - SyntaxKind.Whitespace;[ ];
  51749. - SyntaxKind.LessThan;[<];
  51750. - SyntaxKind.Whitespace;[ ];
  51751. - SyntaxKind.IntegerLiteral;[10];
  51752. - SyntaxKind.Semicolon;[;];
  51753. - SyntaxKind.Whitespace;[ ];
  51754. - SyntaxKind.Identifier;[i];
  51755. - SyntaxKind.Increment;[++];
  51756. - SyntaxKind.RightParenthesis;[)];
  51757. - SyntaxKind.Whitespace;[ ];
  51758. - SyntaxKind.LeftBrace;[{];
  51759. - Markup block - Gen<None> - 12 - (29:0,29)
  51760. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (29:0,29) - Tokens:1
  51761. - SyntaxKind.Whitespace;[ ];
  51762. - Tag block - Gen<None> - 3 - (30:0,30)
  51763. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (30:0,30) - Tokens:3
  51764. - SyntaxKind.OpenAngle;[<];
  51765. - SyntaxKind.Text;[p];
  51766. - SyntaxKind.CloseAngle;[>];
  51767. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:Any - (33:0,33) - Tokens:1
  51768. - SyntaxKind.Text;[Foo];
  51769. - Tag block - Gen<None> - 4 - (36:0,36)
  51770. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (36:0,36) - Tokens:4
  51771. - SyntaxKind.OpenAngle;[<];
  51772. - SyntaxKind.ForwardSlash;[/];
  51773. - SyntaxKind.Text;[p];
  51774. - SyntaxKind.CloseAngle;[>];
  51775. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (40:0,40) - Tokens:1
  51776. - SyntaxKind.Whitespace;[ ];
  51777. - Code span - Gen<Stmt> - [}] - SpanEditHandler;Accepts:None - (41:0,41) - Tokens:1
  51778. - SyntaxKind.RightBrace;[}];
  51779. +CSharpCodeBlock - [0..42)::42 - [for(int i = 0; i < 10; i++) { <p>Foo</p> }]
  51780. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  51781. + Transition;[<Missing>];
  51782. + CSharpStatementLiteral - [0..29)::29 - [for(int i = 0; i < 10; i++) {] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  51783. + Keyword;[for];
  51784. + LeftParenthesis;[(];
  51785. + Keyword;[int];
  51786. + Whitespace;[ ];
  51787. + Identifier;[i];
  51788. + Whitespace;[ ];
  51789. + Assign;[=];
  51790. + Whitespace;[ ];
  51791. + IntegerLiteral;[0];
  51792. + Semicolon;[;];
  51793. + Whitespace;[ ];
  51794. + Identifier;[i];
  51795. + Whitespace;[ ];
  51796. + LessThan;[<];
  51797. + Whitespace;[ ];
  51798. + IntegerLiteral;[10];
  51799. + Semicolon;[;];
  51800. + Whitespace;[ ];
  51801. + Identifier;[i];
  51802. + Increment;[++];
  51803. + RightParenthesis;[)];
  51804. + Whitespace;[ ];
  51805. + LeftBrace;[{];
  51806. + MarkupBlock - [29..41)::12
  51807. + MarkupTextLiteral - [29..30)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  51808. + Whitespace;[ ];
  51809. + MarkupTagBlock - [30..33)::3 - [<p>]
  51810. + MarkupTextLiteral - [30..33)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  51811. + OpenAngle;[<];
  51812. + Text;[p];
  51813. + CloseAngle;[>];
  51814. + MarkupTextLiteral - [33..36)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  51815. + Text;[Foo];
  51816. + MarkupTagBlock - [36..40)::4 - [</p>]
  51817. + MarkupTextLiteral - [36..40)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  51818. + OpenAngle;[<];
  51819. + ForwardSlash;[/];
  51820. + Text;[p];
  51821. + CloseAngle;[>];
  51822. + MarkupTextLiteral - [40..41)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  51823. + Whitespace;[ ];
  51824. + CSharpStatementLiteral - [41..42)::1 - [}] - Gen<Stmt> - SpanEditHandler;Accepts:None
  51825. + RightBrace;[}];
  51826. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ParsesMarkupStatementOnOpenAngleBracketInCodeBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ParsesMarkupStatementOnOpenAngleBracketInCodeBlock.stree.txt
  51827. index 71e65ebb0d6..8eb1bd1e662 100644
  51828. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ParsesMarkupStatementOnOpenAngleBracketInCodeBlock.stree.txt
  51829. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ParsesMarkupStatementOnOpenAngleBracketInCodeBlock.stree.txt
  51830. @@ -1,51 +1,56 @@
  51831. -Statement block - Gen<None> - 46 - (0:0,0)
  51832. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  51833. - SyntaxKind.LeftBrace;[{];
  51834. - Code span - Gen<Stmt> - [ for(int i = 0; i < 10; i++) {] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:24
  51835. - SyntaxKind.Whitespace;[ ];
  51836. - SyntaxKind.Keyword;[for];
  51837. - SyntaxKind.LeftParenthesis;[(];
  51838. - SyntaxKind.Keyword;[int];
  51839. - SyntaxKind.Whitespace;[ ];
  51840. - SyntaxKind.Identifier;[i];
  51841. - SyntaxKind.Whitespace;[ ];
  51842. - SyntaxKind.Assign;[=];
  51843. - SyntaxKind.Whitespace;[ ];
  51844. - SyntaxKind.IntegerLiteral;[0];
  51845. - SyntaxKind.Semicolon;[;];
  51846. - SyntaxKind.Whitespace;[ ];
  51847. - SyntaxKind.Identifier;[i];
  51848. - SyntaxKind.Whitespace;[ ];
  51849. - SyntaxKind.LessThan;[<];
  51850. - SyntaxKind.Whitespace;[ ];
  51851. - SyntaxKind.IntegerLiteral;[10];
  51852. - SyntaxKind.Semicolon;[;];
  51853. - SyntaxKind.Whitespace;[ ];
  51854. - SyntaxKind.Identifier;[i];
  51855. - SyntaxKind.Increment;[++];
  51856. - SyntaxKind.RightParenthesis;[)];
  51857. - SyntaxKind.Whitespace;[ ];
  51858. - SyntaxKind.LeftBrace;[{];
  51859. - Markup block - Gen<None> - 12 - (31:0,31)
  51860. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (31:0,31) - Tokens:1
  51861. - SyntaxKind.Whitespace;[ ];
  51862. - Tag block - Gen<None> - 3 - (32:0,32)
  51863. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (32:0,32) - Tokens:3
  51864. - SyntaxKind.OpenAngle;[<];
  51865. - SyntaxKind.Text;[p];
  51866. - SyntaxKind.CloseAngle;[>];
  51867. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:Any - (35:0,35) - Tokens:1
  51868. - SyntaxKind.Text;[Foo];
  51869. - Tag block - Gen<None> - 4 - (38:0,38)
  51870. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (38:0,38) - Tokens:4
  51871. - SyntaxKind.OpenAngle;[<];
  51872. - SyntaxKind.ForwardSlash;[/];
  51873. - SyntaxKind.Text;[p];
  51874. - SyntaxKind.CloseAngle;[>];
  51875. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (42:0,42) - Tokens:1
  51876. - SyntaxKind.Whitespace;[ ];
  51877. - Code span - Gen<Stmt> - [} ] - SpanEditHandler;Accepts:Any - (43:0,43) - Tokens:2
  51878. - SyntaxKind.RightBrace;[}];
  51879. - SyntaxKind.Whitespace;[ ];
  51880. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (45:0,45) - Tokens:1
  51881. - SyntaxKind.RightBrace;[}];
  51882. +CSharpCodeBlock - [0..46)::46 - [{ for(int i = 0; i < 10; i++) { <p>Foo</p> } }]
  51883. + CSharpStatement - [0..46)::46
  51884. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  51885. + Transition;[<Missing>];
  51886. + CSharpStatementBody - [0..46)::46
  51887. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  51888. + LeftBrace;[{];
  51889. + CSharpCodeBlock - [1..45)::44
  51890. + CSharpStatementLiteral - [1..31)::30 - [ for(int i = 0; i < 10; i++) {] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  51891. + Whitespace;[ ];
  51892. + Keyword;[for];
  51893. + LeftParenthesis;[(];
  51894. + Keyword;[int];
  51895. + Whitespace;[ ];
  51896. + Identifier;[i];
  51897. + Whitespace;[ ];
  51898. + Assign;[=];
  51899. + Whitespace;[ ];
  51900. + IntegerLiteral;[0];
  51901. + Semicolon;[;];
  51902. + Whitespace;[ ];
  51903. + Identifier;[i];
  51904. + Whitespace;[ ];
  51905. + LessThan;[<];
  51906. + Whitespace;[ ];
  51907. + IntegerLiteral;[10];
  51908. + Semicolon;[;];
  51909. + Whitespace;[ ];
  51910. + Identifier;[i];
  51911. + Increment;[++];
  51912. + RightParenthesis;[)];
  51913. + Whitespace;[ ];
  51914. + LeftBrace;[{];
  51915. + MarkupBlock - [31..43)::12
  51916. + MarkupTextLiteral - [31..32)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  51917. + Whitespace;[ ];
  51918. + MarkupTagBlock - [32..35)::3 - [<p>]
  51919. + MarkupTextLiteral - [32..35)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  51920. + OpenAngle;[<];
  51921. + Text;[p];
  51922. + CloseAngle;[>];
  51923. + MarkupTextLiteral - [35..38)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  51924. + Text;[Foo];
  51925. + MarkupTagBlock - [38..42)::4 - [</p>]
  51926. + MarkupTextLiteral - [38..42)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  51927. + OpenAngle;[<];
  51928. + ForwardSlash;[/];
  51929. + Text;[p];
  51930. + CloseAngle;[>];
  51931. + MarkupTextLiteral - [42..43)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  51932. + Whitespace;[ ];
  51933. + CSharpStatementLiteral - [43..45)::2 - [} ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  51934. + RightBrace;[}];
  51935. + Whitespace;[ ];
  51936. + RazorMetaCode - [45..46)::1 - Gen<None> - SpanEditHandler;Accepts:None
  51937. + RightBrace;[}];
  51938. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ParsesMarkupStatementOnSwitchCharacterFollowedByColon.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ParsesMarkupStatementOnSwitchCharacterFollowedByColon.stree.txt
  51939. index 210330124db..117e0e35a34 100644
  51940. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ParsesMarkupStatementOnSwitchCharacterFollowedByColon.stree.txt
  51941. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ParsesMarkupStatementOnSwitchCharacterFollowedByColon.stree.txt
  51942. @@ -1,20 +1,22 @@
  51943. -Statement block - Gen<None> - 18 - (0:0,0)
  51944. - Code span - Gen<Stmt> - [if(foo) {] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:6
  51945. - SyntaxKind.Keyword;[if];
  51946. - SyntaxKind.LeftParenthesis;[(];
  51947. - SyntaxKind.Identifier;[foo];
  51948. - SyntaxKind.RightParenthesis;[)];
  51949. - SyntaxKind.Whitespace;[ ];
  51950. - SyntaxKind.LeftBrace;[{];
  51951. - Markup block - Gen<None> - 8 - (9:0,9)
  51952. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:1
  51953. - SyntaxKind.Whitespace;[ ];
  51954. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  51955. - SyntaxKind.Transition;[@];
  51956. - MetaCode span - Gen<None> - [:] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:1
  51957. - SyntaxKind.Colon;[:];
  51958. - Markup span - Gen<Markup> - [BarLF] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:2
  51959. - SyntaxKind.Text;[Bar];
  51960. - SyntaxKind.NewLine;[LF];
  51961. - Code span - Gen<Stmt> - [}] - SpanEditHandler;Accepts:Any - (17:1,0) - Tokens:1
  51962. - SyntaxKind.RightBrace;[}];
  51963. +CSharpCodeBlock - [0..18)::18 - [if(foo) { @:BarLF}]
  51964. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  51965. + Transition;[<Missing>];
  51966. + CSharpStatementLiteral - [0..9)::9 - [if(foo) {] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  51967. + Keyword;[if];
  51968. + LeftParenthesis;[(];
  51969. + Identifier;[foo];
  51970. + RightParenthesis;[)];
  51971. + Whitespace;[ ];
  51972. + LeftBrace;[{];
  51973. + MarkupBlock - [9..17)::8
  51974. + MarkupTextLiteral - [9..10)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  51975. + Whitespace;[ ];
  51976. + MarkupTransition - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  51977. + Transition;[@];
  51978. + RazorMetaCode - [11..12)::1 - Gen<None> - SpanEditHandler;Accepts:Any
  51979. + Colon;[:];
  51980. + MarkupTextLiteral - [12..17)::5 - [BarLF] - Gen<Markup> - SpanEditHandler;Accepts:None
  51981. + Text;[Bar];
  51982. + NewLine;[LF];
  51983. + CSharpStatementLiteral - [17..18)::1 - [}] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  51984. + RightBrace;[}];
  51985. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ParsesMarkupStatementOnSwitchCharacterFollowedByColonInCodeBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ParsesMarkupStatementOnSwitchCharacterFollowedByColonInCodeBlock.stree.txt
  51986. index 2ece8f5d8cb..8c569a20585 100644
  51987. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ParsesMarkupStatementOnSwitchCharacterFollowedByColonInCodeBlock.stree.txt
  51988. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ParsesMarkupStatementOnSwitchCharacterFollowedByColonInCodeBlock.stree.txt
  51989. @@ -1,26 +1,31 @@
  51990. -Statement block - Gen<None> - 22 - (0:0,0)
  51991. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  51992. - SyntaxKind.LeftBrace;[{];
  51993. - Code span - Gen<Stmt> - [ if(foo) {] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:7
  51994. - SyntaxKind.Whitespace;[ ];
  51995. - SyntaxKind.Keyword;[if];
  51996. - SyntaxKind.LeftParenthesis;[(];
  51997. - SyntaxKind.Identifier;[foo];
  51998. - SyntaxKind.RightParenthesis;[)];
  51999. - SyntaxKind.Whitespace;[ ];
  52000. - SyntaxKind.LeftBrace;[{];
  52001. - Markup block - Gen<None> - 8 - (11:0,11)
  52002. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:1
  52003. - SyntaxKind.Whitespace;[ ];
  52004. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:1
  52005. - SyntaxKind.Transition;[@];
  52006. - MetaCode span - Gen<None> - [:] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:1
  52007. - SyntaxKind.Colon;[:];
  52008. - Markup span - Gen<Markup> - [BarLF] - SpanEditHandler;Accepts:None - (14:0,14) - Tokens:2
  52009. - SyntaxKind.Text;[Bar];
  52010. - SyntaxKind.NewLine;[LF];
  52011. - Code span - Gen<Stmt> - [} ] - SpanEditHandler;Accepts:Any - (19:1,0) - Tokens:2
  52012. - SyntaxKind.RightBrace;[}];
  52013. - SyntaxKind.Whitespace;[ ];
  52014. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (21:1,2) - Tokens:1
  52015. - SyntaxKind.RightBrace;[}];
  52016. +CSharpCodeBlock - [0..22)::22 - [{ if(foo) { @:BarLF} }]
  52017. + CSharpStatement - [0..22)::22
  52018. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  52019. + Transition;[<Missing>];
  52020. + CSharpStatementBody - [0..22)::22
  52021. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  52022. + LeftBrace;[{];
  52023. + CSharpCodeBlock - [1..21)::20
  52024. + CSharpStatementLiteral - [1..11)::10 - [ if(foo) {] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  52025. + Whitespace;[ ];
  52026. + Keyword;[if];
  52027. + LeftParenthesis;[(];
  52028. + Identifier;[foo];
  52029. + RightParenthesis;[)];
  52030. + Whitespace;[ ];
  52031. + LeftBrace;[{];
  52032. + MarkupBlock - [11..19)::8
  52033. + MarkupTextLiteral - [11..12)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  52034. + Whitespace;[ ];
  52035. + MarkupTransition - [12..13)::1 - Gen<None> - SpanEditHandler;Accepts:None
  52036. + Transition;[@];
  52037. + RazorMetaCode - [13..14)::1 - Gen<None> - SpanEditHandler;Accepts:Any
  52038. + Colon;[:];
  52039. + MarkupTextLiteral - [14..19)::5 - [BarLF] - Gen<Markup> - SpanEditHandler;Accepts:None
  52040. + Text;[Bar];
  52041. + NewLine;[LF];
  52042. + CSharpStatementLiteral - [19..21)::2 - [} ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  52043. + RightBrace;[}];
  52044. + Whitespace;[ ];
  52045. + RazorMetaCode - [21..22)::1 - Gen<None> - SpanEditHandler;Accepts:None
  52046. + RightBrace;[}];
  52047. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ParsesMarkupStatementOnSwitchCharacterFollowedByDoubleColon.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ParsesMarkupStatementOnSwitchCharacterFollowedByDoubleColon.stree.txt
  52048. index a40785e9ff8..f4d93b3f94a 100644
  52049. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ParsesMarkupStatementOnSwitchCharacterFollowedByDoubleColon.stree.txt
  52050. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ParsesMarkupStatementOnSwitchCharacterFollowedByDoubleColon.stree.txt
  52051. @@ -1,20 +1,22 @@
  52052. -Statement block - Gen<None> - 24 - (0:0,0)
  52053. - Code span - Gen<Stmt> - [if(foo) {] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:6
  52054. - SyntaxKind.Keyword;[if];
  52055. - SyntaxKind.LeftParenthesis;[(];
  52056. - SyntaxKind.Identifier;[foo];
  52057. - SyntaxKind.RightParenthesis;[)];
  52058. - SyntaxKind.Whitespace;[ ];
  52059. - SyntaxKind.LeftBrace;[{];
  52060. - Markup block - Gen<None> - 14 - (9:0,9)
  52061. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:1
  52062. - SyntaxKind.Whitespace;[ ];
  52063. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  52064. - SyntaxKind.Transition;[@];
  52065. - MetaCode span - Gen<None> - [:] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:1
  52066. - SyntaxKind.Colon;[:];
  52067. - Markup span - Gen<Markup> - [:SometextLF] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:2
  52068. - SyntaxKind.Text;[:Sometext];
  52069. - SyntaxKind.NewLine;[LF];
  52070. - Code span - Gen<Stmt> - [}] - SpanEditHandler;Accepts:Any - (23:1,0) - Tokens:1
  52071. - SyntaxKind.RightBrace;[}];
  52072. +CSharpCodeBlock - [0..24)::24 - [if(foo) { @::SometextLF}]
  52073. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  52074. + Transition;[<Missing>];
  52075. + CSharpStatementLiteral - [0..9)::9 - [if(foo) {] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  52076. + Keyword;[if];
  52077. + LeftParenthesis;[(];
  52078. + Identifier;[foo];
  52079. + RightParenthesis;[)];
  52080. + Whitespace;[ ];
  52081. + LeftBrace;[{];
  52082. + MarkupBlock - [9..23)::14
  52083. + MarkupTextLiteral - [9..10)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  52084. + Whitespace;[ ];
  52085. + MarkupTransition - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  52086. + Transition;[@];
  52087. + RazorMetaCode - [11..12)::1 - Gen<None> - SpanEditHandler;Accepts:Any
  52088. + Colon;[:];
  52089. + MarkupTextLiteral - [12..23)::11 - [:SometextLF] - Gen<Markup> - SpanEditHandler;Accepts:None
  52090. + Text;[:Sometext];
  52091. + NewLine;[LF];
  52092. + CSharpStatementLiteral - [23..24)::1 - [}] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  52093. + RightBrace;[}];
  52094. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ParsesMarkupStatementOnSwitchCharacterFollowedByTripleColon.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ParsesMarkupStatementOnSwitchCharacterFollowedByTripleColon.stree.txt
  52095. index 0bf72b7b7fe..679cc778b6d 100644
  52096. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ParsesMarkupStatementOnSwitchCharacterFollowedByTripleColon.stree.txt
  52097. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ParsesMarkupStatementOnSwitchCharacterFollowedByTripleColon.stree.txt
  52098. @@ -1,20 +1,22 @@
  52099. -Statement block - Gen<None> - 25 - (0:0,0)
  52100. - Code span - Gen<Stmt> - [if(foo) {] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:6
  52101. - SyntaxKind.Keyword;[if];
  52102. - SyntaxKind.LeftParenthesis;[(];
  52103. - SyntaxKind.Identifier;[foo];
  52104. - SyntaxKind.RightParenthesis;[)];
  52105. - SyntaxKind.Whitespace;[ ];
  52106. - SyntaxKind.LeftBrace;[{];
  52107. - Markup block - Gen<None> - 15 - (9:0,9)
  52108. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:1
  52109. - SyntaxKind.Whitespace;[ ];
  52110. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  52111. - SyntaxKind.Transition;[@];
  52112. - MetaCode span - Gen<None> - [:] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:1
  52113. - SyntaxKind.Colon;[:];
  52114. - Markup span - Gen<Markup> - [::SometextLF] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:2
  52115. - SyntaxKind.Text;[::Sometext];
  52116. - SyntaxKind.NewLine;[LF];
  52117. - Code span - Gen<Stmt> - [}] - SpanEditHandler;Accepts:Any - (24:1,0) - Tokens:1
  52118. - SyntaxKind.RightBrace;[}];
  52119. +CSharpCodeBlock - [0..25)::25 - [if(foo) { @:::SometextLF}]
  52120. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  52121. + Transition;[<Missing>];
  52122. + CSharpStatementLiteral - [0..9)::9 - [if(foo) {] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  52123. + Keyword;[if];
  52124. + LeftParenthesis;[(];
  52125. + Identifier;[foo];
  52126. + RightParenthesis;[)];
  52127. + Whitespace;[ ];
  52128. + LeftBrace;[{];
  52129. + MarkupBlock - [9..24)::15
  52130. + MarkupTextLiteral - [9..10)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  52131. + Whitespace;[ ];
  52132. + MarkupTransition - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  52133. + Transition;[@];
  52134. + RazorMetaCode - [11..12)::1 - Gen<None> - SpanEditHandler;Accepts:Any
  52135. + Colon;[:];
  52136. + MarkupTextLiteral - [12..24)::12 - [::SometextLF] - Gen<Markup> - SpanEditHandler;Accepts:None
  52137. + Text;[::Sometext];
  52138. + NewLine;[LF];
  52139. + CSharpStatementLiteral - [24..25)::1 - [}] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  52140. + RightBrace;[}];
  52141. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ShouldSupportMarkupWithoutPreceedingWhitespace.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ShouldSupportMarkupWithoutPreceedingWhitespace.stree.txt
  52142. index 8c5fa532f36..06aeb9e15b8 100644
  52143. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ShouldSupportMarkupWithoutPreceedingWhitespace.stree.txt
  52144. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ShouldSupportMarkupWithoutPreceedingWhitespace.stree.txt
  52145. @@ -1,59 +1,61 @@
  52146. -Statement block - Gen<None> - 67 - (0:0,0)
  52147. - Code span - Gen<Stmt> - [foreach(var file in files){LFLFLF] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:14
  52148. - SyntaxKind.Keyword;[foreach];
  52149. - SyntaxKind.LeftParenthesis;[(];
  52150. - SyntaxKind.Identifier;[var];
  52151. - SyntaxKind.Whitespace;[ ];
  52152. - SyntaxKind.Identifier;[file];
  52153. - SyntaxKind.Whitespace;[ ];
  52154. - SyntaxKind.Keyword;[in];
  52155. - SyntaxKind.Whitespace;[ ];
  52156. - SyntaxKind.Identifier;[files];
  52157. - SyntaxKind.RightParenthesis;[)];
  52158. - SyntaxKind.LeftBrace;[{];
  52159. - SyntaxKind.NewLine;[LF];
  52160. - SyntaxKind.NewLine;[LF];
  52161. - SyntaxKind.NewLine;[LF];
  52162. - Markup block - Gen<None> - 7 - (33:3,0)
  52163. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (33:3,0) - Tokens:1
  52164. - SyntaxKind.Transition;[@];
  52165. - MetaCode span - Gen<None> - [:] - SpanEditHandler;Accepts:Any - (34:3,1) - Tokens:1
  52166. - SyntaxKind.Colon;[:];
  52167. - Markup span - Gen<Markup> - [BazLF] - SpanEditHandler;Accepts:None - (35:3,2) - Tokens:2
  52168. - SyntaxKind.Text;[Baz];
  52169. - SyntaxKind.NewLine;[LF];
  52170. - Markup block - Gen<None> - 7 - (40:4,0)
  52171. - Tag block - Gen<None> - 5 - (40:4,0)
  52172. - Markup span - Gen<Markup> - [<br/>] - SpanEditHandler;Accepts:None - (40:4,0) - Tokens:4
  52173. - SyntaxKind.OpenAngle;[<];
  52174. - SyntaxKind.Text;[br];
  52175. - SyntaxKind.ForwardSlash;[/];
  52176. - SyntaxKind.CloseAngle;[>];
  52177. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (45:4,5) - Tokens:1
  52178. - SyntaxKind.NewLine;[LF];
  52179. - Markup block - Gen<None> - 12 - (47:5,0)
  52180. - Tag block - Gen<None> - 3 - (47:5,0)
  52181. - Markup span - Gen<Markup> - [<a>] - SpanEditHandler;Accepts:None - (47:5,0) - Tokens:3
  52182. - SyntaxKind.OpenAngle;[<];
  52183. - SyntaxKind.Text;[a];
  52184. - SyntaxKind.CloseAngle;[>];
  52185. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:Any - (50:5,3) - Tokens:1
  52186. - SyntaxKind.Text;[Foo];
  52187. - Tag block - Gen<None> - 4 - (53:5,6)
  52188. - Markup span - Gen<Markup> - [</a>] - SpanEditHandler;Accepts:None - (53:5,6) - Tokens:4
  52189. - SyntaxKind.OpenAngle;[<];
  52190. - SyntaxKind.ForwardSlash;[/];
  52191. - SyntaxKind.Text;[a];
  52192. - SyntaxKind.CloseAngle;[>];
  52193. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (57:5,10) - Tokens:1
  52194. - SyntaxKind.NewLine;[LF];
  52195. - Markup block - Gen<None> - 7 - (59:6,0)
  52196. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (59:6,0) - Tokens:1
  52197. - SyntaxKind.Transition;[@];
  52198. - MetaCode span - Gen<None> - [:] - SpanEditHandler;Accepts:Any - (60:6,1) - Tokens:1
  52199. - SyntaxKind.Colon;[:];
  52200. - Markup span - Gen<Markup> - [BarLF] - SpanEditHandler;Accepts:None - (61:6,2) - Tokens:2
  52201. - SyntaxKind.Text;[Bar];
  52202. - SyntaxKind.NewLine;[LF];
  52203. - Code span - Gen<Stmt> - [}] - SpanEditHandler;Accepts:None - (66:7,0) - Tokens:1
  52204. - SyntaxKind.RightBrace;[}];
  52205. +CSharpCodeBlock - [0..67)::67 - [foreach(var file in files){LFLFLF@:BazLF<br/>LF<a>Foo</a>LF@:BarLF}]
  52206. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  52207. + Transition;[<Missing>];
  52208. + CSharpStatementLiteral - [0..33)::33 - [foreach(var file in files){LFLFLF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  52209. + Keyword;[foreach];
  52210. + LeftParenthesis;[(];
  52211. + Identifier;[var];
  52212. + Whitespace;[ ];
  52213. + Identifier;[file];
  52214. + Whitespace;[ ];
  52215. + Keyword;[in];
  52216. + Whitespace;[ ];
  52217. + Identifier;[files];
  52218. + RightParenthesis;[)];
  52219. + LeftBrace;[{];
  52220. + NewLine;[LF];
  52221. + NewLine;[LF];
  52222. + NewLine;[LF];
  52223. + MarkupBlock - [33..40)::7
  52224. + MarkupTransition - [33..34)::1 - Gen<None> - SpanEditHandler;Accepts:None
  52225. + Transition;[@];
  52226. + RazorMetaCode - [34..35)::1 - Gen<None> - SpanEditHandler;Accepts:Any
  52227. + Colon;[:];
  52228. + MarkupTextLiteral - [35..40)::5 - [BazLF] - Gen<Markup> - SpanEditHandler;Accepts:None
  52229. + Text;[Baz];
  52230. + NewLine;[LF];
  52231. + MarkupBlock - [40..47)::7
  52232. + MarkupTagBlock - [40..45)::5 - [<br/>]
  52233. + MarkupTextLiteral - [40..45)::5 - [<br/>] - Gen<Markup> - SpanEditHandler;Accepts:None
  52234. + OpenAngle;[<];
  52235. + Text;[br];
  52236. + ForwardSlash;[/];
  52237. + CloseAngle;[>];
  52238. + MarkupTextLiteral - [45..47)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  52239. + NewLine;[LF];
  52240. + MarkupBlock - [47..59)::12
  52241. + MarkupTagBlock - [47..50)::3 - [<a>]
  52242. + MarkupTextLiteral - [47..50)::3 - [<a>] - Gen<Markup> - SpanEditHandler;Accepts:None
  52243. + OpenAngle;[<];
  52244. + Text;[a];
  52245. + CloseAngle;[>];
  52246. + MarkupTextLiteral - [50..53)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  52247. + Text;[Foo];
  52248. + MarkupTagBlock - [53..57)::4 - [</a>]
  52249. + MarkupTextLiteral - [53..57)::4 - [</a>] - Gen<Markup> - SpanEditHandler;Accepts:None
  52250. + OpenAngle;[<];
  52251. + ForwardSlash;[/];
  52252. + Text;[a];
  52253. + CloseAngle;[>];
  52254. + MarkupTextLiteral - [57..59)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  52255. + NewLine;[LF];
  52256. + MarkupBlock - [59..66)::7
  52257. + MarkupTransition - [59..60)::1 - Gen<None> - SpanEditHandler;Accepts:None
  52258. + Transition;[@];
  52259. + RazorMetaCode - [60..61)::1 - Gen<None> - SpanEditHandler;Accepts:Any
  52260. + Colon;[:];
  52261. + MarkupTextLiteral - [61..66)::5 - [BarLF] - Gen<Markup> - SpanEditHandler;Accepts:None
  52262. + Text;[Bar];
  52263. + NewLine;[LF];
  52264. + CSharpStatementLiteral - [66..67)::1 - [}] - Gen<Stmt> - SpanEditHandler;Accepts:None
  52265. + RightBrace;[}];
  52266. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ShouldSupportSingleLineMarkupContainingStatementBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ShouldSupportSingleLineMarkupContainingStatementBlock.stree.txt
  52267. index 675e2a0836b..bbe83e5e690 100644
  52268. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ShouldSupportSingleLineMarkupContainingStatementBlock.stree.txt
  52269. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/ShouldSupportSingleLineMarkupContainingStatementBlock.stree.txt
  52270. @@ -1,29 +1,37 @@
  52271. -Expression block - Gen<Expr> - 25 - (0:0,0)
  52272. - Code span - Gen<Expr> - [Repeat(10,LF ] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (0:0,0) - Tokens:6
  52273. - SyntaxKind.Identifier;[Repeat];
  52274. - SyntaxKind.LeftParenthesis;[(];
  52275. - SyntaxKind.IntegerLiteral;[10];
  52276. - SyntaxKind.Comma;[,];
  52277. - SyntaxKind.NewLine;[LF];
  52278. - SyntaxKind.Whitespace;[ ];
  52279. - Template block - Gen<Template> - 8 - (16:1,4)
  52280. - Markup block - Gen<None> - 8 - (16:1,4)
  52281. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (16:1,4) - Tokens:1
  52282. - SyntaxKind.Transition;[@];
  52283. - MetaCode span - Gen<None> - [:] - SpanEditHandler;Accepts:Any - (17:1,5) - Tokens:1
  52284. - SyntaxKind.Colon;[:];
  52285. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (18:1,6) - Tokens:1
  52286. - SyntaxKind.Whitespace;[ ];
  52287. - Statement block - Gen<None> - 3 - (19:1,7)
  52288. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (19:1,7) - Tokens:1
  52289. - SyntaxKind.Transition;[@];
  52290. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (20:1,8) - Tokens:1
  52291. - SyntaxKind.LeftBrace;[{];
  52292. - Code span - Gen<Stmt> - [] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (21:1,9) - Tokens:1
  52293. - SyntaxKind.Unknown;[];
  52294. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (21:1,9) - Tokens:1
  52295. - SyntaxKind.RightBrace;[}];
  52296. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (22:1,10) - Tokens:1
  52297. - SyntaxKind.NewLine;[LF];
  52298. - Code span - Gen<Expr> - [)] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (24:2,0) - Tokens:1
  52299. - SyntaxKind.RightParenthesis;[)];
  52300. +CSharpCodeBlock - [0..25)::25 - [Repeat(10,LF @: @{}LF)]
  52301. + CSharpImplicitExpression - [0..25)::25
  52302. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  52303. + Transition;[<Missing>];
  52304. + CSharpImplicitExpressionBody - [0..25)::25
  52305. + CSharpCodeBlock - [0..25)::25
  52306. + CSharpExpressionLiteral - [0..16)::16 - [Repeat(10,LF ] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14
  52307. + Identifier;[Repeat];
  52308. + LeftParenthesis;[(];
  52309. + IntegerLiteral;[10];
  52310. + Comma;[,];
  52311. + NewLine;[LF];
  52312. + Whitespace;[ ];
  52313. + CSharpTemplateBlock - [16..24)::8
  52314. + MarkupBlock - [16..24)::8
  52315. + MarkupTransition - [16..17)::1 - Gen<None> - SpanEditHandler;Accepts:None
  52316. + Transition;[@];
  52317. + RazorMetaCode - [17..18)::1 - Gen<None> - SpanEditHandler;Accepts:Any
  52318. + Colon;[:];
  52319. + MarkupTextLiteral - [18..19)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  52320. + Whitespace;[ ];
  52321. + CSharpCodeBlock - [19..22)::3
  52322. + CSharpStatement - [19..22)::3
  52323. + CSharpTransition - [19..20)::1 - Gen<None> - SpanEditHandler;Accepts:None
  52324. + Transition;[@];
  52325. + CSharpStatementBody - [20..22)::2
  52326. + RazorMetaCode - [20..21)::1 - Gen<None> - SpanEditHandler;Accepts:None
  52327. + LeftBrace;[{];
  52328. + CSharpCodeBlock - [21..21)::0
  52329. + CSharpStatementLiteral - [21..21)::0 - [] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  52330. + Marker;[];
  52331. + RazorMetaCode - [21..22)::1 - Gen<None> - SpanEditHandler;Accepts:None
  52332. + RightBrace;[}];
  52333. + MarkupTextLiteral - [22..24)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  52334. + NewLine;[LF];
  52335. + CSharpExpressionLiteral - [24..25)::1 - [)] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  52336. + RightParenthesis;[)];
  52337. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/SingleAngleBracketDoesNotCauseSwitchIfOuterBlockIsTerminated.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/SingleAngleBracketDoesNotCauseSwitchIfOuterBlockIsTerminated.stree.txt
  52338. index d204354fba6..378950bec03 100644
  52339. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/SingleAngleBracketDoesNotCauseSwitchIfOuterBlockIsTerminated.stree.txt
  52340. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/SingleAngleBracketDoesNotCauseSwitchIfOuterBlockIsTerminated.stree.txt
  52341. @@ -1,10 +1,15 @@
  52342. -Statement block - Gen<None> - 9 - (0:0,0)
  52343. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  52344. - SyntaxKind.LeftBrace;[{];
  52345. - Code span - Gen<Stmt> - [ List< ] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:4
  52346. - SyntaxKind.Whitespace;[ ];
  52347. - SyntaxKind.Identifier;[List];
  52348. - SyntaxKind.LessThan;[<];
  52349. - SyntaxKind.Whitespace;[ ];
  52350. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (8:0,8) - Tokens:1
  52351. - SyntaxKind.RightBrace;[}];
  52352. +CSharpCodeBlock - [0..9)::9 - [{ List< }]
  52353. + CSharpStatement - [0..9)::9
  52354. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  52355. + Transition;[<Missing>];
  52356. + CSharpStatementBody - [0..9)::9
  52357. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  52358. + LeftBrace;[{];
  52359. + CSharpCodeBlock - [1..8)::7
  52360. + CSharpStatementLiteral - [1..8)::7 - [ List< ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  52361. + Whitespace;[ ];
  52362. + Identifier;[List];
  52363. + LessThan;[<];
  52364. + Whitespace;[ ];
  52365. + RazorMetaCode - [8..9)::1 - Gen<None> - SpanEditHandler;Accepts:None
  52366. + RightBrace;[}];
  52367. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/SupportsAllKindsOfImplicitMarkupInCodeBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/SupportsAllKindsOfImplicitMarkupInCodeBlock.stree.txt
  52368. index b20144b4558..e6b7738e802 100644
  52369. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/SupportsAllKindsOfImplicitMarkupInCodeBlock.stree.txt
  52370. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/SupportsAllKindsOfImplicitMarkupInCodeBlock.stree.txt
  52371. @@ -1,122 +1,130 @@
  52372. -Statement block - Gen<None> - 206 - (0:0,0)
  52373. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  52374. - SyntaxKind.LeftBrace;[{];
  52375. - Code span - Gen<Stmt> - [LF if(true) {LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:9
  52376. - SyntaxKind.NewLine;[LF];
  52377. - SyntaxKind.Whitespace;[ ];
  52378. - SyntaxKind.Keyword;[if];
  52379. - SyntaxKind.LeftParenthesis;[(];
  52380. - SyntaxKind.Keyword;[true];
  52381. - SyntaxKind.RightParenthesis;[)];
  52382. - SyntaxKind.Whitespace;[ ];
  52383. - SyntaxKind.LeftBrace;[{];
  52384. - SyntaxKind.NewLine;[LF];
  52385. - Markup block - Gen<None> - 30 - (19:2,0)
  52386. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (19:2,0) - Tokens:1
  52387. - SyntaxKind.Whitespace;[ ];
  52388. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (27:2,8) - Tokens:1
  52389. - SyntaxKind.Transition;[@];
  52390. - MetaCode span - Gen<None> - [:] - SpanEditHandler;Accepts:Any - (28:2,9) - Tokens:1
  52391. - SyntaxKind.Colon;[:];
  52392. - Markup span - Gen<Markup> - [Single Line MarkupLF] - SpanEditHandler;Accepts:None - (29:2,10) - Tokens:6
  52393. - SyntaxKind.Text;[Single];
  52394. - SyntaxKind.Whitespace;[ ];
  52395. - SyntaxKind.Text;[Line];
  52396. - SyntaxKind.Whitespace;[ ];
  52397. - SyntaxKind.Text;[Markup];
  52398. - SyntaxKind.NewLine;[LF];
  52399. - Code span - Gen<Stmt> - [ }LF foreach (var p in Enumerable.Range(1, 10)) {LF ] - SpanEditHandler;Accepts:Any - (49:3,0) - Tokens:27
  52400. - SyntaxKind.Whitespace;[ ];
  52401. - SyntaxKind.RightBrace;[}];
  52402. - SyntaxKind.NewLine;[LF];
  52403. - SyntaxKind.Whitespace;[ ];
  52404. - SyntaxKind.Keyword;[foreach];
  52405. - SyntaxKind.Whitespace;[ ];
  52406. - SyntaxKind.LeftParenthesis;[(];
  52407. - SyntaxKind.Identifier;[var];
  52408. - SyntaxKind.Whitespace;[ ];
  52409. - SyntaxKind.Identifier;[p];
  52410. - SyntaxKind.Whitespace;[ ];
  52411. - SyntaxKind.Keyword;[in];
  52412. - SyntaxKind.Whitespace;[ ];
  52413. - SyntaxKind.Identifier;[Enumerable];
  52414. - SyntaxKind.Dot;[.];
  52415. - SyntaxKind.Identifier;[Range];
  52416. - SyntaxKind.LeftParenthesis;[(];
  52417. - SyntaxKind.IntegerLiteral;[1];
  52418. - SyntaxKind.Comma;[,];
  52419. - SyntaxKind.Whitespace;[ ];
  52420. - SyntaxKind.IntegerLiteral;[10];
  52421. - SyntaxKind.RightParenthesis;[)];
  52422. - SyntaxKind.RightParenthesis;[)];
  52423. - SyntaxKind.Whitespace;[ ];
  52424. - SyntaxKind.LeftBrace;[{];
  52425. - SyntaxKind.NewLine;[LF];
  52426. - SyntaxKind.Whitespace;[ ];
  52427. - Markup block - Gen<None> - 29 - (114:5,8)
  52428. - Tag block - Gen<None> - 6 - (114:5,8)
  52429. - Transition span - Gen<None> - [<text>] - SpanEditHandler;Accepts:None - (114:5,8) - Tokens:3
  52430. - SyntaxKind.OpenAngle;[<];
  52431. - SyntaxKind.Text;[text];
  52432. - SyntaxKind.CloseAngle;[>];
  52433. - Markup span - Gen<Markup> - [The number is ] - SpanEditHandler;Accepts:None - (120:5,14) - Tokens:6
  52434. - SyntaxKind.Text;[The];
  52435. - SyntaxKind.Whitespace;[ ];
  52436. - SyntaxKind.Text;[number];
  52437. - SyntaxKind.Whitespace;[ ];
  52438. - SyntaxKind.Text;[is];
  52439. - SyntaxKind.Whitespace;[ ];
  52440. - Expression block - Gen<Expr> - 2 - (134:5,28)
  52441. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (134:5,28) - Tokens:1
  52442. - SyntaxKind.Transition;[@];
  52443. - Code span - Gen<Expr> - [p] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (135:5,29) - Tokens:1
  52444. - SyntaxKind.Identifier;[p];
  52445. - Tag block - Gen<None> - 7 - (136:5,30)
  52446. - Transition span - Gen<None> - [</text>] - SpanEditHandler;Accepts:None - (136:5,30) - Tokens:4
  52447. - SyntaxKind.OpenAngle;[<];
  52448. - SyntaxKind.ForwardSlash;[/];
  52449. - SyntaxKind.Text;[text];
  52450. - SyntaxKind.CloseAngle;[>];
  52451. - Code span - Gen<Stmt> - [LF }LF if(!false) {LF] - SpanEditHandler;Accepts:Any - (143:5,37) - Tokens:13
  52452. - SyntaxKind.NewLine;[LF];
  52453. - SyntaxKind.Whitespace;[ ];
  52454. - SyntaxKind.RightBrace;[}];
  52455. - SyntaxKind.NewLine;[LF];
  52456. - SyntaxKind.Whitespace;[ ];
  52457. - SyntaxKind.Keyword;[if];
  52458. - SyntaxKind.LeftParenthesis;[(];
  52459. - SyntaxKind.Not;[!];
  52460. - SyntaxKind.Keyword;[false];
  52461. - SyntaxKind.RightParenthesis;[)];
  52462. - SyntaxKind.Whitespace;[ ];
  52463. - SyntaxKind.LeftBrace;[{];
  52464. - SyntaxKind.NewLine;[LF];
  52465. - Markup block - Gen<None> - 28 - (170:8,0)
  52466. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (170:8,0) - Tokens:1
  52467. - SyntaxKind.Whitespace;[ ];
  52468. - Tag block - Gen<None> - 3 - (178:8,8)
  52469. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (178:8,8) - Tokens:3
  52470. - SyntaxKind.OpenAngle;[<];
  52471. - SyntaxKind.Text;[p];
  52472. - SyntaxKind.CloseAngle;[>];
  52473. - Markup span - Gen<Markup> - [A real tag!] - SpanEditHandler;Accepts:Any - (181:8,11) - Tokens:6
  52474. - SyntaxKind.Text;[A];
  52475. - SyntaxKind.Whitespace;[ ];
  52476. - SyntaxKind.Text;[real];
  52477. - SyntaxKind.Whitespace;[ ];
  52478. - SyntaxKind.Text;[tag];
  52479. - SyntaxKind.Bang;[!];
  52480. - Tag block - Gen<None> - 4 - (192:8,22)
  52481. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (192:8,22) - Tokens:4
  52482. - SyntaxKind.OpenAngle;[<];
  52483. - SyntaxKind.ForwardSlash;[/];
  52484. - SyntaxKind.Text;[p];
  52485. - SyntaxKind.CloseAngle;[>];
  52486. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (196:8,26) - Tokens:1
  52487. - SyntaxKind.NewLine;[LF];
  52488. - Code span - Gen<Stmt> - [ }LF] - SpanEditHandler;Accepts:Any - (198:9,0) - Tokens:3
  52489. - SyntaxKind.Whitespace;[ ];
  52490. - SyntaxKind.RightBrace;[}];
  52491. - SyntaxKind.NewLine;[LF];
  52492. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (205:10,0) - Tokens:1
  52493. - SyntaxKind.RightBrace;[}];
  52494. +CSharpCodeBlock - [0..206)::206 - [{LF if(true) {LF @:Single Line MarkupLF }LF foreach (var p in Enumerable.Range(1, 10)) {LF <text>The number is @p</text>LF }LF if(!false) {LF <p>A real tag!</p>LF }LF}]
  52495. + CSharpStatement - [0..206)::206
  52496. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  52497. + Transition;[<Missing>];
  52498. + CSharpStatementBody - [0..206)::206
  52499. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  52500. + LeftBrace;[{];
  52501. + CSharpCodeBlock - [1..205)::204
  52502. + CSharpStatementLiteral - [1..19)::18 - [LF if(true) {LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  52503. + NewLine;[LF];
  52504. + Whitespace;[ ];
  52505. + Keyword;[if];
  52506. + LeftParenthesis;[(];
  52507. + Keyword;[true];
  52508. + RightParenthesis;[)];
  52509. + Whitespace;[ ];
  52510. + LeftBrace;[{];
  52511. + NewLine;[LF];
  52512. + MarkupBlock - [19..49)::30
  52513. + MarkupTextLiteral - [19..27)::8 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  52514. + Whitespace;[ ];
  52515. + MarkupTransition - [27..28)::1 - Gen<None> - SpanEditHandler;Accepts:None
  52516. + Transition;[@];
  52517. + RazorMetaCode - [28..29)::1 - Gen<None> - SpanEditHandler;Accepts:Any
  52518. + Colon;[:];
  52519. + MarkupTextLiteral - [29..49)::20 - [Single Line MarkupLF] - Gen<Markup> - SpanEditHandler;Accepts:None
  52520. + Text;[Single];
  52521. + Whitespace;[ ];
  52522. + Text;[Line];
  52523. + Whitespace;[ ];
  52524. + Text;[Markup];
  52525. + NewLine;[LF];
  52526. + CSharpStatementLiteral - [49..114)::65 - [ }LF foreach (var p in Enumerable.Range(1, 10)) {LF ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  52527. + Whitespace;[ ];
  52528. + RightBrace;[}];
  52529. + NewLine;[LF];
  52530. + Whitespace;[ ];
  52531. + Keyword;[foreach];
  52532. + Whitespace;[ ];
  52533. + LeftParenthesis;[(];
  52534. + Identifier;[var];
  52535. + Whitespace;[ ];
  52536. + Identifier;[p];
  52537. + Whitespace;[ ];
  52538. + Keyword;[in];
  52539. + Whitespace;[ ];
  52540. + Identifier;[Enumerable];
  52541. + Dot;[.];
  52542. + Identifier;[Range];
  52543. + LeftParenthesis;[(];
  52544. + IntegerLiteral;[1];
  52545. + Comma;[,];
  52546. + Whitespace;[ ];
  52547. + IntegerLiteral;[10];
  52548. + RightParenthesis;[)];
  52549. + RightParenthesis;[)];
  52550. + Whitespace;[ ];
  52551. + LeftBrace;[{];
  52552. + NewLine;[LF];
  52553. + Whitespace;[ ];
  52554. + MarkupBlock - [114..143)::29
  52555. + MarkupTagBlock - [114..120)::6 - [<text>]
  52556. + MarkupTransition - [114..120)::6 - Gen<None> - SpanEditHandler;Accepts:None
  52557. + OpenAngle;[<];
  52558. + Text;[text];
  52559. + CloseAngle;[>];
  52560. + MarkupTextLiteral - [120..134)::14 - [The number is ] - Gen<Markup> - SpanEditHandler;Accepts:None
  52561. + Text;[The];
  52562. + Whitespace;[ ];
  52563. + Text;[number];
  52564. + Whitespace;[ ];
  52565. + Text;[is];
  52566. + Whitespace;[ ];
  52567. + CSharpCodeBlock - [134..136)::2
  52568. + CSharpImplicitExpression - [134..136)::2
  52569. + CSharpTransition - [134..135)::1 - Gen<None> - SpanEditHandler;Accepts:None
  52570. + Transition;[@];
  52571. + CSharpImplicitExpressionBody - [135..136)::1
  52572. + CSharpCodeBlock - [135..136)::1
  52573. + CSharpExpressionLiteral - [135..136)::1 - [p] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  52574. + Identifier;[p];
  52575. + MarkupTagBlock - [136..143)::7 - [</text>]
  52576. + MarkupTransition - [136..143)::7 - Gen<None> - SpanEditHandler;Accepts:None
  52577. + OpenAngle;[<];
  52578. + ForwardSlash;[/];
  52579. + Text;[text];
  52580. + CloseAngle;[>];
  52581. + CSharpStatementLiteral - [143..170)::27 - [LF }LF if(!false) {LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  52582. + NewLine;[LF];
  52583. + Whitespace;[ ];
  52584. + RightBrace;[}];
  52585. + NewLine;[LF];
  52586. + Whitespace;[ ];
  52587. + Keyword;[if];
  52588. + LeftParenthesis;[(];
  52589. + Not;[!];
  52590. + Keyword;[false];
  52591. + RightParenthesis;[)];
  52592. + Whitespace;[ ];
  52593. + LeftBrace;[{];
  52594. + NewLine;[LF];
  52595. + MarkupBlock - [170..198)::28
  52596. + MarkupTextLiteral - [170..178)::8 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  52597. + Whitespace;[ ];
  52598. + MarkupTagBlock - [178..181)::3 - [<p>]
  52599. + MarkupTextLiteral - [178..181)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  52600. + OpenAngle;[<];
  52601. + Text;[p];
  52602. + CloseAngle;[>];
  52603. + MarkupTextLiteral - [181..192)::11 - [A real tag!] - Gen<Markup> - SpanEditHandler;Accepts:Any
  52604. + Text;[A];
  52605. + Whitespace;[ ];
  52606. + Text;[real];
  52607. + Whitespace;[ ];
  52608. + Text;[tag];
  52609. + Bang;[!];
  52610. + MarkupTagBlock - [192..196)::4 - [</p>]
  52611. + MarkupTextLiteral - [192..196)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  52612. + OpenAngle;[<];
  52613. + ForwardSlash;[/];
  52614. + Text;[p];
  52615. + CloseAngle;[>];
  52616. + MarkupTextLiteral - [196..198)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  52617. + NewLine;[LF];
  52618. + CSharpStatementLiteral - [198..205)::7 - [ }LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  52619. + Whitespace;[ ];
  52620. + RightBrace;[}];
  52621. + NewLine;[LF];
  52622. + RazorMetaCode - [205..206)::1 - Gen<None> - SpanEditHandler;Accepts:None
  52623. + RightBrace;[}];
  52624. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/SupportsMarkupInCaseAndDefaultBranchesOfSwitch.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/SupportsMarkupInCaseAndDefaultBranchesOfSwitch.stree.txt
  52625. index 4f7e4420de4..90ac5da821c 100644
  52626. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/SupportsMarkupInCaseAndDefaultBranchesOfSwitch.stree.txt
  52627. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/SupportsMarkupInCaseAndDefaultBranchesOfSwitch.stree.txt
  52628. @@ -1,140 +1,142 @@
  52629. -Statement block - Gen<None> - 232 - (0:0,0)
  52630. - Code span - Gen<Stmt> - [switch(foo) {LF case 0:LF] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:13
  52631. - SyntaxKind.Keyword;[switch];
  52632. - SyntaxKind.LeftParenthesis;[(];
  52633. - SyntaxKind.Identifier;[foo];
  52634. - SyntaxKind.RightParenthesis;[)];
  52635. - SyntaxKind.Whitespace;[ ];
  52636. - SyntaxKind.LeftBrace;[{];
  52637. - SyntaxKind.NewLine;[LF];
  52638. - SyntaxKind.Whitespace;[ ];
  52639. - SyntaxKind.Keyword;[case];
  52640. - SyntaxKind.Whitespace;[ ];
  52641. - SyntaxKind.IntegerLiteral;[0];
  52642. - SyntaxKind.Colon;[:];
  52643. - SyntaxKind.NewLine;[LF];
  52644. - Markup block - Gen<None> - 20 - (28:2,0)
  52645. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (28:2,0) - Tokens:1
  52646. - SyntaxKind.Whitespace;[ ];
  52647. - Tag block - Gen<None> - 3 - (36:2,8)
  52648. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (36:2,8) - Tokens:3
  52649. - SyntaxKind.OpenAngle;[<];
  52650. - SyntaxKind.Text;[p];
  52651. - SyntaxKind.CloseAngle;[>];
  52652. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:Any - (39:2,11) - Tokens:1
  52653. - SyntaxKind.Text;[Foo];
  52654. - Tag block - Gen<None> - 4 - (42:2,14)
  52655. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (42:2,14) - Tokens:4
  52656. - SyntaxKind.OpenAngle;[<];
  52657. - SyntaxKind.ForwardSlash;[/];
  52658. - SyntaxKind.Text;[p];
  52659. - SyntaxKind.CloseAngle;[>];
  52660. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (46:2,18) - Tokens:1
  52661. - SyntaxKind.NewLine;[LF];
  52662. - Code span - Gen<Stmt> - [ break;LF case 1:LF] - SpanEditHandler;Accepts:Any - (48:3,0) - Tokens:10
  52663. - SyntaxKind.Whitespace;[ ];
  52664. - SyntaxKind.Keyword;[break];
  52665. - SyntaxKind.Semicolon;[;];
  52666. - SyntaxKind.NewLine;[LF];
  52667. - SyntaxKind.Whitespace;[ ];
  52668. - SyntaxKind.Keyword;[case];
  52669. - SyntaxKind.Whitespace;[ ];
  52670. - SyntaxKind.IntegerLiteral;[1];
  52671. - SyntaxKind.Colon;[:];
  52672. - SyntaxKind.NewLine;[LF];
  52673. - Markup block - Gen<None> - 20 - (77:5,0)
  52674. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (77:5,0) - Tokens:1
  52675. - SyntaxKind.Whitespace;[ ];
  52676. - Tag block - Gen<None> - 3 - (85:5,8)
  52677. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (85:5,8) - Tokens:3
  52678. - SyntaxKind.OpenAngle;[<];
  52679. - SyntaxKind.Text;[p];
  52680. - SyntaxKind.CloseAngle;[>];
  52681. - Markup span - Gen<Markup> - [Bar] - SpanEditHandler;Accepts:Any - (88:5,11) - Tokens:1
  52682. - SyntaxKind.Text;[Bar];
  52683. - Tag block - Gen<None> - 4 - (91:5,14)
  52684. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (91:5,14) - Tokens:4
  52685. - SyntaxKind.OpenAngle;[<];
  52686. - SyntaxKind.ForwardSlash;[/];
  52687. - SyntaxKind.Text;[p];
  52688. - SyntaxKind.CloseAngle;[>];
  52689. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (95:5,18) - Tokens:1
  52690. - SyntaxKind.NewLine;[LF];
  52691. - Code span - Gen<Stmt> - [ return;LF case 2:LF {LF] - SpanEditHandler;Accepts:Any - (97:6,0) - Tokens:13
  52692. - SyntaxKind.Whitespace;[ ];
  52693. - SyntaxKind.Keyword;[return];
  52694. - SyntaxKind.Semicolon;[;];
  52695. - SyntaxKind.NewLine;[LF];
  52696. - SyntaxKind.Whitespace;[ ];
  52697. - SyntaxKind.Keyword;[case];
  52698. - SyntaxKind.Whitespace;[ ];
  52699. - SyntaxKind.IntegerLiteral;[2];
  52700. - SyntaxKind.Colon;[:];
  52701. - SyntaxKind.NewLine;[LF];
  52702. - SyntaxKind.Whitespace;[ ];
  52703. - SyntaxKind.LeftBrace;[{];
  52704. - SyntaxKind.NewLine;[LF];
  52705. - Markup block - Gen<None> - 24 - (138:9,0)
  52706. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (138:9,0) - Tokens:1
  52707. - SyntaxKind.Whitespace;[ ];
  52708. - Tag block - Gen<None> - 3 - (150:9,12)
  52709. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (150:9,12) - Tokens:3
  52710. - SyntaxKind.OpenAngle;[<];
  52711. - SyntaxKind.Text;[p];
  52712. - SyntaxKind.CloseAngle;[>];
  52713. - Markup span - Gen<Markup> - [Baz] - SpanEditHandler;Accepts:Any - (153:9,15) - Tokens:1
  52714. - SyntaxKind.Text;[Baz];
  52715. - Tag block - Gen<None> - 4 - (156:9,18)
  52716. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (156:9,18) - Tokens:4
  52717. - SyntaxKind.OpenAngle;[<];
  52718. - SyntaxKind.ForwardSlash;[/];
  52719. - SyntaxKind.Text;[p];
  52720. - SyntaxKind.CloseAngle;[>];
  52721. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (160:9,22) - Tokens:1
  52722. - SyntaxKind.NewLine;[LF];
  52723. - Markup block - Gen<None> - 24 - (162:10,0)
  52724. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (162:10,0) - Tokens:1
  52725. - SyntaxKind.Whitespace;[ ];
  52726. - Tag block - Gen<None> - 3 - (174:10,12)
  52727. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (174:10,12) - Tokens:3
  52728. - SyntaxKind.OpenAngle;[<];
  52729. - SyntaxKind.Text;[p];
  52730. - SyntaxKind.CloseAngle;[>];
  52731. - Markup span - Gen<Markup> - [Boz] - SpanEditHandler;Accepts:Any - (177:10,15) - Tokens:1
  52732. - SyntaxKind.Text;[Boz];
  52733. - Tag block - Gen<None> - 4 - (180:10,18)
  52734. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (180:10,18) - Tokens:4
  52735. - SyntaxKind.OpenAngle;[<];
  52736. - SyntaxKind.ForwardSlash;[/];
  52737. - SyntaxKind.Text;[p];
  52738. - SyntaxKind.CloseAngle;[>];
  52739. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (184:10,22) - Tokens:1
  52740. - SyntaxKind.NewLine;[LF];
  52741. - Code span - Gen<Stmt> - [ }LF default:LF] - SpanEditHandler;Accepts:Any - (186:11,0) - Tokens:7
  52742. - SyntaxKind.Whitespace;[ ];
  52743. - SyntaxKind.RightBrace;[}];
  52744. - SyntaxKind.NewLine;[LF];
  52745. - SyntaxKind.Whitespace;[ ];
  52746. - SyntaxKind.Keyword;[default];
  52747. - SyntaxKind.Colon;[:];
  52748. - SyntaxKind.NewLine;[LF];
  52749. - Markup block - Gen<None> - 20 - (211:13,0)
  52750. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (211:13,0) - Tokens:1
  52751. - SyntaxKind.Whitespace;[ ];
  52752. - Tag block - Gen<None> - 3 - (219:13,8)
  52753. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (219:13,8) - Tokens:3
  52754. - SyntaxKind.OpenAngle;[<];
  52755. - SyntaxKind.Text;[p];
  52756. - SyntaxKind.CloseAngle;[>];
  52757. - Markup span - Gen<Markup> - [Biz] - SpanEditHandler;Accepts:Any - (222:13,11) - Tokens:1
  52758. - SyntaxKind.Text;[Biz];
  52759. - Tag block - Gen<None> - 4 - (225:13,14)
  52760. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (225:13,14) - Tokens:4
  52761. - SyntaxKind.OpenAngle;[<];
  52762. - SyntaxKind.ForwardSlash;[/];
  52763. - SyntaxKind.Text;[p];
  52764. - SyntaxKind.CloseAngle;[>];
  52765. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (229:13,18) - Tokens:1
  52766. - SyntaxKind.NewLine;[LF];
  52767. - Code span - Gen<Stmt> - [}] - SpanEditHandler;Accepts:None - (231:14,0) - Tokens:1
  52768. - SyntaxKind.RightBrace;[}];
  52769. +CSharpCodeBlock - [0..232)::232 - [switch(foo) {LF case 0:LF <p>Foo</p>LF break;LF case 1:LF <p>Bar</p>LF return;LF case 2:LF {LF <p>Baz</p>LF <p>Boz</p>LF }LF default:LF <p>Biz</p>LF}]
  52770. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  52771. + Transition;[<Missing>];
  52772. + CSharpStatementLiteral - [0..28)::28 - [switch(foo) {LF case 0:LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  52773. + Keyword;[switch];
  52774. + LeftParenthesis;[(];
  52775. + Identifier;[foo];
  52776. + RightParenthesis;[)];
  52777. + Whitespace;[ ];
  52778. + LeftBrace;[{];
  52779. + NewLine;[LF];
  52780. + Whitespace;[ ];
  52781. + Keyword;[case];
  52782. + Whitespace;[ ];
  52783. + IntegerLiteral;[0];
  52784. + Colon;[:];
  52785. + NewLine;[LF];
  52786. + MarkupBlock - [28..48)::20
  52787. + MarkupTextLiteral - [28..36)::8 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  52788. + Whitespace;[ ];
  52789. + MarkupTagBlock - [36..39)::3 - [<p>]
  52790. + MarkupTextLiteral - [36..39)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  52791. + OpenAngle;[<];
  52792. + Text;[p];
  52793. + CloseAngle;[>];
  52794. + MarkupTextLiteral - [39..42)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  52795. + Text;[Foo];
  52796. + MarkupTagBlock - [42..46)::4 - [</p>]
  52797. + MarkupTextLiteral - [42..46)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  52798. + OpenAngle;[<];
  52799. + ForwardSlash;[/];
  52800. + Text;[p];
  52801. + CloseAngle;[>];
  52802. + MarkupTextLiteral - [46..48)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  52803. + NewLine;[LF];
  52804. + CSharpStatementLiteral - [48..77)::29 - [ break;LF case 1:LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  52805. + Whitespace;[ ];
  52806. + Keyword;[break];
  52807. + Semicolon;[;];
  52808. + NewLine;[LF];
  52809. + Whitespace;[ ];
  52810. + Keyword;[case];
  52811. + Whitespace;[ ];
  52812. + IntegerLiteral;[1];
  52813. + Colon;[:];
  52814. + NewLine;[LF];
  52815. + MarkupBlock - [77..97)::20
  52816. + MarkupTextLiteral - [77..85)::8 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  52817. + Whitespace;[ ];
  52818. + MarkupTagBlock - [85..88)::3 - [<p>]
  52819. + MarkupTextLiteral - [85..88)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  52820. + OpenAngle;[<];
  52821. + Text;[p];
  52822. + CloseAngle;[>];
  52823. + MarkupTextLiteral - [88..91)::3 - [Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  52824. + Text;[Bar];
  52825. + MarkupTagBlock - [91..95)::4 - [</p>]
  52826. + MarkupTextLiteral - [91..95)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  52827. + OpenAngle;[<];
  52828. + ForwardSlash;[/];
  52829. + Text;[p];
  52830. + CloseAngle;[>];
  52831. + MarkupTextLiteral - [95..97)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  52832. + NewLine;[LF];
  52833. + CSharpStatementLiteral - [97..138)::41 - [ return;LF case 2:LF {LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  52834. + Whitespace;[ ];
  52835. + Keyword;[return];
  52836. + Semicolon;[;];
  52837. + NewLine;[LF];
  52838. + Whitespace;[ ];
  52839. + Keyword;[case];
  52840. + Whitespace;[ ];
  52841. + IntegerLiteral;[2];
  52842. + Colon;[:];
  52843. + NewLine;[LF];
  52844. + Whitespace;[ ];
  52845. + LeftBrace;[{];
  52846. + NewLine;[LF];
  52847. + MarkupBlock - [138..162)::24
  52848. + MarkupTextLiteral - [138..150)::12 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  52849. + Whitespace;[ ];
  52850. + MarkupTagBlock - [150..153)::3 - [<p>]
  52851. + MarkupTextLiteral - [150..153)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  52852. + OpenAngle;[<];
  52853. + Text;[p];
  52854. + CloseAngle;[>];
  52855. + MarkupTextLiteral - [153..156)::3 - [Baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  52856. + Text;[Baz];
  52857. + MarkupTagBlock - [156..160)::4 - [</p>]
  52858. + MarkupTextLiteral - [156..160)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  52859. + OpenAngle;[<];
  52860. + ForwardSlash;[/];
  52861. + Text;[p];
  52862. + CloseAngle;[>];
  52863. + MarkupTextLiteral - [160..162)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  52864. + NewLine;[LF];
  52865. + MarkupBlock - [162..186)::24
  52866. + MarkupTextLiteral - [162..174)::12 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  52867. + Whitespace;[ ];
  52868. + MarkupTagBlock - [174..177)::3 - [<p>]
  52869. + MarkupTextLiteral - [174..177)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  52870. + OpenAngle;[<];
  52871. + Text;[p];
  52872. + CloseAngle;[>];
  52873. + MarkupTextLiteral - [177..180)::3 - [Boz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  52874. + Text;[Boz];
  52875. + MarkupTagBlock - [180..184)::4 - [</p>]
  52876. + MarkupTextLiteral - [180..184)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  52877. + OpenAngle;[<];
  52878. + ForwardSlash;[/];
  52879. + Text;[p];
  52880. + CloseAngle;[>];
  52881. + MarkupTextLiteral - [184..186)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  52882. + NewLine;[LF];
  52883. + CSharpStatementLiteral - [186..211)::25 - [ }LF default:LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  52884. + Whitespace;[ ];
  52885. + RightBrace;[}];
  52886. + NewLine;[LF];
  52887. + Whitespace;[ ];
  52888. + Keyword;[default];
  52889. + Colon;[:];
  52890. + NewLine;[LF];
  52891. + MarkupBlock - [211..231)::20
  52892. + MarkupTextLiteral - [211..219)::8 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  52893. + Whitespace;[ ];
  52894. + MarkupTagBlock - [219..222)::3 - [<p>]
  52895. + MarkupTextLiteral - [219..222)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  52896. + OpenAngle;[<];
  52897. + Text;[p];
  52898. + CloseAngle;[>];
  52899. + MarkupTextLiteral - [222..225)::3 - [Biz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  52900. + Text;[Biz];
  52901. + MarkupTagBlock - [225..229)::4 - [</p>]
  52902. + MarkupTextLiteral - [225..229)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  52903. + OpenAngle;[<];
  52904. + ForwardSlash;[/];
  52905. + Text;[p];
  52906. + CloseAngle;[>];
  52907. + MarkupTextLiteral - [229..231)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  52908. + NewLine;[LF];
  52909. + CSharpStatementLiteral - [231..232)::1 - [}] - Gen<Stmt> - SpanEditHandler;Accepts:None
  52910. + RightBrace;[}];
  52911. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/SupportsMarkupInCaseAndDefaultBranchesOfSwitchInCodeBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/SupportsMarkupInCaseAndDefaultBranchesOfSwitchInCodeBlock.stree.txt
  52912. index a2c4647f98b..4d510b9654d 100644
  52913. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/SupportsMarkupInCaseAndDefaultBranchesOfSwitchInCodeBlock.stree.txt
  52914. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpToMarkupSwitchTest/SupportsMarkupInCaseAndDefaultBranchesOfSwitchInCodeBlock.stree.txt
  52915. @@ -1,146 +1,151 @@
  52916. -Statement block - Gen<None> - 236 - (0:0,0)
  52917. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  52918. - SyntaxKind.LeftBrace;[{];
  52919. - Code span - Gen<Stmt> - [ switch(foo) {LF case 0:LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:14
  52920. - SyntaxKind.Whitespace;[ ];
  52921. - SyntaxKind.Keyword;[switch];
  52922. - SyntaxKind.LeftParenthesis;[(];
  52923. - SyntaxKind.Identifier;[foo];
  52924. - SyntaxKind.RightParenthesis;[)];
  52925. - SyntaxKind.Whitespace;[ ];
  52926. - SyntaxKind.LeftBrace;[{];
  52927. - SyntaxKind.NewLine;[LF];
  52928. - SyntaxKind.Whitespace;[ ];
  52929. - SyntaxKind.Keyword;[case];
  52930. - SyntaxKind.Whitespace;[ ];
  52931. - SyntaxKind.IntegerLiteral;[0];
  52932. - SyntaxKind.Colon;[:];
  52933. - SyntaxKind.NewLine;[LF];
  52934. - Markup block - Gen<None> - 20 - (30:2,0)
  52935. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (30:2,0) - Tokens:1
  52936. - SyntaxKind.Whitespace;[ ];
  52937. - Tag block - Gen<None> - 3 - (38:2,8)
  52938. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (38:2,8) - Tokens:3
  52939. - SyntaxKind.OpenAngle;[<];
  52940. - SyntaxKind.Text;[p];
  52941. - SyntaxKind.CloseAngle;[>];
  52942. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:Any - (41:2,11) - Tokens:1
  52943. - SyntaxKind.Text;[Foo];
  52944. - Tag block - Gen<None> - 4 - (44:2,14)
  52945. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (44:2,14) - Tokens:4
  52946. - SyntaxKind.OpenAngle;[<];
  52947. - SyntaxKind.ForwardSlash;[/];
  52948. - SyntaxKind.Text;[p];
  52949. - SyntaxKind.CloseAngle;[>];
  52950. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (48:2,18) - Tokens:1
  52951. - SyntaxKind.NewLine;[LF];
  52952. - Code span - Gen<Stmt> - [ break;LF case 1:LF] - SpanEditHandler;Accepts:Any - (50:3,0) - Tokens:10
  52953. - SyntaxKind.Whitespace;[ ];
  52954. - SyntaxKind.Keyword;[break];
  52955. - SyntaxKind.Semicolon;[;];
  52956. - SyntaxKind.NewLine;[LF];
  52957. - SyntaxKind.Whitespace;[ ];
  52958. - SyntaxKind.Keyword;[case];
  52959. - SyntaxKind.Whitespace;[ ];
  52960. - SyntaxKind.IntegerLiteral;[1];
  52961. - SyntaxKind.Colon;[:];
  52962. - SyntaxKind.NewLine;[LF];
  52963. - Markup block - Gen<None> - 20 - (79:5,0)
  52964. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (79:5,0) - Tokens:1
  52965. - SyntaxKind.Whitespace;[ ];
  52966. - Tag block - Gen<None> - 3 - (87:5,8)
  52967. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (87:5,8) - Tokens:3
  52968. - SyntaxKind.OpenAngle;[<];
  52969. - SyntaxKind.Text;[p];
  52970. - SyntaxKind.CloseAngle;[>];
  52971. - Markup span - Gen<Markup> - [Bar] - SpanEditHandler;Accepts:Any - (90:5,11) - Tokens:1
  52972. - SyntaxKind.Text;[Bar];
  52973. - Tag block - Gen<None> - 4 - (93:5,14)
  52974. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (93:5,14) - Tokens:4
  52975. - SyntaxKind.OpenAngle;[<];
  52976. - SyntaxKind.ForwardSlash;[/];
  52977. - SyntaxKind.Text;[p];
  52978. - SyntaxKind.CloseAngle;[>];
  52979. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (97:5,18) - Tokens:1
  52980. - SyntaxKind.NewLine;[LF];
  52981. - Code span - Gen<Stmt> - [ return;LF case 2:LF {LF] - SpanEditHandler;Accepts:Any - (99:6,0) - Tokens:13
  52982. - SyntaxKind.Whitespace;[ ];
  52983. - SyntaxKind.Keyword;[return];
  52984. - SyntaxKind.Semicolon;[;];
  52985. - SyntaxKind.NewLine;[LF];
  52986. - SyntaxKind.Whitespace;[ ];
  52987. - SyntaxKind.Keyword;[case];
  52988. - SyntaxKind.Whitespace;[ ];
  52989. - SyntaxKind.IntegerLiteral;[2];
  52990. - SyntaxKind.Colon;[:];
  52991. - SyntaxKind.NewLine;[LF];
  52992. - SyntaxKind.Whitespace;[ ];
  52993. - SyntaxKind.LeftBrace;[{];
  52994. - SyntaxKind.NewLine;[LF];
  52995. - Markup block - Gen<None> - 24 - (140:9,0)
  52996. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (140:9,0) - Tokens:1
  52997. - SyntaxKind.Whitespace;[ ];
  52998. - Tag block - Gen<None> - 3 - (152:9,12)
  52999. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (152:9,12) - Tokens:3
  53000. - SyntaxKind.OpenAngle;[<];
  53001. - SyntaxKind.Text;[p];
  53002. - SyntaxKind.CloseAngle;[>];
  53003. - Markup span - Gen<Markup> - [Baz] - SpanEditHandler;Accepts:Any - (155:9,15) - Tokens:1
  53004. - SyntaxKind.Text;[Baz];
  53005. - Tag block - Gen<None> - 4 - (158:9,18)
  53006. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (158:9,18) - Tokens:4
  53007. - SyntaxKind.OpenAngle;[<];
  53008. - SyntaxKind.ForwardSlash;[/];
  53009. - SyntaxKind.Text;[p];
  53010. - SyntaxKind.CloseAngle;[>];
  53011. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (162:9,22) - Tokens:1
  53012. - SyntaxKind.NewLine;[LF];
  53013. - Markup block - Gen<None> - 24 - (164:10,0)
  53014. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (164:10,0) - Tokens:1
  53015. - SyntaxKind.Whitespace;[ ];
  53016. - Tag block - Gen<None> - 3 - (176:10,12)
  53017. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (176:10,12) - Tokens:3
  53018. - SyntaxKind.OpenAngle;[<];
  53019. - SyntaxKind.Text;[p];
  53020. - SyntaxKind.CloseAngle;[>];
  53021. - Markup span - Gen<Markup> - [Boz] - SpanEditHandler;Accepts:Any - (179:10,15) - Tokens:1
  53022. - SyntaxKind.Text;[Boz];
  53023. - Tag block - Gen<None> - 4 - (182:10,18)
  53024. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (182:10,18) - Tokens:4
  53025. - SyntaxKind.OpenAngle;[<];
  53026. - SyntaxKind.ForwardSlash;[/];
  53027. - SyntaxKind.Text;[p];
  53028. - SyntaxKind.CloseAngle;[>];
  53029. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (186:10,22) - Tokens:1
  53030. - SyntaxKind.NewLine;[LF];
  53031. - Code span - Gen<Stmt> - [ }LF default:LF] - SpanEditHandler;Accepts:Any - (188:11,0) - Tokens:7
  53032. - SyntaxKind.Whitespace;[ ];
  53033. - SyntaxKind.RightBrace;[}];
  53034. - SyntaxKind.NewLine;[LF];
  53035. - SyntaxKind.Whitespace;[ ];
  53036. - SyntaxKind.Keyword;[default];
  53037. - SyntaxKind.Colon;[:];
  53038. - SyntaxKind.NewLine;[LF];
  53039. - Markup block - Gen<None> - 20 - (213:13,0)
  53040. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (213:13,0) - Tokens:1
  53041. - SyntaxKind.Whitespace;[ ];
  53042. - Tag block - Gen<None> - 3 - (221:13,8)
  53043. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (221:13,8) - Tokens:3
  53044. - SyntaxKind.OpenAngle;[<];
  53045. - SyntaxKind.Text;[p];
  53046. - SyntaxKind.CloseAngle;[>];
  53047. - Markup span - Gen<Markup> - [Biz] - SpanEditHandler;Accepts:Any - (224:13,11) - Tokens:1
  53048. - SyntaxKind.Text;[Biz];
  53049. - Tag block - Gen<None> - 4 - (227:13,14)
  53050. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (227:13,14) - Tokens:4
  53051. - SyntaxKind.OpenAngle;[<];
  53052. - SyntaxKind.ForwardSlash;[/];
  53053. - SyntaxKind.Text;[p];
  53054. - SyntaxKind.CloseAngle;[>];
  53055. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (231:13,18) - Tokens:1
  53056. - SyntaxKind.NewLine;[LF];
  53057. - Code span - Gen<Stmt> - [} ] - SpanEditHandler;Accepts:Any - (233:14,0) - Tokens:2
  53058. - SyntaxKind.RightBrace;[}];
  53059. - SyntaxKind.Whitespace;[ ];
  53060. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (235:14,2) - Tokens:1
  53061. - SyntaxKind.RightBrace;[}];
  53062. +CSharpCodeBlock - [0..236)::236 - [{ switch(foo) {LF case 0:LF <p>Foo</p>LF break;LF case 1:LF <p>Bar</p>LF return;LF case 2:LF {LF <p>Baz</p>LF <p>Boz</p>LF }LF default:LF <p>Biz</p>LF} }]
  53063. + CSharpStatement - [0..236)::236
  53064. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  53065. + Transition;[<Missing>];
  53066. + CSharpStatementBody - [0..236)::236
  53067. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53068. + LeftBrace;[{];
  53069. + CSharpCodeBlock - [1..235)::234
  53070. + CSharpStatementLiteral - [1..30)::29 - [ switch(foo) {LF case 0:LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  53071. + Whitespace;[ ];
  53072. + Keyword;[switch];
  53073. + LeftParenthesis;[(];
  53074. + Identifier;[foo];
  53075. + RightParenthesis;[)];
  53076. + Whitespace;[ ];
  53077. + LeftBrace;[{];
  53078. + NewLine;[LF];
  53079. + Whitespace;[ ];
  53080. + Keyword;[case];
  53081. + Whitespace;[ ];
  53082. + IntegerLiteral;[0];
  53083. + Colon;[:];
  53084. + NewLine;[LF];
  53085. + MarkupBlock - [30..50)::20
  53086. + MarkupTextLiteral - [30..38)::8 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53087. + Whitespace;[ ];
  53088. + MarkupTagBlock - [38..41)::3 - [<p>]
  53089. + MarkupTextLiteral - [38..41)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  53090. + OpenAngle;[<];
  53091. + Text;[p];
  53092. + CloseAngle;[>];
  53093. + MarkupTextLiteral - [41..44)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53094. + Text;[Foo];
  53095. + MarkupTagBlock - [44..48)::4 - [</p>]
  53096. + MarkupTextLiteral - [44..48)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  53097. + OpenAngle;[<];
  53098. + ForwardSlash;[/];
  53099. + Text;[p];
  53100. + CloseAngle;[>];
  53101. + MarkupTextLiteral - [48..50)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  53102. + NewLine;[LF];
  53103. + CSharpStatementLiteral - [50..79)::29 - [ break;LF case 1:LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  53104. + Whitespace;[ ];
  53105. + Keyword;[break];
  53106. + Semicolon;[;];
  53107. + NewLine;[LF];
  53108. + Whitespace;[ ];
  53109. + Keyword;[case];
  53110. + Whitespace;[ ];
  53111. + IntegerLiteral;[1];
  53112. + Colon;[:];
  53113. + NewLine;[LF];
  53114. + MarkupBlock - [79..99)::20
  53115. + MarkupTextLiteral - [79..87)::8 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53116. + Whitespace;[ ];
  53117. + MarkupTagBlock - [87..90)::3 - [<p>]
  53118. + MarkupTextLiteral - [87..90)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  53119. + OpenAngle;[<];
  53120. + Text;[p];
  53121. + CloseAngle;[>];
  53122. + MarkupTextLiteral - [90..93)::3 - [Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53123. + Text;[Bar];
  53124. + MarkupTagBlock - [93..97)::4 - [</p>]
  53125. + MarkupTextLiteral - [93..97)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  53126. + OpenAngle;[<];
  53127. + ForwardSlash;[/];
  53128. + Text;[p];
  53129. + CloseAngle;[>];
  53130. + MarkupTextLiteral - [97..99)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  53131. + NewLine;[LF];
  53132. + CSharpStatementLiteral - [99..140)::41 - [ return;LF case 2:LF {LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  53133. + Whitespace;[ ];
  53134. + Keyword;[return];
  53135. + Semicolon;[;];
  53136. + NewLine;[LF];
  53137. + Whitespace;[ ];
  53138. + Keyword;[case];
  53139. + Whitespace;[ ];
  53140. + IntegerLiteral;[2];
  53141. + Colon;[:];
  53142. + NewLine;[LF];
  53143. + Whitespace;[ ];
  53144. + LeftBrace;[{];
  53145. + NewLine;[LF];
  53146. + MarkupBlock - [140..164)::24
  53147. + MarkupTextLiteral - [140..152)::12 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53148. + Whitespace;[ ];
  53149. + MarkupTagBlock - [152..155)::3 - [<p>]
  53150. + MarkupTextLiteral - [152..155)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  53151. + OpenAngle;[<];
  53152. + Text;[p];
  53153. + CloseAngle;[>];
  53154. + MarkupTextLiteral - [155..158)::3 - [Baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53155. + Text;[Baz];
  53156. + MarkupTagBlock - [158..162)::4 - [</p>]
  53157. + MarkupTextLiteral - [158..162)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  53158. + OpenAngle;[<];
  53159. + ForwardSlash;[/];
  53160. + Text;[p];
  53161. + CloseAngle;[>];
  53162. + MarkupTextLiteral - [162..164)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  53163. + NewLine;[LF];
  53164. + MarkupBlock - [164..188)::24
  53165. + MarkupTextLiteral - [164..176)::12 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53166. + Whitespace;[ ];
  53167. + MarkupTagBlock - [176..179)::3 - [<p>]
  53168. + MarkupTextLiteral - [176..179)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  53169. + OpenAngle;[<];
  53170. + Text;[p];
  53171. + CloseAngle;[>];
  53172. + MarkupTextLiteral - [179..182)::3 - [Boz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53173. + Text;[Boz];
  53174. + MarkupTagBlock - [182..186)::4 - [</p>]
  53175. + MarkupTextLiteral - [182..186)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  53176. + OpenAngle;[<];
  53177. + ForwardSlash;[/];
  53178. + Text;[p];
  53179. + CloseAngle;[>];
  53180. + MarkupTextLiteral - [186..188)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  53181. + NewLine;[LF];
  53182. + CSharpStatementLiteral - [188..213)::25 - [ }LF default:LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  53183. + Whitespace;[ ];
  53184. + RightBrace;[}];
  53185. + NewLine;[LF];
  53186. + Whitespace;[ ];
  53187. + Keyword;[default];
  53188. + Colon;[:];
  53189. + NewLine;[LF];
  53190. + MarkupBlock - [213..233)::20
  53191. + MarkupTextLiteral - [213..221)::8 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53192. + Whitespace;[ ];
  53193. + MarkupTagBlock - [221..224)::3 - [<p>]
  53194. + MarkupTextLiteral - [221..224)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  53195. + OpenAngle;[<];
  53196. + Text;[p];
  53197. + CloseAngle;[>];
  53198. + MarkupTextLiteral - [224..227)::3 - [Biz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53199. + Text;[Biz];
  53200. + MarkupTagBlock - [227..231)::4 - [</p>]
  53201. + MarkupTextLiteral - [227..231)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  53202. + OpenAngle;[<];
  53203. + ForwardSlash;[/];
  53204. + Text;[p];
  53205. + CloseAngle;[>];
  53206. + MarkupTextLiteral - [231..233)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  53207. + NewLine;[LF];
  53208. + CSharpStatementLiteral - [233..235)::2 - [} ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  53209. + RightBrace;[}];
  53210. + Whitespace;[ ];
  53211. + RazorMetaCode - [235..236)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53212. + RightBrace;[}];
  53213. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExprAcceptsTrailingNewlineInDesignTimeMode.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExprAcceptsTrailingNewlineInDesignTimeMode.stree.txt
  53214. index 6bed46fd6d7..8314ab6e93b 100644
  53215. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExprAcceptsTrailingNewlineInDesignTimeMode.stree.txt
  53216. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExprAcceptsTrailingNewlineInDesignTimeMode.stree.txt
  53217. @@ -1,15 +1,23 @@
  53218. -Statement block - Gen<None> - 9 - (0:0,0)
  53219. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  53220. - SyntaxKind.LeftBrace;[{];
  53221. - Code span - Gen<Stmt> - [] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:1
  53222. - SyntaxKind.Unknown;[];
  53223. - Expression block - Gen<Expr> - 5 - (1:0,1)
  53224. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  53225. - SyntaxKind.Transition;[@];
  53226. - Code span - Gen<Expr> - [foo.] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K14 - (2:0,2) - Tokens:2
  53227. - SyntaxKind.Identifier;[foo];
  53228. - SyntaxKind.Dot;[.];
  53229. - Code span - Gen<Stmt> - [LF] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:1
  53230. - SyntaxKind.NewLine;[LF];
  53231. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (8:1,0) - Tokens:1
  53232. - SyntaxKind.RightBrace;[}];
  53233. +CSharpCodeBlock - [0..9)::9 - [{@foo.LF}]
  53234. + CSharpStatement - [0..9)::9
  53235. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  53236. + Transition;[<Missing>];
  53237. + CSharpStatementBody - [0..9)::9
  53238. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53239. + LeftBrace;[{];
  53240. + CSharpCodeBlock - [1..8)::7
  53241. + CSharpStatementLiteral - [1..1)::0 - [] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  53242. + Marker;[];
  53243. + CSharpCodeBlock - [1..6)::5
  53244. + CSharpImplicitExpression - [1..6)::5
  53245. + CSharpTransition - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53246. + Transition;[@];
  53247. + CSharpImplicitExpressionBody - [2..6)::4
  53248. + CSharpCodeBlock - [2..6)::4
  53249. + CSharpExpressionLiteral - [2..6)::4 - [foo.] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K14
  53250. + Identifier;[foo];
  53251. + Dot;[.];
  53252. + CSharpStatementLiteral - [6..8)::2 - [LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  53253. + NewLine;[LF];
  53254. + RazorMetaCode - [8..9)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53255. + RightBrace;[}];
  53256. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExprDoesNotAcceptDotAfterAt.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExprDoesNotAcceptDotAfterAt.stree.txt
  53257. index b0334fd7b49..3f04f4e47f0 100644
  53258. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExprDoesNotAcceptDotAfterAt.stree.txt
  53259. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExprDoesNotAcceptDotAfterAt.stree.txt
  53260. @@ -1,14 +1,22 @@
  53261. -Statement block - Gen<None> - 4 - (0:0,0)
  53262. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  53263. - SyntaxKind.LeftBrace;[{];
  53264. - Code span - Gen<Stmt> - [] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:1
  53265. - SyntaxKind.Unknown;[];
  53266. - Expression block - Gen<Expr> - 1 - (1:0,1)
  53267. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  53268. - SyntaxKind.Transition;[@];
  53269. - Code span - Gen<Expr> - [] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K14 - (2:0,2) - Tokens:1
  53270. - SyntaxKind.Unknown;[];
  53271. - Code span - Gen<Stmt> - [.] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  53272. - SyntaxKind.Dot;[.];
  53273. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  53274. - SyntaxKind.RightBrace;[}];
  53275. +CSharpCodeBlock - [0..4)::4 - [{@.}]
  53276. + CSharpStatement - [0..4)::4
  53277. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  53278. + Transition;[<Missing>];
  53279. + CSharpStatementBody - [0..4)::4
  53280. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53281. + LeftBrace;[{];
  53282. + CSharpCodeBlock - [1..3)::2
  53283. + CSharpStatementLiteral - [1..1)::0 - [] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  53284. + Marker;[];
  53285. + CSharpCodeBlock - [1..2)::1
  53286. + CSharpImplicitExpression - [1..2)::1
  53287. + CSharpTransition - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53288. + Transition;[@];
  53289. + CSharpImplicitExpressionBody - [2..2)::0
  53290. + CSharpCodeBlock - [2..2)::0
  53291. + CSharpExpressionLiteral - [2..2)::0 - [] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K14
  53292. + Marker;[];
  53293. + CSharpStatementLiteral - [2..3)::1 - [.] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  53294. + Dot;[.];
  53295. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53296. + RightBrace;[}];
  53297. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExprDoesNotAcceptTrailingNewlineInRunTimeMode.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExprDoesNotAcceptTrailingNewlineInRunTimeMode.stree.txt
  53298. index 6bed46fd6d7..8314ab6e93b 100644
  53299. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExprDoesNotAcceptTrailingNewlineInRunTimeMode.stree.txt
  53300. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExprDoesNotAcceptTrailingNewlineInRunTimeMode.stree.txt
  53301. @@ -1,15 +1,23 @@
  53302. -Statement block - Gen<None> - 9 - (0:0,0)
  53303. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  53304. - SyntaxKind.LeftBrace;[{];
  53305. - Code span - Gen<Stmt> - [] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:1
  53306. - SyntaxKind.Unknown;[];
  53307. - Expression block - Gen<Expr> - 5 - (1:0,1)
  53308. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  53309. - SyntaxKind.Transition;[@];
  53310. - Code span - Gen<Expr> - [foo.] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K14 - (2:0,2) - Tokens:2
  53311. - SyntaxKind.Identifier;[foo];
  53312. - SyntaxKind.Dot;[.];
  53313. - Code span - Gen<Stmt> - [LF] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:1
  53314. - SyntaxKind.NewLine;[LF];
  53315. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (8:1,0) - Tokens:1
  53316. - SyntaxKind.RightBrace;[}];
  53317. +CSharpCodeBlock - [0..9)::9 - [{@foo.LF}]
  53318. + CSharpStatement - [0..9)::9
  53319. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  53320. + Transition;[<Missing>];
  53321. + CSharpStatementBody - [0..9)::9
  53322. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53323. + LeftBrace;[{];
  53324. + CSharpCodeBlock - [1..8)::7
  53325. + CSharpStatementLiteral - [1..1)::0 - [] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  53326. + Marker;[];
  53327. + CSharpCodeBlock - [1..6)::5
  53328. + CSharpImplicitExpression - [1..6)::5
  53329. + CSharpTransition - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53330. + Transition;[@];
  53331. + CSharpImplicitExpressionBody - [2..6)::4
  53332. + CSharpCodeBlock - [2..6)::4
  53333. + CSharpExpressionLiteral - [2..6)::4 - [foo.] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K14
  53334. + Identifier;[foo];
  53335. + Dot;[.];
  53336. + CSharpStatementLiteral - [6..8)::2 - [LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  53337. + NewLine;[LF];
  53338. + RazorMetaCode - [8..9)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53339. + RightBrace;[}];
  53340. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExprWithOnlySingleAtAcceptsSingleSpaceOrNewlineAtDesignTime.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExprWithOnlySingleAtAcceptsSingleSpaceOrNewlineAtDesignTime.stree.txt
  53341. index e244b5c78e4..3b0a6d65726 100644
  53342. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExprWithOnlySingleAtAcceptsSingleSpaceOrNewlineAtDesignTime.stree.txt
  53343. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExprWithOnlySingleAtAcceptsSingleSpaceOrNewlineAtDesignTime.stree.txt
  53344. @@ -1,15 +1,23 @@
  53345. -Statement block - Gen<None> - 11 - (0:0,0)
  53346. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  53347. - SyntaxKind.LeftBrace;[{];
  53348. - Code span - Gen<Stmt> - [LF ] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:2
  53349. - SyntaxKind.NewLine;[LF];
  53350. - SyntaxKind.Whitespace;[ ];
  53351. - Expression block - Gen<Expr> - 1 - (7:1,4)
  53352. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (7:1,4) - Tokens:1
  53353. - SyntaxKind.Transition;[@];
  53354. - Code span - Gen<Expr> - [] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K14 - (8:1,5) - Tokens:1
  53355. - SyntaxKind.Unknown;[];
  53356. - Code span - Gen<Stmt> - [LF] - SpanEditHandler;Accepts:Any - (8:1,5) - Tokens:1
  53357. - SyntaxKind.NewLine;[LF];
  53358. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (10:2,0) - Tokens:1
  53359. - SyntaxKind.RightBrace;[}];
  53360. +CSharpCodeBlock - [0..11)::11 - [{LF @LF}]
  53361. + CSharpStatement - [0..11)::11
  53362. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  53363. + Transition;[<Missing>];
  53364. + CSharpStatementBody - [0..11)::11
  53365. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53366. + LeftBrace;[{];
  53367. + CSharpCodeBlock - [1..10)::9
  53368. + CSharpStatementLiteral - [1..7)::6 - [LF ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  53369. + NewLine;[LF];
  53370. + Whitespace;[ ];
  53371. + CSharpCodeBlock - [7..8)::1
  53372. + CSharpImplicitExpression - [7..8)::1
  53373. + CSharpTransition - [7..8)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53374. + Transition;[@];
  53375. + CSharpImplicitExpressionBody - [8..8)::0
  53376. + CSharpCodeBlock - [8..8)::0
  53377. + CSharpExpressionLiteral - [8..8)::0 - [] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K14
  53378. + Marker;[];
  53379. + CSharpStatementLiteral - [8..10)::2 - [LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  53380. + NewLine;[LF];
  53381. + RazorMetaCode - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53382. + RightBrace;[}];
  53383. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExprWithOnlySingleAtOutputsZeroLengthCodeSpan.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExprWithOnlySingleAtOutputsZeroLengthCodeSpan.stree.txt
  53384. index e5a4136c84d..a6056790afd 100644
  53385. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExprWithOnlySingleAtOutputsZeroLengthCodeSpan.stree.txt
  53386. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/InnerImplicitExprWithOnlySingleAtOutputsZeroLengthCodeSpan.stree.txt
  53387. @@ -1,14 +1,22 @@
  53388. -Statement block - Gen<None> - 3 - (0:0,0)
  53389. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  53390. - SyntaxKind.LeftBrace;[{];
  53391. - Code span - Gen<Stmt> - [] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (1:0,1) - Tokens:1
  53392. - SyntaxKind.Unknown;[];
  53393. - Expression block - Gen<Expr> - 1 - (1:0,1)
  53394. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  53395. - SyntaxKind.Transition;[@];
  53396. - Code span - Gen<Expr> - [] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K14 - (2:0,2) - Tokens:1
  53397. - SyntaxKind.Unknown;[];
  53398. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  53399. - SyntaxKind.Unknown;[];
  53400. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (2:0,2) - Tokens:1
  53401. - SyntaxKind.RightBrace;[}];
  53402. +CSharpCodeBlock - [0..3)::3 - [{@}]
  53403. + CSharpStatement - [0..3)::3
  53404. + CSharpTransition - [0..0)::0 - Gen<None> - SpanEditHandler;Accepts:None
  53405. + Transition;[<Missing>];
  53406. + CSharpStatementBody - [0..3)::3
  53407. + RazorMetaCode - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53408. + LeftBrace;[{];
  53409. + CSharpCodeBlock - [1..2)::1
  53410. + CSharpStatementLiteral - [1..1)::0 - [] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  53411. + Marker;[];
  53412. + CSharpCodeBlock - [1..2)::1
  53413. + CSharpImplicitExpression - [1..2)::1
  53414. + CSharpTransition - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53415. + Transition;[@];
  53416. + CSharpImplicitExpressionBody - [2..2)::0
  53417. + CSharpCodeBlock - [2..2)::0
  53418. + CSharpExpressionLiteral - [2..2)::0 - [] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K14
  53419. + Marker;[];
  53420. + CSharpStatementLiteral - [2..2)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  53421. + Marker;[];
  53422. + RazorMetaCode - [2..3)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53423. + RightBrace;[}];
  53424. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/VerbatimBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/VerbatimBlock.stree.txt
  53425. index 8124ca34a82..b2a52501b52 100644
  53426. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/VerbatimBlock.stree.txt
  53427. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpVerbatimBlockTest/VerbatimBlock.stree.txt
  53428. @@ -1,14 +1,17 @@
  53429. -Statement block - Gen<None> - 11 - (0:0,0)
  53430. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  53431. - SyntaxKind.Transition;[@];
  53432. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  53433. - SyntaxKind.LeftBrace;[{];
  53434. - Code span - Gen<Stmt> - [ foo(); ] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (2:0,2) - Tokens:6
  53435. - SyntaxKind.Whitespace;[ ];
  53436. - SyntaxKind.Identifier;[foo];
  53437. - SyntaxKind.LeftParenthesis;[(];
  53438. - SyntaxKind.RightParenthesis;[)];
  53439. - SyntaxKind.Semicolon;[;];
  53440. - SyntaxKind.Whitespace;[ ];
  53441. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  53442. - SyntaxKind.RightBrace;[}];
  53443. +CSharpCodeBlock - [0..11)::11 - [@{ foo(); }]
  53444. + CSharpStatement - [0..11)::11
  53445. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53446. + Transition;[@];
  53447. + CSharpStatementBody - [1..11)::10
  53448. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53449. + LeftBrace;[{];
  53450. + CSharpCodeBlock - [2..10)::8
  53451. + CSharpStatementLiteral - [2..10)::8 - [ foo(); ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  53452. + Whitespace;[ ];
  53453. + Identifier;[foo];
  53454. + LeftParenthesis;[(];
  53455. + RightParenthesis;[)];
  53456. + Semicolon;[;];
  53457. + Whitespace;[ ];
  53458. + RazorMetaCode - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53459. + RightBrace;[}];
  53460. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpWhitespaceHandlingTest/StmtBlockDoesNotAcceptTrailingNewlineIfTheyAreSignificantToAncestor.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpWhitespaceHandlingTest/StmtBlockDoesNotAcceptTrailingNewlineIfTheyAreSignificantToAncestor.stree.txt
  53461. index 4352bd53eb7..ca5e987d023 100644
  53462. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpWhitespaceHandlingTest/StmtBlockDoesNotAcceptTrailingNewlineIfTheyAreSignificantToAncestor.stree.txt
  53463. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpWhitespaceHandlingTest/StmtBlockDoesNotAcceptTrailingNewlineIfTheyAreSignificantToAncestor.stree.txt
  53464. @@ -1,22 +1,22 @@
  53465. -Markup block - Gen<None> - 19 - (0:0,0)
  53466. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  53467. - SyntaxKind.Transition;[@];
  53468. - MetaCode span - Gen<None> - [:] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:1
  53469. - SyntaxKind.Colon;[:];
  53470. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  53471. - SyntaxKind.Whitespace;[ ];
  53472. - Statement block - Gen<None> - 14 - (3:0,3)
  53473. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  53474. - SyntaxKind.Transition;[@];
  53475. - Code span - Gen<Stmt> - [if (true) { }] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:9
  53476. - SyntaxKind.Keyword;[if];
  53477. - SyntaxKind.Whitespace;[ ];
  53478. - SyntaxKind.LeftParenthesis;[(];
  53479. - SyntaxKind.Keyword;[true];
  53480. - SyntaxKind.RightParenthesis;[)];
  53481. - SyntaxKind.Whitespace;[ ];
  53482. - SyntaxKind.LeftBrace;[{];
  53483. - SyntaxKind.Whitespace;[ ];
  53484. - SyntaxKind.RightBrace;[}];
  53485. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (17:0,17) - Tokens:1
  53486. - SyntaxKind.NewLine;[LF];
  53487. +MarkupBlock - [0..19)::19 - [@: @if (true) { }LF]
  53488. + MarkupTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53489. + Transition;[@];
  53490. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:Any
  53491. + Colon;[:];
  53492. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53493. + Whitespace;[ ];
  53494. + CSharpCodeBlock - [3..17)::14
  53495. + CSharpTransition - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53496. + Transition;[@];
  53497. + CSharpStatementLiteral - [4..17)::13 - [if (true) { }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  53498. + Keyword;[if];
  53499. + Whitespace;[ ];
  53500. + LeftParenthesis;[(];
  53501. + Keyword;[true];
  53502. + RightParenthesis;[)];
  53503. + Whitespace;[ ];
  53504. + LeftBrace;[{];
  53505. + Whitespace;[ ];
  53506. + RightBrace;[}];
  53507. + MarkupTextLiteral - [17..19)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  53508. + NewLine;[LF];
  53509. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/ConditionalAttributesAreDisabledForDataAttributesInBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/ConditionalAttributesAreDisabledForDataAttributesInBlock.stree.txt
  53510. index 37c2ff8df8a..970628a5c2a 100644
  53511. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/ConditionalAttributesAreDisabledForDataAttributesInBlock.stree.txt
  53512. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/ConditionalAttributesAreDisabledForDataAttributesInBlock.stree.txt
  53513. @@ -1,26 +1,32 @@
  53514. -Markup block - Gen<None> - 29 - (0:0,0)
  53515. - Tag block - Gen<None> - 22 - (0:0,0)
  53516. - Markup span - Gen<Markup> - [<span] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  53517. - SyntaxKind.OpenAngle;[<];
  53518. - SyntaxKind.Text;[span];
  53519. - Markup block - Gen<None> - 16 - (5:0,5)
  53520. - Markup span - Gen<Markup> - [ data-foo='] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:4
  53521. - SyntaxKind.Whitespace;[ ];
  53522. - SyntaxKind.Text;[data-foo];
  53523. - SyntaxKind.Equals;[=];
  53524. - SyntaxKind.SingleQuote;['];
  53525. - Expression block - Gen<Expr> - 4 - (16:0,16)
  53526. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  53527. - SyntaxKind.Transition;[@];
  53528. - Code span - Gen<Expr> - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (17:0,17) - Tokens:1
  53529. - SyntaxKind.Identifier;[foo];
  53530. - Markup span - Gen<Markup> - ['] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:1
  53531. - SyntaxKind.SingleQuote;['];
  53532. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:1
  53533. - SyntaxKind.CloseAngle;[>];
  53534. - Tag block - Gen<None> - 7 - (22:0,22)
  53535. - Markup span - Gen<Markup> - [</span>] - SpanEditHandler;Accepts:None - (22:0,22) - Tokens:4
  53536. - SyntaxKind.OpenAngle;[<];
  53537. - SyntaxKind.ForwardSlash;[/];
  53538. - SyntaxKind.Text;[span];
  53539. - SyntaxKind.CloseAngle;[>];
  53540. +MarkupBlock - [0..29)::29 - [<span data-foo='@foo'></span>]
  53541. + MarkupTagBlock - [0..22)::22 - [<span data-foo='@foo'>]
  53542. + MarkupTextLiteral - [0..5)::5 - [<span] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53543. + OpenAngle;[<];
  53544. + Text;[span];
  53545. + MarkupAttributeBlock - [5..21)::16 - [ data-foo='@foo']
  53546. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53547. + Whitespace;[ ];
  53548. + MarkupTextLiteral - [6..14)::8 - [data-foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53549. + Text;[data-foo];
  53550. + Equals;[=];
  53551. + MarkupTextLiteral - [15..16)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53552. + SingleQuote;['];
  53553. + GenericBlock - [16..20)::4
  53554. + CSharpCodeBlock - [16..20)::4
  53555. + CSharpImplicitExpression - [16..20)::4
  53556. + CSharpTransition - [16..17)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53557. + Transition;[@];
  53558. + CSharpImplicitExpressionBody - [17..20)::3
  53559. + CSharpCodeBlock - [17..20)::3
  53560. + CSharpExpressionLiteral - [17..20)::3 - [foo] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  53561. + Identifier;[foo];
  53562. + MarkupTextLiteral - [20..21)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53563. + SingleQuote;['];
  53564. + MarkupTextLiteral - [21..22)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  53565. + CloseAngle;[>];
  53566. + MarkupTagBlock - [22..29)::7 - [</span>]
  53567. + MarkupTextLiteral - [22..29)::7 - [</span>] - Gen<Markup> - SpanEditHandler;Accepts:None
  53568. + OpenAngle;[<];
  53569. + ForwardSlash;[/];
  53570. + Text;[span];
  53571. + CloseAngle;[>];
  53572. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/ConditionalAttributesAreDisabledForDataAttributesInDocument.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/ConditionalAttributesAreDisabledForDataAttributesInDocument.stree.txt
  53573. index 5adc548d21c..34d6b8bcc63 100644
  53574. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/ConditionalAttributesAreDisabledForDataAttributesInDocument.stree.txt
  53575. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/ConditionalAttributesAreDisabledForDataAttributesInDocument.stree.txt
  53576. @@ -1,26 +1,33 @@
  53577. -Markup block - Gen<None> - 29 - (0:0,0)
  53578. - Tag block - Gen<None> - 22 - (0:0,0)
  53579. - Markup span - Gen<Markup> - [<span] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  53580. - SyntaxKind.OpenAngle;[<];
  53581. - SyntaxKind.Text;[span];
  53582. - Markup block - Gen<None> - 16 - (5:0,5)
  53583. - Markup span - Gen<Markup> - [ data-foo='] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:4
  53584. - SyntaxKind.Whitespace;[ ];
  53585. - SyntaxKind.Text;[data-foo];
  53586. - SyntaxKind.Equals;[=];
  53587. - SyntaxKind.SingleQuote;['];
  53588. - Expression block - Gen<Expr> - 4 - (16:0,16)
  53589. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  53590. - SyntaxKind.Transition;[@];
  53591. - Code span - Gen<Expr> - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (17:0,17) - Tokens:1
  53592. - SyntaxKind.Identifier;[foo];
  53593. - Markup span - Gen<Markup> - ['] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:1
  53594. - SyntaxKind.SingleQuote;['];
  53595. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:1
  53596. - SyntaxKind.CloseAngle;[>];
  53597. - Tag block - Gen<None> - 7 - (22:0,22)
  53598. - Markup span - Gen<Markup> - [</span>] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:4
  53599. - SyntaxKind.OpenAngle;[<];
  53600. - SyntaxKind.ForwardSlash;[/];
  53601. - SyntaxKind.Text;[span];
  53602. - SyntaxKind.CloseAngle;[>];
  53603. +RazorDocument - [0..29)::29 - [<span data-foo='@foo'></span>]
  53604. + MarkupBlock - [0..29)::29
  53605. + MarkupTagBlock - [0..22)::22 - [<span data-foo='@foo'>]
  53606. + MarkupTextLiteral - [0..5)::5 - [<span] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53607. + OpenAngle;[<];
  53608. + Text;[span];
  53609. + MarkupAttributeBlock - [5..21)::16 - [ data-foo='@foo']
  53610. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53611. + Whitespace;[ ];
  53612. + MarkupTextLiteral - [6..14)::8 - [data-foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53613. + Text;[data-foo];
  53614. + Equals;[=];
  53615. + MarkupTextLiteral - [15..16)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53616. + SingleQuote;['];
  53617. + GenericBlock - [16..20)::4
  53618. + CSharpCodeBlock - [16..20)::4
  53619. + CSharpImplicitExpression - [16..20)::4
  53620. + CSharpTransition - [16..17)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53621. + Transition;[@];
  53622. + CSharpImplicitExpressionBody - [17..20)::3
  53623. + CSharpCodeBlock - [17..20)::3
  53624. + CSharpExpressionLiteral - [17..20)::3 - [foo] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  53625. + Identifier;[foo];
  53626. + MarkupTextLiteral - [20..21)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53627. + SingleQuote;['];
  53628. + MarkupTextLiteral - [21..22)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53629. + CloseAngle;[>];
  53630. + MarkupTagBlock - [22..29)::7 - [</span>]
  53631. + MarkupTextLiteral - [22..29)::7 - [</span>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53632. + OpenAngle;[<];
  53633. + ForwardSlash;[/];
  53634. + Text;[span];
  53635. + CloseAngle;[>];
  53636. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/ConditionalAttributesAreEnabledForDataAttributesWithExperimentalFlag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/ConditionalAttributesAreEnabledForDataAttributesWithExperimentalFlag.stree.txt
  53637. index 82c2aa6712c..8f1e3285d5b 100644
  53638. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/ConditionalAttributesAreEnabledForDataAttributesWithExperimentalFlag.stree.txt
  53639. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/ConditionalAttributesAreEnabledForDataAttributesWithExperimentalFlag.stree.txt
  53640. @@ -1,27 +1,34 @@
  53641. -Markup block - Gen<None> - 29 - (0:0,0)
  53642. - Tag block - Gen<None> - 22 - (0:0,0)
  53643. - Markup span - Gen<Markup> - [<span] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  53644. - SyntaxKind.OpenAngle;[<];
  53645. - SyntaxKind.Text;[span];
  53646. - Markup block - Gen<Attr:data-foo, data-foo='@(5:0,5),'@(20:0,20)> - 16 - (5:0,5)
  53647. - Markup span - Gen<None> - [ data-foo='] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:4
  53648. - SyntaxKind.Whitespace;[ ];
  53649. - SyntaxKind.Text;[data-foo];
  53650. - SyntaxKind.Equals;[=];
  53651. - SyntaxKind.SingleQuote;['];
  53652. - Markup block - Gen<DynAttr:@(16:0,16)> - 4 - (16:0,16)
  53653. - Expression block - Gen<Expr> - 4 - (16:0,16)
  53654. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  53655. - SyntaxKind.Transition;[@];
  53656. - Code span - Gen<Expr> - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (17:0,17) - Tokens:1
  53657. - SyntaxKind.Identifier;[foo];
  53658. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:1
  53659. - SyntaxKind.SingleQuote;['];
  53660. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:1
  53661. - SyntaxKind.CloseAngle;[>];
  53662. - Tag block - Gen<None> - 7 - (22:0,22)
  53663. - Markup span - Gen<Markup> - [</span>] - SpanEditHandler;Accepts:None - (22:0,22) - Tokens:4
  53664. - SyntaxKind.OpenAngle;[<];
  53665. - SyntaxKind.ForwardSlash;[/];
  53666. - SyntaxKind.Text;[span];
  53667. - SyntaxKind.CloseAngle;[>];
  53668. +MarkupBlock - [0..29)::29 - [<span data-foo='@foo'></span>]
  53669. + MarkupTagBlock - [0..22)::22 - [<span data-foo='@foo'>]
  53670. + MarkupTextLiteral - [0..5)::5 - [<span] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53671. + OpenAngle;[<];
  53672. + Text;[span];
  53673. + MarkupAttributeBlock - [5..21)::16 - [ data-foo='@foo']
  53674. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53675. + Whitespace;[ ];
  53676. + MarkupTextLiteral - [6..14)::8 - [data-foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53677. + Text;[data-foo];
  53678. + Equals;[=];
  53679. + MarkupTextLiteral - [15..16)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  53680. + SingleQuote;['];
  53681. + GenericBlock - [16..20)::4
  53682. + MarkupDynamicAttributeValue - [16..20)::4 - [@foo]
  53683. + GenericBlock - [16..20)::4
  53684. + CSharpCodeBlock - [16..20)::4
  53685. + CSharpImplicitExpression - [16..20)::4
  53686. + CSharpTransition - [16..17)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53687. + Transition;[@];
  53688. + CSharpImplicitExpressionBody - [17..20)::3
  53689. + CSharpCodeBlock - [17..20)::3
  53690. + CSharpExpressionLiteral - [17..20)::3 - [foo] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  53691. + Identifier;[foo];
  53692. + MarkupTextLiteral - [20..21)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  53693. + SingleQuote;['];
  53694. + MarkupTextLiteral - [21..22)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  53695. + CloseAngle;[>];
  53696. + MarkupTagBlock - [22..29)::7 - [</span>]
  53697. + MarkupTextLiteral - [22..29)::7 - [</span>] - Gen<Markup> - SpanEditHandler;Accepts:None
  53698. + OpenAngle;[<];
  53699. + ForwardSlash;[/];
  53700. + Text;[span];
  53701. + CloseAngle;[>];
  53702. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/ConditionalAttributesWithWeirdSpacingAreDisabledForDataAttributesInBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/ConditionalAttributesWithWeirdSpacingAreDisabledForDataAttributesInBlock.stree.txt
  53703. index eb16428c4bd..e9b567d9715 100644
  53704. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/ConditionalAttributesWithWeirdSpacingAreDisabledForDataAttributesInBlock.stree.txt
  53705. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/ConditionalAttributesWithWeirdSpacingAreDisabledForDataAttributesInBlock.stree.txt
  53706. @@ -1,28 +1,35 @@
  53707. -Markup block - Gen<None> - 33 - (0:0,0)
  53708. - Tag block - Gen<None> - 26 - (0:0,0)
  53709. - Markup span - Gen<Markup> - [<span] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  53710. - SyntaxKind.OpenAngle;[<];
  53711. - SyntaxKind.Text;[span];
  53712. - Markup block - Gen<None> - 20 - (5:0,5)
  53713. - Markup span - Gen<Markup> - [ data-foo = '] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:6
  53714. - SyntaxKind.Whitespace;[ ];
  53715. - SyntaxKind.Text;[data-foo];
  53716. - SyntaxKind.Whitespace;[ ];
  53717. - SyntaxKind.Equals;[=];
  53718. - SyntaxKind.Whitespace;[ ];
  53719. - SyntaxKind.SingleQuote;['];
  53720. - Expression block - Gen<Expr> - 4 - (20:0,20)
  53721. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (20:0,20) - Tokens:1
  53722. - SyntaxKind.Transition;[@];
  53723. - Code span - Gen<Expr> - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (21:0,21) - Tokens:1
  53724. - SyntaxKind.Identifier;[foo];
  53725. - Markup span - Gen<Markup> - ['] - SpanEditHandler;Accepts:Any - (24:0,24) - Tokens:1
  53726. - SyntaxKind.SingleQuote;['];
  53727. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:None - (25:0,25) - Tokens:1
  53728. - SyntaxKind.CloseAngle;[>];
  53729. - Tag block - Gen<None> - 7 - (26:0,26)
  53730. - Markup span - Gen<Markup> - [</span>] - SpanEditHandler;Accepts:None - (26:0,26) - Tokens:4
  53731. - SyntaxKind.OpenAngle;[<];
  53732. - SyntaxKind.ForwardSlash;[/];
  53733. - SyntaxKind.Text;[span];
  53734. - SyntaxKind.CloseAngle;[>];
  53735. +MarkupBlock - [0..33)::33 - [<span data-foo = '@foo'></span>]
  53736. + MarkupTagBlock - [0..26)::26 - [<span data-foo = '@foo'>]
  53737. + MarkupTextLiteral - [0..5)::5 - [<span] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53738. + OpenAngle;[<];
  53739. + Text;[span];
  53740. + MarkupAttributeBlock - [5..25)::20 - [ data-foo = '@foo']
  53741. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53742. + Whitespace;[ ];
  53743. + MarkupTextLiteral - [6..14)::8 - [data-foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53744. + Text;[data-foo];
  53745. + MarkupTextLiteral - [14..16)::2 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53746. + Whitespace;[ ];
  53747. + Equals;[=];
  53748. + MarkupTextLiteral - [17..20)::3 - [ '] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53749. + Whitespace;[ ];
  53750. + SingleQuote;['];
  53751. + GenericBlock - [20..24)::4
  53752. + CSharpCodeBlock - [20..24)::4
  53753. + CSharpImplicitExpression - [20..24)::4
  53754. + CSharpTransition - [20..21)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53755. + Transition;[@];
  53756. + CSharpImplicitExpressionBody - [21..24)::3
  53757. + CSharpCodeBlock - [21..24)::3
  53758. + CSharpExpressionLiteral - [21..24)::3 - [foo] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  53759. + Identifier;[foo];
  53760. + MarkupTextLiteral - [24..25)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53761. + SingleQuote;['];
  53762. + MarkupTextLiteral - [25..26)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  53763. + CloseAngle;[>];
  53764. + MarkupTagBlock - [26..33)::7 - [</span>]
  53765. + MarkupTextLiteral - [26..33)::7 - [</span>] - Gen<Markup> - SpanEditHandler;Accepts:None
  53766. + OpenAngle;[<];
  53767. + ForwardSlash;[/];
  53768. + Text;[span];
  53769. + CloseAngle;[>];
  53770. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/ConditionalAttributesWithWeirdSpacingAreDisabledForDataAttributesInDocument.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/ConditionalAttributesWithWeirdSpacingAreDisabledForDataAttributesInDocument.stree.txt
  53771. index 5a7555fb152..50c1dc3a50e 100644
  53772. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/ConditionalAttributesWithWeirdSpacingAreDisabledForDataAttributesInDocument.stree.txt
  53773. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/ConditionalAttributesWithWeirdSpacingAreDisabledForDataAttributesInDocument.stree.txt
  53774. @@ -1,24 +1,30 @@
  53775. -Markup block - Gen<None> - 28 - (0:0,0)
  53776. - Tag block - Gen<None> - 21 - (0:0,0)
  53777. - Markup span - Gen<Markup> - [<span] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  53778. - SyntaxKind.OpenAngle;[<];
  53779. - SyntaxKind.Text;[span];
  53780. - Markup block - Gen<None> - 14 - (5:0,5)
  53781. - Markup span - Gen<Markup> - [ data-foo=] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:3
  53782. - SyntaxKind.Whitespace;[ ];
  53783. - SyntaxKind.Text;[data-foo];
  53784. - SyntaxKind.Equals;[=];
  53785. - Expression block - Gen<Expr> - 4 - (15:0,15)
  53786. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:1
  53787. - SyntaxKind.Transition;[@];
  53788. - Code span - Gen<Expr> - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (16:0,16) - Tokens:1
  53789. - SyntaxKind.Identifier;[foo];
  53790. - Markup span - Gen<Markup> - [ >] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:2
  53791. - SyntaxKind.Whitespace;[ ];
  53792. - SyntaxKind.CloseAngle;[>];
  53793. - Tag block - Gen<None> - 7 - (21:0,21)
  53794. - Markup span - Gen<Markup> - [</span>] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:4
  53795. - SyntaxKind.OpenAngle;[<];
  53796. - SyntaxKind.ForwardSlash;[/];
  53797. - SyntaxKind.Text;[span];
  53798. - SyntaxKind.CloseAngle;[>];
  53799. +RazorDocument - [0..28)::28 - [<span data-foo=@foo ></span>]
  53800. + MarkupBlock - [0..28)::28
  53801. + MarkupTagBlock - [0..21)::21 - [<span data-foo=@foo >]
  53802. + MarkupTextLiteral - [0..5)::5 - [<span] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53803. + OpenAngle;[<];
  53804. + Text;[span];
  53805. + MarkupAttributeBlock - [5..19)::14 - [ data-foo=@foo]
  53806. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53807. + Whitespace;[ ];
  53808. + MarkupTextLiteral - [6..14)::8 - [data-foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53809. + Text;[data-foo];
  53810. + Equals;[=];
  53811. + GenericBlock - [15..19)::4
  53812. + CSharpCodeBlock - [15..19)::4
  53813. + CSharpImplicitExpression - [15..19)::4
  53814. + CSharpTransition - [15..16)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53815. + Transition;[@];
  53816. + CSharpImplicitExpressionBody - [16..19)::3
  53817. + CSharpCodeBlock - [16..19)::3
  53818. + CSharpExpressionLiteral - [16..19)::3 - [foo] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  53819. + Identifier;[foo];
  53820. + MarkupTextLiteral - [19..21)::2 - [ >] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53821. + Whitespace;[ ];
  53822. + CloseAngle;[>];
  53823. + MarkupTagBlock - [21..28)::7 - [</span>]
  53824. + MarkupTextLiteral - [21..28)::7 - [</span>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53825. + OpenAngle;[<];
  53826. + ForwardSlash;[/];
  53827. + Text;[span];
  53828. + CloseAngle;[>];
  53829. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/DoubleQuotedLiteralAttribute.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/DoubleQuotedLiteralAttribute.stree.txt
  53830. index 670df8e547c..69f99cdc5df 100644
  53831. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/DoubleQuotedLiteralAttribute.stree.txt
  53832. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/DoubleQuotedLiteralAttribute.stree.txt
  53833. @@ -1,25 +1,33 @@
  53834. -Markup block - Gen<None> - 24 - (0:0,0)
  53835. - Tag block - Gen<None> - 24 - (0:0,0)
  53836. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  53837. - SyntaxKind.OpenAngle;[<];
  53838. - SyntaxKind.Text;[a];
  53839. - Markup block - Gen<Attr:href, href="@(2:0,2),"@(20:0,20)> - 19 - (2:0,2)
  53840. - Markup span - Gen<None> - [ href="] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:4
  53841. - SyntaxKind.Whitespace;[ ];
  53842. - SyntaxKind.Text;[href];
  53843. - SyntaxKind.Equals;[=];
  53844. - SyntaxKind.DoubleQuote;["];
  53845. - Markup span - Gen<LitAttr:@(9:0,9)> - [Foo] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:1
  53846. - SyntaxKind.Text;[Foo];
  53847. - Markup span - Gen<LitAttr: @(12:0,12)> - [ Bar] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:2
  53848. - SyntaxKind.Whitespace;[ ];
  53849. - SyntaxKind.Text;[Bar];
  53850. - Markup span - Gen<LitAttr: @(16:0,16)> - [ Baz] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:2
  53851. - SyntaxKind.Whitespace;[ ];
  53852. - SyntaxKind.Text;[Baz];
  53853. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:1
  53854. - SyntaxKind.DoubleQuote;["];
  53855. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:3
  53856. - SyntaxKind.Whitespace;[ ];
  53857. - SyntaxKind.ForwardSlash;[/];
  53858. - SyntaxKind.CloseAngle;[>];
  53859. +MarkupBlock - [0..24)::24 - [<a href="Foo Bar Baz" />]
  53860. + MarkupTagBlock - [0..24)::24 - [<a href="Foo Bar Baz" />]
  53861. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53862. + OpenAngle;[<];
  53863. + Text;[a];
  53864. + MarkupAttributeBlock - [2..21)::19 - [ href="Foo Bar Baz"]
  53865. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53866. + Whitespace;[ ];
  53867. + MarkupTextLiteral - [3..7)::4 - [href] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53868. + Text;[href];
  53869. + Equals;[=];
  53870. + MarkupTextLiteral - [8..9)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  53871. + DoubleQuote;["];
  53872. + GenericBlock - [9..20)::11
  53873. + MarkupLiteralAttributeValue - [9..12)::3 - [Foo]
  53874. + MarkupTextLiteral - [9..12)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53875. + Text;[Foo];
  53876. + MarkupLiteralAttributeValue - [12..16)::4 - [ Bar]
  53877. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53878. + Whitespace;[ ];
  53879. + MarkupTextLiteral - [13..16)::3 - [Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53880. + Text;[Bar];
  53881. + MarkupLiteralAttributeValue - [16..20)::4 - [ Baz]
  53882. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53883. + Whitespace;[ ];
  53884. + MarkupTextLiteral - [17..20)::3 - [Baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53885. + Text;[Baz];
  53886. + MarkupTextLiteral - [20..21)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  53887. + DoubleQuote;["];
  53888. + MarkupTextLiteral - [21..24)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  53889. + Whitespace;[ ];
  53890. + ForwardSlash;[/];
  53891. + CloseAngle;[>];
  53892. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/DynamicAttributeWithWhitespaceSurroundingEquals.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/DynamicAttributeWithWhitespaceSurroundingEquals.stree.txt
  53893. index 1dd50619e05..7d07f6a07b0 100644
  53894. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/DynamicAttributeWithWhitespaceSurroundingEquals.stree.txt
  53895. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/DynamicAttributeWithWhitespaceSurroundingEquals.stree.txt
  53896. @@ -1,27 +1,35 @@
  53897. -Markup block - Gen<None> - 23 - (0:0,0)
  53898. - Tag block - Gen<None> - 23 - (0:0,0)
  53899. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  53900. - SyntaxKind.OpenAngle;[<];
  53901. - SyntaxKind.Text;[a];
  53902. - Markup block - Gen<Attr:href, href LF= LF'@(2:0,2),'@(19:2,5)> - 18 - (2:0,2)
  53903. - Markup span - Gen<None> - [ href LF= LF'] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:8
  53904. - SyntaxKind.Whitespace;[ ];
  53905. - SyntaxKind.Text;[href];
  53906. - SyntaxKind.Whitespace;[ ];
  53907. - SyntaxKind.NewLine;[LF];
  53908. - SyntaxKind.Equals;[=];
  53909. - SyntaxKind.Whitespace;[ ];
  53910. - SyntaxKind.NewLine;[LF];
  53911. - SyntaxKind.SingleQuote;['];
  53912. - Markup block - Gen<DynAttr:@(15:2,1)> - 4 - (15:2,1)
  53913. - Expression block - Gen<Expr> - 4 - (15:2,1)
  53914. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (15:2,1) - Tokens:1
  53915. - SyntaxKind.Transition;[@];
  53916. - Code span - Gen<Expr> - [Foo] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (16:2,2) - Tokens:1
  53917. - SyntaxKind.Identifier;[Foo];
  53918. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (19:2,5) - Tokens:1
  53919. - SyntaxKind.SingleQuote;['];
  53920. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (20:2,6) - Tokens:3
  53921. - SyntaxKind.Whitespace;[ ];
  53922. - SyntaxKind.ForwardSlash;[/];
  53923. - SyntaxKind.CloseAngle;[>];
  53924. +MarkupBlock - [0..23)::23 - [<a href LF= LF'@Foo' />]
  53925. + MarkupTagBlock - [0..23)::23 - [<a href LF= LF'@Foo' />]
  53926. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53927. + OpenAngle;[<];
  53928. + Text;[a];
  53929. + MarkupAttributeBlock - [2..20)::18 - [ href LF= LF'@Foo']
  53930. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53931. + Whitespace;[ ];
  53932. + MarkupTextLiteral - [3..7)::4 - [href] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53933. + Text;[href];
  53934. + MarkupTextLiteral - [7..10)::3 - [ LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53935. + Whitespace;[ ];
  53936. + NewLine;[LF];
  53937. + Equals;[=];
  53938. + MarkupTextLiteral - [11..15)::4 - [ LF'] - Gen<None> - SpanEditHandler;Accepts:Any
  53939. + Whitespace;[ ];
  53940. + NewLine;[LF];
  53941. + SingleQuote;['];
  53942. + GenericBlock - [15..19)::4
  53943. + MarkupDynamicAttributeValue - [15..19)::4 - [@Foo]
  53944. + GenericBlock - [15..19)::4
  53945. + CSharpCodeBlock - [15..19)::4
  53946. + CSharpImplicitExpression - [15..19)::4
  53947. + CSharpTransition - [15..16)::1 - Gen<None> - SpanEditHandler;Accepts:None
  53948. + Transition;[@];
  53949. + CSharpImplicitExpressionBody - [16..19)::3
  53950. + CSharpCodeBlock - [16..19)::3
  53951. + CSharpExpressionLiteral - [16..19)::3 - [Foo] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  53952. + Identifier;[Foo];
  53953. + MarkupTextLiteral - [19..20)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  53954. + SingleQuote;['];
  53955. + MarkupTextLiteral - [20..23)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  53956. + Whitespace;[ ];
  53957. + ForwardSlash;[/];
  53958. + CloseAngle;[>];
  53959. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/MultiPartLiteralAttribute.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/MultiPartLiteralAttribute.stree.txt
  53960. index a9bf10bf593..ac550a06fd2 100644
  53961. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/MultiPartLiteralAttribute.stree.txt
  53962. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/MultiPartLiteralAttribute.stree.txt
  53963. @@ -1,25 +1,33 @@
  53964. -Markup block - Gen<None> - 24 - (0:0,0)
  53965. - Tag block - Gen<None> - 24 - (0:0,0)
  53966. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  53967. - SyntaxKind.OpenAngle;[<];
  53968. - SyntaxKind.Text;[a];
  53969. - Markup block - Gen<Attr:href, href='@(2:0,2),'@(20:0,20)> - 19 - (2:0,2)
  53970. - Markup span - Gen<None> - [ href='] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:4
  53971. - SyntaxKind.Whitespace;[ ];
  53972. - SyntaxKind.Text;[href];
  53973. - SyntaxKind.Equals;[=];
  53974. - SyntaxKind.SingleQuote;['];
  53975. - Markup span - Gen<LitAttr:@(9:0,9)> - [Foo] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:1
  53976. - SyntaxKind.Text;[Foo];
  53977. - Markup span - Gen<LitAttr: @(12:0,12)> - [ Bar] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:2
  53978. - SyntaxKind.Whitespace;[ ];
  53979. - SyntaxKind.Text;[Bar];
  53980. - Markup span - Gen<LitAttr: @(16:0,16)> - [ Baz] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:2
  53981. - SyntaxKind.Whitespace;[ ];
  53982. - SyntaxKind.Text;[Baz];
  53983. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:1
  53984. - SyntaxKind.SingleQuote;['];
  53985. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:3
  53986. - SyntaxKind.Whitespace;[ ];
  53987. - SyntaxKind.ForwardSlash;[/];
  53988. - SyntaxKind.CloseAngle;[>];
  53989. +MarkupBlock - [0..24)::24 - [<a href='Foo Bar Baz' />]
  53990. + MarkupTagBlock - [0..24)::24 - [<a href='Foo Bar Baz' />]
  53991. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53992. + OpenAngle;[<];
  53993. + Text;[a];
  53994. + MarkupAttributeBlock - [2..21)::19 - [ href='Foo Bar Baz']
  53995. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53996. + Whitespace;[ ];
  53997. + MarkupTextLiteral - [3..7)::4 - [href] - Gen<Markup> - SpanEditHandler;Accepts:Any
  53998. + Text;[href];
  53999. + Equals;[=];
  54000. + MarkupTextLiteral - [8..9)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54001. + SingleQuote;['];
  54002. + GenericBlock - [9..20)::11
  54003. + MarkupLiteralAttributeValue - [9..12)::3 - [Foo]
  54004. + MarkupTextLiteral - [9..12)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54005. + Text;[Foo];
  54006. + MarkupLiteralAttributeValue - [12..16)::4 - [ Bar]
  54007. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54008. + Whitespace;[ ];
  54009. + MarkupTextLiteral - [13..16)::3 - [Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54010. + Text;[Bar];
  54011. + MarkupLiteralAttributeValue - [16..20)::4 - [ Baz]
  54012. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54013. + Whitespace;[ ];
  54014. + MarkupTextLiteral - [17..20)::3 - [Baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54015. + Text;[Baz];
  54016. + MarkupTextLiteral - [20..21)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54017. + SingleQuote;['];
  54018. + MarkupTextLiteral - [21..24)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  54019. + Whitespace;[ ];
  54020. + ForwardSlash;[/];
  54021. + CloseAngle;[>];
  54022. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/MultiValueExpressionAttribute.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/MultiValueExpressionAttribute.stree.txt
  54023. index 0c546fb06d9..7ca933a84f6 100644
  54024. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/MultiValueExpressionAttribute.stree.txt
  54025. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/MultiValueExpressionAttribute.stree.txt
  54026. @@ -1,34 +1,47 @@
  54027. -Markup block - Gen<None> - 26 - (0:0,0)
  54028. - Tag block - Gen<None> - 26 - (0:0,0)
  54029. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  54030. - SyntaxKind.OpenAngle;[<];
  54031. - SyntaxKind.Text;[a];
  54032. - Markup block - Gen<Attr:href, href='@(2:0,2),'@(22:0,22)> - 21 - (2:0,2)
  54033. - Markup span - Gen<None> - [ href='] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:4
  54034. - SyntaxKind.Whitespace;[ ];
  54035. - SyntaxKind.Text;[href];
  54036. - SyntaxKind.Equals;[=];
  54037. - SyntaxKind.SingleQuote;['];
  54038. - Markup block - Gen<DynAttr:@(9:0,9)> - 4 - (9:0,9)
  54039. - Expression block - Gen<Expr> - 4 - (9:0,9)
  54040. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (9:0,9) - Tokens:1
  54041. - SyntaxKind.Transition;[@];
  54042. - Code span - Gen<Expr> - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (10:0,10) - Tokens:1
  54043. - SyntaxKind.Identifier;[foo];
  54044. - Markup span - Gen<LitAttr: @(13:0,13)> - [ bar] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:2
  54045. - SyntaxKind.Whitespace;[ ];
  54046. - SyntaxKind.Text;[bar];
  54047. - Markup block - Gen<DynAttr: @(17:0,17)> - 5 - (17:0,17)
  54048. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:1
  54049. - SyntaxKind.Whitespace;[ ];
  54050. - Expression block - Gen<Expr> - 4 - (18:0,18)
  54051. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (18:0,18) - Tokens:1
  54052. - SyntaxKind.Transition;[@];
  54053. - Code span - Gen<Expr> - [baz] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (19:0,19) - Tokens:1
  54054. - SyntaxKind.Identifier;[baz];
  54055. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:1
  54056. - SyntaxKind.SingleQuote;['];
  54057. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (23:0,23) - Tokens:3
  54058. - SyntaxKind.Whitespace;[ ];
  54059. - SyntaxKind.ForwardSlash;[/];
  54060. - SyntaxKind.CloseAngle;[>];
  54061. +MarkupBlock - [0..26)::26 - [<a href='@foo bar @baz' />]
  54062. + MarkupTagBlock - [0..26)::26 - [<a href='@foo bar @baz' />]
  54063. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54064. + OpenAngle;[<];
  54065. + Text;[a];
  54066. + MarkupAttributeBlock - [2..23)::21 - [ href='@foo bar @baz']
  54067. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54068. + Whitespace;[ ];
  54069. + MarkupTextLiteral - [3..7)::4 - [href] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54070. + Text;[href];
  54071. + Equals;[=];
  54072. + MarkupTextLiteral - [8..9)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54073. + SingleQuote;['];
  54074. + GenericBlock - [9..22)::13
  54075. + MarkupDynamicAttributeValue - [9..13)::4 - [@foo]
  54076. + GenericBlock - [9..13)::4
  54077. + CSharpCodeBlock - [9..13)::4
  54078. + CSharpImplicitExpression - [9..13)::4
  54079. + CSharpTransition - [9..10)::1 - Gen<None> - SpanEditHandler;Accepts:None
  54080. + Transition;[@];
  54081. + CSharpImplicitExpressionBody - [10..13)::3
  54082. + CSharpCodeBlock - [10..13)::3
  54083. + CSharpExpressionLiteral - [10..13)::3 - [foo] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  54084. + Identifier;[foo];
  54085. + MarkupLiteralAttributeValue - [13..17)::4 - [ bar]
  54086. + MarkupTextLiteral - [13..14)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54087. + Whitespace;[ ];
  54088. + MarkupTextLiteral - [14..17)::3 - [bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54089. + Text;[bar];
  54090. + MarkupDynamicAttributeValue - [17..22)::5 - [ @baz]
  54091. + MarkupTextLiteral - [17..18)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54092. + Whitespace;[ ];
  54093. + GenericBlock - [18..22)::4
  54094. + CSharpCodeBlock - [18..22)::4
  54095. + CSharpImplicitExpression - [18..22)::4
  54096. + CSharpTransition - [18..19)::1 - Gen<None> - SpanEditHandler;Accepts:None
  54097. + Transition;[@];
  54098. + CSharpImplicitExpressionBody - [19..22)::3
  54099. + CSharpCodeBlock - [19..22)::3
  54100. + CSharpExpressionLiteral - [19..22)::3 - [baz] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  54101. + Identifier;[baz];
  54102. + MarkupTextLiteral - [22..23)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54103. + SingleQuote;['];
  54104. + MarkupTextLiteral - [23..26)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  54105. + Whitespace;[ ];
  54106. + ForwardSlash;[/];
  54107. + CloseAngle;[>];
  54108. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/NewLineBetweenAttributes.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/NewLineBetweenAttributes.stree.txt
  54109. index e49e317c012..6de9860c96a 100644
  54110. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/NewLineBetweenAttributes.stree.txt
  54111. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/NewLineBetweenAttributes.stree.txt
  54112. @@ -1,29 +1,37 @@
  54113. -Markup block - Gen<None> - 29 - (0:0,0)
  54114. - Tag block - Gen<None> - 29 - (0:0,0)
  54115. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  54116. - SyntaxKind.OpenAngle;[<];
  54117. - SyntaxKind.Text;[a];
  54118. - Markup block - Gen<Attr:href,LFhref='@(2:0,2),'@(13:1,9)> - 12 - (2:0,2)
  54119. - Markup span - Gen<None> - [LFhref='] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:4
  54120. - SyntaxKind.NewLine;[LF];
  54121. - SyntaxKind.Text;[href];
  54122. - SyntaxKind.Equals;[=];
  54123. - SyntaxKind.SingleQuote;['];
  54124. - Markup span - Gen<LitAttr:@(10:1,6)> - [Foo] - SpanEditHandler;Accepts:Any - (10:1,6) - Tokens:1
  54125. - SyntaxKind.Text;[Foo];
  54126. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (13:1,9) - Tokens:1
  54127. - SyntaxKind.SingleQuote;['];
  54128. - Markup block - Gen<Attr:abcd,LFabcd='@(14:1,10),'@(25:2,9)> - 12 - (14:1,10)
  54129. - Markup span - Gen<None> - [LFabcd='] - SpanEditHandler;Accepts:Any - (14:1,10) - Tokens:4
  54130. - SyntaxKind.NewLine;[LF];
  54131. - SyntaxKind.Text;[abcd];
  54132. - SyntaxKind.Equals;[=];
  54133. - SyntaxKind.SingleQuote;['];
  54134. - Markup span - Gen<LitAttr:@(22:2,6)> - [Bar] - SpanEditHandler;Accepts:Any - (22:2,6) - Tokens:1
  54135. - SyntaxKind.Text;[Bar];
  54136. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (25:2,9) - Tokens:1
  54137. - SyntaxKind.SingleQuote;['];
  54138. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (26:2,10) - Tokens:3
  54139. - SyntaxKind.Whitespace;[ ];
  54140. - SyntaxKind.ForwardSlash;[/];
  54141. - SyntaxKind.CloseAngle;[>];
  54142. +MarkupBlock - [0..29)::29 - [<aLFhref='Foo'LFabcd='Bar' />]
  54143. + MarkupTagBlock - [0..29)::29 - [<aLFhref='Foo'LFabcd='Bar' />]
  54144. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54145. + OpenAngle;[<];
  54146. + Text;[a];
  54147. + MarkupAttributeBlock - [2..14)::12 - [LFhref='Foo']
  54148. + MarkupTextLiteral - [2..4)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54149. + NewLine;[LF];
  54150. + MarkupTextLiteral - [4..8)::4 - [href] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54151. + Text;[href];
  54152. + Equals;[=];
  54153. + MarkupTextLiteral - [9..10)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54154. + SingleQuote;['];
  54155. + GenericBlock - [10..13)::3
  54156. + MarkupLiteralAttributeValue - [10..13)::3 - [Foo]
  54157. + MarkupTextLiteral - [10..13)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54158. + Text;[Foo];
  54159. + MarkupTextLiteral - [13..14)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54160. + SingleQuote;['];
  54161. + MarkupAttributeBlock - [14..26)::12 - [LFabcd='Bar']
  54162. + MarkupTextLiteral - [14..16)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54163. + NewLine;[LF];
  54164. + MarkupTextLiteral - [16..20)::4 - [abcd] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54165. + Text;[abcd];
  54166. + Equals;[=];
  54167. + MarkupTextLiteral - [21..22)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54168. + SingleQuote;['];
  54169. + GenericBlock - [22..25)::3
  54170. + MarkupLiteralAttributeValue - [22..25)::3 - [Bar]
  54171. + MarkupTextLiteral - [22..25)::3 - [Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54172. + Text;[Bar];
  54173. + MarkupTextLiteral - [25..26)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54174. + SingleQuote;['];
  54175. + MarkupTextLiteral - [26..29)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  54176. + Whitespace;[ ];
  54177. + ForwardSlash;[/];
  54178. + CloseAngle;[>];
  54179. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/NewLinePrecedingAttribute.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/NewLinePrecedingAttribute.stree.txt
  54180. index 2ac8dd5c6b7..d3f3368f3cc 100644
  54181. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/NewLinePrecedingAttribute.stree.txt
  54182. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/NewLinePrecedingAttribute.stree.txt
  54183. @@ -1,19 +1,23 @@
  54184. -Markup block - Gen<None> - 17 - (0:0,0)
  54185. - Tag block - Gen<None> - 17 - (0:0,0)
  54186. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  54187. - SyntaxKind.OpenAngle;[<];
  54188. - SyntaxKind.Text;[a];
  54189. - Markup block - Gen<Attr:href,LFhref='@(2:0,2),'@(13:1,9)> - 12 - (2:0,2)
  54190. - Markup span - Gen<None> - [LFhref='] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:4
  54191. - SyntaxKind.NewLine;[LF];
  54192. - SyntaxKind.Text;[href];
  54193. - SyntaxKind.Equals;[=];
  54194. - SyntaxKind.SingleQuote;['];
  54195. - Markup span - Gen<LitAttr:@(10:1,6)> - [Foo] - SpanEditHandler;Accepts:Any - (10:1,6) - Tokens:1
  54196. - SyntaxKind.Text;[Foo];
  54197. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (13:1,9) - Tokens:1
  54198. - SyntaxKind.SingleQuote;['];
  54199. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (14:1,10) - Tokens:3
  54200. - SyntaxKind.Whitespace;[ ];
  54201. - SyntaxKind.ForwardSlash;[/];
  54202. - SyntaxKind.CloseAngle;[>];
  54203. +MarkupBlock - [0..17)::17 - [<aLFhref='Foo' />]
  54204. + MarkupTagBlock - [0..17)::17 - [<aLFhref='Foo' />]
  54205. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54206. + OpenAngle;[<];
  54207. + Text;[a];
  54208. + MarkupAttributeBlock - [2..14)::12 - [LFhref='Foo']
  54209. + MarkupTextLiteral - [2..4)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54210. + NewLine;[LF];
  54211. + MarkupTextLiteral - [4..8)::4 - [href] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54212. + Text;[href];
  54213. + Equals;[=];
  54214. + MarkupTextLiteral - [9..10)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54215. + SingleQuote;['];
  54216. + GenericBlock - [10..13)::3
  54217. + MarkupLiteralAttributeValue - [10..13)::3 - [Foo]
  54218. + MarkupTextLiteral - [10..13)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54219. + Text;[Foo];
  54220. + MarkupTextLiteral - [13..14)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54221. + SingleQuote;['];
  54222. + MarkupTextLiteral - [14..17)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  54223. + Whitespace;[ ];
  54224. + ForwardSlash;[/];
  54225. + CloseAngle;[>];
  54226. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SimpleExpressionAttribute.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SimpleExpressionAttribute.stree.txt
  54227. index 794f6052086..4c788d31668 100644
  54228. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SimpleExpressionAttribute.stree.txt
  54229. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SimpleExpressionAttribute.stree.txt
  54230. @@ -1,23 +1,30 @@
  54231. -Markup block - Gen<None> - 17 - (0:0,0)
  54232. - Tag block - Gen<None> - 17 - (0:0,0)
  54233. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  54234. - SyntaxKind.OpenAngle;[<];
  54235. - SyntaxKind.Text;[a];
  54236. - Markup block - Gen<Attr:href, href='@(2:0,2),'@(13:0,13)> - 12 - (2:0,2)
  54237. - Markup span - Gen<None> - [ href='] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:4
  54238. - SyntaxKind.Whitespace;[ ];
  54239. - SyntaxKind.Text;[href];
  54240. - SyntaxKind.Equals;[=];
  54241. - SyntaxKind.SingleQuote;['];
  54242. - Markup block - Gen<DynAttr:@(9:0,9)> - 4 - (9:0,9)
  54243. - Expression block - Gen<Expr> - 4 - (9:0,9)
  54244. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (9:0,9) - Tokens:1
  54245. - SyntaxKind.Transition;[@];
  54246. - Code span - Gen<Expr> - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (10:0,10) - Tokens:1
  54247. - SyntaxKind.Identifier;[foo];
  54248. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:1
  54249. - SyntaxKind.SingleQuote;['];
  54250. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (14:0,14) - Tokens:3
  54251. - SyntaxKind.Whitespace;[ ];
  54252. - SyntaxKind.ForwardSlash;[/];
  54253. - SyntaxKind.CloseAngle;[>];
  54254. +MarkupBlock - [0..17)::17 - [<a href='@foo' />]
  54255. + MarkupTagBlock - [0..17)::17 - [<a href='@foo' />]
  54256. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54257. + OpenAngle;[<];
  54258. + Text;[a];
  54259. + MarkupAttributeBlock - [2..14)::12 - [ href='@foo']
  54260. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54261. + Whitespace;[ ];
  54262. + MarkupTextLiteral - [3..7)::4 - [href] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54263. + Text;[href];
  54264. + Equals;[=];
  54265. + MarkupTextLiteral - [8..9)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54266. + SingleQuote;['];
  54267. + GenericBlock - [9..13)::4
  54268. + MarkupDynamicAttributeValue - [9..13)::4 - [@foo]
  54269. + GenericBlock - [9..13)::4
  54270. + CSharpCodeBlock - [9..13)::4
  54271. + CSharpImplicitExpression - [9..13)::4
  54272. + CSharpTransition - [9..10)::1 - Gen<None> - SpanEditHandler;Accepts:None
  54273. + Transition;[@];
  54274. + CSharpImplicitExpressionBody - [10..13)::3
  54275. + CSharpCodeBlock - [10..13)::3
  54276. + CSharpExpressionLiteral - [10..13)::3 - [foo] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  54277. + Identifier;[foo];
  54278. + MarkupTextLiteral - [13..14)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54279. + SingleQuote;['];
  54280. + MarkupTextLiteral - [14..17)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  54281. + Whitespace;[ ];
  54282. + ForwardSlash;[/];
  54283. + CloseAngle;[>];
  54284. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SimpleLiteralAttribute.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SimpleLiteralAttribute.stree.txt
  54285. index 9b93dc3b2f4..5226e007dfb 100644
  54286. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SimpleLiteralAttribute.stree.txt
  54287. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SimpleLiteralAttribute.stree.txt
  54288. @@ -1,19 +1,23 @@
  54289. -Markup block - Gen<None> - 16 - (0:0,0)
  54290. - Tag block - Gen<None> - 16 - (0:0,0)
  54291. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  54292. - SyntaxKind.OpenAngle;[<];
  54293. - SyntaxKind.Text;[a];
  54294. - Markup block - Gen<Attr:href, href='@(2:0,2),'@(12:0,12)> - 11 - (2:0,2)
  54295. - Markup span - Gen<None> - [ href='] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:4
  54296. - SyntaxKind.Whitespace;[ ];
  54297. - SyntaxKind.Text;[href];
  54298. - SyntaxKind.Equals;[=];
  54299. - SyntaxKind.SingleQuote;['];
  54300. - Markup span - Gen<LitAttr:@(9:0,9)> - [Foo] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:1
  54301. - SyntaxKind.Text;[Foo];
  54302. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:1
  54303. - SyntaxKind.SingleQuote;['];
  54304. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:3
  54305. - SyntaxKind.Whitespace;[ ];
  54306. - SyntaxKind.ForwardSlash;[/];
  54307. - SyntaxKind.CloseAngle;[>];
  54308. +MarkupBlock - [0..16)::16 - [<a href='Foo' />]
  54309. + MarkupTagBlock - [0..16)::16 - [<a href='Foo' />]
  54310. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54311. + OpenAngle;[<];
  54312. + Text;[a];
  54313. + MarkupAttributeBlock - [2..13)::11 - [ href='Foo']
  54314. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54315. + Whitespace;[ ];
  54316. + MarkupTextLiteral - [3..7)::4 - [href] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54317. + Text;[href];
  54318. + Equals;[=];
  54319. + MarkupTextLiteral - [8..9)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54320. + SingleQuote;['];
  54321. + GenericBlock - [9..12)::3
  54322. + MarkupLiteralAttributeValue - [9..12)::3 - [Foo]
  54323. + MarkupTextLiteral - [9..12)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54324. + Text;[Foo];
  54325. + MarkupTextLiteral - [12..13)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54326. + SingleQuote;['];
  54327. + MarkupTextLiteral - [13..16)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  54328. + Whitespace;[ ];
  54329. + ForwardSlash;[/];
  54330. + CloseAngle;[>];
  54331. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SimpleLiteralAttributeWithWhitespaceSurroundingEquals.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SimpleLiteralAttributeWithWhitespaceSurroundingEquals.stree.txt
  54332. index 53a5a17d26c..150eab1458c 100644
  54333. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SimpleLiteralAttributeWithWhitespaceSurroundingEquals.stree.txt
  54334. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SimpleLiteralAttributeWithWhitespaceSurroundingEquals.stree.txt
  54335. @@ -1,23 +1,28 @@
  54336. -Markup block - Gen<None> - 24 - (0:0,0)
  54337. - Tag block - Gen<None> - 24 - (0:0,0)
  54338. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  54339. - SyntaxKind.OpenAngle;[<];
  54340. - SyntaxKind.Text;[a];
  54341. - Markup block - Gen<Attr:href, href LF= LF'@(2:0,2),'@(20:2,4)> - 19 - (2:0,2)
  54342. - Markup span - Gen<None> - [ href LF= LF'] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:8
  54343. - SyntaxKind.Whitespace;[ ];
  54344. - SyntaxKind.Text;[href];
  54345. - SyntaxKind.Whitespace;[ ];
  54346. - SyntaxKind.NewLine;[LF];
  54347. - SyntaxKind.Equals;[=];
  54348. - SyntaxKind.Whitespace;[ ];
  54349. - SyntaxKind.NewLine;[LF];
  54350. - SyntaxKind.SingleQuote;['];
  54351. - Markup span - Gen<LitAttr:@(17:2,1)> - [Foo] - SpanEditHandler;Accepts:Any - (17:2,1) - Tokens:1
  54352. - SyntaxKind.Text;[Foo];
  54353. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (20:2,4) - Tokens:1
  54354. - SyntaxKind.SingleQuote;['];
  54355. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (21:2,5) - Tokens:3
  54356. - SyntaxKind.Whitespace;[ ];
  54357. - SyntaxKind.ForwardSlash;[/];
  54358. - SyntaxKind.CloseAngle;[>];
  54359. +MarkupBlock - [0..24)::24 - [<a href LF= LF'Foo' />]
  54360. + MarkupTagBlock - [0..24)::24 - [<a href LF= LF'Foo' />]
  54361. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54362. + OpenAngle;[<];
  54363. + Text;[a];
  54364. + MarkupAttributeBlock - [2..21)::19 - [ href LF= LF'Foo']
  54365. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54366. + Whitespace;[ ];
  54367. + MarkupTextLiteral - [3..7)::4 - [href] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54368. + Text;[href];
  54369. + MarkupTextLiteral - [7..11)::4 - [ LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54370. + Whitespace;[ ];
  54371. + NewLine;[LF];
  54372. + Equals;[=];
  54373. + MarkupTextLiteral - [12..17)::5 - [ LF'] - Gen<None> - SpanEditHandler;Accepts:Any
  54374. + Whitespace;[ ];
  54375. + NewLine;[LF];
  54376. + SingleQuote;['];
  54377. + GenericBlock - [17..20)::3
  54378. + MarkupLiteralAttributeValue - [17..20)::3 - [Foo]
  54379. + MarkupTextLiteral - [17..20)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54380. + Text;[Foo];
  54381. + MarkupTextLiteral - [20..21)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54382. + SingleQuote;['];
  54383. + MarkupTextLiteral - [21..24)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  54384. + Whitespace;[ ];
  54385. + ForwardSlash;[/];
  54386. + CloseAngle;[>];
  54387. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes1.stree.txt
  54388. index e423902d003..644d279c658 100644
  54389. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes1.stree.txt
  54390. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes1.stree.txt
  54391. @@ -1,21 +1,25 @@
  54392. -Markup block - Gen<None> - 18 - (0:0,0)
  54393. - Tag block - Gen<None> - 18 - (0:0,0)
  54394. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  54395. - SyntaxKind.OpenAngle;[<];
  54396. - SyntaxKind.Text;[a];
  54397. - Markup block - Gen<Attr:[item], [item]='@(2:0,2),'@(14:0,14)> - 13 - (2:0,2)
  54398. - Markup span - Gen<None> - [ [item]='] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:6
  54399. - SyntaxKind.Whitespace;[ ];
  54400. - SyntaxKind.LeftBracket;[[];
  54401. - SyntaxKind.Text;[item];
  54402. - SyntaxKind.RightBracket;[]];
  54403. - SyntaxKind.Equals;[=];
  54404. - SyntaxKind.SingleQuote;['];
  54405. - Markup span - Gen<LitAttr:@(11:0,11)> - [Foo] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:1
  54406. - SyntaxKind.Text;[Foo];
  54407. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  54408. - SyntaxKind.SingleQuote;['];
  54409. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:3
  54410. - SyntaxKind.Whitespace;[ ];
  54411. - SyntaxKind.ForwardSlash;[/];
  54412. - SyntaxKind.CloseAngle;[>];
  54413. +MarkupBlock - [0..18)::18 - [<a [item]='Foo' />]
  54414. + MarkupTagBlock - [0..18)::18 - [<a [item]='Foo' />]
  54415. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54416. + OpenAngle;[<];
  54417. + Text;[a];
  54418. + MarkupAttributeBlock - [2..15)::13 - [ [item]='Foo']
  54419. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54420. + Whitespace;[ ];
  54421. + MarkupTextLiteral - [3..9)::6 - [[item]] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54422. + LeftBracket;[[];
  54423. + Text;[item];
  54424. + RightBracket;[]];
  54425. + Equals;[=];
  54426. + MarkupTextLiteral - [10..11)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54427. + SingleQuote;['];
  54428. + GenericBlock - [11..14)::3
  54429. + MarkupLiteralAttributeValue - [11..14)::3 - [Foo]
  54430. + MarkupTextLiteral - [11..14)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54431. + Text;[Foo];
  54432. + MarkupTextLiteral - [14..15)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54433. + SingleQuote;['];
  54434. + MarkupTextLiteral - [15..18)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  54435. + Whitespace;[ ];
  54436. + ForwardSlash;[/];
  54437. + CloseAngle;[>];
  54438. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes2.stree.txt
  54439. index af52c413625..34a56480b2a 100644
  54440. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes2.stree.txt
  54441. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes2.stree.txt
  54442. @@ -1,20 +1,24 @@
  54443. -Markup block - Gen<None> - 19 - (0:0,0)
  54444. - Tag block - Gen<None> - 19 - (0:0,0)
  54445. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  54446. - SyntaxKind.OpenAngle;[<];
  54447. - SyntaxKind.Text;[a];
  54448. - Markup block - Gen<Attr:[(item,, [(item,='@(2:0,2),'@(15:0,15)> - 14 - (2:0,2)
  54449. - Markup span - Gen<None> - [ [(item,='] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:5
  54450. - SyntaxKind.Whitespace;[ ];
  54451. - SyntaxKind.LeftBracket;[[];
  54452. - SyntaxKind.Text;[(item,];
  54453. - SyntaxKind.Equals;[=];
  54454. - SyntaxKind.SingleQuote;['];
  54455. - Markup span - Gen<LitAttr:@(12:0,12)> - [Foo] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:1
  54456. - SyntaxKind.Text;[Foo];
  54457. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:1
  54458. - SyntaxKind.SingleQuote;['];
  54459. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:3
  54460. - SyntaxKind.Whitespace;[ ];
  54461. - SyntaxKind.ForwardSlash;[/];
  54462. - SyntaxKind.CloseAngle;[>];
  54463. +MarkupBlock - [0..19)::19 - [<a [(item,='Foo' />]
  54464. + MarkupTagBlock - [0..19)::19 - [<a [(item,='Foo' />]
  54465. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54466. + OpenAngle;[<];
  54467. + Text;[a];
  54468. + MarkupAttributeBlock - [2..16)::14 - [ [(item,='Foo']
  54469. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54470. + Whitespace;[ ];
  54471. + MarkupTextLiteral - [3..10)::7 - [[(item,] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54472. + LeftBracket;[[];
  54473. + Text;[(item,];
  54474. + Equals;[=];
  54475. + MarkupTextLiteral - [11..12)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54476. + SingleQuote;['];
  54477. + GenericBlock - [12..15)::3
  54478. + MarkupLiteralAttributeValue - [12..15)::3 - [Foo]
  54479. + MarkupTextLiteral - [12..15)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54480. + Text;[Foo];
  54481. + MarkupTextLiteral - [15..16)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54482. + SingleQuote;['];
  54483. + MarkupTextLiteral - [16..19)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  54484. + Whitespace;[ ];
  54485. + ForwardSlash;[/];
  54486. + CloseAngle;[>];
  54487. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes3.stree.txt
  54488. index 7a5f7a0b502..8362be761a2 100644
  54489. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes3.stree.txt
  54490. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes3.stree.txt
  54491. @@ -1,19 +1,23 @@
  54492. -Markup block - Gen<None> - 19 - (0:0,0)
  54493. - Tag block - Gen<None> - 19 - (0:0,0)
  54494. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  54495. - SyntaxKind.OpenAngle;[<];
  54496. - SyntaxKind.Text;[a];
  54497. - Markup block - Gen<Attr:(click), (click)='@(2:0,2),'@(15:0,15)> - 14 - (2:0,2)
  54498. - Markup span - Gen<None> - [ (click)='] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:4
  54499. - SyntaxKind.Whitespace;[ ];
  54500. - SyntaxKind.Text;[(click)];
  54501. - SyntaxKind.Equals;[=];
  54502. - SyntaxKind.SingleQuote;['];
  54503. - Markup span - Gen<LitAttr:@(12:0,12)> - [Foo] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:1
  54504. - SyntaxKind.Text;[Foo];
  54505. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:1
  54506. - SyntaxKind.SingleQuote;['];
  54507. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:3
  54508. - SyntaxKind.Whitespace;[ ];
  54509. - SyntaxKind.ForwardSlash;[/];
  54510. - SyntaxKind.CloseAngle;[>];
  54511. +MarkupBlock - [0..19)::19 - [<a (click)='Foo' />]
  54512. + MarkupTagBlock - [0..19)::19 - [<a (click)='Foo' />]
  54513. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54514. + OpenAngle;[<];
  54515. + Text;[a];
  54516. + MarkupAttributeBlock - [2..16)::14 - [ (click)='Foo']
  54517. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54518. + Whitespace;[ ];
  54519. + MarkupTextLiteral - [3..10)::7 - [(click)] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54520. + Text;[(click)];
  54521. + Equals;[=];
  54522. + MarkupTextLiteral - [11..12)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54523. + SingleQuote;['];
  54524. + GenericBlock - [12..15)::3
  54525. + MarkupLiteralAttributeValue - [12..15)::3 - [Foo]
  54526. + MarkupTextLiteral - [12..15)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54527. + Text;[Foo];
  54528. + MarkupTextLiteral - [15..16)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54529. + SingleQuote;['];
  54530. + MarkupTextLiteral - [16..19)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  54531. + Whitespace;[ ];
  54532. + ForwardSlash;[/];
  54533. + CloseAngle;[>];
  54534. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes4.stree.txt
  54535. index 378afa31d85..e8b4c737a30 100644
  54536. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes4.stree.txt
  54537. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes4.stree.txt
  54538. @@ -1,19 +1,23 @@
  54539. -Markup block - Gen<None> - 20 - (0:0,0)
  54540. - Tag block - Gen<None> - 20 - (0:0,0)
  54541. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  54542. - SyntaxKind.OpenAngle;[<];
  54543. - SyntaxKind.Text;[a];
  54544. - Markup block - Gen<Attr:(^click), (^click)='@(2:0,2),'@(16:0,16)> - 15 - (2:0,2)
  54545. - Markup span - Gen<None> - [ (^click)='] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:4
  54546. - SyntaxKind.Whitespace;[ ];
  54547. - SyntaxKind.Text;[(^click)];
  54548. - SyntaxKind.Equals;[=];
  54549. - SyntaxKind.SingleQuote;['];
  54550. - Markup span - Gen<LitAttr:@(13:0,13)> - [Foo] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:1
  54551. - SyntaxKind.Text;[Foo];
  54552. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  54553. - SyntaxKind.SingleQuote;['];
  54554. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (17:0,17) - Tokens:3
  54555. - SyntaxKind.Whitespace;[ ];
  54556. - SyntaxKind.ForwardSlash;[/];
  54557. - SyntaxKind.CloseAngle;[>];
  54558. +MarkupBlock - [0..20)::20 - [<a (^click)='Foo' />]
  54559. + MarkupTagBlock - [0..20)::20 - [<a (^click)='Foo' />]
  54560. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54561. + OpenAngle;[<];
  54562. + Text;[a];
  54563. + MarkupAttributeBlock - [2..17)::15 - [ (^click)='Foo']
  54564. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54565. + Whitespace;[ ];
  54566. + MarkupTextLiteral - [3..11)::8 - [(^click)] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54567. + Text;[(^click)];
  54568. + Equals;[=];
  54569. + MarkupTextLiteral - [12..13)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54570. + SingleQuote;['];
  54571. + GenericBlock - [13..16)::3
  54572. + MarkupLiteralAttributeValue - [13..16)::3 - [Foo]
  54573. + MarkupTextLiteral - [13..16)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54574. + Text;[Foo];
  54575. + MarkupTextLiteral - [16..17)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54576. + SingleQuote;['];
  54577. + MarkupTextLiteral - [17..20)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  54578. + Whitespace;[ ];
  54579. + ForwardSlash;[/];
  54580. + CloseAngle;[>];
  54581. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes5.stree.txt
  54582. index 5412976c4ab..a90b0eb210c 100644
  54583. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes5.stree.txt
  54584. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes5.stree.txt
  54585. @@ -1,19 +1,23 @@
  54586. -Markup block - Gen<None> - 22 - (0:0,0)
  54587. - Tag block - Gen<None> - 22 - (0:0,0)
  54588. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  54589. - SyntaxKind.OpenAngle;[<];
  54590. - SyntaxKind.Text;[a];
  54591. - Markup block - Gen<Attr:*something, *something='@(2:0,2),'@(18:0,18)> - 17 - (2:0,2)
  54592. - Markup span - Gen<None> - [ *something='] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:4
  54593. - SyntaxKind.Whitespace;[ ];
  54594. - SyntaxKind.Text;[*something];
  54595. - SyntaxKind.Equals;[=];
  54596. - SyntaxKind.SingleQuote;['];
  54597. - Markup span - Gen<LitAttr:@(15:0,15)> - [Foo] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:1
  54598. - SyntaxKind.Text;[Foo];
  54599. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:1
  54600. - SyntaxKind.SingleQuote;['];
  54601. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (19:0,19) - Tokens:3
  54602. - SyntaxKind.Whitespace;[ ];
  54603. - SyntaxKind.ForwardSlash;[/];
  54604. - SyntaxKind.CloseAngle;[>];
  54605. +MarkupBlock - [0..22)::22 - [<a *something='Foo' />]
  54606. + MarkupTagBlock - [0..22)::22 - [<a *something='Foo' />]
  54607. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54608. + OpenAngle;[<];
  54609. + Text;[a];
  54610. + MarkupAttributeBlock - [2..19)::17 - [ *something='Foo']
  54611. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54612. + Whitespace;[ ];
  54613. + MarkupTextLiteral - [3..13)::10 - [*something] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54614. + Text;[*something];
  54615. + Equals;[=];
  54616. + MarkupTextLiteral - [14..15)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54617. + SingleQuote;['];
  54618. + GenericBlock - [15..18)::3
  54619. + MarkupLiteralAttributeValue - [15..18)::3 - [Foo]
  54620. + MarkupTextLiteral - [15..18)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54621. + Text;[Foo];
  54622. + MarkupTextLiteral - [18..19)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54623. + SingleQuote;['];
  54624. + MarkupTextLiteral - [19..22)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  54625. + Whitespace;[ ];
  54626. + ForwardSlash;[/];
  54627. + CloseAngle;[>];
  54628. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes6.stree.txt
  54629. index 27b6e848f64..c4222276973 100644
  54630. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes6.stree.txt
  54631. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes6.stree.txt
  54632. @@ -1,19 +1,23 @@
  54633. -Markup block - Gen<None> - 18 - (0:0,0)
  54634. - Tag block - Gen<None> - 18 - (0:0,0)
  54635. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  54636. - SyntaxKind.OpenAngle;[<];
  54637. - SyntaxKind.Text;[a];
  54638. - Markup block - Gen<Attr:#local, #local='@(2:0,2),'@(14:0,14)> - 13 - (2:0,2)
  54639. - Markup span - Gen<None> - [ #local='] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:4
  54640. - SyntaxKind.Whitespace;[ ];
  54641. - SyntaxKind.Text;[#local];
  54642. - SyntaxKind.Equals;[=];
  54643. - SyntaxKind.SingleQuote;['];
  54644. - Markup span - Gen<LitAttr:@(11:0,11)> - [Foo] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:1
  54645. - SyntaxKind.Text;[Foo];
  54646. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  54647. - SyntaxKind.SingleQuote;['];
  54648. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:3
  54649. - SyntaxKind.Whitespace;[ ];
  54650. - SyntaxKind.ForwardSlash;[/];
  54651. - SyntaxKind.CloseAngle;[>];
  54652. +MarkupBlock - [0..18)::18 - [<a #local='Foo' />]
  54653. + MarkupTagBlock - [0..18)::18 - [<a #local='Foo' />]
  54654. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54655. + OpenAngle;[<];
  54656. + Text;[a];
  54657. + MarkupAttributeBlock - [2..15)::13 - [ #local='Foo']
  54658. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54659. + Whitespace;[ ];
  54660. + MarkupTextLiteral - [3..9)::6 - [#local] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54661. + Text;[#local];
  54662. + Equals;[=];
  54663. + MarkupTextLiteral - [10..11)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54664. + SingleQuote;['];
  54665. + GenericBlock - [11..14)::3
  54666. + MarkupLiteralAttributeValue - [11..14)::3 - [Foo]
  54667. + MarkupTextLiteral - [11..14)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54668. + Text;[Foo];
  54669. + MarkupTextLiteral - [14..15)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54670. + SingleQuote;['];
  54671. + MarkupTextLiteral - [15..18)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  54672. + Whitespace;[ ];
  54673. + ForwardSlash;[/];
  54674. + CloseAngle;[>];
  54675. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_BeforeEqualWhitespace1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_BeforeEqualWhitespace1.stree.txt
  54676. index b260467ac9b..ed90ad5f48f 100644
  54677. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_BeforeEqualWhitespace1.stree.txt
  54678. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_BeforeEqualWhitespace1.stree.txt
  54679. @@ -1,35 +1,44 @@
  54680. -Markup block - Gen<None> - 35 - (0:0,0)
  54681. - Tag block - Gen<None> - 35 - (0:0,0)
  54682. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  54683. - SyntaxKind.OpenAngle;[<];
  54684. - SyntaxKind.Text;[a];
  54685. - Markup block - Gen<Attr:[item], [item]LF='@(2:0,2),'@(16:1,5)> - 15 - (2:0,2)
  54686. - Markup span - Gen<None> - [ [item]LF='] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:7
  54687. - SyntaxKind.Whitespace;[ ];
  54688. - SyntaxKind.LeftBracket;[[];
  54689. - SyntaxKind.Text;[item];
  54690. - SyntaxKind.RightBracket;[]];
  54691. - SyntaxKind.NewLine;[LF];
  54692. - SyntaxKind.Equals;[=];
  54693. - SyntaxKind.SingleQuote;['];
  54694. - Markup span - Gen<LitAttr:@(13:1,2)> - [Foo] - SpanEditHandler;Accepts:Any - (13:1,2) - Tokens:1
  54695. - SyntaxKind.Text;[Foo];
  54696. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (16:1,5) - Tokens:1
  54697. - SyntaxKind.SingleQuote;['];
  54698. - Markup block - Gen<Attr:[item], [item]=LF'@(17:1,6),'@(31:2,4)> - 15 - (17:1,6)
  54699. - Markup span - Gen<None> - [ [item]=LF'] - SpanEditHandler;Accepts:Any - (17:1,6) - Tokens:7
  54700. - SyntaxKind.Whitespace;[ ];
  54701. - SyntaxKind.LeftBracket;[[];
  54702. - SyntaxKind.Text;[item];
  54703. - SyntaxKind.RightBracket;[]];
  54704. - SyntaxKind.Equals;[=];
  54705. - SyntaxKind.NewLine;[LF];
  54706. - SyntaxKind.SingleQuote;['];
  54707. - Markup span - Gen<LitAttr:@(28:2,1)> - [Bar] - SpanEditHandler;Accepts:Any - (28:2,1) - Tokens:1
  54708. - SyntaxKind.Text;[Bar];
  54709. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (31:2,4) - Tokens:1
  54710. - SyntaxKind.SingleQuote;['];
  54711. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (32:2,5) - Tokens:3
  54712. - SyntaxKind.Whitespace;[ ];
  54713. - SyntaxKind.ForwardSlash;[/];
  54714. - SyntaxKind.CloseAngle;[>];
  54715. +MarkupBlock - [0..35)::35 - [<a [item]LF='Foo' [item]=LF'Bar' />]
  54716. + MarkupTagBlock - [0..35)::35 - [<a [item]LF='Foo' [item]=LF'Bar' />]
  54717. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54718. + OpenAngle;[<];
  54719. + Text;[a];
  54720. + MarkupAttributeBlock - [2..17)::15 - [ [item]LF='Foo']
  54721. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54722. + Whitespace;[ ];
  54723. + MarkupTextLiteral - [3..9)::6 - [[item]] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54724. + LeftBracket;[[];
  54725. + Text;[item];
  54726. + RightBracket;[]];
  54727. + MarkupTextLiteral - [9..11)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54728. + NewLine;[LF];
  54729. + Equals;[=];
  54730. + MarkupTextLiteral - [12..13)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54731. + SingleQuote;['];
  54732. + GenericBlock - [13..16)::3
  54733. + MarkupLiteralAttributeValue - [13..16)::3 - [Foo]
  54734. + MarkupTextLiteral - [13..16)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54735. + Text;[Foo];
  54736. + MarkupTextLiteral - [16..17)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54737. + SingleQuote;['];
  54738. + MarkupAttributeBlock - [17..32)::15 - [ [item]=LF'Bar']
  54739. + MarkupTextLiteral - [17..18)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54740. + Whitespace;[ ];
  54741. + MarkupTextLiteral - [18..24)::6 - [[item]] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54742. + LeftBracket;[[];
  54743. + Text;[item];
  54744. + RightBracket;[]];
  54745. + Equals;[=];
  54746. + MarkupTextLiteral - [25..28)::3 - [LF'] - Gen<None> - SpanEditHandler;Accepts:Any
  54747. + NewLine;[LF];
  54748. + SingleQuote;['];
  54749. + GenericBlock - [28..31)::3
  54750. + MarkupLiteralAttributeValue - [28..31)::3 - [Bar]
  54751. + MarkupTextLiteral - [28..31)::3 - [Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54752. + Text;[Bar];
  54753. + MarkupTextLiteral - [31..32)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54754. + SingleQuote;['];
  54755. + MarkupTextLiteral - [32..35)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  54756. + Whitespace;[ ];
  54757. + ForwardSlash;[/];
  54758. + CloseAngle;[>];
  54759. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_BeforeEqualWhitespace2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_BeforeEqualWhitespace2.stree.txt
  54760. index 67c099ce8c9..154e149e727 100644
  54761. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_BeforeEqualWhitespace2.stree.txt
  54762. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_BeforeEqualWhitespace2.stree.txt
  54763. @@ -1,33 +1,42 @@
  54764. -Markup block - Gen<None> - 37 - (0:0,0)
  54765. - Tag block - Gen<None> - 37 - (0:0,0)
  54766. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  54767. - SyntaxKind.OpenAngle;[<];
  54768. - SyntaxKind.Text;[a];
  54769. - Markup block - Gen<Attr:[(item,, [(item,LF='@(2:0,2),'@(17:1,5)> - 16 - (2:0,2)
  54770. - Markup span - Gen<None> - [ [(item,LF='] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:6
  54771. - SyntaxKind.Whitespace;[ ];
  54772. - SyntaxKind.LeftBracket;[[];
  54773. - SyntaxKind.Text;[(item,];
  54774. - SyntaxKind.NewLine;[LF];
  54775. - SyntaxKind.Equals;[=];
  54776. - SyntaxKind.SingleQuote;['];
  54777. - Markup span - Gen<LitAttr:@(14:1,2)> - [Foo] - SpanEditHandler;Accepts:Any - (14:1,2) - Tokens:1
  54778. - SyntaxKind.Text;[Foo];
  54779. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (17:1,5) - Tokens:1
  54780. - SyntaxKind.SingleQuote;['];
  54781. - Markup block - Gen<Attr:[(item,, [(item,=LF'@(18:1,6),'@(33:2,4)> - 16 - (18:1,6)
  54782. - Markup span - Gen<None> - [ [(item,=LF'] - SpanEditHandler;Accepts:Any - (18:1,6) - Tokens:6
  54783. - SyntaxKind.Whitespace;[ ];
  54784. - SyntaxKind.LeftBracket;[[];
  54785. - SyntaxKind.Text;[(item,];
  54786. - SyntaxKind.Equals;[=];
  54787. - SyntaxKind.NewLine;[LF];
  54788. - SyntaxKind.SingleQuote;['];
  54789. - Markup span - Gen<LitAttr:@(30:2,1)> - [Bar] - SpanEditHandler;Accepts:Any - (30:2,1) - Tokens:1
  54790. - SyntaxKind.Text;[Bar];
  54791. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (33:2,4) - Tokens:1
  54792. - SyntaxKind.SingleQuote;['];
  54793. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (34:2,5) - Tokens:3
  54794. - SyntaxKind.Whitespace;[ ];
  54795. - SyntaxKind.ForwardSlash;[/];
  54796. - SyntaxKind.CloseAngle;[>];
  54797. +MarkupBlock - [0..37)::37 - [<a [(item,LF='Foo' [(item,=LF'Bar' />]
  54798. + MarkupTagBlock - [0..37)::37 - [<a [(item,LF='Foo' [(item,=LF'Bar' />]
  54799. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54800. + OpenAngle;[<];
  54801. + Text;[a];
  54802. + MarkupAttributeBlock - [2..18)::16 - [ [(item,LF='Foo']
  54803. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54804. + Whitespace;[ ];
  54805. + MarkupTextLiteral - [3..10)::7 - [[(item,] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54806. + LeftBracket;[[];
  54807. + Text;[(item,];
  54808. + MarkupTextLiteral - [10..12)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54809. + NewLine;[LF];
  54810. + Equals;[=];
  54811. + MarkupTextLiteral - [13..14)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54812. + SingleQuote;['];
  54813. + GenericBlock - [14..17)::3
  54814. + MarkupLiteralAttributeValue - [14..17)::3 - [Foo]
  54815. + MarkupTextLiteral - [14..17)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54816. + Text;[Foo];
  54817. + MarkupTextLiteral - [17..18)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54818. + SingleQuote;['];
  54819. + MarkupAttributeBlock - [18..34)::16 - [ [(item,=LF'Bar']
  54820. + MarkupTextLiteral - [18..19)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54821. + Whitespace;[ ];
  54822. + MarkupTextLiteral - [19..26)::7 - [[(item,] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54823. + LeftBracket;[[];
  54824. + Text;[(item,];
  54825. + Equals;[=];
  54826. + MarkupTextLiteral - [27..30)::3 - [LF'] - Gen<None> - SpanEditHandler;Accepts:Any
  54827. + NewLine;[LF];
  54828. + SingleQuote;['];
  54829. + GenericBlock - [30..33)::3
  54830. + MarkupLiteralAttributeValue - [30..33)::3 - [Bar]
  54831. + MarkupTextLiteral - [30..33)::3 - [Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54832. + Text;[Bar];
  54833. + MarkupTextLiteral - [33..34)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54834. + SingleQuote;['];
  54835. + MarkupTextLiteral - [34..37)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  54836. + Whitespace;[ ];
  54837. + ForwardSlash;[/];
  54838. + CloseAngle;[>];
  54839. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_BeforeEqualWhitespace3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_BeforeEqualWhitespace3.stree.txt
  54840. index 935a48269a6..32cdc36a1c2 100644
  54841. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_BeforeEqualWhitespace3.stree.txt
  54842. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_BeforeEqualWhitespace3.stree.txt
  54843. @@ -1,31 +1,40 @@
  54844. -Markup block - Gen<None> - 37 - (0:0,0)
  54845. - Tag block - Gen<None> - 37 - (0:0,0)
  54846. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  54847. - SyntaxKind.OpenAngle;[<];
  54848. - SyntaxKind.Text;[a];
  54849. - Markup block - Gen<Attr:(click), (click)LF='@(2:0,2),'@(17:1,5)> - 16 - (2:0,2)
  54850. - Markup span - Gen<None> - [ (click)LF='] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:5
  54851. - SyntaxKind.Whitespace;[ ];
  54852. - SyntaxKind.Text;[(click)];
  54853. - SyntaxKind.NewLine;[LF];
  54854. - SyntaxKind.Equals;[=];
  54855. - SyntaxKind.SingleQuote;['];
  54856. - Markup span - Gen<LitAttr:@(14:1,2)> - [Foo] - SpanEditHandler;Accepts:Any - (14:1,2) - Tokens:1
  54857. - SyntaxKind.Text;[Foo];
  54858. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (17:1,5) - Tokens:1
  54859. - SyntaxKind.SingleQuote;['];
  54860. - Markup block - Gen<Attr:(click), (click)=LF'@(18:1,6),'@(33:2,4)> - 16 - (18:1,6)
  54861. - Markup span - Gen<None> - [ (click)=LF'] - SpanEditHandler;Accepts:Any - (18:1,6) - Tokens:5
  54862. - SyntaxKind.Whitespace;[ ];
  54863. - SyntaxKind.Text;[(click)];
  54864. - SyntaxKind.Equals;[=];
  54865. - SyntaxKind.NewLine;[LF];
  54866. - SyntaxKind.SingleQuote;['];
  54867. - Markup span - Gen<LitAttr:@(30:2,1)> - [Bar] - SpanEditHandler;Accepts:Any - (30:2,1) - Tokens:1
  54868. - SyntaxKind.Text;[Bar];
  54869. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (33:2,4) - Tokens:1
  54870. - SyntaxKind.SingleQuote;['];
  54871. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (34:2,5) - Tokens:3
  54872. - SyntaxKind.Whitespace;[ ];
  54873. - SyntaxKind.ForwardSlash;[/];
  54874. - SyntaxKind.CloseAngle;[>];
  54875. +MarkupBlock - [0..37)::37 - [<a (click)LF='Foo' (click)=LF'Bar' />]
  54876. + MarkupTagBlock - [0..37)::37 - [<a (click)LF='Foo' (click)=LF'Bar' />]
  54877. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54878. + OpenAngle;[<];
  54879. + Text;[a];
  54880. + MarkupAttributeBlock - [2..18)::16 - [ (click)LF='Foo']
  54881. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54882. + Whitespace;[ ];
  54883. + MarkupTextLiteral - [3..10)::7 - [(click)] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54884. + Text;[(click)];
  54885. + MarkupTextLiteral - [10..12)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54886. + NewLine;[LF];
  54887. + Equals;[=];
  54888. + MarkupTextLiteral - [13..14)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54889. + SingleQuote;['];
  54890. + GenericBlock - [14..17)::3
  54891. + MarkupLiteralAttributeValue - [14..17)::3 - [Foo]
  54892. + MarkupTextLiteral - [14..17)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54893. + Text;[Foo];
  54894. + MarkupTextLiteral - [17..18)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54895. + SingleQuote;['];
  54896. + MarkupAttributeBlock - [18..34)::16 - [ (click)=LF'Bar']
  54897. + MarkupTextLiteral - [18..19)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54898. + Whitespace;[ ];
  54899. + MarkupTextLiteral - [19..26)::7 - [(click)] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54900. + Text;[(click)];
  54901. + Equals;[=];
  54902. + MarkupTextLiteral - [27..30)::3 - [LF'] - Gen<None> - SpanEditHandler;Accepts:Any
  54903. + NewLine;[LF];
  54904. + SingleQuote;['];
  54905. + GenericBlock - [30..33)::3
  54906. + MarkupLiteralAttributeValue - [30..33)::3 - [Bar]
  54907. + MarkupTextLiteral - [30..33)::3 - [Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54908. + Text;[Bar];
  54909. + MarkupTextLiteral - [33..34)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54910. + SingleQuote;['];
  54911. + MarkupTextLiteral - [34..37)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  54912. + Whitespace;[ ];
  54913. + ForwardSlash;[/];
  54914. + CloseAngle;[>];
  54915. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_BeforeEqualWhitespace4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_BeforeEqualWhitespace4.stree.txt
  54916. index fa669084849..24a5075573d 100644
  54917. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_BeforeEqualWhitespace4.stree.txt
  54918. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_BeforeEqualWhitespace4.stree.txt
  54919. @@ -1,31 +1,40 @@
  54920. -Markup block - Gen<None> - 39 - (0:0,0)
  54921. - Tag block - Gen<None> - 39 - (0:0,0)
  54922. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  54923. - SyntaxKind.OpenAngle;[<];
  54924. - SyntaxKind.Text;[a];
  54925. - Markup block - Gen<Attr:(^click), (^click)LF='@(2:0,2),'@(18:1,5)> - 17 - (2:0,2)
  54926. - Markup span - Gen<None> - [ (^click)LF='] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:5
  54927. - SyntaxKind.Whitespace;[ ];
  54928. - SyntaxKind.Text;[(^click)];
  54929. - SyntaxKind.NewLine;[LF];
  54930. - SyntaxKind.Equals;[=];
  54931. - SyntaxKind.SingleQuote;['];
  54932. - Markup span - Gen<LitAttr:@(15:1,2)> - [Foo] - SpanEditHandler;Accepts:Any - (15:1,2) - Tokens:1
  54933. - SyntaxKind.Text;[Foo];
  54934. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (18:1,5) - Tokens:1
  54935. - SyntaxKind.SingleQuote;['];
  54936. - Markup block - Gen<Attr:(^click), (^click)=LF'@(19:1,6),'@(35:2,4)> - 17 - (19:1,6)
  54937. - Markup span - Gen<None> - [ (^click)=LF'] - SpanEditHandler;Accepts:Any - (19:1,6) - Tokens:5
  54938. - SyntaxKind.Whitespace;[ ];
  54939. - SyntaxKind.Text;[(^click)];
  54940. - SyntaxKind.Equals;[=];
  54941. - SyntaxKind.NewLine;[LF];
  54942. - SyntaxKind.SingleQuote;['];
  54943. - Markup span - Gen<LitAttr:@(32:2,1)> - [Bar] - SpanEditHandler;Accepts:Any - (32:2,1) - Tokens:1
  54944. - SyntaxKind.Text;[Bar];
  54945. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (35:2,4) - Tokens:1
  54946. - SyntaxKind.SingleQuote;['];
  54947. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (36:2,5) - Tokens:3
  54948. - SyntaxKind.Whitespace;[ ];
  54949. - SyntaxKind.ForwardSlash;[/];
  54950. - SyntaxKind.CloseAngle;[>];
  54951. +MarkupBlock - [0..39)::39 - [<a (^click)LF='Foo' (^click)=LF'Bar' />]
  54952. + MarkupTagBlock - [0..39)::39 - [<a (^click)LF='Foo' (^click)=LF'Bar' />]
  54953. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54954. + OpenAngle;[<];
  54955. + Text;[a];
  54956. + MarkupAttributeBlock - [2..19)::17 - [ (^click)LF='Foo']
  54957. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54958. + Whitespace;[ ];
  54959. + MarkupTextLiteral - [3..11)::8 - [(^click)] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54960. + Text;[(^click)];
  54961. + MarkupTextLiteral - [11..13)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54962. + NewLine;[LF];
  54963. + Equals;[=];
  54964. + MarkupTextLiteral - [14..15)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54965. + SingleQuote;['];
  54966. + GenericBlock - [15..18)::3
  54967. + MarkupLiteralAttributeValue - [15..18)::3 - [Foo]
  54968. + MarkupTextLiteral - [15..18)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54969. + Text;[Foo];
  54970. + MarkupTextLiteral - [18..19)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54971. + SingleQuote;['];
  54972. + MarkupAttributeBlock - [19..36)::17 - [ (^click)=LF'Bar']
  54973. + MarkupTextLiteral - [19..20)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54974. + Whitespace;[ ];
  54975. + MarkupTextLiteral - [20..28)::8 - [(^click)] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54976. + Text;[(^click)];
  54977. + Equals;[=];
  54978. + MarkupTextLiteral - [29..32)::3 - [LF'] - Gen<None> - SpanEditHandler;Accepts:Any
  54979. + NewLine;[LF];
  54980. + SingleQuote;['];
  54981. + GenericBlock - [32..35)::3
  54982. + MarkupLiteralAttributeValue - [32..35)::3 - [Bar]
  54983. + MarkupTextLiteral - [32..35)::3 - [Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  54984. + Text;[Bar];
  54985. + MarkupTextLiteral - [35..36)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  54986. + SingleQuote;['];
  54987. + MarkupTextLiteral - [36..39)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  54988. + Whitespace;[ ];
  54989. + ForwardSlash;[/];
  54990. + CloseAngle;[>];
  54991. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_BeforeEqualWhitespace5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_BeforeEqualWhitespace5.stree.txt
  54992. index 40ebd0e6c36..e25c7154e9c 100644
  54993. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_BeforeEqualWhitespace5.stree.txt
  54994. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_BeforeEqualWhitespace5.stree.txt
  54995. @@ -1,31 +1,40 @@
  54996. -Markup block - Gen<None> - 43 - (0:0,0)
  54997. - Tag block - Gen<None> - 43 - (0:0,0)
  54998. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  54999. - SyntaxKind.OpenAngle;[<];
  55000. - SyntaxKind.Text;[a];
  55001. - Markup block - Gen<Attr:*something, *somethingLF='@(2:0,2),'@(20:1,5)> - 19 - (2:0,2)
  55002. - Markup span - Gen<None> - [ *somethingLF='] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:5
  55003. - SyntaxKind.Whitespace;[ ];
  55004. - SyntaxKind.Text;[*something];
  55005. - SyntaxKind.NewLine;[LF];
  55006. - SyntaxKind.Equals;[=];
  55007. - SyntaxKind.SingleQuote;['];
  55008. - Markup span - Gen<LitAttr:@(17:1,2)> - [Foo] - SpanEditHandler;Accepts:Any - (17:1,2) - Tokens:1
  55009. - SyntaxKind.Text;[Foo];
  55010. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (20:1,5) - Tokens:1
  55011. - SyntaxKind.SingleQuote;['];
  55012. - Markup block - Gen<Attr:*something, *something=LF'@(21:1,6),'@(39:2,4)> - 19 - (21:1,6)
  55013. - Markup span - Gen<None> - [ *something=LF'] - SpanEditHandler;Accepts:Any - (21:1,6) - Tokens:5
  55014. - SyntaxKind.Whitespace;[ ];
  55015. - SyntaxKind.Text;[*something];
  55016. - SyntaxKind.Equals;[=];
  55017. - SyntaxKind.NewLine;[LF];
  55018. - SyntaxKind.SingleQuote;['];
  55019. - Markup span - Gen<LitAttr:@(36:2,1)> - [Bar] - SpanEditHandler;Accepts:Any - (36:2,1) - Tokens:1
  55020. - SyntaxKind.Text;[Bar];
  55021. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (39:2,4) - Tokens:1
  55022. - SyntaxKind.SingleQuote;['];
  55023. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (40:2,5) - Tokens:3
  55024. - SyntaxKind.Whitespace;[ ];
  55025. - SyntaxKind.ForwardSlash;[/];
  55026. - SyntaxKind.CloseAngle;[>];
  55027. +MarkupBlock - [0..43)::43 - [<a *somethingLF='Foo' *something=LF'Bar' />]
  55028. + MarkupTagBlock - [0..43)::43 - [<a *somethingLF='Foo' *something=LF'Bar' />]
  55029. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55030. + OpenAngle;[<];
  55031. + Text;[a];
  55032. + MarkupAttributeBlock - [2..21)::19 - [ *somethingLF='Foo']
  55033. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55034. + Whitespace;[ ];
  55035. + MarkupTextLiteral - [3..13)::10 - [*something] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55036. + Text;[*something];
  55037. + MarkupTextLiteral - [13..15)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55038. + NewLine;[LF];
  55039. + Equals;[=];
  55040. + MarkupTextLiteral - [16..17)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55041. + SingleQuote;['];
  55042. + GenericBlock - [17..20)::3
  55043. + MarkupLiteralAttributeValue - [17..20)::3 - [Foo]
  55044. + MarkupTextLiteral - [17..20)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55045. + Text;[Foo];
  55046. + MarkupTextLiteral - [20..21)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55047. + SingleQuote;['];
  55048. + MarkupAttributeBlock - [21..40)::19 - [ *something=LF'Bar']
  55049. + MarkupTextLiteral - [21..22)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55050. + Whitespace;[ ];
  55051. + MarkupTextLiteral - [22..32)::10 - [*something] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55052. + Text;[*something];
  55053. + Equals;[=];
  55054. + MarkupTextLiteral - [33..36)::3 - [LF'] - Gen<None> - SpanEditHandler;Accepts:Any
  55055. + NewLine;[LF];
  55056. + SingleQuote;['];
  55057. + GenericBlock - [36..39)::3
  55058. + MarkupLiteralAttributeValue - [36..39)::3 - [Bar]
  55059. + MarkupTextLiteral - [36..39)::3 - [Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55060. + Text;[Bar];
  55061. + MarkupTextLiteral - [39..40)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55062. + SingleQuote;['];
  55063. + MarkupTextLiteral - [40..43)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  55064. + Whitespace;[ ];
  55065. + ForwardSlash;[/];
  55066. + CloseAngle;[>];
  55067. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_BeforeEqualWhitespace6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_BeforeEqualWhitespace6.stree.txt
  55068. index 33cd85dc5a9..bbef8bcd542 100644
  55069. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_BeforeEqualWhitespace6.stree.txt
  55070. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_BeforeEqualWhitespace6.stree.txt
  55071. @@ -1,31 +1,40 @@
  55072. -Markup block - Gen<None> - 35 - (0:0,0)
  55073. - Tag block - Gen<None> - 35 - (0:0,0)
  55074. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  55075. - SyntaxKind.OpenAngle;[<];
  55076. - SyntaxKind.Text;[a];
  55077. - Markup block - Gen<Attr:#local, #localLF='@(2:0,2),'@(16:1,5)> - 15 - (2:0,2)
  55078. - Markup span - Gen<None> - [ #localLF='] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:5
  55079. - SyntaxKind.Whitespace;[ ];
  55080. - SyntaxKind.Text;[#local];
  55081. - SyntaxKind.NewLine;[LF];
  55082. - SyntaxKind.Equals;[=];
  55083. - SyntaxKind.SingleQuote;['];
  55084. - Markup span - Gen<LitAttr:@(13:1,2)> - [Foo] - SpanEditHandler;Accepts:Any - (13:1,2) - Tokens:1
  55085. - SyntaxKind.Text;[Foo];
  55086. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (16:1,5) - Tokens:1
  55087. - SyntaxKind.SingleQuote;['];
  55088. - Markup block - Gen<Attr:#local, #local=LF'@(17:1,6),'@(31:2,4)> - 15 - (17:1,6)
  55089. - Markup span - Gen<None> - [ #local=LF'] - SpanEditHandler;Accepts:Any - (17:1,6) - Tokens:5
  55090. - SyntaxKind.Whitespace;[ ];
  55091. - SyntaxKind.Text;[#local];
  55092. - SyntaxKind.Equals;[=];
  55093. - SyntaxKind.NewLine;[LF];
  55094. - SyntaxKind.SingleQuote;['];
  55095. - Markup span - Gen<LitAttr:@(28:2,1)> - [Bar] - SpanEditHandler;Accepts:Any - (28:2,1) - Tokens:1
  55096. - SyntaxKind.Text;[Bar];
  55097. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (31:2,4) - Tokens:1
  55098. - SyntaxKind.SingleQuote;['];
  55099. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (32:2,5) - Tokens:3
  55100. - SyntaxKind.Whitespace;[ ];
  55101. - SyntaxKind.ForwardSlash;[/];
  55102. - SyntaxKind.CloseAngle;[>];
  55103. +MarkupBlock - [0..35)::35 - [<a #localLF='Foo' #local=LF'Bar' />]
  55104. + MarkupTagBlock - [0..35)::35 - [<a #localLF='Foo' #local=LF'Bar' />]
  55105. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55106. + OpenAngle;[<];
  55107. + Text;[a];
  55108. + MarkupAttributeBlock - [2..17)::15 - [ #localLF='Foo']
  55109. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55110. + Whitespace;[ ];
  55111. + MarkupTextLiteral - [3..9)::6 - [#local] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55112. + Text;[#local];
  55113. + MarkupTextLiteral - [9..11)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55114. + NewLine;[LF];
  55115. + Equals;[=];
  55116. + MarkupTextLiteral - [12..13)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55117. + SingleQuote;['];
  55118. + GenericBlock - [13..16)::3
  55119. + MarkupLiteralAttributeValue - [13..16)::3 - [Foo]
  55120. + MarkupTextLiteral - [13..16)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55121. + Text;[Foo];
  55122. + MarkupTextLiteral - [16..17)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55123. + SingleQuote;['];
  55124. + MarkupAttributeBlock - [17..32)::15 - [ #local=LF'Bar']
  55125. + MarkupTextLiteral - [17..18)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55126. + Whitespace;[ ];
  55127. + MarkupTextLiteral - [18..24)::6 - [#local] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55128. + Text;[#local];
  55129. + Equals;[=];
  55130. + MarkupTextLiteral - [25..28)::3 - [LF'] - Gen<None> - SpanEditHandler;Accepts:Any
  55131. + NewLine;[LF];
  55132. + SingleQuote;['];
  55133. + GenericBlock - [28..31)::3
  55134. + MarkupLiteralAttributeValue - [28..31)::3 - [Bar]
  55135. + MarkupTextLiteral - [28..31)::3 - [Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55136. + Text;[Bar];
  55137. + MarkupTextLiteral - [31..32)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55138. + SingleQuote;['];
  55139. + MarkupTextLiteral - [32..35)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  55140. + Whitespace;[ ];
  55141. + ForwardSlash;[/];
  55142. + CloseAngle;[>];
  55143. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_Whitespace1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_Whitespace1.stree.txt
  55144. index c2dc3941e35..992fccc9d1a 100644
  55145. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_Whitespace1.stree.txt
  55146. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_Whitespace1.stree.txt
  55147. @@ -1,36 +1,44 @@
  55148. -Markup block - Gen<None> - 37 - (0:0,0)
  55149. - Tag block - Gen<None> - 37 - (0:0,0)
  55150. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  55151. - SyntaxKind.OpenAngle;[<];
  55152. - SyntaxKind.Text;[a];
  55153. - Markup block - Gen<Attr:[item], LF [item]='@(2:0,2),'@(18:1,13)> - 17 - (2:0,2)
  55154. - Markup span - Gen<None> - [ LF [item]='] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:8
  55155. - SyntaxKind.Whitespace;[ ];
  55156. - SyntaxKind.NewLine;[LF];
  55157. - SyntaxKind.Whitespace;[ ];
  55158. - SyntaxKind.LeftBracket;[[];
  55159. - SyntaxKind.Text;[item];
  55160. - SyntaxKind.RightBracket;[]];
  55161. - SyntaxKind.Equals;[=];
  55162. - SyntaxKind.SingleQuote;['];
  55163. - Markup span - Gen<LitAttr:@(15:1,10)> - [Foo] - SpanEditHandler;Accepts:Any - (15:1,10) - Tokens:1
  55164. - SyntaxKind.Text;[Foo];
  55165. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (18:1,13) - Tokens:1
  55166. - SyntaxKind.SingleQuote;['];
  55167. - Markup block - Gen<Attr:[item], LF[item]='@(19:1,14),'@(33:2,11)> - 15 - (19:1,14)
  55168. - Markup span - Gen<None> - [ LF[item]='] - SpanEditHandler;Accepts:Any - (19:1,14) - Tokens:7
  55169. - SyntaxKind.Whitespace;[ ];
  55170. - SyntaxKind.NewLine;[LF];
  55171. - SyntaxKind.LeftBracket;[[];
  55172. - SyntaxKind.Text;[item];
  55173. - SyntaxKind.RightBracket;[]];
  55174. - SyntaxKind.Equals;[=];
  55175. - SyntaxKind.SingleQuote;['];
  55176. - Markup span - Gen<LitAttr:@(30:2,8)> - [Bar] - SpanEditHandler;Accepts:Any - (30:2,8) - Tokens:1
  55177. - SyntaxKind.Text;[Bar];
  55178. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (33:2,11) - Tokens:1
  55179. - SyntaxKind.SingleQuote;['];
  55180. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (34:2,12) - Tokens:3
  55181. - SyntaxKind.Whitespace;[ ];
  55182. - SyntaxKind.ForwardSlash;[/];
  55183. - SyntaxKind.CloseAngle;[>];
  55184. +MarkupBlock - [0..37)::37 - [<a LF [item]='Foo' LF[item]='Bar' />]
  55185. + MarkupTagBlock - [0..37)::37 - [<a LF [item]='Foo' LF[item]='Bar' />]
  55186. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55187. + OpenAngle;[<];
  55188. + Text;[a];
  55189. + MarkupAttributeBlock - [2..19)::17 - [ LF [item]='Foo']
  55190. + MarkupTextLiteral - [2..7)::5 - [ LF ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55191. + Whitespace;[ ];
  55192. + NewLine;[LF];
  55193. + Whitespace;[ ];
  55194. + MarkupTextLiteral - [7..13)::6 - [[item]] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55195. + LeftBracket;[[];
  55196. + Text;[item];
  55197. + RightBracket;[]];
  55198. + Equals;[=];
  55199. + MarkupTextLiteral - [14..15)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55200. + SingleQuote;['];
  55201. + GenericBlock - [15..18)::3
  55202. + MarkupLiteralAttributeValue - [15..18)::3 - [Foo]
  55203. + MarkupTextLiteral - [15..18)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55204. + Text;[Foo];
  55205. + MarkupTextLiteral - [18..19)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55206. + SingleQuote;['];
  55207. + MarkupAttributeBlock - [19..34)::15 - [ LF[item]='Bar']
  55208. + MarkupTextLiteral - [19..22)::3 - [ LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55209. + Whitespace;[ ];
  55210. + NewLine;[LF];
  55211. + MarkupTextLiteral - [22..28)::6 - [[item]] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55212. + LeftBracket;[[];
  55213. + Text;[item];
  55214. + RightBracket;[]];
  55215. + Equals;[=];
  55216. + MarkupTextLiteral - [29..30)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55217. + SingleQuote;['];
  55218. + GenericBlock - [30..33)::3
  55219. + MarkupLiteralAttributeValue - [30..33)::3 - [Bar]
  55220. + MarkupTextLiteral - [30..33)::3 - [Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55221. + Text;[Bar];
  55222. + MarkupTextLiteral - [33..34)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55223. + SingleQuote;['];
  55224. + MarkupTextLiteral - [34..37)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  55225. + Whitespace;[ ];
  55226. + ForwardSlash;[/];
  55227. + CloseAngle;[>];
  55228. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_Whitespace2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_Whitespace2.stree.txt
  55229. index d1d5158fb4b..19f24c26fda 100644
  55230. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_Whitespace2.stree.txt
  55231. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_Whitespace2.stree.txt
  55232. @@ -1,34 +1,42 @@
  55233. -Markup block - Gen<None> - 39 - (0:0,0)
  55234. - Tag block - Gen<None> - 39 - (0:0,0)
  55235. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  55236. - SyntaxKind.OpenAngle;[<];
  55237. - SyntaxKind.Text;[a];
  55238. - Markup block - Gen<Attr:[(item,, LF [(item,='@(2:0,2),'@(19:1,14)> - 18 - (2:0,2)
  55239. - Markup span - Gen<None> - [ LF [(item,='] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:7
  55240. - SyntaxKind.Whitespace;[ ];
  55241. - SyntaxKind.NewLine;[LF];
  55242. - SyntaxKind.Whitespace;[ ];
  55243. - SyntaxKind.LeftBracket;[[];
  55244. - SyntaxKind.Text;[(item,];
  55245. - SyntaxKind.Equals;[=];
  55246. - SyntaxKind.SingleQuote;['];
  55247. - Markup span - Gen<LitAttr:@(16:1,11)> - [Foo] - SpanEditHandler;Accepts:Any - (16:1,11) - Tokens:1
  55248. - SyntaxKind.Text;[Foo];
  55249. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (19:1,14) - Tokens:1
  55250. - SyntaxKind.SingleQuote;['];
  55251. - Markup block - Gen<Attr:[(item,, LF[(item,='@(20:1,15),'@(35:2,12)> - 16 - (20:1,15)
  55252. - Markup span - Gen<None> - [ LF[(item,='] - SpanEditHandler;Accepts:Any - (20:1,15) - Tokens:6
  55253. - SyntaxKind.Whitespace;[ ];
  55254. - SyntaxKind.NewLine;[LF];
  55255. - SyntaxKind.LeftBracket;[[];
  55256. - SyntaxKind.Text;[(item,];
  55257. - SyntaxKind.Equals;[=];
  55258. - SyntaxKind.SingleQuote;['];
  55259. - Markup span - Gen<LitAttr:@(32:2,9)> - [Bar] - SpanEditHandler;Accepts:Any - (32:2,9) - Tokens:1
  55260. - SyntaxKind.Text;[Bar];
  55261. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (35:2,12) - Tokens:1
  55262. - SyntaxKind.SingleQuote;['];
  55263. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (36:2,13) - Tokens:3
  55264. - SyntaxKind.Whitespace;[ ];
  55265. - SyntaxKind.ForwardSlash;[/];
  55266. - SyntaxKind.CloseAngle;[>];
  55267. +MarkupBlock - [0..39)::39 - [<a LF [(item,='Foo' LF[(item,='Bar' />]
  55268. + MarkupTagBlock - [0..39)::39 - [<a LF [(item,='Foo' LF[(item,='Bar' />]
  55269. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55270. + OpenAngle;[<];
  55271. + Text;[a];
  55272. + MarkupAttributeBlock - [2..20)::18 - [ LF [(item,='Foo']
  55273. + MarkupTextLiteral - [2..7)::5 - [ LF ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55274. + Whitespace;[ ];
  55275. + NewLine;[LF];
  55276. + Whitespace;[ ];
  55277. + MarkupTextLiteral - [7..14)::7 - [[(item,] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55278. + LeftBracket;[[];
  55279. + Text;[(item,];
  55280. + Equals;[=];
  55281. + MarkupTextLiteral - [15..16)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55282. + SingleQuote;['];
  55283. + GenericBlock - [16..19)::3
  55284. + MarkupLiteralAttributeValue - [16..19)::3 - [Foo]
  55285. + MarkupTextLiteral - [16..19)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55286. + Text;[Foo];
  55287. + MarkupTextLiteral - [19..20)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55288. + SingleQuote;['];
  55289. + MarkupAttributeBlock - [20..36)::16 - [ LF[(item,='Bar']
  55290. + MarkupTextLiteral - [20..23)::3 - [ LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55291. + Whitespace;[ ];
  55292. + NewLine;[LF];
  55293. + MarkupTextLiteral - [23..30)::7 - [[(item,] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55294. + LeftBracket;[[];
  55295. + Text;[(item,];
  55296. + Equals;[=];
  55297. + MarkupTextLiteral - [31..32)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55298. + SingleQuote;['];
  55299. + GenericBlock - [32..35)::3
  55300. + MarkupLiteralAttributeValue - [32..35)::3 - [Bar]
  55301. + MarkupTextLiteral - [32..35)::3 - [Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55302. + Text;[Bar];
  55303. + MarkupTextLiteral - [35..36)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55304. + SingleQuote;['];
  55305. + MarkupTextLiteral - [36..39)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  55306. + Whitespace;[ ];
  55307. + ForwardSlash;[/];
  55308. + CloseAngle;[>];
  55309. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_Whitespace3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_Whitespace3.stree.txt
  55310. index 27315992e0e..b540ce71ede 100644
  55311. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_Whitespace3.stree.txt
  55312. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_Whitespace3.stree.txt
  55313. @@ -1,32 +1,40 @@
  55314. -Markup block - Gen<None> - 39 - (0:0,0)
  55315. - Tag block - Gen<None> - 39 - (0:0,0)
  55316. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  55317. - SyntaxKind.OpenAngle;[<];
  55318. - SyntaxKind.Text;[a];
  55319. - Markup block - Gen<Attr:(click), LF (click)='@(2:0,2),'@(19:1,14)> - 18 - (2:0,2)
  55320. - Markup span - Gen<None> - [ LF (click)='] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:6
  55321. - SyntaxKind.Whitespace;[ ];
  55322. - SyntaxKind.NewLine;[LF];
  55323. - SyntaxKind.Whitespace;[ ];
  55324. - SyntaxKind.Text;[(click)];
  55325. - SyntaxKind.Equals;[=];
  55326. - SyntaxKind.SingleQuote;['];
  55327. - Markup span - Gen<LitAttr:@(16:1,11)> - [Foo] - SpanEditHandler;Accepts:Any - (16:1,11) - Tokens:1
  55328. - SyntaxKind.Text;[Foo];
  55329. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (19:1,14) - Tokens:1
  55330. - SyntaxKind.SingleQuote;['];
  55331. - Markup block - Gen<Attr:(click), LF(click)='@(20:1,15),'@(35:2,12)> - 16 - (20:1,15)
  55332. - Markup span - Gen<None> - [ LF(click)='] - SpanEditHandler;Accepts:Any - (20:1,15) - Tokens:5
  55333. - SyntaxKind.Whitespace;[ ];
  55334. - SyntaxKind.NewLine;[LF];
  55335. - SyntaxKind.Text;[(click)];
  55336. - SyntaxKind.Equals;[=];
  55337. - SyntaxKind.SingleQuote;['];
  55338. - Markup span - Gen<LitAttr:@(32:2,9)> - [Bar] - SpanEditHandler;Accepts:Any - (32:2,9) - Tokens:1
  55339. - SyntaxKind.Text;[Bar];
  55340. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (35:2,12) - Tokens:1
  55341. - SyntaxKind.SingleQuote;['];
  55342. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (36:2,13) - Tokens:3
  55343. - SyntaxKind.Whitespace;[ ];
  55344. - SyntaxKind.ForwardSlash;[/];
  55345. - SyntaxKind.CloseAngle;[>];
  55346. +MarkupBlock - [0..39)::39 - [<a LF (click)='Foo' LF(click)='Bar' />]
  55347. + MarkupTagBlock - [0..39)::39 - [<a LF (click)='Foo' LF(click)='Bar' />]
  55348. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55349. + OpenAngle;[<];
  55350. + Text;[a];
  55351. + MarkupAttributeBlock - [2..20)::18 - [ LF (click)='Foo']
  55352. + MarkupTextLiteral - [2..7)::5 - [ LF ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55353. + Whitespace;[ ];
  55354. + NewLine;[LF];
  55355. + Whitespace;[ ];
  55356. + MarkupTextLiteral - [7..14)::7 - [(click)] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55357. + Text;[(click)];
  55358. + Equals;[=];
  55359. + MarkupTextLiteral - [15..16)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55360. + SingleQuote;['];
  55361. + GenericBlock - [16..19)::3
  55362. + MarkupLiteralAttributeValue - [16..19)::3 - [Foo]
  55363. + MarkupTextLiteral - [16..19)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55364. + Text;[Foo];
  55365. + MarkupTextLiteral - [19..20)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55366. + SingleQuote;['];
  55367. + MarkupAttributeBlock - [20..36)::16 - [ LF(click)='Bar']
  55368. + MarkupTextLiteral - [20..23)::3 - [ LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55369. + Whitespace;[ ];
  55370. + NewLine;[LF];
  55371. + MarkupTextLiteral - [23..30)::7 - [(click)] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55372. + Text;[(click)];
  55373. + Equals;[=];
  55374. + MarkupTextLiteral - [31..32)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55375. + SingleQuote;['];
  55376. + GenericBlock - [32..35)::3
  55377. + MarkupLiteralAttributeValue - [32..35)::3 - [Bar]
  55378. + MarkupTextLiteral - [32..35)::3 - [Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55379. + Text;[Bar];
  55380. + MarkupTextLiteral - [35..36)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55381. + SingleQuote;['];
  55382. + MarkupTextLiteral - [36..39)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  55383. + Whitespace;[ ];
  55384. + ForwardSlash;[/];
  55385. + CloseAngle;[>];
  55386. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_Whitespace4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_Whitespace4.stree.txt
  55387. index 77d6fd916b0..e1492b44ec0 100644
  55388. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_Whitespace4.stree.txt
  55389. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_Whitespace4.stree.txt
  55390. @@ -1,32 +1,40 @@
  55391. -Markup block - Gen<None> - 41 - (0:0,0)
  55392. - Tag block - Gen<None> - 41 - (0:0,0)
  55393. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  55394. - SyntaxKind.OpenAngle;[<];
  55395. - SyntaxKind.Text;[a];
  55396. - Markup block - Gen<Attr:(^click), LF (^click)='@(2:0,2),'@(20:1,15)> - 19 - (2:0,2)
  55397. - Markup span - Gen<None> - [ LF (^click)='] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:6
  55398. - SyntaxKind.Whitespace;[ ];
  55399. - SyntaxKind.NewLine;[LF];
  55400. - SyntaxKind.Whitespace;[ ];
  55401. - SyntaxKind.Text;[(^click)];
  55402. - SyntaxKind.Equals;[=];
  55403. - SyntaxKind.SingleQuote;['];
  55404. - Markup span - Gen<LitAttr:@(17:1,12)> - [Foo] - SpanEditHandler;Accepts:Any - (17:1,12) - Tokens:1
  55405. - SyntaxKind.Text;[Foo];
  55406. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (20:1,15) - Tokens:1
  55407. - SyntaxKind.SingleQuote;['];
  55408. - Markup block - Gen<Attr:(^click), LF(^click)='@(21:1,16),'@(37:2,13)> - 17 - (21:1,16)
  55409. - Markup span - Gen<None> - [ LF(^click)='] - SpanEditHandler;Accepts:Any - (21:1,16) - Tokens:5
  55410. - SyntaxKind.Whitespace;[ ];
  55411. - SyntaxKind.NewLine;[LF];
  55412. - SyntaxKind.Text;[(^click)];
  55413. - SyntaxKind.Equals;[=];
  55414. - SyntaxKind.SingleQuote;['];
  55415. - Markup span - Gen<LitAttr:@(34:2,10)> - [Bar] - SpanEditHandler;Accepts:Any - (34:2,10) - Tokens:1
  55416. - SyntaxKind.Text;[Bar];
  55417. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (37:2,13) - Tokens:1
  55418. - SyntaxKind.SingleQuote;['];
  55419. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (38:2,14) - Tokens:3
  55420. - SyntaxKind.Whitespace;[ ];
  55421. - SyntaxKind.ForwardSlash;[/];
  55422. - SyntaxKind.CloseAngle;[>];
  55423. +MarkupBlock - [0..41)::41 - [<a LF (^click)='Foo' LF(^click)='Bar' />]
  55424. + MarkupTagBlock - [0..41)::41 - [<a LF (^click)='Foo' LF(^click)='Bar' />]
  55425. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55426. + OpenAngle;[<];
  55427. + Text;[a];
  55428. + MarkupAttributeBlock - [2..21)::19 - [ LF (^click)='Foo']
  55429. + MarkupTextLiteral - [2..7)::5 - [ LF ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55430. + Whitespace;[ ];
  55431. + NewLine;[LF];
  55432. + Whitespace;[ ];
  55433. + MarkupTextLiteral - [7..15)::8 - [(^click)] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55434. + Text;[(^click)];
  55435. + Equals;[=];
  55436. + MarkupTextLiteral - [16..17)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55437. + SingleQuote;['];
  55438. + GenericBlock - [17..20)::3
  55439. + MarkupLiteralAttributeValue - [17..20)::3 - [Foo]
  55440. + MarkupTextLiteral - [17..20)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55441. + Text;[Foo];
  55442. + MarkupTextLiteral - [20..21)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55443. + SingleQuote;['];
  55444. + MarkupAttributeBlock - [21..38)::17 - [ LF(^click)='Bar']
  55445. + MarkupTextLiteral - [21..24)::3 - [ LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55446. + Whitespace;[ ];
  55447. + NewLine;[LF];
  55448. + MarkupTextLiteral - [24..32)::8 - [(^click)] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55449. + Text;[(^click)];
  55450. + Equals;[=];
  55451. + MarkupTextLiteral - [33..34)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55452. + SingleQuote;['];
  55453. + GenericBlock - [34..37)::3
  55454. + MarkupLiteralAttributeValue - [34..37)::3 - [Bar]
  55455. + MarkupTextLiteral - [34..37)::3 - [Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55456. + Text;[Bar];
  55457. + MarkupTextLiteral - [37..38)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55458. + SingleQuote;['];
  55459. + MarkupTextLiteral - [38..41)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  55460. + Whitespace;[ ];
  55461. + ForwardSlash;[/];
  55462. + CloseAngle;[>];
  55463. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_Whitespace5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_Whitespace5.stree.txt
  55464. index 07988944343..d227e0fe287 100644
  55465. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_Whitespace5.stree.txt
  55466. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_Whitespace5.stree.txt
  55467. @@ -1,32 +1,40 @@
  55468. -Markup block - Gen<None> - 45 - (0:0,0)
  55469. - Tag block - Gen<None> - 45 - (0:0,0)
  55470. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  55471. - SyntaxKind.OpenAngle;[<];
  55472. - SyntaxKind.Text;[a];
  55473. - Markup block - Gen<Attr:*something, LF *something='@(2:0,2),'@(22:1,17)> - 21 - (2:0,2)
  55474. - Markup span - Gen<None> - [ LF *something='] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:6
  55475. - SyntaxKind.Whitespace;[ ];
  55476. - SyntaxKind.NewLine;[LF];
  55477. - SyntaxKind.Whitespace;[ ];
  55478. - SyntaxKind.Text;[*something];
  55479. - SyntaxKind.Equals;[=];
  55480. - SyntaxKind.SingleQuote;['];
  55481. - Markup span - Gen<LitAttr:@(19:1,14)> - [Foo] - SpanEditHandler;Accepts:Any - (19:1,14) - Tokens:1
  55482. - SyntaxKind.Text;[Foo];
  55483. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (22:1,17) - Tokens:1
  55484. - SyntaxKind.SingleQuote;['];
  55485. - Markup block - Gen<Attr:*something, LF*something='@(23:1,18),'@(41:2,15)> - 19 - (23:1,18)
  55486. - Markup span - Gen<None> - [ LF*something='] - SpanEditHandler;Accepts:Any - (23:1,18) - Tokens:5
  55487. - SyntaxKind.Whitespace;[ ];
  55488. - SyntaxKind.NewLine;[LF];
  55489. - SyntaxKind.Text;[*something];
  55490. - SyntaxKind.Equals;[=];
  55491. - SyntaxKind.SingleQuote;['];
  55492. - Markup span - Gen<LitAttr:@(38:2,12)> - [Bar] - SpanEditHandler;Accepts:Any - (38:2,12) - Tokens:1
  55493. - SyntaxKind.Text;[Bar];
  55494. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (41:2,15) - Tokens:1
  55495. - SyntaxKind.SingleQuote;['];
  55496. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (42:2,16) - Tokens:3
  55497. - SyntaxKind.Whitespace;[ ];
  55498. - SyntaxKind.ForwardSlash;[/];
  55499. - SyntaxKind.CloseAngle;[>];
  55500. +MarkupBlock - [0..45)::45 - [<a LF *something='Foo' LF*something='Bar' />]
  55501. + MarkupTagBlock - [0..45)::45 - [<a LF *something='Foo' LF*something='Bar' />]
  55502. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55503. + OpenAngle;[<];
  55504. + Text;[a];
  55505. + MarkupAttributeBlock - [2..23)::21 - [ LF *something='Foo']
  55506. + MarkupTextLiteral - [2..7)::5 - [ LF ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55507. + Whitespace;[ ];
  55508. + NewLine;[LF];
  55509. + Whitespace;[ ];
  55510. + MarkupTextLiteral - [7..17)::10 - [*something] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55511. + Text;[*something];
  55512. + Equals;[=];
  55513. + MarkupTextLiteral - [18..19)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55514. + SingleQuote;['];
  55515. + GenericBlock - [19..22)::3
  55516. + MarkupLiteralAttributeValue - [19..22)::3 - [Foo]
  55517. + MarkupTextLiteral - [19..22)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55518. + Text;[Foo];
  55519. + MarkupTextLiteral - [22..23)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55520. + SingleQuote;['];
  55521. + MarkupAttributeBlock - [23..42)::19 - [ LF*something='Bar']
  55522. + MarkupTextLiteral - [23..26)::3 - [ LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55523. + Whitespace;[ ];
  55524. + NewLine;[LF];
  55525. + MarkupTextLiteral - [26..36)::10 - [*something] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55526. + Text;[*something];
  55527. + Equals;[=];
  55528. + MarkupTextLiteral - [37..38)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55529. + SingleQuote;['];
  55530. + GenericBlock - [38..41)::3
  55531. + MarkupLiteralAttributeValue - [38..41)::3 - [Bar]
  55532. + MarkupTextLiteral - [38..41)::3 - [Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55533. + Text;[Bar];
  55534. + MarkupTextLiteral - [41..42)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55535. + SingleQuote;['];
  55536. + MarkupTextLiteral - [42..45)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  55537. + Whitespace;[ ];
  55538. + ForwardSlash;[/];
  55539. + CloseAngle;[>];
  55540. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_Whitespace6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_Whitespace6.stree.txt
  55541. index 959aba13f88..c5195535fea 100644
  55542. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_Whitespace6.stree.txt
  55543. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/SymbolBoundAttributes_Whitespace6.stree.txt
  55544. @@ -1,32 +1,40 @@
  55545. -Markup block - Gen<None> - 37 - (0:0,0)
  55546. - Tag block - Gen<None> - 37 - (0:0,0)
  55547. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  55548. - SyntaxKind.OpenAngle;[<];
  55549. - SyntaxKind.Text;[a];
  55550. - Markup block - Gen<Attr:#local, LF #local='@(2:0,2),'@(18:1,13)> - 17 - (2:0,2)
  55551. - Markup span - Gen<None> - [ LF #local='] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:6
  55552. - SyntaxKind.Whitespace;[ ];
  55553. - SyntaxKind.NewLine;[LF];
  55554. - SyntaxKind.Whitespace;[ ];
  55555. - SyntaxKind.Text;[#local];
  55556. - SyntaxKind.Equals;[=];
  55557. - SyntaxKind.SingleQuote;['];
  55558. - Markup span - Gen<LitAttr:@(15:1,10)> - [Foo] - SpanEditHandler;Accepts:Any - (15:1,10) - Tokens:1
  55559. - SyntaxKind.Text;[Foo];
  55560. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (18:1,13) - Tokens:1
  55561. - SyntaxKind.SingleQuote;['];
  55562. - Markup block - Gen<Attr:#local, LF#local='@(19:1,14),'@(33:2,11)> - 15 - (19:1,14)
  55563. - Markup span - Gen<None> - [ LF#local='] - SpanEditHandler;Accepts:Any - (19:1,14) - Tokens:5
  55564. - SyntaxKind.Whitespace;[ ];
  55565. - SyntaxKind.NewLine;[LF];
  55566. - SyntaxKind.Text;[#local];
  55567. - SyntaxKind.Equals;[=];
  55568. - SyntaxKind.SingleQuote;['];
  55569. - Markup span - Gen<LitAttr:@(30:2,8)> - [Bar] - SpanEditHandler;Accepts:Any - (30:2,8) - Tokens:1
  55570. - SyntaxKind.Text;[Bar];
  55571. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (33:2,11) - Tokens:1
  55572. - SyntaxKind.SingleQuote;['];
  55573. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (34:2,12) - Tokens:3
  55574. - SyntaxKind.Whitespace;[ ];
  55575. - SyntaxKind.ForwardSlash;[/];
  55576. - SyntaxKind.CloseAngle;[>];
  55577. +MarkupBlock - [0..37)::37 - [<a LF #local='Foo' LF#local='Bar' />]
  55578. + MarkupTagBlock - [0..37)::37 - [<a LF #local='Foo' LF#local='Bar' />]
  55579. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55580. + OpenAngle;[<];
  55581. + Text;[a];
  55582. + MarkupAttributeBlock - [2..19)::17 - [ LF #local='Foo']
  55583. + MarkupTextLiteral - [2..7)::5 - [ LF ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55584. + Whitespace;[ ];
  55585. + NewLine;[LF];
  55586. + Whitespace;[ ];
  55587. + MarkupTextLiteral - [7..13)::6 - [#local] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55588. + Text;[#local];
  55589. + Equals;[=];
  55590. + MarkupTextLiteral - [14..15)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55591. + SingleQuote;['];
  55592. + GenericBlock - [15..18)::3
  55593. + MarkupLiteralAttributeValue - [15..18)::3 - [Foo]
  55594. + MarkupTextLiteral - [15..18)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55595. + Text;[Foo];
  55596. + MarkupTextLiteral - [18..19)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55597. + SingleQuote;['];
  55598. + MarkupAttributeBlock - [19..34)::15 - [ LF#local='Bar']
  55599. + MarkupTextLiteral - [19..22)::3 - [ LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55600. + Whitespace;[ ];
  55601. + NewLine;[LF];
  55602. + MarkupTextLiteral - [22..28)::6 - [#local] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55603. + Text;[#local];
  55604. + Equals;[=];
  55605. + MarkupTextLiteral - [29..30)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55606. + SingleQuote;['];
  55607. + GenericBlock - [30..33)::3
  55608. + MarkupLiteralAttributeValue - [30..33)::3 - [Bar]
  55609. + MarkupTextLiteral - [30..33)::3 - [Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55610. + Text;[Bar];
  55611. + MarkupTextLiteral - [33..34)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55612. + SingleQuote;['];
  55613. + MarkupTextLiteral - [34..37)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  55614. + Whitespace;[ ];
  55615. + ForwardSlash;[/];
  55616. + CloseAngle;[>];
  55617. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/UnquotedAttributeWithCodeWithSpacesInBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/UnquotedAttributeWithCodeWithSpacesInBlock.stree.txt
  55618. index 67e293a5e07..d040f4101ee 100644
  55619. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/UnquotedAttributeWithCodeWithSpacesInBlock.stree.txt
  55620. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/UnquotedAttributeWithCodeWithSpacesInBlock.stree.txt
  55621. @@ -1,20 +1,26 @@
  55622. -Markup block - Gen<None> - 20 - (0:0,0)
  55623. - Tag block - Gen<None> - 20 - (0:0,0)
  55624. - Markup span - Gen<Markup> - [<input] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  55625. - SyntaxKind.OpenAngle;[<];
  55626. - SyntaxKind.Text;[input];
  55627. - Markup block - Gen<Attr:value, value=@(6:0,6),@(17:0,17)> - 11 - (6:0,6)
  55628. - Markup span - Gen<None> - [ value=] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:3
  55629. - SyntaxKind.Whitespace;[ ];
  55630. - SyntaxKind.Text;[value];
  55631. - SyntaxKind.Equals;[=];
  55632. - Markup block - Gen<DynAttr:@(13:0,13)> - 4 - (13:0,13)
  55633. - Expression block - Gen<Expr> - 4 - (13:0,13)
  55634. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:1
  55635. - SyntaxKind.Transition;[@];
  55636. - Code span - Gen<Expr> - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (14:0,14) - Tokens:1
  55637. - SyntaxKind.Identifier;[foo];
  55638. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (17:0,17) - Tokens:3
  55639. - SyntaxKind.Whitespace;[ ];
  55640. - SyntaxKind.ForwardSlash;[/];
  55641. - SyntaxKind.CloseAngle;[>];
  55642. +MarkupBlock - [0..20)::20 - [<input value=@foo />]
  55643. + MarkupTagBlock - [0..20)::20 - [<input value=@foo />]
  55644. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55645. + OpenAngle;[<];
  55646. + Text;[input];
  55647. + MarkupAttributeBlock - [6..17)::11 - [ value=@foo]
  55648. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55649. + Whitespace;[ ];
  55650. + MarkupTextLiteral - [7..12)::5 - [value] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55651. + Text;[value];
  55652. + Equals;[=];
  55653. + GenericBlock - [13..17)::4
  55654. + MarkupDynamicAttributeValue - [13..17)::4 - [@foo]
  55655. + GenericBlock - [13..17)::4
  55656. + CSharpCodeBlock - [13..17)::4
  55657. + CSharpImplicitExpression - [13..17)::4
  55658. + CSharpTransition - [13..14)::1 - Gen<None> - SpanEditHandler;Accepts:None
  55659. + Transition;[@];
  55660. + CSharpImplicitExpressionBody - [14..17)::3
  55661. + CSharpCodeBlock - [14..17)::3
  55662. + CSharpExpressionLiteral - [14..17)::3 - [foo] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  55663. + Identifier;[foo];
  55664. + MarkupTextLiteral - [17..20)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  55665. + Whitespace;[ ];
  55666. + ForwardSlash;[/];
  55667. + CloseAngle;[>];
  55668. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/UnquotedAttributeWithCodeWithSpacesInDocument.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/UnquotedAttributeWithCodeWithSpacesInDocument.stree.txt
  55669. index 9024b4e6f94..98799bc17de 100644
  55670. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/UnquotedAttributeWithCodeWithSpacesInDocument.stree.txt
  55671. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/UnquotedAttributeWithCodeWithSpacesInDocument.stree.txt
  55672. @@ -1,20 +1,27 @@
  55673. -Markup block - Gen<None> - 20 - (0:0,0)
  55674. - Tag block - Gen<None> - 20 - (0:0,0)
  55675. - Markup span - Gen<Markup> - [<input] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  55676. - SyntaxKind.OpenAngle;[<];
  55677. - SyntaxKind.Text;[input];
  55678. - Markup block - Gen<Attr:value, value=@(6:0,6),@(17:0,17)> - 11 - (6:0,6)
  55679. - Markup span - Gen<None> - [ value=] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:3
  55680. - SyntaxKind.Whitespace;[ ];
  55681. - SyntaxKind.Text;[value];
  55682. - SyntaxKind.Equals;[=];
  55683. - Markup block - Gen<DynAttr:@(13:0,13)> - 4 - (13:0,13)
  55684. - Expression block - Gen<Expr> - 4 - (13:0,13)
  55685. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:1
  55686. - SyntaxKind.Transition;[@];
  55687. - Code span - Gen<Expr> - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (14:0,14) - Tokens:1
  55688. - SyntaxKind.Identifier;[foo];
  55689. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:3
  55690. - SyntaxKind.Whitespace;[ ];
  55691. - SyntaxKind.ForwardSlash;[/];
  55692. - SyntaxKind.CloseAngle;[>];
  55693. +RazorDocument - [0..20)::20 - [<input value=@foo />]
  55694. + MarkupBlock - [0..20)::20
  55695. + MarkupTagBlock - [0..20)::20 - [<input value=@foo />]
  55696. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55697. + OpenAngle;[<];
  55698. + Text;[input];
  55699. + MarkupAttributeBlock - [6..17)::11 - [ value=@foo]
  55700. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55701. + Whitespace;[ ];
  55702. + MarkupTextLiteral - [7..12)::5 - [value] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55703. + Text;[value];
  55704. + Equals;[=];
  55705. + GenericBlock - [13..17)::4
  55706. + MarkupDynamicAttributeValue - [13..17)::4 - [@foo]
  55707. + GenericBlock - [13..17)::4
  55708. + CSharpCodeBlock - [13..17)::4
  55709. + CSharpImplicitExpression - [13..17)::4
  55710. + CSharpTransition - [13..14)::1 - Gen<None> - SpanEditHandler;Accepts:None
  55711. + Transition;[@];
  55712. + CSharpImplicitExpressionBody - [14..17)::3
  55713. + CSharpCodeBlock - [14..17)::3
  55714. + CSharpExpressionLiteral - [14..17)::3 - [foo] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  55715. + Identifier;[foo];
  55716. + MarkupTextLiteral - [17..20)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55717. + Whitespace;[ ];
  55718. + ForwardSlash;[/];
  55719. + CloseAngle;[>];
  55720. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/UnquotedLiteralAttribute.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/UnquotedLiteralAttribute.stree.txt
  55721. index 15358c8febb..7d8ed2ebb9f 100644
  55722. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/UnquotedLiteralAttribute.stree.txt
  55723. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/UnquotedLiteralAttribute.stree.txt
  55724. @@ -1,24 +1,29 @@
  55725. -Markup block - Gen<None> - 22 - (0:0,0)
  55726. - Tag block - Gen<None> - 22 - (0:0,0)
  55727. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  55728. - SyntaxKind.OpenAngle;[<];
  55729. - SyntaxKind.Text;[a];
  55730. - Markup block - Gen<Attr:href, href=@(2:0,2),@(11:0,11)> - 9 - (2:0,2)
  55731. - Markup span - Gen<None> - [ href=] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:3
  55732. - SyntaxKind.Whitespace;[ ];
  55733. - SyntaxKind.Text;[href];
  55734. - SyntaxKind.Equals;[=];
  55735. - Markup span - Gen<LitAttr:@(8:0,8)> - [Foo] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:1
  55736. - SyntaxKind.Text;[Foo];
  55737. - Markup block - Gen<None> - 4 - (11:0,11)
  55738. - Markup span - Gen<Markup> - [ Bar] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:2
  55739. - SyntaxKind.Whitespace;[ ];
  55740. - SyntaxKind.Text;[Bar];
  55741. - Markup block - Gen<None> - 4 - (15:0,15)
  55742. - Markup span - Gen<Markup> - [ Baz] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:2
  55743. - SyntaxKind.Whitespace;[ ];
  55744. - SyntaxKind.Text;[Baz];
  55745. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (19:0,19) - Tokens:3
  55746. - SyntaxKind.Whitespace;[ ];
  55747. - SyntaxKind.ForwardSlash;[/];
  55748. - SyntaxKind.CloseAngle;[>];
  55749. +MarkupBlock - [0..22)::22 - [<a href=Foo Bar Baz />]
  55750. + MarkupTagBlock - [0..22)::22 - [<a href=Foo Bar Baz />]
  55751. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55752. + OpenAngle;[<];
  55753. + Text;[a];
  55754. + MarkupAttributeBlock - [2..11)::9 - [ href=Foo]
  55755. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55756. + Whitespace;[ ];
  55757. + MarkupTextLiteral - [3..7)::4 - [href] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55758. + Text;[href];
  55759. + Equals;[=];
  55760. + GenericBlock - [8..11)::3
  55761. + MarkupLiteralAttributeValue - [8..11)::3 - [Foo]
  55762. + MarkupTextLiteral - [8..11)::3 - [Foo] - Gen<None> - SpanEditHandler;Accepts:Any
  55763. + Text;[Foo];
  55764. + MarkupMinimizedAttributeBlock - [11..15)::4 - [ Bar]
  55765. + MarkupTextLiteral - [11..12)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55766. + Whitespace;[ ];
  55767. + MarkupTextLiteral - [12..15)::3 - [Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55768. + Text;[Bar];
  55769. + MarkupMinimizedAttributeBlock - [15..19)::4 - [ Baz]
  55770. + MarkupTextLiteral - [15..16)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55771. + Whitespace;[ ];
  55772. + MarkupTextLiteral - [16..19)::3 - [Baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55773. + Text;[Baz];
  55774. + MarkupTextLiteral - [19..22)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  55775. + Whitespace;[ ];
  55776. + ForwardSlash;[/];
  55777. + CloseAngle;[>];
  55778. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/VirtualPathAttributesWorkWithConditionalAttributes.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/VirtualPathAttributesWorkWithConditionalAttributes.stree.txt
  55779. index a6b6e38b398..389babea534 100644
  55780. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/VirtualPathAttributesWorkWithConditionalAttributes.stree.txt
  55781. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/VirtualPathAttributesWorkWithConditionalAttributes.stree.txt
  55782. @@ -1,30 +1,39 @@
  55783. -Markup block - Gen<None> - 27 - (0:0,0)
  55784. - Tag block - Gen<None> - 27 - (0:0,0)
  55785. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  55786. - SyntaxKind.OpenAngle;[<];
  55787. - SyntaxKind.Text;[a];
  55788. - Markup block - Gen<Attr:href, href='@(2:0,2),'@(23:0,23)> - 22 - (2:0,2)
  55789. - Markup span - Gen<None> - [ href='] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:4
  55790. - SyntaxKind.Whitespace;[ ];
  55791. - SyntaxKind.Text;[href];
  55792. - SyntaxKind.Equals;[=];
  55793. - SyntaxKind.SingleQuote;['];
  55794. - Markup block - Gen<DynAttr:@(9:0,9)> - 4 - (9:0,9)
  55795. - Expression block - Gen<Expr> - 4 - (9:0,9)
  55796. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (9:0,9) - Tokens:1
  55797. - SyntaxKind.Transition;[@];
  55798. - Code span - Gen<Expr> - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (10:0,10) - Tokens:1
  55799. - SyntaxKind.Identifier;[foo];
  55800. - Markup span - Gen<LitAttr: @(13:0,13)> - [ ~/Foo/Bar] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:6
  55801. - SyntaxKind.Whitespace;[ ];
  55802. - SyntaxKind.Text;[~];
  55803. - SyntaxKind.ForwardSlash;[/];
  55804. - SyntaxKind.Text;[Foo];
  55805. - SyntaxKind.ForwardSlash;[/];
  55806. - SyntaxKind.Text;[Bar];
  55807. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:1
  55808. - SyntaxKind.SingleQuote;['];
  55809. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (24:0,24) - Tokens:3
  55810. - SyntaxKind.Whitespace;[ ];
  55811. - SyntaxKind.ForwardSlash;[/];
  55812. - SyntaxKind.CloseAngle;[>];
  55813. +MarkupBlock - [0..27)::27 - [<a href='@foo ~/Foo/Bar' />]
  55814. + MarkupTagBlock - [0..27)::27 - [<a href='@foo ~/Foo/Bar' />]
  55815. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55816. + OpenAngle;[<];
  55817. + Text;[a];
  55818. + MarkupAttributeBlock - [2..24)::22 - [ href='@foo ~/Foo/Bar']
  55819. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55820. + Whitespace;[ ];
  55821. + MarkupTextLiteral - [3..7)::4 - [href] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55822. + Text;[href];
  55823. + Equals;[=];
  55824. + MarkupTextLiteral - [8..9)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55825. + SingleQuote;['];
  55826. + GenericBlock - [9..23)::14
  55827. + MarkupDynamicAttributeValue - [9..13)::4 - [@foo]
  55828. + GenericBlock - [9..13)::4
  55829. + CSharpCodeBlock - [9..13)::4
  55830. + CSharpImplicitExpression - [9..13)::4
  55831. + CSharpTransition - [9..10)::1 - Gen<None> - SpanEditHandler;Accepts:None
  55832. + Transition;[@];
  55833. + CSharpImplicitExpressionBody - [10..13)::3
  55834. + CSharpCodeBlock - [10..13)::3
  55835. + CSharpExpressionLiteral - [10..13)::3 - [foo] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  55836. + Identifier;[foo];
  55837. + MarkupLiteralAttributeValue - [13..23)::10 - [ ~/Foo/Bar]
  55838. + MarkupTextLiteral - [13..14)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55839. + Whitespace;[ ];
  55840. + MarkupTextLiteral - [14..23)::9 - [~/Foo/Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55841. + Text;[~];
  55842. + ForwardSlash;[/];
  55843. + Text;[Foo];
  55844. + ForwardSlash;[/];
  55845. + Text;[Bar];
  55846. + MarkupTextLiteral - [23..24)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55847. + SingleQuote;['];
  55848. + MarkupTextLiteral - [24..27)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  55849. + Whitespace;[ ];
  55850. + ForwardSlash;[/];
  55851. + CloseAngle;[>];
  55852. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/WhitespaceAndNewLinePrecedingAttribute.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/WhitespaceAndNewLinePrecedingAttribute.stree.txt
  55853. index 6f18fa974af..142355d4d7c 100644
  55854. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/WhitespaceAndNewLinePrecedingAttribute.stree.txt
  55855. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlAttributeTest/WhitespaceAndNewLinePrecedingAttribute.stree.txt
  55856. @@ -1,20 +1,24 @@
  55857. -Markup block - Gen<None> - 19 - (0:0,0)
  55858. - Tag block - Gen<None> - 19 - (0:0,0)
  55859. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  55860. - SyntaxKind.OpenAngle;[<];
  55861. - SyntaxKind.Text;[a];
  55862. - Markup block - Gen<Attr:href, LFhref='@(2:0,2),'@(15:1,9)> - 14 - (2:0,2)
  55863. - Markup span - Gen<None> - [ LFhref='] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:5
  55864. - SyntaxKind.Whitespace;[ ];
  55865. - SyntaxKind.NewLine;[LF];
  55866. - SyntaxKind.Text;[href];
  55867. - SyntaxKind.Equals;[=];
  55868. - SyntaxKind.SingleQuote;['];
  55869. - Markup span - Gen<LitAttr:@(12:1,6)> - [Foo] - SpanEditHandler;Accepts:Any - (12:1,6) - Tokens:1
  55870. - SyntaxKind.Text;[Foo];
  55871. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (15:1,9) - Tokens:1
  55872. - SyntaxKind.SingleQuote;['];
  55873. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (16:1,10) - Tokens:3
  55874. - SyntaxKind.Whitespace;[ ];
  55875. - SyntaxKind.ForwardSlash;[/];
  55876. - SyntaxKind.CloseAngle;[>];
  55877. +MarkupBlock - [0..19)::19 - [<a LFhref='Foo' />]
  55878. + MarkupTagBlock - [0..19)::19 - [<a LFhref='Foo' />]
  55879. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55880. + OpenAngle;[<];
  55881. + Text;[a];
  55882. + MarkupAttributeBlock - [2..16)::14 - [ LFhref='Foo']
  55883. + MarkupTextLiteral - [2..6)::4 - [ LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55884. + Whitespace;[ ];
  55885. + NewLine;[LF];
  55886. + MarkupTextLiteral - [6..10)::4 - [href] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55887. + Text;[href];
  55888. + Equals;[=];
  55889. + MarkupTextLiteral - [11..12)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55890. + SingleQuote;['];
  55891. + GenericBlock - [12..15)::3
  55892. + MarkupLiteralAttributeValue - [12..15)::3 - [Foo]
  55893. + MarkupTextLiteral - [12..15)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55894. + Text;[Foo];
  55895. + MarkupTextLiteral - [15..16)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  55896. + SingleQuote;['];
  55897. + MarkupTextLiteral - [16..19)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  55898. + Whitespace;[ ];
  55899. + ForwardSlash;[/];
  55900. + CloseAngle;[>];
  55901. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AcceptsEmptyTextTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AcceptsEmptyTextTag.stree.txt
  55902. index a61f0260391..3822a0dbc8f 100644
  55903. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AcceptsEmptyTextTag.stree.txt
  55904. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AcceptsEmptyTextTag.stree.txt
  55905. @@ -1,7 +1,7 @@
  55906. -Markup block - Gen<None> - 7 - (0:0,0)
  55907. - Tag block - Gen<None> - 7 - (0:0,0)
  55908. - Transition span - Gen<None> - [<text/>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:4
  55909. - SyntaxKind.OpenAngle;[<];
  55910. - SyntaxKind.Text;[text];
  55911. - SyntaxKind.ForwardSlash;[/];
  55912. - SyntaxKind.CloseAngle;[>];
  55913. +MarkupBlock - [0..7)::7 - [<text/>]
  55914. + MarkupTagBlock - [0..7)::7 - [<text/>]
  55915. + MarkupTransition - [0..7)::7 - Gen<None> - SpanEditHandler;Accepts:None
  55916. + OpenAngle;[<];
  55917. + Text;[text];
  55918. + ForwardSlash;[/];
  55919. + CloseAngle;[>];
  55920. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AcceptsTextTagAsOuterTagButDoesNotRender.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AcceptsTextTagAsOuterTagButDoesNotRender.stree.txt
  55921. index 79772b3e177..974b3155411 100644
  55922. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AcceptsTextTagAsOuterTagButDoesNotRender.stree.txt
  55923. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AcceptsTextTagAsOuterTagButDoesNotRender.stree.txt
  55924. @@ -1,25 +1,25 @@
  55925. -Markup block - Gen<None> - 30 - (0:0,0)
  55926. - Tag block - Gen<None> - 6 - (0:0,0)
  55927. - Transition span - Gen<None> - [<text>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  55928. - SyntaxKind.OpenAngle;[<];
  55929. - SyntaxKind.Text;[text];
  55930. - SyntaxKind.CloseAngle;[>];
  55931. - Markup span - Gen<Markup> - [Foo Bar ] - SpanEditHandler;Accepts:None - (6:0,6) - Tokens:4
  55932. - SyntaxKind.Text;[Foo];
  55933. - SyntaxKind.Whitespace;[ ];
  55934. - SyntaxKind.Text;[Bar];
  55935. - SyntaxKind.Whitespace;[ ];
  55936. - Tag block - Gen<None> - 5 - (14:0,14)
  55937. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (14:0,14) - Tokens:3
  55938. - SyntaxKind.OpenAngle;[<];
  55939. - SyntaxKind.Text;[foo];
  55940. - SyntaxKind.CloseAngle;[>];
  55941. - Markup span - Gen<Markup> - [ Baz] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:2
  55942. - SyntaxKind.Whitespace;[ ];
  55943. - SyntaxKind.Text;[Baz];
  55944. - Tag block - Gen<None> - 7 - (23:0,23)
  55945. - Transition span - Gen<None> - [</text>] - SpanEditHandler;Accepts:None - (23:0,23) - Tokens:4
  55946. - SyntaxKind.OpenAngle;[<];
  55947. - SyntaxKind.ForwardSlash;[/];
  55948. - SyntaxKind.Text;[text];
  55949. - SyntaxKind.CloseAngle;[>];
  55950. +MarkupBlock - [0..30)::30 - [<text>Foo Bar <foo> Baz</text>]
  55951. + MarkupTagBlock - [0..6)::6 - [<text>]
  55952. + MarkupTransition - [0..6)::6 - Gen<None> - SpanEditHandler;Accepts:None
  55953. + OpenAngle;[<];
  55954. + Text;[text];
  55955. + CloseAngle;[>];
  55956. + MarkupTextLiteral - [6..14)::8 - [Foo Bar ] - Gen<Markup> - SpanEditHandler;Accepts:None
  55957. + Text;[Foo];
  55958. + Whitespace;[ ];
  55959. + Text;[Bar];
  55960. + Whitespace;[ ];
  55961. + MarkupTagBlock - [14..19)::5 - [<foo>]
  55962. + MarkupTextLiteral - [14..19)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  55963. + OpenAngle;[<];
  55964. + Text;[foo];
  55965. + CloseAngle;[>];
  55966. + MarkupTextLiteral - [19..23)::4 - [ Baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  55967. + Whitespace;[ ];
  55968. + Text;[Baz];
  55969. + MarkupTagBlock - [23..30)::7 - [</text>]
  55970. + MarkupTransition - [23..30)::7 - Gen<None> - SpanEditHandler;Accepts:None
  55971. + OpenAngle;[<];
  55972. + ForwardSlash;[/];
  55973. + Text;[text];
  55974. + CloseAngle;[>];
  55975. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AllowsCloseAngleBracketInAttributeValueIfDoubleQuoted.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AllowsCloseAngleBracketInAttributeValueIfDoubleQuoted.stree.txt
  55976. index 82f723bf8db..94283777039 100644
  55977. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AllowsCloseAngleBracketInAttributeValueIfDoubleQuoted.stree.txt
  55978. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AllowsCloseAngleBracketInAttributeValueIfDoubleQuoted.stree.txt
  55979. @@ -1,30 +1,34 @@
  55980. -Markup block - Gen<None> - 26 - (0:0,0)
  55981. - Tag block - Gen<None> - 5 - (0:0,0)
  55982. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  55983. - SyntaxKind.OpenAngle;[<];
  55984. - SyntaxKind.Text;[foo];
  55985. - SyntaxKind.CloseAngle;[>];
  55986. - Tag block - Gen<None> - 15 - (5:0,5)
  55987. - Markup span - Gen<Markup> - [<bar] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:2
  55988. - SyntaxKind.OpenAngle;[<];
  55989. - SyntaxKind.Text;[bar];
  55990. - Markup block - Gen<Attr:baz, baz="@(9:0,9),"@(16:0,16)> - 8 - (9:0,9)
  55991. - Markup span - Gen<None> - [ baz="] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:4
  55992. - SyntaxKind.Whitespace;[ ];
  55993. - SyntaxKind.Text;[baz];
  55994. - SyntaxKind.Equals;[=];
  55995. - SyntaxKind.DoubleQuote;["];
  55996. - Markup span - Gen<LitAttr:@(15:0,15)> - [>] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:1
  55997. - SyntaxKind.CloseAngle;[>];
  55998. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  55999. - SyntaxKind.DoubleQuote;["];
  56000. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (17:0,17) - Tokens:3
  56001. - SyntaxKind.Whitespace;[ ];
  56002. - SyntaxKind.ForwardSlash;[/];
  56003. - SyntaxKind.CloseAngle;[>];
  56004. - Tag block - Gen<None> - 6 - (20:0,20)
  56005. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:None - (20:0,20) - Tokens:4
  56006. - SyntaxKind.OpenAngle;[<];
  56007. - SyntaxKind.ForwardSlash;[/];
  56008. - SyntaxKind.Text;[foo];
  56009. - SyntaxKind.CloseAngle;[>];
  56010. +MarkupBlock - [0..26)::26 - [<foo><bar baz=">" /></foo>]
  56011. + MarkupTagBlock - [0..5)::5 - [<foo>]
  56012. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56013. + OpenAngle;[<];
  56014. + Text;[foo];
  56015. + CloseAngle;[>];
  56016. + MarkupTagBlock - [5..20)::15 - [<bar baz=">" />]
  56017. + MarkupTextLiteral - [5..9)::4 - [<bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56018. + OpenAngle;[<];
  56019. + Text;[bar];
  56020. + MarkupAttributeBlock - [9..17)::8 - [ baz=">"]
  56021. + MarkupTextLiteral - [9..10)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56022. + Whitespace;[ ];
  56023. + MarkupTextLiteral - [10..13)::3 - [baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56024. + Text;[baz];
  56025. + Equals;[=];
  56026. + MarkupTextLiteral - [14..15)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  56027. + DoubleQuote;["];
  56028. + GenericBlock - [15..16)::1
  56029. + MarkupLiteralAttributeValue - [15..16)::1 - [>]
  56030. + MarkupTextLiteral - [15..16)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56031. + CloseAngle;[>];
  56032. + MarkupTextLiteral - [16..17)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  56033. + DoubleQuote;["];
  56034. + MarkupTextLiteral - [17..20)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  56035. + Whitespace;[ ];
  56036. + ForwardSlash;[/];
  56037. + CloseAngle;[>];
  56038. + MarkupTagBlock - [20..26)::6 - [</foo>]
  56039. + MarkupTextLiteral - [20..26)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56040. + OpenAngle;[<];
  56041. + ForwardSlash;[/];
  56042. + Text;[foo];
  56043. + CloseAngle;[>];
  56044. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AllowsCloseAngleBracketInAttributeValueIfSingleQuoted.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AllowsCloseAngleBracketInAttributeValueIfSingleQuoted.stree.txt
  56045. index 3b2f18c552d..3195045ef36 100644
  56046. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AllowsCloseAngleBracketInAttributeValueIfSingleQuoted.stree.txt
  56047. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AllowsCloseAngleBracketInAttributeValueIfSingleQuoted.stree.txt
  56048. @@ -1,30 +1,34 @@
  56049. -Markup block - Gen<None> - 26 - (0:0,0)
  56050. - Tag block - Gen<None> - 5 - (0:0,0)
  56051. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  56052. - SyntaxKind.OpenAngle;[<];
  56053. - SyntaxKind.Text;[foo];
  56054. - SyntaxKind.CloseAngle;[>];
  56055. - Tag block - Gen<None> - 15 - (5:0,5)
  56056. - Markup span - Gen<Markup> - [<bar] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:2
  56057. - SyntaxKind.OpenAngle;[<];
  56058. - SyntaxKind.Text;[bar];
  56059. - Markup block - Gen<Attr:baz, baz='@(9:0,9),'@(16:0,16)> - 8 - (9:0,9)
  56060. - Markup span - Gen<None> - [ baz='] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:4
  56061. - SyntaxKind.Whitespace;[ ];
  56062. - SyntaxKind.Text;[baz];
  56063. - SyntaxKind.Equals;[=];
  56064. - SyntaxKind.SingleQuote;['];
  56065. - Markup span - Gen<LitAttr:@(15:0,15)> - [>] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:1
  56066. - SyntaxKind.CloseAngle;[>];
  56067. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  56068. - SyntaxKind.SingleQuote;['];
  56069. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (17:0,17) - Tokens:3
  56070. - SyntaxKind.Whitespace;[ ];
  56071. - SyntaxKind.ForwardSlash;[/];
  56072. - SyntaxKind.CloseAngle;[>];
  56073. - Tag block - Gen<None> - 6 - (20:0,20)
  56074. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:None - (20:0,20) - Tokens:4
  56075. - SyntaxKind.OpenAngle;[<];
  56076. - SyntaxKind.ForwardSlash;[/];
  56077. - SyntaxKind.Text;[foo];
  56078. - SyntaxKind.CloseAngle;[>];
  56079. +MarkupBlock - [0..26)::26 - [<foo><bar baz='>' /></foo>]
  56080. + MarkupTagBlock - [0..5)::5 - [<foo>]
  56081. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56082. + OpenAngle;[<];
  56083. + Text;[foo];
  56084. + CloseAngle;[>];
  56085. + MarkupTagBlock - [5..20)::15 - [<bar baz='>' />]
  56086. + MarkupTextLiteral - [5..9)::4 - [<bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56087. + OpenAngle;[<];
  56088. + Text;[bar];
  56089. + MarkupAttributeBlock - [9..17)::8 - [ baz='>']
  56090. + MarkupTextLiteral - [9..10)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56091. + Whitespace;[ ];
  56092. + MarkupTextLiteral - [10..13)::3 - [baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56093. + Text;[baz];
  56094. + Equals;[=];
  56095. + MarkupTextLiteral - [14..15)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  56096. + SingleQuote;['];
  56097. + GenericBlock - [15..16)::1
  56098. + MarkupLiteralAttributeValue - [15..16)::1 - [>]
  56099. + MarkupTextLiteral - [15..16)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56100. + CloseAngle;[>];
  56101. + MarkupTextLiteral - [16..17)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  56102. + SingleQuote;['];
  56103. + MarkupTextLiteral - [17..20)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  56104. + Whitespace;[ ];
  56105. + ForwardSlash;[/];
  56106. + CloseAngle;[>];
  56107. + MarkupTagBlock - [20..26)::6 - [</foo>]
  56108. + MarkupTextLiteral - [20..26)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56109. + OpenAngle;[<];
  56110. + ForwardSlash;[/];
  56111. + Text;[foo];
  56112. + CloseAngle;[>];
  56113. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AllowsSlashInAttributeValueIfDoubleQuoted.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AllowsSlashInAttributeValueIfDoubleQuoted.stree.txt
  56114. index dbc204d5ec4..f6fae621cde 100644
  56115. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AllowsSlashInAttributeValueIfDoubleQuoted.stree.txt
  56116. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AllowsSlashInAttributeValueIfDoubleQuoted.stree.txt
  56117. @@ -1,34 +1,38 @@
  56118. -Markup block - Gen<None> - 30 - (0:0,0)
  56119. - Tag block - Gen<None> - 5 - (0:0,0)
  56120. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  56121. - SyntaxKind.OpenAngle;[<];
  56122. - SyntaxKind.Text;[foo];
  56123. - SyntaxKind.CloseAngle;[>];
  56124. - Tag block - Gen<None> - 13 - (5:0,5)
  56125. - Markup span - Gen<Markup> - [<bar] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:2
  56126. - SyntaxKind.OpenAngle;[<];
  56127. - SyntaxKind.Text;[bar];
  56128. - Markup block - Gen<Attr:baz, baz="@(9:0,9),"@(16:0,16)> - 8 - (9:0,9)
  56129. - Markup span - Gen<None> - [ baz="] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:4
  56130. - SyntaxKind.Whitespace;[ ];
  56131. - SyntaxKind.Text;[baz];
  56132. - SyntaxKind.Equals;[=];
  56133. - SyntaxKind.DoubleQuote;["];
  56134. - Markup span - Gen<LitAttr:@(15:0,15)> - [/] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:1
  56135. - SyntaxKind.ForwardSlash;[/];
  56136. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  56137. - SyntaxKind.DoubleQuote;["];
  56138. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:None - (17:0,17) - Tokens:1
  56139. - SyntaxKind.CloseAngle;[>];
  56140. - Tag block - Gen<None> - 6 - (18:0,18)
  56141. - Markup span - Gen<Markup> - [</bar>] - SpanEditHandler;Accepts:None - (18:0,18) - Tokens:4
  56142. - SyntaxKind.OpenAngle;[<];
  56143. - SyntaxKind.ForwardSlash;[/];
  56144. - SyntaxKind.Text;[bar];
  56145. - SyntaxKind.CloseAngle;[>];
  56146. - Tag block - Gen<None> - 6 - (24:0,24)
  56147. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:None - (24:0,24) - Tokens:4
  56148. - SyntaxKind.OpenAngle;[<];
  56149. - SyntaxKind.ForwardSlash;[/];
  56150. - SyntaxKind.Text;[foo];
  56151. - SyntaxKind.CloseAngle;[>];
  56152. +MarkupBlock - [0..30)::30 - [<foo><bar baz="/"></bar></foo>]
  56153. + MarkupTagBlock - [0..5)::5 - [<foo>]
  56154. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56155. + OpenAngle;[<];
  56156. + Text;[foo];
  56157. + CloseAngle;[>];
  56158. + MarkupTagBlock - [5..18)::13 - [<bar baz="/">]
  56159. + MarkupTextLiteral - [5..9)::4 - [<bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56160. + OpenAngle;[<];
  56161. + Text;[bar];
  56162. + MarkupAttributeBlock - [9..17)::8 - [ baz="/"]
  56163. + MarkupTextLiteral - [9..10)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56164. + Whitespace;[ ];
  56165. + MarkupTextLiteral - [10..13)::3 - [baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56166. + Text;[baz];
  56167. + Equals;[=];
  56168. + MarkupTextLiteral - [14..15)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  56169. + DoubleQuote;["];
  56170. + GenericBlock - [15..16)::1
  56171. + MarkupLiteralAttributeValue - [15..16)::1 - [/]
  56172. + MarkupTextLiteral - [15..16)::1 - [/] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56173. + ForwardSlash;[/];
  56174. + MarkupTextLiteral - [16..17)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  56175. + DoubleQuote;["];
  56176. + MarkupTextLiteral - [17..18)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56177. + CloseAngle;[>];
  56178. + MarkupTagBlock - [18..24)::6 - [</bar>]
  56179. + MarkupTextLiteral - [18..24)::6 - [</bar>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56180. + OpenAngle;[<];
  56181. + ForwardSlash;[/];
  56182. + Text;[bar];
  56183. + CloseAngle;[>];
  56184. + MarkupTagBlock - [24..30)::6 - [</foo>]
  56185. + MarkupTextLiteral - [24..30)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56186. + OpenAngle;[<];
  56187. + ForwardSlash;[/];
  56188. + Text;[foo];
  56189. + CloseAngle;[>];
  56190. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AllowsSlashInAttributeValueIfSingleQuoted.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AllowsSlashInAttributeValueIfSingleQuoted.stree.txt
  56191. index 0557f30ffbe..9e465a56083 100644
  56192. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AllowsSlashInAttributeValueIfSingleQuoted.stree.txt
  56193. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AllowsSlashInAttributeValueIfSingleQuoted.stree.txt
  56194. @@ -1,34 +1,38 @@
  56195. -Markup block - Gen<None> - 30 - (0:0,0)
  56196. - Tag block - Gen<None> - 5 - (0:0,0)
  56197. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  56198. - SyntaxKind.OpenAngle;[<];
  56199. - SyntaxKind.Text;[foo];
  56200. - SyntaxKind.CloseAngle;[>];
  56201. - Tag block - Gen<None> - 13 - (5:0,5)
  56202. - Markup span - Gen<Markup> - [<bar] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:2
  56203. - SyntaxKind.OpenAngle;[<];
  56204. - SyntaxKind.Text;[bar];
  56205. - Markup block - Gen<Attr:baz, baz='@(9:0,9),'@(16:0,16)> - 8 - (9:0,9)
  56206. - Markup span - Gen<None> - [ baz='] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:4
  56207. - SyntaxKind.Whitespace;[ ];
  56208. - SyntaxKind.Text;[baz];
  56209. - SyntaxKind.Equals;[=];
  56210. - SyntaxKind.SingleQuote;['];
  56211. - Markup span - Gen<LitAttr:@(15:0,15)> - [/] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:1
  56212. - SyntaxKind.ForwardSlash;[/];
  56213. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  56214. - SyntaxKind.SingleQuote;['];
  56215. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:None - (17:0,17) - Tokens:1
  56216. - SyntaxKind.CloseAngle;[>];
  56217. - Tag block - Gen<None> - 6 - (18:0,18)
  56218. - Markup span - Gen<Markup> - [</bar>] - SpanEditHandler;Accepts:None - (18:0,18) - Tokens:4
  56219. - SyntaxKind.OpenAngle;[<];
  56220. - SyntaxKind.ForwardSlash;[/];
  56221. - SyntaxKind.Text;[bar];
  56222. - SyntaxKind.CloseAngle;[>];
  56223. - Tag block - Gen<None> - 6 - (24:0,24)
  56224. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:None - (24:0,24) - Tokens:4
  56225. - SyntaxKind.OpenAngle;[<];
  56226. - SyntaxKind.ForwardSlash;[/];
  56227. - SyntaxKind.Text;[foo];
  56228. - SyntaxKind.CloseAngle;[>];
  56229. +MarkupBlock - [0..30)::30 - [<foo><bar baz='/'></bar></foo>]
  56230. + MarkupTagBlock - [0..5)::5 - [<foo>]
  56231. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56232. + OpenAngle;[<];
  56233. + Text;[foo];
  56234. + CloseAngle;[>];
  56235. + MarkupTagBlock - [5..18)::13 - [<bar baz='/'>]
  56236. + MarkupTextLiteral - [5..9)::4 - [<bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56237. + OpenAngle;[<];
  56238. + Text;[bar];
  56239. + MarkupAttributeBlock - [9..17)::8 - [ baz='/']
  56240. + MarkupTextLiteral - [9..10)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56241. + Whitespace;[ ];
  56242. + MarkupTextLiteral - [10..13)::3 - [baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56243. + Text;[baz];
  56244. + Equals;[=];
  56245. + MarkupTextLiteral - [14..15)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  56246. + SingleQuote;['];
  56247. + GenericBlock - [15..16)::1
  56248. + MarkupLiteralAttributeValue - [15..16)::1 - [/]
  56249. + MarkupTextLiteral - [15..16)::1 - [/] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56250. + ForwardSlash;[/];
  56251. + MarkupTextLiteral - [16..17)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  56252. + SingleQuote;['];
  56253. + MarkupTextLiteral - [17..18)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56254. + CloseAngle;[>];
  56255. + MarkupTagBlock - [18..24)::6 - [</bar>]
  56256. + MarkupTextLiteral - [18..24)::6 - [</bar>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56257. + OpenAngle;[<];
  56258. + ForwardSlash;[/];
  56259. + Text;[bar];
  56260. + CloseAngle;[>];
  56261. + MarkupTagBlock - [24..30)::6 - [</foo>]
  56262. + MarkupTextLiteral - [24..30)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56263. + OpenAngle;[<];
  56264. + ForwardSlash;[/];
  56265. + Text;[foo];
  56266. + CloseAngle;[>];
  56267. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AllowsStartAndEndTagsToDifferInCase.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AllowsStartAndEndTagsToDifferInCase.stree.txt
  56268. index c1c9c652408..9e5a17d162f 100644
  56269. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AllowsStartAndEndTagsToDifferInCase.stree.txt
  56270. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AllowsStartAndEndTagsToDifferInCase.stree.txt
  56271. @@ -1,25 +1,25 @@
  56272. -Markup block - Gen<None> - 19 - (0:0,0)
  56273. - Tag block - Gen<None> - 4 - (0:0,0)
  56274. - Markup span - Gen<Markup> - [<li>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  56275. - SyntaxKind.OpenAngle;[<];
  56276. - SyntaxKind.Text;[li];
  56277. - SyntaxKind.CloseAngle;[>];
  56278. - Tag block - Gen<None> - 3 - (4:0,4)
  56279. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (4:0,4) - Tokens:3
  56280. - SyntaxKind.OpenAngle;[<];
  56281. - SyntaxKind.Text;[p];
  56282. - SyntaxKind.CloseAngle;[>];
  56283. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:Any - (7:0,7) - Tokens:1
  56284. - SyntaxKind.Text;[Foo];
  56285. - Tag block - Gen<None> - 4 - (10:0,10)
  56286. - Markup span - Gen<Markup> - [</P>] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:4
  56287. - SyntaxKind.OpenAngle;[<];
  56288. - SyntaxKind.ForwardSlash;[/];
  56289. - SyntaxKind.Text;[P];
  56290. - SyntaxKind.CloseAngle;[>];
  56291. - Tag block - Gen<None> - 5 - (14:0,14)
  56292. - Markup span - Gen<Markup> - [</lI>] - SpanEditHandler;Accepts:None - (14:0,14) - Tokens:4
  56293. - SyntaxKind.OpenAngle;[<];
  56294. - SyntaxKind.ForwardSlash;[/];
  56295. - SyntaxKind.Text;[lI];
  56296. - SyntaxKind.CloseAngle;[>];
  56297. +MarkupBlock - [0..19)::19 - [<li><p>Foo</P></lI>]
  56298. + MarkupTagBlock - [0..4)::4 - [<li>]
  56299. + MarkupTextLiteral - [0..4)::4 - [<li>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56300. + OpenAngle;[<];
  56301. + Text;[li];
  56302. + CloseAngle;[>];
  56303. + MarkupTagBlock - [4..7)::3 - [<p>]
  56304. + MarkupTextLiteral - [4..7)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56305. + OpenAngle;[<];
  56306. + Text;[p];
  56307. + CloseAngle;[>];
  56308. + MarkupTextLiteral - [7..10)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56309. + Text;[Foo];
  56310. + MarkupTagBlock - [10..14)::4 - [</P>]
  56311. + MarkupTextLiteral - [10..14)::4 - [</P>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56312. + OpenAngle;[<];
  56313. + ForwardSlash;[/];
  56314. + Text;[P];
  56315. + CloseAngle;[>];
  56316. + MarkupTagBlock - [14..19)::5 - [</lI>]
  56317. + MarkupTextLiteral - [14..19)::5 - [</lI>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56318. + OpenAngle;[<];
  56319. + ForwardSlash;[/];
  56320. + Text;[lI];
  56321. + CloseAngle;[>];
  56322. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AllowsUnclosedTagsAsLongAsItCanRecoverToAnExpectedEndTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AllowsUnclosedTagsAsLongAsItCanRecoverToAnExpectedEndTag.stree.txt
  56323. index 3b461ecf51e..a766c435222 100644
  56324. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AllowsUnclosedTagsAsLongAsItCanRecoverToAnExpectedEndTag.stree.txt
  56325. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/AllowsUnclosedTagsAsLongAsItCanRecoverToAnExpectedEndTag.stree.txt
  56326. @@ -1,22 +1,22 @@
  56327. -Markup block - Gen<None> - 21 - (0:0,0)
  56328. - Tag block - Gen<None> - 5 - (0:0,0)
  56329. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  56330. - SyntaxKind.OpenAngle;[<];
  56331. - SyntaxKind.Text;[foo];
  56332. - SyntaxKind.CloseAngle;[>];
  56333. - Tag block - Gen<None> - 5 - (5:0,5)
  56334. - Markup span - Gen<Markup> - [<bar>] - SpanEditHandler;Accepts:None - (5:0,5) - Tokens:3
  56335. - SyntaxKind.OpenAngle;[<];
  56336. - SyntaxKind.Text;[bar];
  56337. - SyntaxKind.CloseAngle;[>];
  56338. - Tag block - Gen<None> - 5 - (10:0,10)
  56339. - Markup span - Gen<Markup> - [<baz>] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:3
  56340. - SyntaxKind.OpenAngle;[<];
  56341. - SyntaxKind.Text;[baz];
  56342. - SyntaxKind.CloseAngle;[>];
  56343. - Tag block - Gen<None> - 6 - (15:0,15)
  56344. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:4
  56345. - SyntaxKind.OpenAngle;[<];
  56346. - SyntaxKind.ForwardSlash;[/];
  56347. - SyntaxKind.Text;[foo];
  56348. - SyntaxKind.CloseAngle;[>];
  56349. +MarkupBlock - [0..21)::21 - [<foo><bar><baz></foo>]
  56350. + MarkupTagBlock - [0..5)::5 - [<foo>]
  56351. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56352. + OpenAngle;[<];
  56353. + Text;[foo];
  56354. + CloseAngle;[>];
  56355. + MarkupTagBlock - [5..10)::5 - [<bar>]
  56356. + MarkupTextLiteral - [5..10)::5 - [<bar>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56357. + OpenAngle;[<];
  56358. + Text;[bar];
  56359. + CloseAngle;[>];
  56360. + MarkupTagBlock - [10..15)::5 - [<baz>]
  56361. + MarkupTextLiteral - [10..15)::5 - [<baz>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56362. + OpenAngle;[<];
  56363. + Text;[baz];
  56364. + CloseAngle;[>];
  56365. + MarkupTagBlock - [15..21)::6 - [</foo>]
  56366. + MarkupTextLiteral - [15..21)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56367. + OpenAngle;[<];
  56368. + ForwardSlash;[/];
  56369. + Text;[foo];
  56370. + CloseAngle;[>];
  56371. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/CanHandleSelfClosingTagsWithinBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/CanHandleSelfClosingTagsWithinBlock.stree.txt
  56372. index 062324bedb0..6b5ee297742 100644
  56373. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/CanHandleSelfClosingTagsWithinBlock.stree.txt
  56374. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/CanHandleSelfClosingTagsWithinBlock.stree.txt
  56375. @@ -1,19 +1,19 @@
  56376. -Markup block - Gen<None> - 18 - (0:0,0)
  56377. - Tag block - Gen<None> - 5 - (0:0,0)
  56378. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  56379. - SyntaxKind.OpenAngle;[<];
  56380. - SyntaxKind.Text;[foo];
  56381. - SyntaxKind.CloseAngle;[>];
  56382. - Tag block - Gen<None> - 7 - (5:0,5)
  56383. - Markup span - Gen<Markup> - [<bar />] - SpanEditHandler;Accepts:None - (5:0,5) - Tokens:5
  56384. - SyntaxKind.OpenAngle;[<];
  56385. - SyntaxKind.Text;[bar];
  56386. - SyntaxKind.Whitespace;[ ];
  56387. - SyntaxKind.ForwardSlash;[/];
  56388. - SyntaxKind.CloseAngle;[>];
  56389. - Tag block - Gen<None> - 6 - (12:0,12)
  56390. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:4
  56391. - SyntaxKind.OpenAngle;[<];
  56392. - SyntaxKind.ForwardSlash;[/];
  56393. - SyntaxKind.Text;[foo];
  56394. - SyntaxKind.CloseAngle;[>];
  56395. +MarkupBlock - [0..18)::18 - [<foo><bar /></foo>]
  56396. + MarkupTagBlock - [0..5)::5 - [<foo>]
  56397. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56398. + OpenAngle;[<];
  56399. + Text;[foo];
  56400. + CloseAngle;[>];
  56401. + MarkupTagBlock - [5..12)::7 - [<bar />]
  56402. + MarkupTextLiteral - [5..12)::7 - [<bar />] - Gen<Markup> - SpanEditHandler;Accepts:None
  56403. + OpenAngle;[<];
  56404. + Text;[bar];
  56405. + Whitespace;[ ];
  56406. + ForwardSlash;[/];
  56407. + CloseAngle;[>];
  56408. + MarkupTagBlock - [12..18)::6 - [</foo>]
  56409. + MarkupTextLiteral - [12..18)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56410. + OpenAngle;[<];
  56411. + ForwardSlash;[/];
  56412. + Text;[foo];
  56413. + CloseAngle;[>];
  56414. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/CorrectlyHandlesSingleLineOfMarkupWithEmbeddedStatement.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/CorrectlyHandlesSingleLineOfMarkupWithEmbeddedStatement.stree.txt
  56415. index 02b2d48ed9e..8d9c25cecbf 100644
  56416. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/CorrectlyHandlesSingleLineOfMarkupWithEmbeddedStatement.stree.txt
  56417. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/CorrectlyHandlesSingleLineOfMarkupWithEmbeddedStatement.stree.txt
  56418. @@ -1,29 +1,29 @@
  56419. -Markup block - Gen<None> - 31 - (0:0,0)
  56420. - Tag block - Gen<None> - 5 - (0:0,0)
  56421. - Markup span - Gen<Markup> - [<div>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  56422. - SyntaxKind.OpenAngle;[<];
  56423. - SyntaxKind.Text;[div];
  56424. - SyntaxKind.CloseAngle;[>];
  56425. - Markup span - Gen<Markup> - [Foo ] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:2
  56426. - SyntaxKind.Text;[Foo];
  56427. - SyntaxKind.Whitespace;[ ];
  56428. - Statement block - Gen<None> - 12 - (9:0,9)
  56429. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (9:0,9) - Tokens:1
  56430. - SyntaxKind.Transition;[@];
  56431. - Code span - Gen<Stmt> - [if(true) {}] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:7
  56432. - SyntaxKind.Keyword;[if];
  56433. - SyntaxKind.LeftParenthesis;[(];
  56434. - SyntaxKind.Keyword;[true];
  56435. - SyntaxKind.RightParenthesis;[)];
  56436. - SyntaxKind.Whitespace;[ ];
  56437. - SyntaxKind.LeftBrace;[{];
  56438. - SyntaxKind.RightBrace;[}];
  56439. - Markup span - Gen<Markup> - [ Bar] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:2
  56440. - SyntaxKind.Whitespace;[ ];
  56441. - SyntaxKind.Text;[Bar];
  56442. - Tag block - Gen<None> - 6 - (25:0,25)
  56443. - Markup span - Gen<Markup> - [</div>] - SpanEditHandler;Accepts:None - (25:0,25) - Tokens:4
  56444. - SyntaxKind.OpenAngle;[<];
  56445. - SyntaxKind.ForwardSlash;[/];
  56446. - SyntaxKind.Text;[div];
  56447. - SyntaxKind.CloseAngle;[>];
  56448. +MarkupBlock - [0..31)::31 - [<div>Foo @if(true) {} Bar</div>]
  56449. + MarkupTagBlock - [0..5)::5 - [<div>]
  56450. + MarkupTextLiteral - [0..5)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56451. + OpenAngle;[<];
  56452. + Text;[div];
  56453. + CloseAngle;[>];
  56454. + MarkupTextLiteral - [5..9)::4 - [Foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56455. + Text;[Foo];
  56456. + Whitespace;[ ];
  56457. + CSharpCodeBlock - [9..21)::12
  56458. + CSharpTransition - [9..10)::1 - Gen<None> - SpanEditHandler;Accepts:None
  56459. + Transition;[@];
  56460. + CSharpStatementLiteral - [10..21)::11 - [if(true) {}] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  56461. + Keyword;[if];
  56462. + LeftParenthesis;[(];
  56463. + Keyword;[true];
  56464. + RightParenthesis;[)];
  56465. + Whitespace;[ ];
  56466. + LeftBrace;[{];
  56467. + RightBrace;[}];
  56468. + MarkupTextLiteral - [21..25)::4 - [ Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56469. + Whitespace;[ ];
  56470. + Text;[Bar];
  56471. + MarkupTagBlock - [25..31)::6 - [</div>]
  56472. + MarkupTextLiteral - [25..31)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56473. + OpenAngle;[<];
  56474. + ForwardSlash;[/];
  56475. + Text;[div];
  56476. + CloseAngle;[>];
  56477. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/DoesNotConsiderPsuedoTagWithinMarkupBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/DoesNotConsiderPsuedoTagWithinMarkupBlock.stree.txt
  56478. index 977c1412092..6b286521085 100644
  56479. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/DoesNotConsiderPsuedoTagWithinMarkupBlock.stree.txt
  56480. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/DoesNotConsiderPsuedoTagWithinMarkupBlock.stree.txt
  56481. @@ -1,28 +1,28 @@
  56482. -Markup block - Gen<None> - 28 - (0:0,0)
  56483. - Tag block - Gen<None> - 5 - (0:0,0)
  56484. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  56485. - SyntaxKind.OpenAngle;[<];
  56486. - SyntaxKind.Text;[foo];
  56487. - SyntaxKind.CloseAngle;[>];
  56488. - Tag block - Gen<None> - 6 - (5:0,5)
  56489. - Markup span - Gen<Markup> - [<text>] - SpanEditHandler;Accepts:None - (5:0,5) - Tokens:3
  56490. - SyntaxKind.OpenAngle;[<];
  56491. - SyntaxKind.Text;[text];
  56492. - SyntaxKind.CloseAngle;[>];
  56493. - Tag block - Gen<None> - 5 - (11:0,11)
  56494. - Markup span - Gen<Markup> - [<bar>] - SpanEditHandler;Accepts:None - (11:0,11) - Tokens:3
  56495. - SyntaxKind.OpenAngle;[<];
  56496. - SyntaxKind.Text;[bar];
  56497. - SyntaxKind.CloseAngle;[>];
  56498. - Tag block - Gen<None> - 6 - (16:0,16)
  56499. - Markup span - Gen<Markup> - [</bar>] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:4
  56500. - SyntaxKind.OpenAngle;[<];
  56501. - SyntaxKind.ForwardSlash;[/];
  56502. - SyntaxKind.Text;[bar];
  56503. - SyntaxKind.CloseAngle;[>];
  56504. - Tag block - Gen<None> - 6 - (22:0,22)
  56505. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:None - (22:0,22) - Tokens:4
  56506. - SyntaxKind.OpenAngle;[<];
  56507. - SyntaxKind.ForwardSlash;[/];
  56508. - SyntaxKind.Text;[foo];
  56509. - SyntaxKind.CloseAngle;[>];
  56510. +MarkupBlock - [0..28)::28 - [<foo><text><bar></bar></foo>]
  56511. + MarkupTagBlock - [0..5)::5 - [<foo>]
  56512. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56513. + OpenAngle;[<];
  56514. + Text;[foo];
  56515. + CloseAngle;[>];
  56516. + MarkupTagBlock - [5..11)::6 - [<text>]
  56517. + MarkupTextLiteral - [5..11)::6 - [<text>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56518. + OpenAngle;[<];
  56519. + Text;[text];
  56520. + CloseAngle;[>];
  56521. + MarkupTagBlock - [11..16)::5 - [<bar>]
  56522. + MarkupTextLiteral - [11..16)::5 - [<bar>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56523. + OpenAngle;[<];
  56524. + Text;[bar];
  56525. + CloseAngle;[>];
  56526. + MarkupTagBlock - [16..22)::6 - [</bar>]
  56527. + MarkupTextLiteral - [16..22)::6 - [</bar>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56528. + OpenAngle;[<];
  56529. + ForwardSlash;[/];
  56530. + Text;[bar];
  56531. + CloseAngle;[>];
  56532. + MarkupTagBlock - [22..28)::6 - [</foo>]
  56533. + MarkupTextLiteral - [22..28)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56534. + OpenAngle;[<];
  56535. + ForwardSlash;[/];
  56536. + Text;[foo];
  56537. + CloseAngle;[>];
  56538. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/DoesNotTerminateXMLProcInstrAtCloseAngleUnlessPreceededByQuestionMark.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/DoesNotTerminateXMLProcInstrAtCloseAngleUnlessPreceededByQuestionMark.stree.txt
  56539. index c2e64e199f6..b8cb245113e 100644
  56540. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/DoesNotTerminateXMLProcInstrAtCloseAngleUnlessPreceededByQuestionMark.stree.txt
  56541. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/DoesNotTerminateXMLProcInstrAtCloseAngleUnlessPreceededByQuestionMark.stree.txt
  56542. @@ -1,25 +1,25 @@
  56543. -Markup block - Gen<None> - 31 - (0:0,0)
  56544. - Tag block - Gen<None> - 5 - (0:0,0)
  56545. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  56546. - SyntaxKind.OpenAngle;[<];
  56547. - SyntaxKind.Text;[foo];
  56548. - SyntaxKind.CloseAngle;[>];
  56549. - Markup span - Gen<Markup> - [<?xml foo bar> baz?>] - SpanEditHandler;Accepts:None - (5:0,5) - Tokens:12
  56550. - SyntaxKind.OpenAngle;[<];
  56551. - SyntaxKind.QuestionMark;[?];
  56552. - SyntaxKind.Text;[xml];
  56553. - SyntaxKind.Whitespace;[ ];
  56554. - SyntaxKind.Text;[foo];
  56555. - SyntaxKind.Whitespace;[ ];
  56556. - SyntaxKind.Text;[bar];
  56557. - SyntaxKind.CloseAngle;[>];
  56558. - SyntaxKind.Whitespace;[ ];
  56559. - SyntaxKind.Text;[baz];
  56560. - SyntaxKind.QuestionMark;[?];
  56561. - SyntaxKind.CloseAngle;[>];
  56562. - Tag block - Gen<None> - 6 - (25:0,25)
  56563. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:None - (25:0,25) - Tokens:4
  56564. - SyntaxKind.OpenAngle;[<];
  56565. - SyntaxKind.ForwardSlash;[/];
  56566. - SyntaxKind.Text;[foo];
  56567. - SyntaxKind.CloseAngle;[>];
  56568. +MarkupBlock - [0..31)::31 - [<foo><?xml foo bar> baz?></foo>]
  56569. + MarkupTagBlock - [0..5)::5 - [<foo>]
  56570. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56571. + OpenAngle;[<];
  56572. + Text;[foo];
  56573. + CloseAngle;[>];
  56574. + MarkupTextLiteral - [5..25)::20 - [<?xml foo bar> baz?>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56575. + OpenAngle;[<];
  56576. + QuestionMark;[?];
  56577. + Text;[xml];
  56578. + Whitespace;[ ];
  56579. + Text;[foo];
  56580. + Whitespace;[ ];
  56581. + Text;[bar];
  56582. + CloseAngle;[>];
  56583. + Whitespace;[ ];
  56584. + Text;[baz];
  56585. + QuestionMark;[?];
  56586. + CloseAngle;[>];
  56587. + MarkupTagBlock - [25..31)::6 - [</foo>]
  56588. + MarkupTextLiteral - [25..31)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56589. + OpenAngle;[<];
  56590. + ForwardSlash;[/];
  56591. + Text;[foo];
  56592. + CloseAngle;[>];
  56593. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/HandlesOpenAngleAtEof.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/HandlesOpenAngleAtEof.stree.txt
  56594. index e15b0a7e5ad..cc4bd180b30 100644
  56595. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/HandlesOpenAngleAtEof.stree.txt
  56596. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/HandlesOpenAngleAtEof.stree.txt
  56597. @@ -1,14 +1,20 @@
  56598. -Markup block - Gen<None> - 5 - (0:0,0)
  56599. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  56600. - SyntaxKind.Unknown;[];
  56601. - Statement block - Gen<None> - 5 - (0:0,0)
  56602. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  56603. - SyntaxKind.Transition;[@];
  56604. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  56605. - SyntaxKind.LeftBrace;[{];
  56606. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[}];AtEOL - (2:0,2) - Tokens:1
  56607. - SyntaxKind.NewLine;[LF];
  56608. - Markup block - Gen<None> - 1 - (4:1,0)
  56609. - Tag block - Gen<None> - 1 - (4:1,0)
  56610. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (4:1,0) - Tokens:1
  56611. - SyntaxKind.OpenAngle;[<];
  56612. +RazorDocument - [0..5)::5 - [@{LF<]
  56613. + MarkupBlock - [0..5)::5
  56614. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56615. + Marker;[];
  56616. + CSharpCodeBlock - [0..5)::5
  56617. + CSharpStatement - [0..5)::5
  56618. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  56619. + Transition;[@];
  56620. + CSharpStatementBody - [1..5)::4
  56621. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  56622. + LeftBrace;[{];
  56623. + CSharpCodeBlock - [2..5)::3
  56624. + CSharpStatementLiteral - [2..4)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[}];AtEOL
  56625. + NewLine;[LF];
  56626. + MarkupBlock - [4..5)::1
  56627. + MarkupTagBlock - [4..5)::1 - [<]
  56628. + MarkupTextLiteral - [4..5)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56629. + OpenAngle;[<];
  56630. + RazorMetaCode - [5..5)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  56631. + RightBrace;[<Missing>];
  56632. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/HandlesOpenAngleWithProperTagFollowingIt.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/HandlesOpenAngleWithProperTagFollowingIt.stree.txt
  56633. index c9221746d1a..5542db45962 100644
  56634. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/HandlesOpenAngleWithProperTagFollowingIt.stree.txt
  56635. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/HandlesOpenAngleWithProperTagFollowingIt.stree.txt
  56636. @@ -1,24 +1,30 @@
  56637. -Markup block - Gen<None> - 14 - (0:0,0)
  56638. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  56639. - SyntaxKind.Unknown;[];
  56640. - Statement block - Gen<None> - 14 - (0:0,0)
  56641. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  56642. - SyntaxKind.Transition;[@];
  56643. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  56644. - SyntaxKind.LeftBrace;[{];
  56645. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[}];AtEOL - (2:0,2) - Tokens:1
  56646. - SyntaxKind.NewLine;[LF];
  56647. - Markup block - Gen<None> - 3 - (4:1,0)
  56648. - Tag block - Gen<None> - 3 - (4:1,0)
  56649. - Markup span - Gen<Markup> - [<LF] - SpanEditHandler;Accepts:Any - (4:1,0) - Tokens:2
  56650. - SyntaxKind.OpenAngle;[<];
  56651. - SyntaxKind.NewLine;[LF];
  56652. - Markup block - Gen<None> - 7 - (7:2,0)
  56653. - Tag block - Gen<None> - 7 - (7:2,0)
  56654. - Markup span - Gen<Markup> - [</html>] - SpanEditHandler;Accepts:None - (7:2,0) - Tokens:4
  56655. - SyntaxKind.OpenAngle;[<];
  56656. - SyntaxKind.ForwardSlash;[/];
  56657. - SyntaxKind.Text;[html];
  56658. - SyntaxKind.CloseAngle;[>];
  56659. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (14:2,7) - Tokens:1
  56660. - SyntaxKind.Unknown;[];
  56661. +RazorDocument - [0..14)::14 - [@{LF<LF</html>]
  56662. + MarkupBlock - [0..14)::14
  56663. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56664. + Marker;[];
  56665. + CSharpCodeBlock - [0..14)::14
  56666. + CSharpStatement - [0..14)::14
  56667. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  56668. + Transition;[@];
  56669. + CSharpStatementBody - [1..14)::13
  56670. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  56671. + LeftBrace;[{];
  56672. + CSharpCodeBlock - [2..14)::12
  56673. + CSharpStatementLiteral - [2..4)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[}];AtEOL
  56674. + NewLine;[LF];
  56675. + MarkupBlock - [4..7)::3
  56676. + MarkupTagBlock - [4..7)::3 - [<LF]
  56677. + MarkupTextLiteral - [4..7)::3 - [<LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56678. + OpenAngle;[<];
  56679. + NewLine;[LF];
  56680. + MarkupBlock - [7..14)::7
  56681. + MarkupTagBlock - [7..14)::7 - [</html>]
  56682. + MarkupTextLiteral - [7..14)::7 - [</html>] - Gen<Markup> - SpanEditHandler;Accepts:None
  56683. + OpenAngle;[<];
  56684. + ForwardSlash;[/];
  56685. + Text;[html];
  56686. + CloseAngle;[>];
  56687. + CSharpStatementLiteral - [14..14)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  56688. + Marker;[];
  56689. + RazorMetaCode - [14..14)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  56690. + RightBrace;[<Missing>];
  56691. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/HandlesUnbalancedTripleDashHTMLComments.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/HandlesUnbalancedTripleDashHTMLComments.stree.txt
  56692. index 26444feebfd..d6c3b6a1b31 100644
  56693. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/HandlesUnbalancedTripleDashHTMLComments.stree.txt
  56694. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/HandlesUnbalancedTripleDashHTMLComments.stree.txt
  56695. @@ -1,52 +1,56 @@
  56696. -Markup block - Gen<None> - 68 - (0:0,0)
  56697. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  56698. - SyntaxKind.Unknown;[];
  56699. - Statement block - Gen<None> - 68 - (0:0,0)
  56700. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  56701. - SyntaxKind.Transition;[@];
  56702. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  56703. - SyntaxKind.LeftBrace;[{];
  56704. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (2:0,2) - Tokens:1
  56705. - SyntaxKind.NewLine;[LF];
  56706. - Markup block - Gen<None> - 63 - (4:1,0)
  56707. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (4:1,0) - Tokens:1
  56708. - SyntaxKind.Whitespace;[ ];
  56709. - HtmlComment block - Gen<None> - 57 - (8:1,4)
  56710. - Markup span - Gen<Markup> - [<!--] - SpanEditHandler;Accepts:None - (8:1,4) - Tokens:3
  56711. - SyntaxKind.OpenAngle;[<];
  56712. - SyntaxKind.Bang;[!];
  56713. - SyntaxKind.DoubleHyphen;[--];
  56714. - Markup span - Gen<Markup> - [ Hello, I'm a comment that shouldn't break razor -] - SpanEditHandler;Accepts:Whitespace - (12:1,8) - Tokens:22
  56715. - SyntaxKind.Whitespace;[ ];
  56716. - SyntaxKind.Text;[Hello,];
  56717. - SyntaxKind.Whitespace;[ ];
  56718. - SyntaxKind.Text;[I];
  56719. - SyntaxKind.SingleQuote;['];
  56720. - SyntaxKind.Text;[m];
  56721. - SyntaxKind.Whitespace;[ ];
  56722. - SyntaxKind.Text;[a];
  56723. - SyntaxKind.Whitespace;[ ];
  56724. - SyntaxKind.Text;[comment];
  56725. - SyntaxKind.Whitespace;[ ];
  56726. - SyntaxKind.Text;[that];
  56727. - SyntaxKind.Whitespace;[ ];
  56728. - SyntaxKind.Text;[shouldn];
  56729. - SyntaxKind.SingleQuote;['];
  56730. - SyntaxKind.Text;[t];
  56731. - SyntaxKind.Whitespace;[ ];
  56732. - SyntaxKind.Text;[break];
  56733. - SyntaxKind.Whitespace;[ ];
  56734. - SyntaxKind.Text;[razor];
  56735. - SyntaxKind.Whitespace;[ ];
  56736. - SyntaxKind.Text;[-];
  56737. - Markup span - Gen<Markup> - [-->] - SpanEditHandler;Accepts:None - (62:1,58) - Tokens:2
  56738. - SyntaxKind.DoubleHyphen;[--];
  56739. - SyntaxKind.CloseAngle;[>];
  56740. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (65:1,61) - Tokens:1
  56741. - SyntaxKind.NewLine;[LF];
  56742. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (67:2,0) - Tokens:1
  56743. - SyntaxKind.Unknown;[];
  56744. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (67:2,0) - Tokens:1
  56745. - SyntaxKind.RightBrace;[}];
  56746. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (68:2,1) - Tokens:1
  56747. - SyntaxKind.Unknown;[];
  56748. +RazorDocument - [0..68)::68 - [@{LF <!-- Hello, I'm a comment that shouldn't break razor --->LF}]
  56749. + MarkupBlock - [0..68)::68
  56750. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56751. + Marker;[];
  56752. + CSharpCodeBlock - [0..68)::68
  56753. + CSharpStatement - [0..68)::68
  56754. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  56755. + Transition;[@];
  56756. + CSharpStatementBody - [1..68)::67
  56757. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  56758. + LeftBrace;[{];
  56759. + CSharpCodeBlock - [2..67)::65
  56760. + CSharpStatementLiteral - [2..4)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  56761. + NewLine;[LF];
  56762. + MarkupBlock - [4..67)::63
  56763. + MarkupTextLiteral - [4..8)::4 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56764. + Whitespace;[ ];
  56765. + MarkupCommentBlock - [8..65)::57
  56766. + MarkupTextLiteral - [8..12)::4 - [<!--] - Gen<Markup> - SpanEditHandler;Accepts:None
  56767. + OpenAngle;[<];
  56768. + Bang;[!];
  56769. + DoubleHyphen;[--];
  56770. + MarkupTextLiteral - [12..62)::50 - [ Hello, I'm a comment that shouldn't break razor -] - Gen<Markup> - SpanEditHandler;Accepts:Whitespace
  56771. + Whitespace;[ ];
  56772. + Text;[Hello,];
  56773. + Whitespace;[ ];
  56774. + Text;[I];
  56775. + SingleQuote;['];
  56776. + Text;[m];
  56777. + Whitespace;[ ];
  56778. + Text;[a];
  56779. + Whitespace;[ ];
  56780. + Text;[comment];
  56781. + Whitespace;[ ];
  56782. + Text;[that];
  56783. + Whitespace;[ ];
  56784. + Text;[shouldn];
  56785. + SingleQuote;['];
  56786. + Text;[t];
  56787. + Whitespace;[ ];
  56788. + Text;[break];
  56789. + Whitespace;[ ];
  56790. + Text;[razor];
  56791. + Whitespace;[ ];
  56792. + Text;[-];
  56793. + MarkupTextLiteral - [62..65)::3 - [-->] - Gen<Markup> - SpanEditHandler;Accepts:None
  56794. + DoubleHyphen;[--];
  56795. + CloseAngle;[>];
  56796. + MarkupTextLiteral - [65..67)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  56797. + NewLine;[LF];
  56798. + CSharpStatementLiteral - [67..67)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  56799. + Marker;[];
  56800. + RazorMetaCode - [67..68)::1 - Gen<None> - SpanEditHandler;Accepts:None
  56801. + RightBrace;[}];
  56802. + MarkupTextLiteral - [68..68)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56803. + Marker;[];
  56804. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/HtmlCommentSupportsMultipleDashes.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/HtmlCommentSupportsMultipleDashes.stree.txt
  56805. index 3679bca5b07..80f23f667be 100644
  56806. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/HtmlCommentSupportsMultipleDashes.stree.txt
  56807. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/HtmlCommentSupportsMultipleDashes.stree.txt
  56808. @@ -1,133 +1,134 @@
  56809. -Markup block - Gen<None> - 165 - (0:0,0)
  56810. - Tag block - Gen<None> - 5 - (0:0,0)
  56811. - Markup span - Gen<Markup> - [<div>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  56812. - SyntaxKind.OpenAngle;[<];
  56813. - SyntaxKind.Text;[div];
  56814. - SyntaxKind.CloseAngle;[>];
  56815. - HtmlComment block - Gen<None> - 22 - (5:0,5)
  56816. - Markup span - Gen<Markup> - [<!--] - SpanEditHandler;Accepts:None - (5:0,5) - Tokens:3
  56817. - SyntaxKind.OpenAngle;[<];
  56818. - SyntaxKind.Bang;[!];
  56819. - SyntaxKind.DoubleHyphen;[--];
  56820. - Markup span - Gen<Markup> - [- Hello World -] - SpanEditHandler;Accepts:Whitespace - (9:0,9) - Tokens:7
  56821. - SyntaxKind.Text;[-];
  56822. - SyntaxKind.Whitespace;[ ];
  56823. - SyntaxKind.Text;[Hello];
  56824. - SyntaxKind.Whitespace;[ ];
  56825. - SyntaxKind.Text;[World];
  56826. - SyntaxKind.Whitespace;[ ];
  56827. - SyntaxKind.Text;[-];
  56828. - Markup span - Gen<Markup> - [-->] - SpanEditHandler;Accepts:None - (24:0,24) - Tokens:2
  56829. - SyntaxKind.DoubleHyphen;[--];
  56830. - SyntaxKind.CloseAngle;[>];
  56831. - Tag block - Gen<None> - 6 - (27:0,27)
  56832. - Markup span - Gen<Markup> - [</div>] - SpanEditHandler;Accepts:Any - (27:0,27) - Tokens:4
  56833. - SyntaxKind.OpenAngle;[<];
  56834. - SyntaxKind.ForwardSlash;[/];
  56835. - SyntaxKind.Text;[div];
  56836. - SyntaxKind.CloseAngle;[>];
  56837. - SyntaxKind.HtmlTextLiteral - [LF] - [33..35) - FullWidth: 2 - Slots: 1
  56838. - SyntaxKind.NewLine;[LF];
  56839. - Tag block - Gen<None> - 5 - (35:1,0)
  56840. - Markup span - Gen<Markup> - [<div>] - SpanEditHandler;Accepts:Any - (35:1,0) - Tokens:3
  56841. - SyntaxKind.OpenAngle;[<];
  56842. - SyntaxKind.Text;[div];
  56843. - SyntaxKind.CloseAngle;[>];
  56844. - HtmlComment block - Gen<None> - 24 - (40:1,5)
  56845. - Markup span - Gen<Markup> - [<!--] - SpanEditHandler;Accepts:None - (40:1,5) - Tokens:3
  56846. - SyntaxKind.OpenAngle;[<];
  56847. - SyntaxKind.Bang;[!];
  56848. - SyntaxKind.DoubleHyphen;[--];
  56849. - Markup span - Gen<Markup> - [-- Hello World --] - SpanEditHandler;Accepts:Whitespace - (44:1,9) - Tokens:7
  56850. - SyntaxKind.DoubleHyphen;[--];
  56851. - SyntaxKind.Whitespace;[ ];
  56852. - SyntaxKind.Text;[Hello];
  56853. - SyntaxKind.Whitespace;[ ];
  56854. - SyntaxKind.Text;[World];
  56855. - SyntaxKind.Whitespace;[ ];
  56856. - SyntaxKind.DoubleHyphen;[--];
  56857. - Markup span - Gen<Markup> - [-->] - SpanEditHandler;Accepts:None - (61:1,26) - Tokens:2
  56858. - SyntaxKind.DoubleHyphen;[--];
  56859. - SyntaxKind.CloseAngle;[>];
  56860. - Tag block - Gen<None> - 6 - (64:1,29)
  56861. - Markup span - Gen<Markup> - [</div>] - SpanEditHandler;Accepts:Any - (64:1,29) - Tokens:4
  56862. - SyntaxKind.OpenAngle;[<];
  56863. - SyntaxKind.ForwardSlash;[/];
  56864. - SyntaxKind.Text;[div];
  56865. - SyntaxKind.CloseAngle;[>];
  56866. - SyntaxKind.HtmlTextLiteral - [LF] - [70..72) - FullWidth: 2 - Slots: 1
  56867. - SyntaxKind.NewLine;[LF];
  56868. - Tag block - Gen<None> - 5 - (72:2,0)
  56869. - Markup span - Gen<Markup> - [<div>] - SpanEditHandler;Accepts:Any - (72:2,0) - Tokens:3
  56870. - SyntaxKind.OpenAngle;[<];
  56871. - SyntaxKind.Text;[div];
  56872. - SyntaxKind.CloseAngle;[>];
  56873. - HtmlComment block - Gen<None> - 26 - (77:2,5)
  56874. - Markup span - Gen<Markup> - [<!--] - SpanEditHandler;Accepts:None - (77:2,5) - Tokens:3
  56875. - SyntaxKind.OpenAngle;[<];
  56876. - SyntaxKind.Bang;[!];
  56877. - SyntaxKind.DoubleHyphen;[--];
  56878. - Markup span - Gen<Markup> - [--- Hello World ---] - SpanEditHandler;Accepts:Whitespace - (81:2,9) - Tokens:9
  56879. - SyntaxKind.DoubleHyphen;[--];
  56880. - SyntaxKind.Text;[-];
  56881. - SyntaxKind.Whitespace;[ ];
  56882. - SyntaxKind.Text;[Hello];
  56883. - SyntaxKind.Whitespace;[ ];
  56884. - SyntaxKind.Text;[World];
  56885. - SyntaxKind.Whitespace;[ ];
  56886. - SyntaxKind.DoubleHyphen;[--];
  56887. - SyntaxKind.Text;[-];
  56888. - Markup span - Gen<Markup> - [-->] - SpanEditHandler;Accepts:None - (100:2,28) - Tokens:2
  56889. - SyntaxKind.DoubleHyphen;[--];
  56890. - SyntaxKind.CloseAngle;[>];
  56891. - Tag block - Gen<None> - 6 - (103:2,31)
  56892. - Markup span - Gen<Markup> - [</div>] - SpanEditHandler;Accepts:Any - (103:2,31) - Tokens:4
  56893. - SyntaxKind.OpenAngle;[<];
  56894. - SyntaxKind.ForwardSlash;[/];
  56895. - SyntaxKind.Text;[div];
  56896. - SyntaxKind.CloseAngle;[>];
  56897. - SyntaxKind.HtmlTextLiteral - [LF] - [109..111) - FullWidth: 2 - Slots: 1
  56898. - SyntaxKind.NewLine;[LF];
  56899. - Tag block - Gen<None> - 5 - (111:3,0)
  56900. - Markup span - Gen<Markup> - [<div>] - SpanEditHandler;Accepts:Any - (111:3,0) - Tokens:3
  56901. - SyntaxKind.OpenAngle;[<];
  56902. - SyntaxKind.Text;[div];
  56903. - SyntaxKind.CloseAngle;[>];
  56904. - HtmlComment block - Gen<None> - 41 - (116:3,5)
  56905. - Markup span - Gen<Markup> - [<!--] - SpanEditHandler;Accepts:None - (116:3,5) - Tokens:3
  56906. - SyntaxKind.OpenAngle;[<];
  56907. - SyntaxKind.Bang;[!];
  56908. - SyntaxKind.DoubleHyphen;[--];
  56909. - Markup span - Gen<Markup> - [--- Hello < --- > World </div> ---] - SpanEditHandler;Accepts:Whitespace - (120:3,9) - Tokens:21
  56910. - SyntaxKind.DoubleHyphen;[--];
  56911. - SyntaxKind.Text;[-];
  56912. - SyntaxKind.Whitespace;[ ];
  56913. - SyntaxKind.Text;[Hello];
  56914. - SyntaxKind.Whitespace;[ ];
  56915. - SyntaxKind.OpenAngle;[<];
  56916. - SyntaxKind.Whitespace;[ ];
  56917. - SyntaxKind.DoubleHyphen;[--];
  56918. - SyntaxKind.Text;[-];
  56919. - SyntaxKind.Whitespace;[ ];
  56920. - SyntaxKind.CloseAngle;[>];
  56921. - SyntaxKind.Whitespace;[ ];
  56922. - SyntaxKind.Text;[World];
  56923. - SyntaxKind.Whitespace;[ ];
  56924. - SyntaxKind.OpenAngle;[<];
  56925. - SyntaxKind.ForwardSlash;[/];
  56926. - SyntaxKind.Text;[div];
  56927. - SyntaxKind.CloseAngle;[>];
  56928. - SyntaxKind.Whitespace;[ ];
  56929. - SyntaxKind.DoubleHyphen;[--];
  56930. - SyntaxKind.Text;[-];
  56931. - Markup span - Gen<Markup> - [-->] - SpanEditHandler;Accepts:None - (154:3,43) - Tokens:2
  56932. - SyntaxKind.DoubleHyphen;[--];
  56933. - SyntaxKind.CloseAngle;[>];
  56934. - Tag block - Gen<None> - 6 - (157:3,46)
  56935. - Markup span - Gen<Markup> - [</div>] - SpanEditHandler;Accepts:Any - (157:3,46) - Tokens:4
  56936. - SyntaxKind.OpenAngle;[<];
  56937. - SyntaxKind.ForwardSlash;[/];
  56938. - SyntaxKind.Text;[div];
  56939. - SyntaxKind.CloseAngle;[>];
  56940. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:Any - (163:3,52) - Tokens:1
  56941. - SyntaxKind.NewLine;[LF];
  56942. +RazorDocument - [0..165)::165 - [<div><!--- Hello World ---></div>LF<div><!---- Hello World ----></div>LF<div><!----- Hello World -----></div>LF<div><!----- Hello < --- > World </div> -----></div>LF]
  56943. + MarkupBlock - [0..165)::165
  56944. + MarkupTagBlock - [0..5)::5 - [<div>]
  56945. + MarkupTextLiteral - [0..5)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56946. + OpenAngle;[<];
  56947. + Text;[div];
  56948. + CloseAngle;[>];
  56949. + MarkupCommentBlock - [5..27)::22
  56950. + MarkupTextLiteral - [5..9)::4 - [<!--] - Gen<Markup> - SpanEditHandler;Accepts:None
  56951. + OpenAngle;[<];
  56952. + Bang;[!];
  56953. + DoubleHyphen;[--];
  56954. + MarkupTextLiteral - [9..24)::15 - [- Hello World -] - Gen<Markup> - SpanEditHandler;Accepts:Whitespace
  56955. + Text;[-];
  56956. + Whitespace;[ ];
  56957. + Text;[Hello];
  56958. + Whitespace;[ ];
  56959. + Text;[World];
  56960. + Whitespace;[ ];
  56961. + Text;[-];
  56962. + MarkupTextLiteral - [24..27)::3 - [-->] - Gen<Markup> - SpanEditHandler;Accepts:None
  56963. + DoubleHyphen;[--];
  56964. + CloseAngle;[>];
  56965. + MarkupTagBlock - [27..33)::6 - [</div>]
  56966. + MarkupTextLiteral - [27..33)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56967. + OpenAngle;[<];
  56968. + ForwardSlash;[/];
  56969. + Text;[div];
  56970. + CloseAngle;[>];
  56971. + MarkupTextLiteral - [33..35)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56972. + NewLine;[LF];
  56973. + MarkupTagBlock - [35..40)::5 - [<div>]
  56974. + MarkupTextLiteral - [35..40)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56975. + OpenAngle;[<];
  56976. + Text;[div];
  56977. + CloseAngle;[>];
  56978. + MarkupCommentBlock - [40..64)::24
  56979. + MarkupTextLiteral - [40..44)::4 - [<!--] - Gen<Markup> - SpanEditHandler;Accepts:None
  56980. + OpenAngle;[<];
  56981. + Bang;[!];
  56982. + DoubleHyphen;[--];
  56983. + MarkupTextLiteral - [44..61)::17 - [-- Hello World --] - Gen<Markup> - SpanEditHandler;Accepts:Whitespace
  56984. + DoubleHyphen;[--];
  56985. + Whitespace;[ ];
  56986. + Text;[Hello];
  56987. + Whitespace;[ ];
  56988. + Text;[World];
  56989. + Whitespace;[ ];
  56990. + DoubleHyphen;[--];
  56991. + MarkupTextLiteral - [61..64)::3 - [-->] - Gen<Markup> - SpanEditHandler;Accepts:None
  56992. + DoubleHyphen;[--];
  56993. + CloseAngle;[>];
  56994. + MarkupTagBlock - [64..70)::6 - [</div>]
  56995. + MarkupTextLiteral - [64..70)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  56996. + OpenAngle;[<];
  56997. + ForwardSlash;[/];
  56998. + Text;[div];
  56999. + CloseAngle;[>];
  57000. + MarkupTextLiteral - [70..72)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  57001. + NewLine;[LF];
  57002. + MarkupTagBlock - [72..77)::5 - [<div>]
  57003. + MarkupTextLiteral - [72..77)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  57004. + OpenAngle;[<];
  57005. + Text;[div];
  57006. + CloseAngle;[>];
  57007. + MarkupCommentBlock - [77..103)::26
  57008. + MarkupTextLiteral - [77..81)::4 - [<!--] - Gen<Markup> - SpanEditHandler;Accepts:None
  57009. + OpenAngle;[<];
  57010. + Bang;[!];
  57011. + DoubleHyphen;[--];
  57012. + MarkupTextLiteral - [81..100)::19 - [--- Hello World ---] - Gen<Markup> - SpanEditHandler;Accepts:Whitespace
  57013. + DoubleHyphen;[--];
  57014. + Text;[-];
  57015. + Whitespace;[ ];
  57016. + Text;[Hello];
  57017. + Whitespace;[ ];
  57018. + Text;[World];
  57019. + Whitespace;[ ];
  57020. + DoubleHyphen;[--];
  57021. + Text;[-];
  57022. + MarkupTextLiteral - [100..103)::3 - [-->] - Gen<Markup> - SpanEditHandler;Accepts:None
  57023. + DoubleHyphen;[--];
  57024. + CloseAngle;[>];
  57025. + MarkupTagBlock - [103..109)::6 - [</div>]
  57026. + MarkupTextLiteral - [103..109)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  57027. + OpenAngle;[<];
  57028. + ForwardSlash;[/];
  57029. + Text;[div];
  57030. + CloseAngle;[>];
  57031. + MarkupTextLiteral - [109..111)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  57032. + NewLine;[LF];
  57033. + MarkupTagBlock - [111..116)::5 - [<div>]
  57034. + MarkupTextLiteral - [111..116)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  57035. + OpenAngle;[<];
  57036. + Text;[div];
  57037. + CloseAngle;[>];
  57038. + MarkupCommentBlock - [116..157)::41
  57039. + MarkupTextLiteral - [116..120)::4 - [<!--] - Gen<Markup> - SpanEditHandler;Accepts:None
  57040. + OpenAngle;[<];
  57041. + Bang;[!];
  57042. + DoubleHyphen;[--];
  57043. + MarkupTextLiteral - [120..154)::34 - [--- Hello < --- > World </div> ---] - Gen<Markup> - SpanEditHandler;Accepts:Whitespace
  57044. + DoubleHyphen;[--];
  57045. + Text;[-];
  57046. + Whitespace;[ ];
  57047. + Text;[Hello];
  57048. + Whitespace;[ ];
  57049. + OpenAngle;[<];
  57050. + Whitespace;[ ];
  57051. + DoubleHyphen;[--];
  57052. + Text;[-];
  57053. + Whitespace;[ ];
  57054. + CloseAngle;[>];
  57055. + Whitespace;[ ];
  57056. + Text;[World];
  57057. + Whitespace;[ ];
  57058. + OpenAngle;[<];
  57059. + ForwardSlash;[/];
  57060. + Text;[div];
  57061. + CloseAngle;[>];
  57062. + Whitespace;[ ];
  57063. + DoubleHyphen;[--];
  57064. + Text;[-];
  57065. + MarkupTextLiteral - [154..157)::3 - [-->] - Gen<Markup> - SpanEditHandler;Accepts:None
  57066. + DoubleHyphen;[--];
  57067. + CloseAngle;[>];
  57068. + MarkupTagBlock - [157..163)::6 - [</div>]
  57069. + MarkupTextLiteral - [157..163)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  57070. + OpenAngle;[<];
  57071. + ForwardSlash;[/];
  57072. + Text;[div];
  57073. + CloseAngle;[>];
  57074. + MarkupTextLiteral - [163..165)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  57075. + NewLine;[LF];
  57076. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/IgnoresTagsInContentsOfScriptTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/IgnoresTagsInContentsOfScriptTag.stree.txt
  57077. index d60e3e49372..3da3fd052c1 100644
  57078. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/IgnoresTagsInContentsOfScriptTag.stree.txt
  57079. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/IgnoresTagsInContentsOfScriptTag.stree.txt
  57080. @@ -1,28 +1,31 @@
  57081. -Markup block - Gen<None> - 36 - (0:0,0)
  57082. - Tag block - Gen<None> - 8 - (0:0,0)
  57083. - Markup span - Gen<Markup> - [<script>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  57084. - SyntaxKind.OpenAngle;[<];
  57085. - SyntaxKind.Text;[script];
  57086. - SyntaxKind.CloseAngle;[>];
  57087. - Markup span - Gen<Markup> - [foo<bar baz='] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:7
  57088. - SyntaxKind.Text;[foo];
  57089. - SyntaxKind.OpenAngle;[<];
  57090. - SyntaxKind.Text;[bar];
  57091. - SyntaxKind.Whitespace;[ ];
  57092. - SyntaxKind.Text;[baz];
  57093. - SyntaxKind.Equals;[=];
  57094. - SyntaxKind.SingleQuote;['];
  57095. - Expression block - Gen<Expr> - 4 - (21:0,21)
  57096. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:1
  57097. - SyntaxKind.Transition;[@];
  57098. - Code span - Gen<Expr> - [boz] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (22:0,22) - Tokens:1
  57099. - SyntaxKind.Identifier;[boz];
  57100. - Markup span - Gen<Markup> - ['>] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:2
  57101. - SyntaxKind.SingleQuote;['];
  57102. - SyntaxKind.CloseAngle;[>];
  57103. - Tag block - Gen<None> - 9 - (27:0,27)
  57104. - Markup span - Gen<Markup> - [</script>] - SpanEditHandler;Accepts:None - (27:0,27) - Tokens:4
  57105. - SyntaxKind.OpenAngle;[<];
  57106. - SyntaxKind.ForwardSlash;[/];
  57107. - SyntaxKind.Text;[script];
  57108. - SyntaxKind.CloseAngle;[>];
  57109. +MarkupBlock - [0..36)::36 - [<script>foo<bar baz='@boz'></script>]
  57110. + MarkupTagBlock - [0..8)::8 - [<script>]
  57111. + MarkupTextLiteral - [0..8)::8 - [<script>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57112. + OpenAngle;[<];
  57113. + Text;[script];
  57114. + CloseAngle;[>];
  57115. + MarkupTextLiteral - [8..21)::13 - [foo<bar baz='] - Gen<Markup> - SpanEditHandler;Accepts:Any
  57116. + Text;[foo];
  57117. + OpenAngle;[<];
  57118. + Text;[bar];
  57119. + Whitespace;[ ];
  57120. + Text;[baz];
  57121. + Equals;[=];
  57122. + SingleQuote;['];
  57123. + CSharpCodeBlock - [21..25)::4
  57124. + CSharpImplicitExpression - [21..25)::4
  57125. + CSharpTransition - [21..22)::1 - Gen<None> - SpanEditHandler;Accepts:None
  57126. + Transition;[@];
  57127. + CSharpImplicitExpressionBody - [22..25)::3
  57128. + CSharpCodeBlock - [22..25)::3
  57129. + CSharpExpressionLiteral - [22..25)::3 - [boz] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  57130. + Identifier;[boz];
  57131. + MarkupTextLiteral - [25..27)::2 - ['>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  57132. + SingleQuote;['];
  57133. + CloseAngle;[>];
  57134. + MarkupTagBlock - [27..36)::9 - [</script>]
  57135. + MarkupTextLiteral - [27..36)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57136. + OpenAngle;[<];
  57137. + ForwardSlash;[/];
  57138. + Text;[script];
  57139. + CloseAngle;[>];
  57140. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/OnlyTerminatesCommentOnFullEndSequence.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/OnlyTerminatesCommentOnFullEndSequence.stree.txt
  57141. index 22d402b96cc..965a65db74a 100644
  57142. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/OnlyTerminatesCommentOnFullEndSequence.stree.txt
  57143. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/OnlyTerminatesCommentOnFullEndSequence.stree.txt
  57144. @@ -1,18 +1,18 @@
  57145. -Markup block - Gen<None> - 20 - (0:0,0)
  57146. - HtmlComment block - Gen<None> - 20 - (0:0,0)
  57147. - Markup span - Gen<Markup> - [<!--] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  57148. - SyntaxKind.OpenAngle;[<];
  57149. - SyntaxKind.Bang;[!];
  57150. - SyntaxKind.DoubleHyphen;[--];
  57151. - Markup span - Gen<Markup> - [<foo>--</bar>] - SpanEditHandler;Accepts:Whitespace - (4:0,4) - Tokens:8
  57152. - SyntaxKind.OpenAngle;[<];
  57153. - SyntaxKind.Text;[foo];
  57154. - SyntaxKind.CloseAngle;[>];
  57155. - SyntaxKind.DoubleHyphen;[--];
  57156. - SyntaxKind.OpenAngle;[<];
  57157. - SyntaxKind.ForwardSlash;[/];
  57158. - SyntaxKind.Text;[bar];
  57159. - SyntaxKind.CloseAngle;[>];
  57160. - Markup span - Gen<Markup> - [-->] - SpanEditHandler;Accepts:None - (17:0,17) - Tokens:2
  57161. - SyntaxKind.DoubleHyphen;[--];
  57162. - SyntaxKind.CloseAngle;[>];
  57163. +MarkupBlock - [0..20)::20 - [<!--<foo>--</bar>-->]
  57164. + MarkupCommentBlock - [0..20)::20
  57165. + MarkupTextLiteral - [0..4)::4 - [<!--] - Gen<Markup> - SpanEditHandler;Accepts:None
  57166. + OpenAngle;[<];
  57167. + Bang;[!];
  57168. + DoubleHyphen;[--];
  57169. + MarkupTextLiteral - [4..17)::13 - [<foo>--</bar>] - Gen<Markup> - SpanEditHandler;Accepts:Whitespace
  57170. + OpenAngle;[<];
  57171. + Text;[foo];
  57172. + CloseAngle;[>];
  57173. + DoubleHyphen;[--];
  57174. + OpenAngle;[<];
  57175. + ForwardSlash;[/];
  57176. + Text;[bar];
  57177. + CloseAngle;[>];
  57178. + MarkupTextLiteral - [17..20)::3 - [-->] - Gen<Markup> - SpanEditHandler;Accepts:None
  57179. + DoubleHyphen;[--];
  57180. + CloseAngle;[>];
  57181. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/ParsesSGMLDeclarationAsEmptyTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/ParsesSGMLDeclarationAsEmptyTag.stree.txt
  57182. index b3b77f16230..228dacf053f 100644
  57183. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/ParsesSGMLDeclarationAsEmptyTag.stree.txt
  57184. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/ParsesSGMLDeclarationAsEmptyTag.stree.txt
  57185. @@ -1,23 +1,23 @@
  57186. -Markup block - Gen<None> - 33 - (0:0,0)
  57187. - Tag block - Gen<None> - 5 - (0:0,0)
  57188. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  57189. - SyntaxKind.OpenAngle;[<];
  57190. - SyntaxKind.Text;[foo];
  57191. - SyntaxKind.CloseAngle;[>];
  57192. - Markup span - Gen<Markup> - [<!DOCTYPE foo bar baz>] - SpanEditHandler;Accepts:None - (5:0,5) - Tokens:10
  57193. - SyntaxKind.OpenAngle;[<];
  57194. - SyntaxKind.Bang;[!];
  57195. - SyntaxKind.Text;[DOCTYPE];
  57196. - SyntaxKind.Whitespace;[ ];
  57197. - SyntaxKind.Text;[foo];
  57198. - SyntaxKind.Whitespace;[ ];
  57199. - SyntaxKind.Text;[bar];
  57200. - SyntaxKind.Whitespace;[ ];
  57201. - SyntaxKind.Text;[baz];
  57202. - SyntaxKind.CloseAngle;[>];
  57203. - Tag block - Gen<None> - 6 - (27:0,27)
  57204. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:None - (27:0,27) - Tokens:4
  57205. - SyntaxKind.OpenAngle;[<];
  57206. - SyntaxKind.ForwardSlash;[/];
  57207. - SyntaxKind.Text;[foo];
  57208. - SyntaxKind.CloseAngle;[>];
  57209. +MarkupBlock - [0..33)::33 - [<foo><!DOCTYPE foo bar baz></foo>]
  57210. + MarkupTagBlock - [0..5)::5 - [<foo>]
  57211. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57212. + OpenAngle;[<];
  57213. + Text;[foo];
  57214. + CloseAngle;[>];
  57215. + MarkupTextLiteral - [5..27)::22 - [<!DOCTYPE foo bar baz>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57216. + OpenAngle;[<];
  57217. + Bang;[!];
  57218. + Text;[DOCTYPE];
  57219. + Whitespace;[ ];
  57220. + Text;[foo];
  57221. + Whitespace;[ ];
  57222. + Text;[bar];
  57223. + Whitespace;[ ];
  57224. + Text;[baz];
  57225. + CloseAngle;[>];
  57226. + MarkupTagBlock - [27..33)::6 - [</foo>]
  57227. + MarkupTextLiteral - [27..33)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57228. + OpenAngle;[<];
  57229. + ForwardSlash;[/];
  57230. + Text;[foo];
  57231. + CloseAngle;[>];
  57232. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/ParsesUntilMatchingEndTagIfFirstNonWhitespaceCharacterIsStartTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/ParsesUntilMatchingEndTagIfFirstNonWhitespaceCharacterIsStartTag.stree.txt
  57233. index 42f0bb5e299..89954be6716 100644
  57234. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/ParsesUntilMatchingEndTagIfFirstNonWhitespaceCharacterIsStartTag.stree.txt
  57235. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/ParsesUntilMatchingEndTagIfFirstNonWhitespaceCharacterIsStartTag.stree.txt
  57236. @@ -1,34 +1,34 @@
  57237. -Markup block - Gen<None> - 33 - (0:0,0)
  57238. - Tag block - Gen<None> - 5 - (0:0,0)
  57239. - Markup span - Gen<Markup> - [<baz>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  57240. - SyntaxKind.OpenAngle;[<];
  57241. - SyntaxKind.Text;[baz];
  57242. - SyntaxKind.CloseAngle;[>];
  57243. - Tag block - Gen<None> - 5 - (5:0,5)
  57244. - Markup span - Gen<Markup> - [<boz>] - SpanEditHandler;Accepts:None - (5:0,5) - Tokens:3
  57245. - SyntaxKind.OpenAngle;[<];
  57246. - SyntaxKind.Text;[boz];
  57247. - SyntaxKind.CloseAngle;[>];
  57248. - Tag block - Gen<None> - 5 - (10:0,10)
  57249. - Markup span - Gen<Markup> - [<biz>] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:3
  57250. - SyntaxKind.OpenAngle;[<];
  57251. - SyntaxKind.Text;[biz];
  57252. - SyntaxKind.CloseAngle;[>];
  57253. - Tag block - Gen<None> - 6 - (15:0,15)
  57254. - Markup span - Gen<Markup> - [</biz>] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:4
  57255. - SyntaxKind.OpenAngle;[<];
  57256. - SyntaxKind.ForwardSlash;[/];
  57257. - SyntaxKind.Text;[biz];
  57258. - SyntaxKind.CloseAngle;[>];
  57259. - Tag block - Gen<None> - 6 - (21:0,21)
  57260. - Markup span - Gen<Markup> - [</boz>] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:4
  57261. - SyntaxKind.OpenAngle;[<];
  57262. - SyntaxKind.ForwardSlash;[/];
  57263. - SyntaxKind.Text;[boz];
  57264. - SyntaxKind.CloseAngle;[>];
  57265. - Tag block - Gen<None> - 6 - (27:0,27)
  57266. - Markup span - Gen<Markup> - [</baz>] - SpanEditHandler;Accepts:None - (27:0,27) - Tokens:4
  57267. - SyntaxKind.OpenAngle;[<];
  57268. - SyntaxKind.ForwardSlash;[/];
  57269. - SyntaxKind.Text;[baz];
  57270. - SyntaxKind.CloseAngle;[>];
  57271. +MarkupBlock - [0..33)::33 - [<baz><boz><biz></biz></boz></baz>]
  57272. + MarkupTagBlock - [0..5)::5 - [<baz>]
  57273. + MarkupTextLiteral - [0..5)::5 - [<baz>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57274. + OpenAngle;[<];
  57275. + Text;[baz];
  57276. + CloseAngle;[>];
  57277. + MarkupTagBlock - [5..10)::5 - [<boz>]
  57278. + MarkupTextLiteral - [5..10)::5 - [<boz>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57279. + OpenAngle;[<];
  57280. + Text;[boz];
  57281. + CloseAngle;[>];
  57282. + MarkupTagBlock - [10..15)::5 - [<biz>]
  57283. + MarkupTextLiteral - [10..15)::5 - [<biz>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57284. + OpenAngle;[<];
  57285. + Text;[biz];
  57286. + CloseAngle;[>];
  57287. + MarkupTagBlock - [15..21)::6 - [</biz>]
  57288. + MarkupTextLiteral - [15..21)::6 - [</biz>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57289. + OpenAngle;[<];
  57290. + ForwardSlash;[/];
  57291. + Text;[biz];
  57292. + CloseAngle;[>];
  57293. + MarkupTagBlock - [21..27)::6 - [</boz>]
  57294. + MarkupTextLiteral - [21..27)::6 - [</boz>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57295. + OpenAngle;[<];
  57296. + ForwardSlash;[/];
  57297. + Text;[boz];
  57298. + CloseAngle;[>];
  57299. + MarkupTagBlock - [27..33)::6 - [</baz>]
  57300. + MarkupTextLiteral - [27..33)::6 - [</baz>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57301. + OpenAngle;[<];
  57302. + ForwardSlash;[/];
  57303. + Text;[baz];
  57304. + CloseAngle;[>];
  57305. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/ParsesXMLProcessingInstructionAsEmptyTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/ParsesXMLProcessingInstructionAsEmptyTag.stree.txt
  57306. index e8ab55b89ed..b416a6b86f5 100644
  57307. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/ParsesXMLProcessingInstructionAsEmptyTag.stree.txt
  57308. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/ParsesXMLProcessingInstructionAsEmptyTag.stree.txt
  57309. @@ -1,24 +1,24 @@
  57310. -Markup block - Gen<None> - 30 - (0:0,0)
  57311. - Tag block - Gen<None> - 5 - (0:0,0)
  57312. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  57313. - SyntaxKind.OpenAngle;[<];
  57314. - SyntaxKind.Text;[foo];
  57315. - SyntaxKind.CloseAngle;[>];
  57316. - Markup span - Gen<Markup> - [<?xml foo bar baz?>] - SpanEditHandler;Accepts:None - (5:0,5) - Tokens:11
  57317. - SyntaxKind.OpenAngle;[<];
  57318. - SyntaxKind.QuestionMark;[?];
  57319. - SyntaxKind.Text;[xml];
  57320. - SyntaxKind.Whitespace;[ ];
  57321. - SyntaxKind.Text;[foo];
  57322. - SyntaxKind.Whitespace;[ ];
  57323. - SyntaxKind.Text;[bar];
  57324. - SyntaxKind.Whitespace;[ ];
  57325. - SyntaxKind.Text;[baz];
  57326. - SyntaxKind.QuestionMark;[?];
  57327. - SyntaxKind.CloseAngle;[>];
  57328. - Tag block - Gen<None> - 6 - (24:0,24)
  57329. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:None - (24:0,24) - Tokens:4
  57330. - SyntaxKind.OpenAngle;[<];
  57331. - SyntaxKind.ForwardSlash;[/];
  57332. - SyntaxKind.Text;[foo];
  57333. - SyntaxKind.CloseAngle;[>];
  57334. +MarkupBlock - [0..30)::30 - [<foo><?xml foo bar baz?></foo>]
  57335. + MarkupTagBlock - [0..5)::5 - [<foo>]
  57336. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57337. + OpenAngle;[<];
  57338. + Text;[foo];
  57339. + CloseAngle;[>];
  57340. + MarkupTextLiteral - [5..24)::19 - [<?xml foo bar baz?>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57341. + OpenAngle;[<];
  57342. + QuestionMark;[?];
  57343. + Text;[xml];
  57344. + Whitespace;[ ];
  57345. + Text;[foo];
  57346. + Whitespace;[ ];
  57347. + Text;[bar];
  57348. + Whitespace;[ ];
  57349. + Text;[baz];
  57350. + QuestionMark;[?];
  57351. + CloseAngle;[>];
  57352. + MarkupTagBlock - [24..30)::6 - [</foo>]
  57353. + MarkupTextLiteral - [24..30)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57354. + OpenAngle;[<];
  57355. + ForwardSlash;[/];
  57356. + Text;[foo];
  57357. + CloseAngle;[>];
  57358. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/ProperlyBalancesCommentStartAndEndTags.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/ProperlyBalancesCommentStartAndEndTags.stree.txt
  57359. index b302b41eadf..9a7e052217a 100644
  57360. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/ProperlyBalancesCommentStartAndEndTags.stree.txt
  57361. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/ProperlyBalancesCommentStartAndEndTags.stree.txt
  57362. @@ -1,17 +1,17 @@
  57363. -Markup block - Gen<None> - 18 - (0:0,0)
  57364. - HtmlComment block - Gen<None> - 18 - (0:0,0)
  57365. - Markup span - Gen<Markup> - [<!--] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  57366. - SyntaxKind.OpenAngle;[<];
  57367. - SyntaxKind.Bang;[!];
  57368. - SyntaxKind.DoubleHyphen;[--];
  57369. - Markup span - Gen<Markup> - [<foo></bar>] - SpanEditHandler;Accepts:Whitespace - (4:0,4) - Tokens:7
  57370. - SyntaxKind.OpenAngle;[<];
  57371. - SyntaxKind.Text;[foo];
  57372. - SyntaxKind.CloseAngle;[>];
  57373. - SyntaxKind.OpenAngle;[<];
  57374. - SyntaxKind.ForwardSlash;[/];
  57375. - SyntaxKind.Text;[bar];
  57376. - SyntaxKind.CloseAngle;[>];
  57377. - Markup span - Gen<Markup> - [-->] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:2
  57378. - SyntaxKind.DoubleHyphen;[--];
  57379. - SyntaxKind.CloseAngle;[>];
  57380. +MarkupBlock - [0..18)::18 - [<!--<foo></bar>-->]
  57381. + MarkupCommentBlock - [0..18)::18
  57382. + MarkupTextLiteral - [0..4)::4 - [<!--] - Gen<Markup> - SpanEditHandler;Accepts:None
  57383. + OpenAngle;[<];
  57384. + Bang;[!];
  57385. + DoubleHyphen;[--];
  57386. + MarkupTextLiteral - [4..15)::11 - [<foo></bar>] - Gen<Markup> - SpanEditHandler;Accepts:Whitespace
  57387. + OpenAngle;[<];
  57388. + Text;[foo];
  57389. + CloseAngle;[>];
  57390. + OpenAngle;[<];
  57391. + ForwardSlash;[/];
  57392. + Text;[bar];
  57393. + CloseAngle;[>];
  57394. + MarkupTextLiteral - [15..18)::3 - [-->] - Gen<Markup> - SpanEditHandler;Accepts:None
  57395. + DoubleHyphen;[--];
  57396. + CloseAngle;[>];
  57397. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/ReadsToEndOfLineIfFirstCharacterAfterTransitionIsColon.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/ReadsToEndOfLineIfFirstCharacterAfterTransitionIsColon.stree.txt
  57398. index 7ec39929ead..1c7838e4354 100644
  57399. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/ReadsToEndOfLineIfFirstCharacterAfterTransitionIsColon.stree.txt
  57400. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/ReadsToEndOfLineIfFirstCharacterAfterTransitionIsColon.stree.txt
  57401. @@ -1,15 +1,15 @@
  57402. -Markup block - Gen<None> - 19 - (0:0,0)
  57403. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  57404. - SyntaxKind.Transition;[@];
  57405. - MetaCode span - Gen<None> - [:] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:1
  57406. - SyntaxKind.Colon;[:];
  57407. - Markup span - Gen<Markup> - [<li>Foo Bar BazLF] - SpanEditHandler;Accepts:None - (2:0,2) - Tokens:9
  57408. - SyntaxKind.OpenAngle;[<];
  57409. - SyntaxKind.Text;[li];
  57410. - SyntaxKind.CloseAngle;[>];
  57411. - SyntaxKind.Text;[Foo];
  57412. - SyntaxKind.Whitespace;[ ];
  57413. - SyntaxKind.Text;[Bar];
  57414. - SyntaxKind.Whitespace;[ ];
  57415. - SyntaxKind.Text;[Baz];
  57416. - SyntaxKind.NewLine;[LF];
  57417. +MarkupBlock - [0..19)::19 - [@:<li>Foo Bar BazLF]
  57418. + MarkupTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  57419. + Transition;[@];
  57420. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:Any
  57421. + Colon;[:];
  57422. + MarkupTextLiteral - [2..19)::17 - [<li>Foo Bar BazLF] - Gen<Markup> - SpanEditHandler;Accepts:None
  57423. + OpenAngle;[<];
  57424. + Text;[li];
  57425. + CloseAngle;[>];
  57426. + Text;[Foo];
  57427. + Whitespace;[ ];
  57428. + Text;[Bar];
  57429. + Whitespace;[ ];
  57430. + Text;[Baz];
  57431. + NewLine;[LF];
  57432. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/RendersLiteralTextTagIfDoubled.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/RendersLiteralTextTagIfDoubled.stree.txt
  57433. index d67192745e1..ef9daab3afc 100644
  57434. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/RendersLiteralTextTagIfDoubled.stree.txt
  57435. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/RendersLiteralTextTagIfDoubled.stree.txt
  57436. @@ -1,36 +1,36 @@
  57437. -Markup block - Gen<None> - 43 - (0:0,0)
  57438. - Tag block - Gen<None> - 6 - (0:0,0)
  57439. - Transition span - Gen<None> - [<text>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  57440. - SyntaxKind.OpenAngle;[<];
  57441. - SyntaxKind.Text;[text];
  57442. - SyntaxKind.CloseAngle;[>];
  57443. - Tag block - Gen<None> - 6 - (6:0,6)
  57444. - Markup span - Gen<Markup> - [<text>] - SpanEditHandler;Accepts:None - (6:0,6) - Tokens:3
  57445. - SyntaxKind.OpenAngle;[<];
  57446. - SyntaxKind.Text;[text];
  57447. - SyntaxKind.CloseAngle;[>];
  57448. - Markup span - Gen<Markup> - [Foo Bar ] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:4
  57449. - SyntaxKind.Text;[Foo];
  57450. - SyntaxKind.Whitespace;[ ];
  57451. - SyntaxKind.Text;[Bar];
  57452. - SyntaxKind.Whitespace;[ ];
  57453. - Tag block - Gen<None> - 5 - (20:0,20)
  57454. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (20:0,20) - Tokens:3
  57455. - SyntaxKind.OpenAngle;[<];
  57456. - SyntaxKind.Text;[foo];
  57457. - SyntaxKind.CloseAngle;[>];
  57458. - Markup span - Gen<Markup> - [ Baz] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:2
  57459. - SyntaxKind.Whitespace;[ ];
  57460. - SyntaxKind.Text;[Baz];
  57461. - Tag block - Gen<None> - 7 - (29:0,29)
  57462. - Markup span - Gen<Markup> - [</text>] - SpanEditHandler;Accepts:None - (29:0,29) - Tokens:4
  57463. - SyntaxKind.OpenAngle;[<];
  57464. - SyntaxKind.ForwardSlash;[/];
  57465. - SyntaxKind.Text;[text];
  57466. - SyntaxKind.CloseAngle;[>];
  57467. - Tag block - Gen<None> - 7 - (36:0,36)
  57468. - Transition span - Gen<None> - [</text>] - SpanEditHandler;Accepts:None - (36:0,36) - Tokens:4
  57469. - SyntaxKind.OpenAngle;[<];
  57470. - SyntaxKind.ForwardSlash;[/];
  57471. - SyntaxKind.Text;[text];
  57472. - SyntaxKind.CloseAngle;[>];
  57473. +MarkupBlock - [0..43)::43 - [<text><text>Foo Bar <foo> Baz</text></text>]
  57474. + MarkupTagBlock - [0..6)::6 - [<text>]
  57475. + MarkupTransition - [0..6)::6 - Gen<None> - SpanEditHandler;Accepts:None
  57476. + OpenAngle;[<];
  57477. + Text;[text];
  57478. + CloseAngle;[>];
  57479. + MarkupTagBlock - [6..12)::6 - [<text>]
  57480. + MarkupTextLiteral - [6..12)::6 - [<text>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57481. + OpenAngle;[<];
  57482. + Text;[text];
  57483. + CloseAngle;[>];
  57484. + MarkupTextLiteral - [12..20)::8 - [Foo Bar ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  57485. + Text;[Foo];
  57486. + Whitespace;[ ];
  57487. + Text;[Bar];
  57488. + Whitespace;[ ];
  57489. + MarkupTagBlock - [20..25)::5 - [<foo>]
  57490. + MarkupTextLiteral - [20..25)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57491. + OpenAngle;[<];
  57492. + Text;[foo];
  57493. + CloseAngle;[>];
  57494. + MarkupTextLiteral - [25..29)::4 - [ Baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  57495. + Whitespace;[ ];
  57496. + Text;[Baz];
  57497. + MarkupTagBlock - [29..36)::7 - [</text>]
  57498. + MarkupTextLiteral - [29..36)::7 - [</text>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57499. + OpenAngle;[<];
  57500. + ForwardSlash;[/];
  57501. + Text;[text];
  57502. + CloseAngle;[>];
  57503. + MarkupTagBlock - [36..43)::7 - [</text>]
  57504. + MarkupTransition - [36..43)::7 - Gen<None> - SpanEditHandler;Accepts:None
  57505. + OpenAngle;[<];
  57506. + ForwardSlash;[/];
  57507. + Text;[text];
  57508. + CloseAngle;[>];
  57509. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/StopsAtMatchingCloseTagToStartTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/StopsAtMatchingCloseTagToStartTag.stree.txt
  57510. index b89cf18f912..d70b799bf36 100644
  57511. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/StopsAtMatchingCloseTagToStartTag.stree.txt
  57512. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/StopsAtMatchingCloseTagToStartTag.stree.txt
  57513. @@ -1,23 +1,23 @@
  57514. -Markup block - Gen<None> - 14 - (0:0,0)
  57515. - Tag block - Gen<None> - 3 - (0:0,0)
  57516. - Markup span - Gen<Markup> - [<a>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  57517. - SyntaxKind.OpenAngle;[<];
  57518. - SyntaxKind.Text;[a];
  57519. - SyntaxKind.CloseAngle;[>];
  57520. - Tag block - Gen<None> - 3 - (3:0,3)
  57521. - Markup span - Gen<Markup> - [<b>] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:3
  57522. - SyntaxKind.OpenAngle;[<];
  57523. - SyntaxKind.Text;[b];
  57524. - SyntaxKind.CloseAngle;[>];
  57525. - Tag block - Gen<None> - 4 - (6:0,6)
  57526. - Markup span - Gen<Markup> - [</b>] - SpanEditHandler;Accepts:None - (6:0,6) - Tokens:4
  57527. - SyntaxKind.OpenAngle;[<];
  57528. - SyntaxKind.ForwardSlash;[/];
  57529. - SyntaxKind.Text;[b];
  57530. - SyntaxKind.CloseAngle;[>];
  57531. - Tag block - Gen<None> - 4 - (10:0,10)
  57532. - Markup span - Gen<Markup> - [</a>] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:4
  57533. - SyntaxKind.OpenAngle;[<];
  57534. - SyntaxKind.ForwardSlash;[/];
  57535. - SyntaxKind.Text;[a];
  57536. - SyntaxKind.CloseAngle;[>];
  57537. +MarkupBlock - [0..14)::14 - [<a><b></b></a>]
  57538. + MarkupTagBlock - [0..3)::3 - [<a>]
  57539. + MarkupTextLiteral - [0..3)::3 - [<a>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57540. + OpenAngle;[<];
  57541. + Text;[a];
  57542. + CloseAngle;[>];
  57543. + MarkupTagBlock - [3..6)::3 - [<b>]
  57544. + MarkupTextLiteral - [3..6)::3 - [<b>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57545. + OpenAngle;[<];
  57546. + Text;[b];
  57547. + CloseAngle;[>];
  57548. + MarkupTagBlock - [6..10)::4 - [</b>]
  57549. + MarkupTextLiteral - [6..10)::4 - [</b>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57550. + OpenAngle;[<];
  57551. + ForwardSlash;[/];
  57552. + Text;[b];
  57553. + CloseAngle;[>];
  57554. + MarkupTagBlock - [10..14)::4 - [</a>]
  57555. + MarkupTextLiteral - [10..14)::4 - [</a>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57556. + OpenAngle;[<];
  57557. + ForwardSlash;[/];
  57558. + Text;[a];
  57559. + CloseAngle;[>];
  57560. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/StopsParsingMidEmptyTagIfEOFReached.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/StopsParsingMidEmptyTagIfEOFReached.stree.txt
  57561. index c2064cbe780..6eb28acbc19 100644
  57562. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/StopsParsingMidEmptyTagIfEOFReached.stree.txt
  57563. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/StopsParsingMidEmptyTagIfEOFReached.stree.txt
  57564. @@ -1,6 +1,6 @@
  57565. -Markup block - Gen<None> - 4 - (0:0,0)
  57566. - Tag block - Gen<None> - 4 - (0:0,0)
  57567. - Markup span - Gen<Markup> - [<br/] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  57568. - SyntaxKind.OpenAngle;[<];
  57569. - SyntaxKind.Text;[br];
  57570. - SyntaxKind.ForwardSlash;[/];
  57571. +MarkupBlock - [0..4)::4 - [<br/]
  57572. + MarkupTagBlock - [0..4)::4 - [<br/]
  57573. + MarkupTextLiteral - [0..4)::4 - [<br/] - Gen<Markup> - SpanEditHandler;Accepts:Any
  57574. + OpenAngle;[<];
  57575. + Text;[br];
  57576. + ForwardSlash;[/];
  57577. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/StopsParsingSingleLineBlockAtEOFIfNoEOLReached.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/StopsParsingSingleLineBlockAtEOFIfNoEOLReached.stree.txt
  57578. index 3f3c688a0a9..aeba5083905 100644
  57579. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/StopsParsingSingleLineBlockAtEOFIfNoEOLReached.stree.txt
  57580. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/StopsParsingSingleLineBlockAtEOFIfNoEOLReached.stree.txt
  57581. @@ -1,9 +1,9 @@
  57582. -Markup block - Gen<None> - 9 - (0:0,0)
  57583. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  57584. - SyntaxKind.Transition;[@];
  57585. - MetaCode span - Gen<None> - [:] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:1
  57586. - SyntaxKind.Colon;[:];
  57587. - Markup span - Gen<Markup> - [foo bar] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:3
  57588. - SyntaxKind.Text;[foo];
  57589. - SyntaxKind.Whitespace;[ ];
  57590. - SyntaxKind.Text;[bar];
  57591. +MarkupBlock - [0..9)::9 - [@:foo bar]
  57592. + MarkupTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  57593. + Transition;[@];
  57594. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:Any
  57595. + Colon;[:];
  57596. + MarkupTextLiteral - [2..9)::7 - [foo bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  57597. + Text;[foo];
  57598. + Whitespace;[ ];
  57599. + Text;[bar];
  57600. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/SupportsCommentAsBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/SupportsCommentAsBlock.stree.txt
  57601. index 9e2f6045d30..d503ae4cc3a 100644
  57602. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/SupportsCommentAsBlock.stree.txt
  57603. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/SupportsCommentAsBlock.stree.txt
  57604. @@ -1,13 +1,13 @@
  57605. -Markup block - Gen<None> - 12 - (0:0,0)
  57606. - HtmlComment block - Gen<None> - 12 - (0:0,0)
  57607. - Markup span - Gen<Markup> - [<!--] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  57608. - SyntaxKind.OpenAngle;[<];
  57609. - SyntaxKind.Bang;[!];
  57610. - SyntaxKind.DoubleHyphen;[--];
  57611. - Markup span - Gen<Markup> - [ foo ] - SpanEditHandler;Accepts:Whitespace - (4:0,4) - Tokens:3
  57612. - SyntaxKind.Whitespace;[ ];
  57613. - SyntaxKind.Text;[foo];
  57614. - SyntaxKind.Whitespace;[ ];
  57615. - Markup span - Gen<Markup> - [-->] - SpanEditHandler;Accepts:None - (9:0,9) - Tokens:2
  57616. - SyntaxKind.DoubleHyphen;[--];
  57617. - SyntaxKind.CloseAngle;[>];
  57618. +MarkupBlock - [0..12)::12 - [<!-- foo -->]
  57619. + MarkupCommentBlock - [0..12)::12
  57620. + MarkupTextLiteral - [0..4)::4 - [<!--] - Gen<Markup> - SpanEditHandler;Accepts:None
  57621. + OpenAngle;[<];
  57622. + Bang;[!];
  57623. + DoubleHyphen;[--];
  57624. + MarkupTextLiteral - [4..9)::5 - [ foo ] - Gen<Markup> - SpanEditHandler;Accepts:Whitespace
  57625. + Whitespace;[ ];
  57626. + Text;[foo];
  57627. + Whitespace;[ ];
  57628. + MarkupTextLiteral - [9..12)::3 - [-->] - Gen<Markup> - SpanEditHandler;Accepts:None
  57629. + DoubleHyphen;[--];
  57630. + CloseAngle;[>];
  57631. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/SupportsCommentWithExtraDashAsBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/SupportsCommentWithExtraDashAsBlock.stree.txt
  57632. index 1e7fcc43a6f..05979ffa79b 100644
  57633. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/SupportsCommentWithExtraDashAsBlock.stree.txt
  57634. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/SupportsCommentWithExtraDashAsBlock.stree.txt
  57635. @@ -1,14 +1,14 @@
  57636. -Markup block - Gen<None> - 13 - (0:0,0)
  57637. - HtmlComment block - Gen<None> - 13 - (0:0,0)
  57638. - Markup span - Gen<Markup> - [<!--] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  57639. - SyntaxKind.OpenAngle;[<];
  57640. - SyntaxKind.Bang;[!];
  57641. - SyntaxKind.DoubleHyphen;[--];
  57642. - Markup span - Gen<Markup> - [ foo -] - SpanEditHandler;Accepts:Whitespace - (4:0,4) - Tokens:4
  57643. - SyntaxKind.Whitespace;[ ];
  57644. - SyntaxKind.Text;[foo];
  57645. - SyntaxKind.Whitespace;[ ];
  57646. - SyntaxKind.Text;[-];
  57647. - Markup span - Gen<Markup> - [-->] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:2
  57648. - SyntaxKind.DoubleHyphen;[--];
  57649. - SyntaxKind.CloseAngle;[>];
  57650. +MarkupBlock - [0..13)::13 - [<!-- foo --->]
  57651. + MarkupCommentBlock - [0..13)::13
  57652. + MarkupTextLiteral - [0..4)::4 - [<!--] - Gen<Markup> - SpanEditHandler;Accepts:None
  57653. + OpenAngle;[<];
  57654. + Bang;[!];
  57655. + DoubleHyphen;[--];
  57656. + MarkupTextLiteral - [4..10)::6 - [ foo -] - Gen<Markup> - SpanEditHandler;Accepts:Whitespace
  57657. + Whitespace;[ ];
  57658. + Text;[foo];
  57659. + Whitespace;[ ];
  57660. + Text;[-];
  57661. + MarkupTextLiteral - [10..13)::3 - [-->] - Gen<Markup> - SpanEditHandler;Accepts:None
  57662. + DoubleHyphen;[--];
  57663. + CloseAngle;[>];
  57664. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/SupportsCommentWithinBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/SupportsCommentWithinBlock.stree.txt
  57665. index 464f70dd099..0fb89ab28d4 100644
  57666. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/SupportsCommentWithinBlock.stree.txt
  57667. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/SupportsCommentWithinBlock.stree.txt
  57668. @@ -1,28 +1,28 @@
  57669. -Markup block - Gen<None> - 30 - (0:0,0)
  57670. - Tag block - Gen<None> - 5 - (0:0,0)
  57671. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  57672. - SyntaxKind.OpenAngle;[<];
  57673. - SyntaxKind.Text;[foo];
  57674. - SyntaxKind.CloseAngle;[>];
  57675. - Markup span - Gen<Markup> - [bar] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:1
  57676. - SyntaxKind.Text;[bar];
  57677. - HtmlComment block - Gen<None> - 13 - (8:0,8)
  57678. - Markup span - Gen<Markup> - [<!--] - SpanEditHandler;Accepts:None - (8:0,8) - Tokens:3
  57679. - SyntaxKind.OpenAngle;[<];
  57680. - SyntaxKind.Bang;[!];
  57681. - SyntaxKind.DoubleHyphen;[--];
  57682. - Markup span - Gen<Markup> - [ zoop ] - SpanEditHandler;Accepts:Whitespace - (12:0,12) - Tokens:3
  57683. - SyntaxKind.Whitespace;[ ];
  57684. - SyntaxKind.Text;[zoop];
  57685. - SyntaxKind.Whitespace;[ ];
  57686. - Markup span - Gen<Markup> - [-->] - SpanEditHandler;Accepts:None - (18:0,18) - Tokens:2
  57687. - SyntaxKind.DoubleHyphen;[--];
  57688. - SyntaxKind.CloseAngle;[>];
  57689. - Markup span - Gen<Markup> - [baz] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:1
  57690. - SyntaxKind.Text;[baz];
  57691. - Tag block - Gen<None> - 6 - (24:0,24)
  57692. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:None - (24:0,24) - Tokens:4
  57693. - SyntaxKind.OpenAngle;[<];
  57694. - SyntaxKind.ForwardSlash;[/];
  57695. - SyntaxKind.Text;[foo];
  57696. - SyntaxKind.CloseAngle;[>];
  57697. +MarkupBlock - [0..30)::30 - [<foo>bar<!-- zoop -->baz</foo>]
  57698. + MarkupTagBlock - [0..5)::5 - [<foo>]
  57699. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57700. + OpenAngle;[<];
  57701. + Text;[foo];
  57702. + CloseAngle;[>];
  57703. + MarkupTextLiteral - [5..8)::3 - [bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  57704. + Text;[bar];
  57705. + MarkupCommentBlock - [8..21)::13
  57706. + MarkupTextLiteral - [8..12)::4 - [<!--] - Gen<Markup> - SpanEditHandler;Accepts:None
  57707. + OpenAngle;[<];
  57708. + Bang;[!];
  57709. + DoubleHyphen;[--];
  57710. + MarkupTextLiteral - [12..18)::6 - [ zoop ] - Gen<Markup> - SpanEditHandler;Accepts:Whitespace
  57711. + Whitespace;[ ];
  57712. + Text;[zoop];
  57713. + Whitespace;[ ];
  57714. + MarkupTextLiteral - [18..21)::3 - [-->] - Gen<Markup> - SpanEditHandler;Accepts:None
  57715. + DoubleHyphen;[--];
  57716. + CloseAngle;[>];
  57717. + MarkupTextLiteral - [21..24)::3 - [baz] - Gen<Markup> - SpanEditHandler;Accepts:None
  57718. + Text;[baz];
  57719. + MarkupTagBlock - [24..30)::6 - [</foo>]
  57720. + MarkupTextLiteral - [24..30)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57721. + OpenAngle;[<];
  57722. + ForwardSlash;[/];
  57723. + Text;[foo];
  57724. + CloseAngle;[>];
  57725. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/SupportsScriptTagsWithLessThanSignsInThem.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/SupportsScriptTagsWithLessThanSignsInThem.stree.txt
  57726. index bc3722e3519..5e513098eb5 100644
  57727. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/SupportsScriptTagsWithLessThanSignsInThem.stree.txt
  57728. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/SupportsScriptTagsWithLessThanSignsInThem.stree.txt
  57729. @@ -1,24 +1,24 @@
  57730. -Markup block - Gen<None> - 45 - (0:0,0)
  57731. - Tag block - Gen<None> - 8 - (0:0,0)
  57732. - Markup span - Gen<Markup> - [<script>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  57733. - SyntaxKind.OpenAngle;[<];
  57734. - SyntaxKind.Text;[script];
  57735. - SyntaxKind.CloseAngle;[>];
  57736. - Markup span - Gen<Markup> - [if(foo<bar) { alert("baz");)] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:11
  57737. - SyntaxKind.Text;[if(foo];
  57738. - SyntaxKind.OpenAngle;[<];
  57739. - SyntaxKind.Text;[bar)];
  57740. - SyntaxKind.Whitespace;[ ];
  57741. - SyntaxKind.Text;[{];
  57742. - SyntaxKind.Whitespace;[ ];
  57743. - SyntaxKind.Text;[alert(];
  57744. - SyntaxKind.DoubleQuote;["];
  57745. - SyntaxKind.Text;[baz];
  57746. - SyntaxKind.DoubleQuote;["];
  57747. - SyntaxKind.Text;[);)];
  57748. - Tag block - Gen<None> - 9 - (36:0,36)
  57749. - Markup span - Gen<Markup> - [</script>] - SpanEditHandler;Accepts:None - (36:0,36) - Tokens:4
  57750. - SyntaxKind.OpenAngle;[<];
  57751. - SyntaxKind.ForwardSlash;[/];
  57752. - SyntaxKind.Text;[script];
  57753. - SyntaxKind.CloseAngle;[>];
  57754. +MarkupBlock - [0..45)::45 - [<script>if(foo<bar) { alert("baz");)</script>]
  57755. + MarkupTagBlock - [0..8)::8 - [<script>]
  57756. + MarkupTextLiteral - [0..8)::8 - [<script>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57757. + OpenAngle;[<];
  57758. + Text;[script];
  57759. + CloseAngle;[>];
  57760. + MarkupTextLiteral - [8..36)::28 - [if(foo<bar) { alert("baz");)] - Gen<Markup> - SpanEditHandler;Accepts:Any
  57761. + Text;[if(foo];
  57762. + OpenAngle;[<];
  57763. + Text;[bar)];
  57764. + Whitespace;[ ];
  57765. + Text;[{];
  57766. + Whitespace;[ ];
  57767. + Text;[alert(];
  57768. + DoubleQuote;["];
  57769. + Text;[baz];
  57770. + DoubleQuote;["];
  57771. + Text;[);)];
  57772. + MarkupTagBlock - [36..45)::9 - [</script>]
  57773. + MarkupTextLiteral - [36..45)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57774. + OpenAngle;[<];
  57775. + ForwardSlash;[/];
  57776. + Text;[script];
  57777. + CloseAngle;[>];
  57778. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/SupportsScriptTagsWithSpacedLessThanSignsInThem.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/SupportsScriptTagsWithSpacedLessThanSignsInThem.stree.txt
  57779. index 0435cc4ef60..dfec739076c 100644
  57780. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/SupportsScriptTagsWithSpacedLessThanSignsInThem.stree.txt
  57781. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/SupportsScriptTagsWithSpacedLessThanSignsInThem.stree.txt
  57782. @@ -1,26 +1,26 @@
  57783. -Markup block - Gen<None> - 47 - (0:0,0)
  57784. - Tag block - Gen<None> - 8 - (0:0,0)
  57785. - Markup span - Gen<Markup> - [<script>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  57786. - SyntaxKind.OpenAngle;[<];
  57787. - SyntaxKind.Text;[script];
  57788. - SyntaxKind.CloseAngle;[>];
  57789. - Markup span - Gen<Markup> - [if(foo < bar) { alert("baz");)] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:13
  57790. - SyntaxKind.Text;[if(foo];
  57791. - SyntaxKind.Whitespace;[ ];
  57792. - SyntaxKind.OpenAngle;[<];
  57793. - SyntaxKind.Whitespace;[ ];
  57794. - SyntaxKind.Text;[bar)];
  57795. - SyntaxKind.Whitespace;[ ];
  57796. - SyntaxKind.Text;[{];
  57797. - SyntaxKind.Whitespace;[ ];
  57798. - SyntaxKind.Text;[alert(];
  57799. - SyntaxKind.DoubleQuote;["];
  57800. - SyntaxKind.Text;[baz];
  57801. - SyntaxKind.DoubleQuote;["];
  57802. - SyntaxKind.Text;[);)];
  57803. - Tag block - Gen<None> - 9 - (38:0,38)
  57804. - Markup span - Gen<Markup> - [</script>] - SpanEditHandler;Accepts:None - (38:0,38) - Tokens:4
  57805. - SyntaxKind.OpenAngle;[<];
  57806. - SyntaxKind.ForwardSlash;[/];
  57807. - SyntaxKind.Text;[script];
  57808. - SyntaxKind.CloseAngle;[>];
  57809. +MarkupBlock - [0..47)::47 - [<script>if(foo < bar) { alert("baz");)</script>]
  57810. + MarkupTagBlock - [0..8)::8 - [<script>]
  57811. + MarkupTextLiteral - [0..8)::8 - [<script>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57812. + OpenAngle;[<];
  57813. + Text;[script];
  57814. + CloseAngle;[>];
  57815. + MarkupTextLiteral - [8..38)::30 - [if(foo < bar) { alert("baz");)] - Gen<Markup> - SpanEditHandler;Accepts:Any
  57816. + Text;[if(foo];
  57817. + Whitespace;[ ];
  57818. + OpenAngle;[<];
  57819. + Whitespace;[ ];
  57820. + Text;[bar)];
  57821. + Whitespace;[ ];
  57822. + Text;[{];
  57823. + Whitespace;[ ];
  57824. + Text;[alert(];
  57825. + DoubleQuote;["];
  57826. + Text;[baz];
  57827. + DoubleQuote;["];
  57828. + Text;[);)];
  57829. + MarkupTagBlock - [38..47)::9 - [</script>]
  57830. + MarkupTextLiteral - [38..47)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57831. + OpenAngle;[<];
  57832. + ForwardSlash;[/];
  57833. + Text;[script];
  57834. + CloseAngle;[>];
  57835. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/SupportsTagsWithAttributes.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/SupportsTagsWithAttributes.stree.txt
  57836. index e7bcdaaaa9f..3331b95473b 100644
  57837. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/SupportsTagsWithAttributes.stree.txt
  57838. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/SupportsTagsWithAttributes.stree.txt
  57839. @@ -1,48 +1,55 @@
  57840. -Markup block - Gen<None> - 48 - (0:0,0)
  57841. - Tag block - Gen<None> - 15 - (0:0,0)
  57842. - Markup span - Gen<Markup> - [<foo] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  57843. - SyntaxKind.OpenAngle;[<];
  57844. - SyntaxKind.Text;[foo];
  57845. - Markup block - Gen<Attr:bar, bar="@(4:0,4),"@(13:0,13)> - 10 - (4:0,4)
  57846. - Markup span - Gen<None> - [ bar="] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:4
  57847. - SyntaxKind.Whitespace;[ ];
  57848. - SyntaxKind.Text;[bar];
  57849. - SyntaxKind.Equals;[=];
  57850. - SyntaxKind.DoubleQuote;["];
  57851. - Markup span - Gen<LitAttr:@(10:0,10)> - [baz] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  57852. - SyntaxKind.Text;[baz];
  57853. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:1
  57854. - SyntaxKind.DoubleQuote;["];
  57855. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:None - (14:0,14) - Tokens:1
  57856. - SyntaxKind.CloseAngle;[>];
  57857. - Tag block - Gen<None> - 5 - (15:0,15)
  57858. - Markup span - Gen<Markup> - [<biz>] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:3
  57859. - SyntaxKind.OpenAngle;[<];
  57860. - SyntaxKind.Text;[biz];
  57861. - SyntaxKind.CloseAngle;[>];
  57862. - Tag block - Gen<None> - 16 - (20:0,20)
  57863. - Markup span - Gen<Markup> - [<boz] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:2
  57864. - SyntaxKind.OpenAngle;[<];
  57865. - SyntaxKind.Text;[boz];
  57866. - Markup block - Gen<Attr:zoop, zoop=@(24:0,24),@(34:0,34)> - 10 - (24:0,24)
  57867. - Markup span - Gen<None> - [ zoop=] - SpanEditHandler;Accepts:Any - (24:0,24) - Tokens:3
  57868. - SyntaxKind.Whitespace;[ ];
  57869. - SyntaxKind.Text;[zoop];
  57870. - SyntaxKind.Equals;[=];
  57871. - Markup span - Gen<LitAttr:@(30:0,30)> - [zork] - SpanEditHandler;Accepts:Any - (30:0,30) - Tokens:1
  57872. - SyntaxKind.Text;[zork];
  57873. - Markup span - Gen<Markup> - [/>] - SpanEditHandler;Accepts:None - (34:0,34) - Tokens:2
  57874. - SyntaxKind.ForwardSlash;[/];
  57875. - SyntaxKind.CloseAngle;[>];
  57876. - Tag block - Gen<None> - 6 - (36:0,36)
  57877. - Markup span - Gen<Markup> - [</biz>] - SpanEditHandler;Accepts:None - (36:0,36) - Tokens:4
  57878. - SyntaxKind.OpenAngle;[<];
  57879. - SyntaxKind.ForwardSlash;[/];
  57880. - SyntaxKind.Text;[biz];
  57881. - SyntaxKind.CloseAngle;[>];
  57882. - Tag block - Gen<None> - 6 - (42:0,42)
  57883. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:None - (42:0,42) - Tokens:4
  57884. - SyntaxKind.OpenAngle;[<];
  57885. - SyntaxKind.ForwardSlash;[/];
  57886. - SyntaxKind.Text;[foo];
  57887. - SyntaxKind.CloseAngle;[>];
  57888. +MarkupBlock - [0..48)::48 - [<foo bar="baz"><biz><boz zoop=zork/></biz></foo>]
  57889. + MarkupTagBlock - [0..15)::15 - [<foo bar="baz">]
  57890. + MarkupTextLiteral - [0..4)::4 - [<foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  57891. + OpenAngle;[<];
  57892. + Text;[foo];
  57893. + MarkupAttributeBlock - [4..14)::10 - [ bar="baz"]
  57894. + MarkupTextLiteral - [4..5)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  57895. + Whitespace;[ ];
  57896. + MarkupTextLiteral - [5..8)::3 - [bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  57897. + Text;[bar];
  57898. + Equals;[=];
  57899. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  57900. + DoubleQuote;["];
  57901. + GenericBlock - [10..13)::3
  57902. + MarkupLiteralAttributeValue - [10..13)::3 - [baz]
  57903. + MarkupTextLiteral - [10..13)::3 - [baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  57904. + Text;[baz];
  57905. + MarkupTextLiteral - [13..14)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  57906. + DoubleQuote;["];
  57907. + MarkupTextLiteral - [14..15)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57908. + CloseAngle;[>];
  57909. + MarkupTagBlock - [15..20)::5 - [<biz>]
  57910. + MarkupTextLiteral - [15..20)::5 - [<biz>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57911. + OpenAngle;[<];
  57912. + Text;[biz];
  57913. + CloseAngle;[>];
  57914. + MarkupTagBlock - [20..36)::16 - [<boz zoop=zork/>]
  57915. + MarkupTextLiteral - [20..24)::4 - [<boz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  57916. + OpenAngle;[<];
  57917. + Text;[boz];
  57918. + MarkupAttributeBlock - [24..34)::10 - [ zoop=zork]
  57919. + MarkupTextLiteral - [24..25)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  57920. + Whitespace;[ ];
  57921. + MarkupTextLiteral - [25..29)::4 - [zoop] - Gen<Markup> - SpanEditHandler;Accepts:Any
  57922. + Text;[zoop];
  57923. + Equals;[=];
  57924. + GenericBlock - [30..34)::4
  57925. + MarkupLiteralAttributeValue - [30..34)::4 - [zork]
  57926. + MarkupTextLiteral - [30..34)::4 - [zork] - Gen<None> - SpanEditHandler;Accepts:Any
  57927. + Text;[zork];
  57928. + MarkupTextLiteral - [34..36)::2 - [/>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57929. + ForwardSlash;[/];
  57930. + CloseAngle;[>];
  57931. + MarkupTagBlock - [36..42)::6 - [</biz>]
  57932. + MarkupTextLiteral - [36..42)::6 - [</biz>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57933. + OpenAngle;[<];
  57934. + ForwardSlash;[/];
  57935. + Text;[biz];
  57936. + CloseAngle;[>];
  57937. + MarkupTagBlock - [42..48)::6 - [</foo>]
  57938. + MarkupTextLiteral - [42..48)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57939. + OpenAngle;[<];
  57940. + ForwardSlash;[/];
  57941. + Text;[foo];
  57942. + CloseAngle;[>];
  57943. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TagWithoutCloseAngleDoesNotTerminateBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TagWithoutCloseAngleDoesNotTerminateBlock.stree.txt
  57944. index f8dc7489884..cc9623a3d94 100644
  57945. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TagWithoutCloseAngleDoesNotTerminateBlock.stree.txt
  57946. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TagWithoutCloseAngleDoesNotTerminateBlock.stree.txt
  57947. @@ -1,7 +1,7 @@
  57948. -Markup block - Gen<None> - 28 - (0:0,0)
  57949. - Tag block - Gen<None> - 28 - (0:0,0)
  57950. - Markup span - Gen<Markup> - [< LF ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:4
  57951. - SyntaxKind.OpenAngle;[<];
  57952. - SyntaxKind.Whitespace;[ ];
  57953. - SyntaxKind.NewLine;[LF];
  57954. - SyntaxKind.Whitespace;[ ];
  57955. +MarkupBlock - [0..28)::28 - [< LF ]
  57956. + MarkupTagBlock - [0..28)::28 - [< LF ]
  57957. + MarkupTextLiteral - [0..28)::28 - [< LF ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  57958. + OpenAngle;[<];
  57959. + Whitespace;[ ];
  57960. + NewLine;[LF];
  57961. + Whitespace;[ ];
  57962. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TerminatesAtEOF.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TerminatesAtEOF.stree.txt
  57963. index a4bd0fbd15b..6e363fb26d5 100644
  57964. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TerminatesAtEOF.stree.txt
  57965. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TerminatesAtEOF.stree.txt
  57966. @@ -1,6 +1,6 @@
  57967. -Markup block - Gen<None> - 5 - (0:0,0)
  57968. - Tag block - Gen<None> - 5 - (0:0,0)
  57969. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  57970. - SyntaxKind.OpenAngle;[<];
  57971. - SyntaxKind.Text;[foo];
  57972. - SyntaxKind.CloseAngle;[>];
  57973. +MarkupBlock - [0..5)::5 - [<foo>]
  57974. + MarkupTagBlock - [0..5)::5 - [<foo>]
  57975. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57976. + OpenAngle;[<];
  57977. + Text;[foo];
  57978. + CloseAngle;[>];
  57979. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TerminatesAtEOFWhenParsingComment.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TerminatesAtEOFWhenParsingComment.stree.txt
  57980. index ba8a70b4cf8..cf1cb3ed722 100644
  57981. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TerminatesAtEOFWhenParsingComment.stree.txt
  57982. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TerminatesAtEOFWhenParsingComment.stree.txt
  57983. @@ -1,8 +1,8 @@
  57984. -Markup block - Gen<None> - 9 - (0:0,0)
  57985. - Markup span - Gen<Markup> - [<!--<foo>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:6
  57986. - SyntaxKind.OpenAngle;[<];
  57987. - SyntaxKind.Bang;[!];
  57988. - SyntaxKind.DoubleHyphen;[--];
  57989. - SyntaxKind.OpenAngle;[<];
  57990. - SyntaxKind.Text;[foo];
  57991. - SyntaxKind.CloseAngle;[>];
  57992. +MarkupBlock - [0..9)::9 - [<!--<foo>]
  57993. + MarkupTextLiteral - [0..9)::9 - [<!--<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  57994. + OpenAngle;[<];
  57995. + Bang;[!];
  57996. + DoubleHyphen;[--];
  57997. + OpenAngle;[<];
  57998. + Text;[foo];
  57999. + CloseAngle;[>];
  58000. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TerminatesCommentAtFirstOccurrenceOfEndSequence.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TerminatesCommentAtFirstOccurrenceOfEndSequence.stree.txt
  58001. index 69276bdcf22..5a014d4e230 100644
  58002. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TerminatesCommentAtFirstOccurrenceOfEndSequence.stree.txt
  58003. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TerminatesCommentAtFirstOccurrenceOfEndSequence.stree.txt
  58004. @@ -1,30 +1,30 @@
  58005. -Markup block - Gen<None> - 31 - (0:0,0)
  58006. - Tag block - Gen<None> - 5 - (0:0,0)
  58007. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  58008. - SyntaxKind.OpenAngle;[<];
  58009. - SyntaxKind.Text;[foo];
  58010. - SyntaxKind.CloseAngle;[>];
  58011. - HtmlComment block - Gen<None> - 17 - (5:0,5)
  58012. - Markup span - Gen<Markup> - [<!--] - SpanEditHandler;Accepts:None - (5:0,5) - Tokens:3
  58013. - SyntaxKind.OpenAngle;[<];
  58014. - SyntaxKind.Bang;[!];
  58015. - SyntaxKind.DoubleHyphen;[--];
  58016. - Markup span - Gen<Markup> - [<foo></bar] - SpanEditHandler;Accepts:Whitespace - (9:0,9) - Tokens:6
  58017. - SyntaxKind.OpenAngle;[<];
  58018. - SyntaxKind.Text;[foo];
  58019. - SyntaxKind.CloseAngle;[>];
  58020. - SyntaxKind.OpenAngle;[<];
  58021. - SyntaxKind.ForwardSlash;[/];
  58022. - SyntaxKind.Text;[bar];
  58023. - Markup span - Gen<Markup> - [-->] - SpanEditHandler;Accepts:None - (19:0,19) - Tokens:2
  58024. - SyntaxKind.DoubleHyphen;[--];
  58025. - SyntaxKind.CloseAngle;[>];
  58026. - Markup span - Gen<Markup> - [-->] - SpanEditHandler;Accepts:None - (22:0,22) - Tokens:2
  58027. - SyntaxKind.DoubleHyphen;[--];
  58028. - SyntaxKind.CloseAngle;[>];
  58029. - Tag block - Gen<None> - 6 - (25:0,25)
  58030. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:None - (25:0,25) - Tokens:4
  58031. - SyntaxKind.OpenAngle;[<];
  58032. - SyntaxKind.ForwardSlash;[/];
  58033. - SyntaxKind.Text;[foo];
  58034. - SyntaxKind.CloseAngle;[>];
  58035. +MarkupBlock - [0..31)::31 - [<foo><!--<foo></bar-->--></foo>]
  58036. + MarkupTagBlock - [0..5)::5 - [<foo>]
  58037. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  58038. + OpenAngle;[<];
  58039. + Text;[foo];
  58040. + CloseAngle;[>];
  58041. + MarkupCommentBlock - [5..22)::17
  58042. + MarkupTextLiteral - [5..9)::4 - [<!--] - Gen<Markup> - SpanEditHandler;Accepts:None
  58043. + OpenAngle;[<];
  58044. + Bang;[!];
  58045. + DoubleHyphen;[--];
  58046. + MarkupTextLiteral - [9..19)::10 - [<foo></bar] - Gen<Markup> - SpanEditHandler;Accepts:Whitespace
  58047. + OpenAngle;[<];
  58048. + Text;[foo];
  58049. + CloseAngle;[>];
  58050. + OpenAngle;[<];
  58051. + ForwardSlash;[/];
  58052. + Text;[bar];
  58053. + MarkupTextLiteral - [19..22)::3 - [-->] - Gen<Markup> - SpanEditHandler;Accepts:None
  58054. + DoubleHyphen;[--];
  58055. + CloseAngle;[>];
  58056. + MarkupTextLiteral - [22..25)::3 - [-->] - Gen<Markup> - SpanEditHandler;Accepts:None
  58057. + DoubleHyphen;[--];
  58058. + CloseAngle;[>];
  58059. + MarkupTagBlock - [25..31)::6 - [</foo>]
  58060. + MarkupTextLiteral - [25..31)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  58061. + OpenAngle;[<];
  58062. + ForwardSlash;[/];
  58063. + Text;[foo];
  58064. + CloseAngle;[>];
  58065. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TerminatesSGMLDeclarationAtFirstCloseAngle.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TerminatesSGMLDeclarationAtFirstCloseAngle.stree.txt
  58066. index c779f841b10..372a19319ba 100644
  58067. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TerminatesSGMLDeclarationAtFirstCloseAngle.stree.txt
  58068. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TerminatesSGMLDeclarationAtFirstCloseAngle.stree.txt
  58069. @@ -1,25 +1,25 @@
  58070. -Markup block - Gen<None> - 34 - (0:0,0)
  58071. - Tag block - Gen<None> - 5 - (0:0,0)
  58072. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  58073. - SyntaxKind.OpenAngle;[<];
  58074. - SyntaxKind.Text;[foo];
  58075. - SyntaxKind.CloseAngle;[>];
  58076. - Markup span - Gen<Markup> - [<!DOCTYPE foo bar>] - SpanEditHandler;Accepts:None - (5:0,5) - Tokens:8
  58077. - SyntaxKind.OpenAngle;[<];
  58078. - SyntaxKind.Bang;[!];
  58079. - SyntaxKind.Text;[DOCTYPE];
  58080. - SyntaxKind.Whitespace;[ ];
  58081. - SyntaxKind.Text;[foo];
  58082. - SyntaxKind.Whitespace;[ ];
  58083. - SyntaxKind.Text;[bar];
  58084. - SyntaxKind.CloseAngle;[>];
  58085. - Markup span - Gen<Markup> - [ baz>] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:3
  58086. - SyntaxKind.Whitespace;[ ];
  58087. - SyntaxKind.Text;[baz];
  58088. - SyntaxKind.CloseAngle;[>];
  58089. - Tag block - Gen<None> - 6 - (28:0,28)
  58090. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:None - (28:0,28) - Tokens:4
  58091. - SyntaxKind.OpenAngle;[<];
  58092. - SyntaxKind.ForwardSlash;[/];
  58093. - SyntaxKind.Text;[foo];
  58094. - SyntaxKind.CloseAngle;[>];
  58095. +MarkupBlock - [0..34)::34 - [<foo><!DOCTYPE foo bar> baz></foo>]
  58096. + MarkupTagBlock - [0..5)::5 - [<foo>]
  58097. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  58098. + OpenAngle;[<];
  58099. + Text;[foo];
  58100. + CloseAngle;[>];
  58101. + MarkupTextLiteral - [5..23)::18 - [<!DOCTYPE foo bar>] - Gen<Markup> - SpanEditHandler;Accepts:None
  58102. + OpenAngle;[<];
  58103. + Bang;[!];
  58104. + Text;[DOCTYPE];
  58105. + Whitespace;[ ];
  58106. + Text;[foo];
  58107. + Whitespace;[ ];
  58108. + Text;[bar];
  58109. + CloseAngle;[>];
  58110. + MarkupTextLiteral - [23..28)::5 - [ baz>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58111. + Whitespace;[ ];
  58112. + Text;[baz];
  58113. + CloseAngle;[>];
  58114. + MarkupTagBlock - [28..34)::6 - [</foo>]
  58115. + MarkupTextLiteral - [28..34)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  58116. + OpenAngle;[<];
  58117. + ForwardSlash;[/];
  58118. + Text;[foo];
  58119. + CloseAngle;[>];
  58120. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TerminatesXMLProcessingInstructionAtQuestionMarkCloseAnglePair.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TerminatesXMLProcessingInstructionAtQuestionMarkCloseAnglePair.stree.txt
  58121. index 50bc7768338..caf96df474c 100644
  58122. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TerminatesXMLProcessingInstructionAtQuestionMarkCloseAnglePair.stree.txt
  58123. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TerminatesXMLProcessingInstructionAtQuestionMarkCloseAnglePair.stree.txt
  58124. @@ -1,27 +1,27 @@
  58125. -Markup block - Gen<None> - 34 - (0:0,0)
  58126. - Tag block - Gen<None> - 5 - (0:0,0)
  58127. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  58128. - SyntaxKind.OpenAngle;[<];
  58129. - SyntaxKind.Text;[foo];
  58130. - SyntaxKind.CloseAngle;[>];
  58131. - Markup span - Gen<Markup> - [<?xml foo bar baz?>] - SpanEditHandler;Accepts:None - (5:0,5) - Tokens:11
  58132. - SyntaxKind.OpenAngle;[<];
  58133. - SyntaxKind.QuestionMark;[?];
  58134. - SyntaxKind.Text;[xml];
  58135. - SyntaxKind.Whitespace;[ ];
  58136. - SyntaxKind.Text;[foo];
  58137. - SyntaxKind.Whitespace;[ ];
  58138. - SyntaxKind.Text;[bar];
  58139. - SyntaxKind.Whitespace;[ ];
  58140. - SyntaxKind.Text;[baz];
  58141. - SyntaxKind.QuestionMark;[?];
  58142. - SyntaxKind.CloseAngle;[>];
  58143. - Markup span - Gen<Markup> - [ baz] - SpanEditHandler;Accepts:Any - (24:0,24) - Tokens:2
  58144. - SyntaxKind.Whitespace;[ ];
  58145. - SyntaxKind.Text;[baz];
  58146. - Tag block - Gen<None> - 6 - (28:0,28)
  58147. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:None - (28:0,28) - Tokens:4
  58148. - SyntaxKind.OpenAngle;[<];
  58149. - SyntaxKind.ForwardSlash;[/];
  58150. - SyntaxKind.Text;[foo];
  58151. - SyntaxKind.CloseAngle;[>];
  58152. +MarkupBlock - [0..34)::34 - [<foo><?xml foo bar baz?> baz</foo>]
  58153. + MarkupTagBlock - [0..5)::5 - [<foo>]
  58154. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  58155. + OpenAngle;[<];
  58156. + Text;[foo];
  58157. + CloseAngle;[>];
  58158. + MarkupTextLiteral - [5..24)::19 - [<?xml foo bar baz?>] - Gen<Markup> - SpanEditHandler;Accepts:None
  58159. + OpenAngle;[<];
  58160. + QuestionMark;[?];
  58161. + Text;[xml];
  58162. + Whitespace;[ ];
  58163. + Text;[foo];
  58164. + Whitespace;[ ];
  58165. + Text;[bar];
  58166. + Whitespace;[ ];
  58167. + Text;[baz];
  58168. + QuestionMark;[?];
  58169. + CloseAngle;[>];
  58170. + MarkupTextLiteral - [24..28)::4 - [ baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58171. + Whitespace;[ ];
  58172. + Text;[baz];
  58173. + MarkupTagBlock - [28..34)::6 - [</foo>]
  58174. + MarkupTextLiteral - [28..34)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  58175. + OpenAngle;[<];
  58176. + ForwardSlash;[/];
  58177. + Text;[foo];
  58178. + CloseAngle;[>];
  58179. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TreatsMalformedTagsAsContent.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TreatsMalformedTagsAsContent.stree.txt
  58180. index 786946036fc..3ec892f4b00 100644
  58181. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TreatsMalformedTagsAsContent.stree.txt
  58182. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/TreatsMalformedTagsAsContent.stree.txt
  58183. @@ -1,17 +1,17 @@
  58184. -Markup block - Gen<None> - 18 - (0:0,0)
  58185. - Tag block - Gen<None> - 5 - (0:0,0)
  58186. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  58187. - SyntaxKind.OpenAngle;[<];
  58188. - SyntaxKind.Text;[foo];
  58189. - SyntaxKind.CloseAngle;[>];
  58190. - Tag block - Gen<None> - 13 - (5:0,5)
  58191. - Markup span - Gen<Markup> - [</!-- bar -->] - SpanEditHandler;Accepts:None - (5:0,5) - Tokens:9
  58192. - SyntaxKind.OpenAngle;[<];
  58193. - SyntaxKind.ForwardSlash;[/];
  58194. - SyntaxKind.Bang;[!];
  58195. - SyntaxKind.DoubleHyphen;[--];
  58196. - SyntaxKind.Whitespace;[ ];
  58197. - SyntaxKind.Text;[bar];
  58198. - SyntaxKind.Whitespace;[ ];
  58199. - SyntaxKind.DoubleHyphen;[--];
  58200. - SyntaxKind.CloseAngle;[>];
  58201. +MarkupBlock - [0..18)::18 - [<foo></!-- bar -->]
  58202. + MarkupTagBlock - [0..5)::5 - [<foo>]
  58203. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  58204. + OpenAngle;[<];
  58205. + Text;[foo];
  58206. + CloseAngle;[>];
  58207. + MarkupTagBlock - [5..18)::13 - [</!-- bar -->]
  58208. + MarkupTextLiteral - [5..18)::13 - [</!-- bar -->] - Gen<Markup> - SpanEditHandler;Accepts:None
  58209. + OpenAngle;[<];
  58210. + ForwardSlash;[/];
  58211. + Bang;[!];
  58212. + DoubleHyphen;[--];
  58213. + Whitespace;[ ];
  58214. + Text;[bar];
  58215. + Whitespace;[ ];
  58216. + DoubleHyphen;[--];
  58217. + CloseAngle;[>];
  58218. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/WithSelfClosingTagJustEmitsTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/WithSelfClosingTagJustEmitsTag.stree.txt
  58219. index a29dbc5d270..1e2015375dc 100644
  58220. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/WithSelfClosingTagJustEmitsTag.stree.txt
  58221. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlBlockTest/WithSelfClosingTagJustEmitsTag.stree.txt
  58222. @@ -1,8 +1,8 @@
  58223. -Markup block - Gen<None> - 7 - (0:0,0)
  58224. - Tag block - Gen<None> - 7 - (0:0,0)
  58225. - Markup span - Gen<Markup> - [<foo />] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:5
  58226. - SyntaxKind.OpenAngle;[<];
  58227. - SyntaxKind.Text;[foo];
  58228. - SyntaxKind.Whitespace;[ ];
  58229. - SyntaxKind.ForwardSlash;[/];
  58230. - SyntaxKind.CloseAngle;[>];
  58231. +MarkupBlock - [0..7)::7 - [<foo />]
  58232. + MarkupTagBlock - [0..7)::7 - [<foo />]
  58233. + MarkupTextLiteral - [0..7)::7 - [<foo />] - Gen<Markup> - SpanEditHandler;Accepts:None
  58234. + OpenAngle;[<];
  58235. + Text;[foo];
  58236. + Whitespace;[ ];
  58237. + ForwardSlash;[/];
  58238. + CloseAngle;[>];
  58239. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/AcceptsEndTagWithNoMatchingStartTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/AcceptsEndTagWithNoMatchingStartTag.stree.txt
  58240. index 0279f883d35..eb62248d237 100644
  58241. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/AcceptsEndTagWithNoMatchingStartTag.stree.txt
  58242. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/AcceptsEndTagWithNoMatchingStartTag.stree.txt
  58243. @@ -1,13 +1,14 @@
  58244. -Markup block - Gen<None> - 14 - (0:0,0)
  58245. - Markup span - Gen<Markup> - [Foo ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  58246. - SyntaxKind.Text;[Foo];
  58247. - SyntaxKind.Whitespace;[ ];
  58248. - Tag block - Gen<None> - 6 - (4:0,4)
  58249. - Markup span - Gen<Markup> - [</div>] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:4
  58250. - SyntaxKind.OpenAngle;[<];
  58251. - SyntaxKind.ForwardSlash;[/];
  58252. - SyntaxKind.Text;[div];
  58253. - SyntaxKind.CloseAngle;[>];
  58254. - Markup span - Gen<Markup> - [ Bar] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:2
  58255. - SyntaxKind.Whitespace;[ ];
  58256. - SyntaxKind.Text;[Bar];
  58257. +RazorDocument - [0..14)::14 - [Foo </div> Bar]
  58258. + MarkupBlock - [0..14)::14
  58259. + MarkupTextLiteral - [0..4)::4 - [Foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58260. + Text;[Foo];
  58261. + Whitespace;[ ];
  58262. + MarkupTagBlock - [4..10)::6 - [</div>]
  58263. + MarkupTextLiteral - [4..10)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58264. + OpenAngle;[<];
  58265. + ForwardSlash;[/];
  58266. + Text;[div];
  58267. + CloseAngle;[>];
  58268. + MarkupTextLiteral - [10..14)::4 - [ Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58269. + Whitespace;[ ];
  58270. + Text;[Bar];
  58271. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/AcceptsSwapTokenAtEndOfFileAndOutputsZeroLengthCodeSpan.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/AcceptsSwapTokenAtEndOfFileAndOutputsZeroLengthCodeSpan.stree.txt
  58272. index 111e681d84e..1b3a186cb62 100644
  58273. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/AcceptsSwapTokenAtEndOfFileAndOutputsZeroLengthCodeSpan.stree.txt
  58274. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/AcceptsSwapTokenAtEndOfFileAndOutputsZeroLengthCodeSpan.stree.txt
  58275. @@ -1,10 +1,14 @@
  58276. -Markup block - Gen<None> - 1 - (0:0,0)
  58277. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  58278. - SyntaxKind.Unknown;[];
  58279. - Expression block - Gen<Expr> - 1 - (0:0,0)
  58280. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  58281. - SyntaxKind.Transition;[@];
  58282. - Code span - Gen<Expr> - [] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:1
  58283. - SyntaxKind.Unknown;[];
  58284. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:1
  58285. - SyntaxKind.Unknown;[];
  58286. +RazorDocument - [0..1)::1 - [@]
  58287. + MarkupBlock - [0..1)::1
  58288. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58289. + Marker;[];
  58290. + CSharpCodeBlock - [0..1)::1
  58291. + CSharpImplicitExpression - [0..1)::1
  58292. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  58293. + Transition;[@];
  58294. + CSharpImplicitExpressionBody - [1..1)::0
  58295. + CSharpCodeBlock - [1..1)::0
  58296. + CSharpExpressionLiteral - [1..1)::0 - [] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  58297. + Marker;[];
  58298. + MarkupTextLiteral - [1..1)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58299. + Marker;[];
  58300. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/CorrectlyHandlesOddlySpacedHTMLElements.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/CorrectlyHandlesOddlySpacedHTMLElements.stree.txt
  58301. index 9e676d2db3a..62726a28991 100644
  58302. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/CorrectlyHandlesOddlySpacedHTMLElements.stree.txt
  58303. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/CorrectlyHandlesOddlySpacedHTMLElements.stree.txt
  58304. @@ -1,43 +1,48 @@
  58305. -Markup block - Gen<None> - 39 - (0:0,0)
  58306. - Tag block - Gen<None> - 6 - (0:0,0)
  58307. - Markup span - Gen<Markup> - [<div >] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:4
  58308. - SyntaxKind.OpenAngle;[<];
  58309. - SyntaxKind.Text;[div];
  58310. - SyntaxKind.Whitespace;[ ];
  58311. - SyntaxKind.CloseAngle;[>];
  58312. - Tag block - Gen<None> - 17 - (6:0,6)
  58313. - Markup span - Gen<Markup> - [<p] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:2
  58314. - SyntaxKind.OpenAngle;[<];
  58315. - SyntaxKind.Text;[p];
  58316. - Markup block - Gen<Attr:class, class = '@(8:0,8),'@(21:0,21)> - 14 - (8:0,8)
  58317. - Markup span - Gen<None> - [ class = '] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:6
  58318. - SyntaxKind.Whitespace;[ ];
  58319. - SyntaxKind.Text;[class];
  58320. - SyntaxKind.Whitespace;[ ];
  58321. - SyntaxKind.Equals;[=];
  58322. - SyntaxKind.Whitespace;[ ];
  58323. - SyntaxKind.SingleQuote;['];
  58324. - Markup span - Gen<LitAttr:@(18:0,18)> - [bar] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:1
  58325. - SyntaxKind.Text;[bar];
  58326. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:1
  58327. - SyntaxKind.SingleQuote;['];
  58328. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:1
  58329. - SyntaxKind.CloseAngle;[>];
  58330. - SyntaxKind.HtmlTextLiteral - [ Foo ] - [23..28) - FullWidth: 5 - Slots: 1
  58331. - SyntaxKind.List - [ Foo ] - [23..28) - FullWidth: 5 - Slots: 3
  58332. - SyntaxKind.Whitespace;[ ];
  58333. - SyntaxKind.Text;[Foo];
  58334. - SyntaxKind.Whitespace;[ ];
  58335. - Tag block - Gen<None> - 4 - (28:0,28)
  58336. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (28:0,28) - Tokens:4
  58337. - SyntaxKind.OpenAngle;[<];
  58338. - SyntaxKind.ForwardSlash;[/];
  58339. - SyntaxKind.Text;[p];
  58340. - SyntaxKind.CloseAngle;[>];
  58341. - Tag block - Gen<None> - 7 - (32:0,32)
  58342. - Markup span - Gen<Markup> - [</div >] - SpanEditHandler;Accepts:Any - (32:0,32) - Tokens:5
  58343. - SyntaxKind.OpenAngle;[<];
  58344. - SyntaxKind.ForwardSlash;[/];
  58345. - SyntaxKind.Text;[div];
  58346. - SyntaxKind.Whitespace;[ ];
  58347. - SyntaxKind.CloseAngle;[>];
  58348. +RazorDocument - [0..39)::39 - [<div ><p class = 'bar'> Foo </p></div >]
  58349. + MarkupBlock - [0..39)::39
  58350. + MarkupTagBlock - [0..6)::6 - [<div >]
  58351. + MarkupTextLiteral - [0..6)::6 - [<div >] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58352. + OpenAngle;[<];
  58353. + Text;[div];
  58354. + Whitespace;[ ];
  58355. + CloseAngle;[>];
  58356. + MarkupTagBlock - [6..23)::17 - [<p class = 'bar'>]
  58357. + MarkupTextLiteral - [6..8)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58358. + OpenAngle;[<];
  58359. + Text;[p];
  58360. + MarkupAttributeBlock - [8..22)::14 - [ class = 'bar']
  58361. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58362. + Whitespace;[ ];
  58363. + MarkupTextLiteral - [9..14)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58364. + Text;[class];
  58365. + MarkupTextLiteral - [14..15)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58366. + Whitespace;[ ];
  58367. + Equals;[=];
  58368. + MarkupTextLiteral - [16..18)::2 - [ '] - Gen<None> - SpanEditHandler;Accepts:Any
  58369. + Whitespace;[ ];
  58370. + SingleQuote;['];
  58371. + GenericBlock - [18..21)::3
  58372. + MarkupLiteralAttributeValue - [18..21)::3 - [bar]
  58373. + MarkupTextLiteral - [18..21)::3 - [bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58374. + Text;[bar];
  58375. + MarkupTextLiteral - [21..22)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  58376. + SingleQuote;['];
  58377. + MarkupTextLiteral - [22..23)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58378. + CloseAngle;[>];
  58379. + MarkupTextLiteral - [23..28)::5 - [ Foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58380. + Whitespace;[ ];
  58381. + Text;[Foo];
  58382. + Whitespace;[ ];
  58383. + MarkupTagBlock - [28..32)::4 - [</p>]
  58384. + MarkupTextLiteral - [28..32)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58385. + OpenAngle;[<];
  58386. + ForwardSlash;[/];
  58387. + Text;[p];
  58388. + CloseAngle;[>];
  58389. + MarkupTagBlock - [32..39)::7 - [</div >]
  58390. + MarkupTextLiteral - [32..39)::7 - [</div >] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58391. + OpenAngle;[<];
  58392. + ForwardSlash;[/];
  58393. + Text;[div];
  58394. + Whitespace;[ ];
  58395. + CloseAngle;[>];
  58396. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/CorrectlyHandlesSingleLineOfMarkupWithEmbeddedStatement.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/CorrectlyHandlesSingleLineOfMarkupWithEmbeddedStatement.stree.txt
  58397. index b57b9fee53f..0822f48a4e6 100644
  58398. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/CorrectlyHandlesSingleLineOfMarkupWithEmbeddedStatement.stree.txt
  58399. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/CorrectlyHandlesSingleLineOfMarkupWithEmbeddedStatement.stree.txt
  58400. @@ -1,30 +1,30 @@
  58401. -Markup block - Gen<None> - 31 - (0:0,0)
  58402. - Tag block - Gen<None> - 5 - (0:0,0)
  58403. - Markup span - Gen<Markup> - [<div>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  58404. - SyntaxKind.OpenAngle;[<];
  58405. - SyntaxKind.Text;[div];
  58406. - SyntaxKind.CloseAngle;[>];
  58407. - Markup span - Gen<Markup> - [Foo ] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:2
  58408. - SyntaxKind.Text;[Foo];
  58409. - SyntaxKind.Whitespace;[ ];
  58410. - Statement block - Gen<None> - 12 - (9:0,9)
  58411. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (9:0,9) - Tokens:1
  58412. - SyntaxKind.Transition;[@];
  58413. - Code span - Gen<Stmt> - [if(true) {}] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:7
  58414. - SyntaxKind.Keyword;[if];
  58415. - SyntaxKind.LeftParenthesis;[(];
  58416. - SyntaxKind.Keyword;[true];
  58417. - SyntaxKind.RightParenthesis;[)];
  58418. - SyntaxKind.Whitespace;[ ];
  58419. - SyntaxKind.LeftBrace;[{];
  58420. - SyntaxKind.RightBrace;[}];
  58421. - SyntaxKind.HtmlTextLiteral - [ Bar] - [21..25) - FullWidth: 4 - Slots: 1
  58422. - SyntaxKind.List - [ Bar] - [21..25) - FullWidth: 4 - Slots: 2
  58423. - SyntaxKind.Whitespace;[ ];
  58424. - SyntaxKind.Text;[Bar];
  58425. - Tag block - Gen<None> - 6 - (25:0,25)
  58426. - Markup span - Gen<Markup> - [</div>] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:4
  58427. - SyntaxKind.OpenAngle;[<];
  58428. - SyntaxKind.ForwardSlash;[/];
  58429. - SyntaxKind.Text;[div];
  58430. - SyntaxKind.CloseAngle;[>];
  58431. +RazorDocument - [0..31)::31 - [<div>Foo @if(true) {} Bar</div>]
  58432. + MarkupBlock - [0..31)::31
  58433. + MarkupTagBlock - [0..5)::5 - [<div>]
  58434. + MarkupTextLiteral - [0..5)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58435. + OpenAngle;[<];
  58436. + Text;[div];
  58437. + CloseAngle;[>];
  58438. + MarkupTextLiteral - [5..9)::4 - [Foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58439. + Text;[Foo];
  58440. + Whitespace;[ ];
  58441. + CSharpCodeBlock - [9..21)::12
  58442. + CSharpTransition - [9..10)::1 - Gen<None> - SpanEditHandler;Accepts:None
  58443. + Transition;[@];
  58444. + CSharpStatementLiteral - [10..21)::11 - [if(true) {}] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  58445. + Keyword;[if];
  58446. + LeftParenthesis;[(];
  58447. + Keyword;[true];
  58448. + RightParenthesis;[)];
  58449. + Whitespace;[ ];
  58450. + LeftBrace;[{];
  58451. + RightBrace;[}];
  58452. + MarkupTextLiteral - [21..25)::4 - [ Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58453. + Whitespace;[ ];
  58454. + Text;[Bar];
  58455. + MarkupTagBlock - [25..31)::6 - [</div>]
  58456. + MarkupTextLiteral - [25..31)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58457. + OpenAngle;[<];
  58458. + ForwardSlash;[/];
  58459. + Text;[div];
  58460. + CloseAngle;[>];
  58461. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotIgnoreNewLineAtTheEndOfMarkupBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotIgnoreNewLineAtTheEndOfMarkupBlock.stree.txt
  58462. index 39886635d99..2f8c946bdef 100644
  58463. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotIgnoreNewLineAtTheEndOfMarkupBlock.stree.txt
  58464. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotIgnoreNewLineAtTheEndOfMarkupBlock.stree.txt
  58465. @@ -1,21 +1,25 @@
  58466. -Markup block - Gen<None> - 15 - (0:0,0)
  58467. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  58468. - SyntaxKind.Unknown;[];
  58469. - Statement block - Gen<None> - 5 - (0:0,0)
  58470. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  58471. - SyntaxKind.Transition;[@];
  58472. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  58473. - SyntaxKind.LeftBrace;[{];
  58474. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (2:0,2) - Tokens:1
  58475. - SyntaxKind.NewLine;[LF];
  58476. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (4:1,0) - Tokens:1
  58477. - SyntaxKind.RightBrace;[}];
  58478. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (5:1,1) - Tokens:1
  58479. - SyntaxKind.NewLine;[LF];
  58480. - Tag block - Gen<None> - 6 - (7:2,0)
  58481. - Markup span - Gen<Markup> - [<html>] - SpanEditHandler;Accepts:Any - (7:2,0) - Tokens:3
  58482. - SyntaxKind.OpenAngle;[<];
  58483. - SyntaxKind.Text;[html];
  58484. - SyntaxKind.CloseAngle;[>];
  58485. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:Any - (13:2,6) - Tokens:1
  58486. - SyntaxKind.NewLine;[LF];
  58487. +RazorDocument - [0..15)::15 - [@{LF}LF<html>LF]
  58488. + MarkupBlock - [0..15)::15
  58489. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58490. + Marker;[];
  58491. + CSharpCodeBlock - [0..5)::5
  58492. + CSharpStatement - [0..5)::5
  58493. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  58494. + Transition;[@];
  58495. + CSharpStatementBody - [1..5)::4
  58496. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  58497. + LeftBrace;[{];
  58498. + CSharpCodeBlock - [2..4)::2
  58499. + CSharpStatementLiteral - [2..4)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  58500. + NewLine;[LF];
  58501. + RazorMetaCode - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  58502. + RightBrace;[}];
  58503. + MarkupEphemeralTextLiteral - [5..7)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  58504. + NewLine;[LF];
  58505. + MarkupTagBlock - [7..13)::6 - [<html>]
  58506. + MarkupTextLiteral - [7..13)::6 - [<html>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58507. + OpenAngle;[<];
  58508. + Text;[html];
  58509. + CloseAngle;[>];
  58510. + MarkupTextLiteral - [13..15)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58511. + NewLine;[LF];
  58512. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotIgnoreWhitespaceAtTheEndOfVerbatimBlockIfNoNewlinePresent.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotIgnoreWhitespaceAtTheEndOfVerbatimBlockIfNoNewlinePresent.stree.txt
  58513. index e6d7acb56eb..da3662cee2b 100644
  58514. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotIgnoreWhitespaceAtTheEndOfVerbatimBlockIfNoNewlinePresent.stree.txt
  58515. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotIgnoreWhitespaceAtTheEndOfVerbatimBlockIfNoNewlinePresent.stree.txt
  58516. @@ -1,21 +1,25 @@
  58517. -Markup block - Gen<None> - 17 - (0:0,0)
  58518. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  58519. - SyntaxKind.Unknown;[];
  58520. - Statement block - Gen<None> - 5 - (0:0,0)
  58521. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  58522. - SyntaxKind.Transition;[@];
  58523. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  58524. - SyntaxKind.LeftBrace;[{];
  58525. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (2:0,2) - Tokens:1
  58526. - SyntaxKind.NewLine;[LF];
  58527. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (4:1,0) - Tokens:1
  58528. - SyntaxKind.RightBrace;[}];
  58529. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (5:1,1) - Tokens:1
  58530. - SyntaxKind.Whitespace;[ ];
  58531. - Tag block - Gen<None> - 6 - (9:1,5)
  58532. - Markup span - Gen<Markup> - [<html>] - SpanEditHandler;Accepts:Any - (9:1,5) - Tokens:3
  58533. - SyntaxKind.OpenAngle;[<];
  58534. - SyntaxKind.Text;[html];
  58535. - SyntaxKind.CloseAngle;[>];
  58536. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:Any - (15:1,11) - Tokens:1
  58537. - SyntaxKind.NewLine;[LF];
  58538. +RazorDocument - [0..17)::17 - [@{LF} <html>LF]
  58539. + MarkupBlock - [0..17)::17
  58540. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58541. + Marker;[];
  58542. + CSharpCodeBlock - [0..5)::5
  58543. + CSharpStatement - [0..5)::5
  58544. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  58545. + Transition;[@];
  58546. + CSharpStatementBody - [1..5)::4
  58547. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  58548. + LeftBrace;[{];
  58549. + CSharpCodeBlock - [2..4)::2
  58550. + CSharpStatementLiteral - [2..4)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  58551. + NewLine;[LF];
  58552. + RazorMetaCode - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  58553. + RightBrace;[}];
  58554. + MarkupTextLiteral - [5..9)::4 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58555. + Whitespace;[ ];
  58556. + MarkupTagBlock - [9..15)::6 - [<html>]
  58557. + MarkupTextLiteral - [9..15)::6 - [<html>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58558. + OpenAngle;[<];
  58559. + Text;[html];
  58560. + CloseAngle;[>];
  58561. + MarkupTextLiteral - [15..17)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58562. + NewLine;[LF];
  58563. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotRenderExtraNewLineAtTheEndOfVerbatimBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotRenderExtraNewLineAtTheEndOfVerbatimBlock.stree.txt
  58564. index 9a418f9298c..fcbe43d6d3c 100644
  58565. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotRenderExtraNewLineAtTheEndOfVerbatimBlock.stree.txt
  58566. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotRenderExtraNewLineAtTheEndOfVerbatimBlock.stree.txt
  58567. @@ -1,19 +1,23 @@
  58568. -Markup block - Gen<None> - 13 - (0:0,0)
  58569. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  58570. - SyntaxKind.Unknown;[];
  58571. - Statement block - Gen<None> - 5 - (0:0,0)
  58572. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  58573. - SyntaxKind.Transition;[@];
  58574. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  58575. - SyntaxKind.LeftBrace;[{];
  58576. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (2:0,2) - Tokens:1
  58577. - SyntaxKind.NewLine;[LF];
  58578. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (4:1,0) - Tokens:1
  58579. - SyntaxKind.RightBrace;[}];
  58580. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (5:1,1) - Tokens:1
  58581. - SyntaxKind.NewLine;[LF];
  58582. - Tag block - Gen<None> - 6 - (7:2,0)
  58583. - Markup span - Gen<Markup> - [<html>] - SpanEditHandler;Accepts:Any - (7:2,0) - Tokens:3
  58584. - SyntaxKind.OpenAngle;[<];
  58585. - SyntaxKind.Text;[html];
  58586. - SyntaxKind.CloseAngle;[>];
  58587. +RazorDocument - [0..13)::13 - [@{LF}LF<html>]
  58588. + MarkupBlock - [0..13)::13
  58589. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58590. + Marker;[];
  58591. + CSharpCodeBlock - [0..5)::5
  58592. + CSharpStatement - [0..5)::5
  58593. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  58594. + Transition;[@];
  58595. + CSharpStatementBody - [1..5)::4
  58596. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  58597. + LeftBrace;[{];
  58598. + CSharpCodeBlock - [2..4)::2
  58599. + CSharpStatementLiteral - [2..4)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  58600. + NewLine;[LF];
  58601. + RazorMetaCode - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  58602. + RightBrace;[}];
  58603. + MarkupEphemeralTextLiteral - [5..7)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  58604. + NewLine;[LF];
  58605. + MarkupTagBlock - [7..13)::6 - [<html>]
  58606. + MarkupTextLiteral - [7..13)::6 - [<html>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58607. + OpenAngle;[<];
  58608. + Text;[html];
  58609. + CloseAngle;[>];
  58610. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotRenderExtraWhitespaceAndNewLineAtTheEndOfVerbatimBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotRenderExtraWhitespaceAndNewLineAtTheEndOfVerbatimBlock.stree.txt
  58611. index ef473190e28..446309a6566 100644
  58612. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotRenderExtraWhitespaceAndNewLineAtTheEndOfVerbatimBlock.stree.txt
  58613. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotRenderExtraWhitespaceAndNewLineAtTheEndOfVerbatimBlock.stree.txt
  58614. @@ -1,20 +1,24 @@
  58615. -Markup block - Gen<None> - 15 - (0:0,0)
  58616. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  58617. - SyntaxKind.Unknown;[];
  58618. - Statement block - Gen<None> - 5 - (0:0,0)
  58619. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  58620. - SyntaxKind.Transition;[@];
  58621. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  58622. - SyntaxKind.LeftBrace;[{];
  58623. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (2:0,2) - Tokens:1
  58624. - SyntaxKind.NewLine;[LF];
  58625. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (4:1,0) - Tokens:1
  58626. - SyntaxKind.RightBrace;[}];
  58627. - Markup span - Gen<None> - [ LF] - SpanEditHandler;Accepts:Any - (5:1,1) - Tokens:2
  58628. - SyntaxKind.Whitespace;[ ];
  58629. - SyntaxKind.NewLine;[LF];
  58630. - Tag block - Gen<None> - 6 - (9:2,0)
  58631. - Markup span - Gen<Markup> - [<html>] - SpanEditHandler;Accepts:Any - (9:2,0) - Tokens:3
  58632. - SyntaxKind.OpenAngle;[<];
  58633. - SyntaxKind.Text;[html];
  58634. - SyntaxKind.CloseAngle;[>];
  58635. +RazorDocument - [0..15)::15 - [@{LF} LF<html>]
  58636. + MarkupBlock - [0..15)::15
  58637. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58638. + Marker;[];
  58639. + CSharpCodeBlock - [0..5)::5
  58640. + CSharpStatement - [0..5)::5
  58641. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  58642. + Transition;[@];
  58643. + CSharpStatementBody - [1..5)::4
  58644. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  58645. + LeftBrace;[{];
  58646. + CSharpCodeBlock - [2..4)::2
  58647. + CSharpStatementLiteral - [2..4)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  58648. + NewLine;[LF];
  58649. + RazorMetaCode - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  58650. + RightBrace;[}];
  58651. + MarkupEphemeralTextLiteral - [5..9)::4 - [ LF] - Gen<None> - SpanEditHandler;Accepts:Any
  58652. + Whitespace;[ ];
  58653. + NewLine;[LF];
  58654. + MarkupTagBlock - [9..15)::6 - [<html>]
  58655. + MarkupTextLiteral - [9..15)::6 - [<html>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58656. + OpenAngle;[<];
  58657. + Text;[html];
  58658. + CloseAngle;[>];
  58659. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotRenderNewlineAfterTextTagInVerbatimBlockIfFollowedByCSharp.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotRenderNewlineAfterTextTagInVerbatimBlockIfFollowedByCSharp.stree.txt
  58660. index a0171c8cda8..99cd6a1e76f 100644
  58661. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotRenderNewlineAfterTextTagInVerbatimBlockIfFollowedByCSharp.stree.txt
  58662. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotRenderNewlineAfterTextTagInVerbatimBlockIfFollowedByCSharp.stree.txt
  58663. @@ -1,32 +1,36 @@
  58664. -Markup block - Gen<None> - 30 - (0:0,0)
  58665. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  58666. - SyntaxKind.Unknown;[];
  58667. - Statement block - Gen<None> - 24 - (0:0,0)
  58668. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  58669. - SyntaxKind.Transition;[@];
  58670. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  58671. - SyntaxKind.LeftBrace;[{];
  58672. - Markup block - Gen<None> - 17 - (2:0,2)
  58673. - Tag block - Gen<None> - 6 - (2:0,2)
  58674. - Transition span - Gen<None> - [<text>] - SpanEditHandler;Accepts:None - (2:0,2) - Tokens:3
  58675. - SyntaxKind.OpenAngle;[<];
  58676. - SyntaxKind.Text;[text];
  58677. - SyntaxKind.CloseAngle;[>];
  58678. - Markup span - Gen<Markup> - [Blah] - SpanEditHandler;Accepts:None - (8:0,8) - Tokens:1
  58679. - SyntaxKind.Text;[Blah];
  58680. - Tag block - Gen<None> - 7 - (12:0,12)
  58681. - Transition span - Gen<None> - [</text>] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:4
  58682. - SyntaxKind.OpenAngle;[<];
  58683. - SyntaxKind.ForwardSlash;[/];
  58684. - SyntaxKind.Text;[text];
  58685. - SyntaxKind.CloseAngle;[>];
  58686. - Code span - Gen<Stmt> - [LFLF] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:2
  58687. - SyntaxKind.NewLine;[LF];
  58688. - SyntaxKind.NewLine;[LF];
  58689. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (23:2,0) - Tokens:1
  58690. - SyntaxKind.RightBrace;[}];
  58691. - Tag block - Gen<None> - 6 - (24:2,1)
  58692. - Markup span - Gen<Markup> - [<html>] - SpanEditHandler;Accepts:Any - (24:2,1) - Tokens:3
  58693. - SyntaxKind.OpenAngle;[<];
  58694. - SyntaxKind.Text;[html];
  58695. - SyntaxKind.CloseAngle;[>];
  58696. +RazorDocument - [0..30)::30 - [@{<text>Blah</text>LFLF}<html>]
  58697. + MarkupBlock - [0..30)::30
  58698. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58699. + Marker;[];
  58700. + CSharpCodeBlock - [0..24)::24
  58701. + CSharpStatement - [0..24)::24
  58702. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  58703. + Transition;[@];
  58704. + CSharpStatementBody - [1..24)::23
  58705. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  58706. + LeftBrace;[{];
  58707. + CSharpCodeBlock - [2..23)::21
  58708. + MarkupBlock - [2..19)::17
  58709. + MarkupTagBlock - [2..8)::6 - [<text>]
  58710. + MarkupTransition - [2..8)::6 - Gen<None> - SpanEditHandler;Accepts:None
  58711. + OpenAngle;[<];
  58712. + Text;[text];
  58713. + CloseAngle;[>];
  58714. + MarkupTextLiteral - [8..12)::4 - [Blah] - Gen<Markup> - SpanEditHandler;Accepts:None
  58715. + Text;[Blah];
  58716. + MarkupTagBlock - [12..19)::7 - [</text>]
  58717. + MarkupTransition - [12..19)::7 - Gen<None> - SpanEditHandler;Accepts:None
  58718. + OpenAngle;[<];
  58719. + ForwardSlash;[/];
  58720. + Text;[text];
  58721. + CloseAngle;[>];
  58722. + CSharpStatementLiteral - [19..23)::4 - [LFLF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  58723. + NewLine;[LF];
  58724. + NewLine;[LF];
  58725. + RazorMetaCode - [23..24)::1 - Gen<None> - SpanEditHandler;Accepts:None
  58726. + RightBrace;[}];
  58727. + MarkupTagBlock - [24..30)::6 - [<html>]
  58728. + MarkupTextLiteral - [24..30)::6 - [<html>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58729. + OpenAngle;[<];
  58730. + Text;[html];
  58731. + CloseAngle;[>];
  58732. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotReturnErrorOnMismatchedTags.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotReturnErrorOnMismatchedTags.stree.txt
  58733. index dad631ec5ca..d8bdb6a6187 100644
  58734. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotReturnErrorOnMismatchedTags.stree.txt
  58735. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotReturnErrorOnMismatchedTags.stree.txt
  58736. @@ -1,29 +1,30 @@
  58737. -Markup block - Gen<None> - 24 - (0:0,0)
  58738. - Markup span - Gen<Markup> - [Foo ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  58739. - SyntaxKind.Text;[Foo];
  58740. - SyntaxKind.Whitespace;[ ];
  58741. - Tag block - Gen<None> - 5 - (4:0,4)
  58742. - Markup span - Gen<Markup> - [<div>] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:3
  58743. - SyntaxKind.OpenAngle;[<];
  58744. - SyntaxKind.Text;[div];
  58745. - SyntaxKind.CloseAngle;[>];
  58746. - Tag block - Gen<None> - 3 - (9:0,9)
  58747. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:3
  58748. - SyntaxKind.OpenAngle;[<];
  58749. - SyntaxKind.Text;[p];
  58750. - SyntaxKind.CloseAngle;[>];
  58751. - Tag block - Gen<None> - 4 - (12:0,12)
  58752. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:4
  58753. - SyntaxKind.OpenAngle;[<];
  58754. - SyntaxKind.ForwardSlash;[/];
  58755. - SyntaxKind.Text;[p];
  58756. - SyntaxKind.CloseAngle;[>];
  58757. - Tag block - Gen<None> - 4 - (16:0,16)
  58758. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:4
  58759. - SyntaxKind.OpenAngle;[<];
  58760. - SyntaxKind.ForwardSlash;[/];
  58761. - SyntaxKind.Text;[p];
  58762. - SyntaxKind.CloseAngle;[>];
  58763. - Markup span - Gen<Markup> - [ Baz] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:2
  58764. - SyntaxKind.Whitespace;[ ];
  58765. - SyntaxKind.Text;[Baz];
  58766. +RazorDocument - [0..24)::24 - [Foo <div><p></p></p> Baz]
  58767. + MarkupBlock - [0..24)::24
  58768. + MarkupTextLiteral - [0..4)::4 - [Foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58769. + Text;[Foo];
  58770. + Whitespace;[ ];
  58771. + MarkupTagBlock - [4..9)::5 - [<div>]
  58772. + MarkupTextLiteral - [4..9)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58773. + OpenAngle;[<];
  58774. + Text;[div];
  58775. + CloseAngle;[>];
  58776. + MarkupTagBlock - [9..12)::3 - [<p>]
  58777. + MarkupTextLiteral - [9..12)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58778. + OpenAngle;[<];
  58779. + Text;[p];
  58780. + CloseAngle;[>];
  58781. + MarkupTagBlock - [12..16)::4 - [</p>]
  58782. + MarkupTextLiteral - [12..16)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58783. + OpenAngle;[<];
  58784. + ForwardSlash;[/];
  58785. + Text;[p];
  58786. + CloseAngle;[>];
  58787. + MarkupTagBlock - [16..20)::4 - [</p>]
  58788. + MarkupTextLiteral - [16..20)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58789. + OpenAngle;[<];
  58790. + ForwardSlash;[/];
  58791. + Text;[p];
  58792. + CloseAngle;[>];
  58793. + MarkupTextLiteral - [20..24)::4 - [ Baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58794. + Whitespace;[ ];
  58795. + Text;[Baz];
  58796. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotSwitchToCodeOnEmailAddressInAttribute.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotSwitchToCodeOnEmailAddressInAttribute.stree.txt
  58797. index d0b467e5d8f..a5bfee0c7fb 100644
  58798. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotSwitchToCodeOnEmailAddressInAttribute.stree.txt
  58799. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/DoesNotSwitchToCodeOnEmailAddressInAttribute.stree.txt
  58800. @@ -1,28 +1,32 @@
  58801. -Markup block - Gen<None> - 51 - (0:0,0)
  58802. - Tag block - Gen<None> - 39 - (0:0,0)
  58803. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  58804. - SyntaxKind.OpenAngle;[<];
  58805. - SyntaxKind.Text;[a];
  58806. - Markup block - Gen<Attr:href, href="@(2:0,2),"@(37:0,37)> - 36 - (2:0,2)
  58807. - Markup span - Gen<None> - [ href="] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:4
  58808. - SyntaxKind.Whitespace;[ ];
  58809. - SyntaxKind.Text;[href];
  58810. - SyntaxKind.Equals;[=];
  58811. - SyntaxKind.DoubleQuote;["];
  58812. - Markup span - Gen<LitAttr:@(9:0,9)> - [mailto:[email protected]] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:1
  58813. - SyntaxKind.Text;[mailto:[email protected]];
  58814. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (37:0,37) - Tokens:1
  58815. - SyntaxKind.DoubleQuote;["];
  58816. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (38:0,38) - Tokens:1
  58817. - SyntaxKind.CloseAngle;[>];
  58818. - SyntaxKind.HtmlTextLiteral - [Email me] - [39..47) - FullWidth: 8 - Slots: 1
  58819. - SyntaxKind.List - [Email me] - [39..47) - FullWidth: 8 - Slots: 3
  58820. - SyntaxKind.Text;[Email];
  58821. - SyntaxKind.Whitespace;[ ];
  58822. - SyntaxKind.Text;[me];
  58823. - Tag block - Gen<None> - 4 - (47:0,47)
  58824. - Markup span - Gen<Markup> - [</a>] - SpanEditHandler;Accepts:Any - (47:0,47) - Tokens:4
  58825. - SyntaxKind.OpenAngle;[<];
  58826. - SyntaxKind.ForwardSlash;[/];
  58827. - SyntaxKind.Text;[a];
  58828. - SyntaxKind.CloseAngle;[>];
  58829. +RazorDocument - [0..51)::51 - [<a href="mailto:[email protected]">Email me</a>]
  58830. + MarkupBlock - [0..51)::51
  58831. + MarkupTagBlock - [0..39)::39 - [<a href="mailto:[email protected]">]
  58832. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58833. + OpenAngle;[<];
  58834. + Text;[a];
  58835. + MarkupAttributeBlock - [2..38)::36 - [ href="mailto:[email protected]"]
  58836. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58837. + Whitespace;[ ];
  58838. + MarkupTextLiteral - [3..7)::4 - [href] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58839. + Text;[href];
  58840. + Equals;[=];
  58841. + MarkupTextLiteral - [8..9)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  58842. + DoubleQuote;["];
  58843. + GenericBlock - [9..37)::28
  58844. + MarkupLiteralAttributeValue - [9..37)::28 - [mailto:[email protected]]
  58845. + MarkupTextLiteral - [9..37)::28 - [mailto:[email protected]] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58846. + Text;[mailto:[email protected]];
  58847. + MarkupTextLiteral - [37..38)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  58848. + DoubleQuote;["];
  58849. + MarkupTextLiteral - [38..39)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58850. + CloseAngle;[>];
  58851. + MarkupTextLiteral - [39..47)::8 - [Email me] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58852. + Text;[Email];
  58853. + Whitespace;[ ];
  58854. + Text;[me];
  58855. + MarkupTagBlock - [47..51)::4 - [</a>]
  58856. + MarkupTextLiteral - [47..51)::4 - [</a>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58857. + OpenAngle;[<];
  58858. + ForwardSlash;[/];
  58859. + Text;[a];
  58860. + CloseAngle;[>];
  58861. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/EmitsAtSignAsMarkupIfAtEndOfFile.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/EmitsAtSignAsMarkupIfAtEndOfFile.stree.txt
  58862. index 96e511bc7ce..5f52cafebab 100644
  58863. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/EmitsAtSignAsMarkupIfAtEndOfFile.stree.txt
  58864. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/EmitsAtSignAsMarkupIfAtEndOfFile.stree.txt
  58865. @@ -1,11 +1,15 @@
  58866. -Markup block - Gen<None> - 5 - (0:0,0)
  58867. - Markup span - Gen<Markup> - [foo ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  58868. - SyntaxKind.Text;[foo];
  58869. - SyntaxKind.Whitespace;[ ];
  58870. - Expression block - Gen<Expr> - 1 - (4:0,4)
  58871. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (4:0,4) - Tokens:1
  58872. - SyntaxKind.Transition;[@];
  58873. - Code span - Gen<Expr> - [] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (5:0,5) - Tokens:1
  58874. - SyntaxKind.Unknown;[];
  58875. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:1
  58876. - SyntaxKind.Unknown;[];
  58877. +RazorDocument - [0..5)::5 - [foo @]
  58878. + MarkupBlock - [0..5)::5
  58879. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58880. + Text;[foo];
  58881. + Whitespace;[ ];
  58882. + CSharpCodeBlock - [4..5)::1
  58883. + CSharpImplicitExpression - [4..5)::1
  58884. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  58885. + Transition;[@];
  58886. + CSharpImplicitExpressionBody - [5..5)::0
  58887. + CSharpCodeBlock - [5..5)::0
  58888. + CSharpExpressionLiteral - [5..5)::0 - [] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  58889. + Marker;[];
  58890. + MarkupTextLiteral - [5..5)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58891. + Marker;[];
  58892. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/EmitsCodeBlockIfFirstCharacterIsSwapCharacter.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/EmitsCodeBlockIfFirstCharacterIsSwapCharacter.stree.txt
  58893. index bb5a42cd075..14decc3757f 100644
  58894. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/EmitsCodeBlockIfFirstCharacterIsSwapCharacter.stree.txt
  58895. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/EmitsCodeBlockIfFirstCharacterIsSwapCharacter.stree.txt
  58896. @@ -1,10 +1,14 @@
  58897. -Markup block - Gen<None> - 4 - (0:0,0)
  58898. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  58899. - SyntaxKind.Unknown;[];
  58900. - Expression block - Gen<Expr> - 4 - (0:0,0)
  58901. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  58902. - SyntaxKind.Transition;[@];
  58903. - Code span - Gen<Expr> - [bar] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (1:0,1) - Tokens:1
  58904. - SyntaxKind.Identifier;[bar];
  58905. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  58906. - SyntaxKind.Unknown;[];
  58907. +RazorDocument - [0..4)::4 - [@bar]
  58908. + MarkupBlock - [0..4)::4
  58909. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58910. + Marker;[];
  58911. + CSharpCodeBlock - [0..4)::4
  58912. + CSharpImplicitExpression - [0..4)::4
  58913. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  58914. + Transition;[@];
  58915. + CSharpImplicitExpressionBody - [1..4)::3
  58916. + CSharpCodeBlock - [1..4)::3
  58917. + CSharpExpressionLiteral - [1..4)::3 - [bar] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  58918. + Identifier;[bar];
  58919. + MarkupTextLiteral - [4..4)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58920. + Marker;[];
  58921. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/HandlesExtraNewLineBeforeMarkupInNestedBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/HandlesExtraNewLineBeforeMarkupInNestedBlock.stree.txt
  58922. index 233594530a5..be711bcf295 100644
  58923. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/HandlesExtraNewLineBeforeMarkupInNestedBlock.stree.txt
  58924. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/HandlesExtraNewLineBeforeMarkupInNestedBlock.stree.txt
  58925. @@ -1,42 +1,46 @@
  58926. -Markup block - Gen<None> - 37 - (0:0,0)
  58927. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  58928. - SyntaxKind.Unknown;[];
  58929. - Statement block - Gen<None> - 31 - (0:0,0)
  58930. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  58931. - SyntaxKind.Transition;[@];
  58932. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  58933. - SyntaxKind.LeftBrace;[{];
  58934. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (2:0,2) - Tokens:1
  58935. - SyntaxKind.NewLine;[LF];
  58936. - Statement block - Gen<None> - 13 - (4:1,0)
  58937. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (4:1,0) - Tokens:1
  58938. - SyntaxKind.Transition;[@];
  58939. - Code span - Gen<Stmt> - [if(true){LF}] - SpanEditHandler;Accepts:Any - (5:1,1) - Tokens:7
  58940. - SyntaxKind.Keyword;[if];
  58941. - SyntaxKind.LeftParenthesis;[(];
  58942. - SyntaxKind.Keyword;[true];
  58943. - SyntaxKind.RightParenthesis;[)];
  58944. - SyntaxKind.LeftBrace;[{];
  58945. - SyntaxKind.NewLine;[LF];
  58946. - SyntaxKind.RightBrace;[}];
  58947. - Code span - Gen<Stmt> - [ LF] - SpanEditHandler;Accepts:Any - (17:2,1) - Tokens:2
  58948. - SyntaxKind.Whitespace;[ ];
  58949. - SyntaxKind.NewLine;[LF];
  58950. - Markup block - Gen<None> - 10 - (20:3,0)
  58951. - Tag block - Gen<None> - 7 - (20:3,0)
  58952. - Markup span - Gen<Markup> - [<input>] - SpanEditHandler;Accepts:None - (20:3,0) - Tokens:3
  58953. - SyntaxKind.OpenAngle;[<];
  58954. - SyntaxKind.Text;[input];
  58955. - SyntaxKind.CloseAngle;[>];
  58956. - Markup span - Gen<Markup> - [ LF] - SpanEditHandler;Accepts:None - (27:3,7) - Tokens:2
  58957. - SyntaxKind.Whitespace;[ ];
  58958. - SyntaxKind.NewLine;[LF];
  58959. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (30:4,0) - Tokens:1
  58960. - SyntaxKind.Unknown;[];
  58961. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (30:4,0) - Tokens:1
  58962. - SyntaxKind.RightBrace;[}];
  58963. - Tag block - Gen<None> - 6 - (31:4,1)
  58964. - Markup span - Gen<Markup> - [<html>] - SpanEditHandler;Accepts:Any - (31:4,1) - Tokens:3
  58965. - SyntaxKind.OpenAngle;[<];
  58966. - SyntaxKind.Text;[html];
  58967. - SyntaxKind.CloseAngle;[>];
  58968. +RazorDocument - [0..37)::37 - [@{LF@if(true){LF} LF<input> LF}<html>]
  58969. + MarkupBlock - [0..37)::37
  58970. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  58971. + Marker;[];
  58972. + CSharpCodeBlock - [0..31)::31
  58973. + CSharpStatement - [0..31)::31
  58974. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  58975. + Transition;[@];
  58976. + CSharpStatementBody - [1..31)::30
  58977. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  58978. + LeftBrace;[{];
  58979. + CSharpCodeBlock - [2..30)::28
  58980. + CSharpStatementLiteral - [2..4)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  58981. + NewLine;[LF];
  58982. + CSharpCodeBlock - [4..17)::13
  58983. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  58984. + Transition;[@];
  58985. + CSharpStatementLiteral - [5..17)::12 - [if(true){LF}] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  58986. + Keyword;[if];
  58987. + LeftParenthesis;[(];
  58988. + Keyword;[true];
  58989. + RightParenthesis;[)];
  58990. + LeftBrace;[{];
  58991. + NewLine;[LF];
  58992. + RightBrace;[}];
  58993. + CSharpStatementLiteral - [17..20)::3 - [ LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  58994. + Whitespace;[ ];
  58995. + NewLine;[LF];
  58996. + MarkupBlock - [20..30)::10
  58997. + MarkupTagBlock - [20..27)::7 - [<input>]
  58998. + MarkupTextLiteral - [20..27)::7 - [<input>] - Gen<Markup> - SpanEditHandler;Accepts:None
  58999. + OpenAngle;[<];
  59000. + Text;[input];
  59001. + CloseAngle;[>];
  59002. + MarkupTextLiteral - [27..30)::3 - [ LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  59003. + Whitespace;[ ];
  59004. + NewLine;[LF];
  59005. + CSharpStatementLiteral - [30..30)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  59006. + Marker;[];
  59007. + RazorMetaCode - [30..31)::1 - Gen<None> - SpanEditHandler;Accepts:None
  59008. + RightBrace;[}];
  59009. + MarkupTagBlock - [31..37)::6 - [<html>]
  59010. + MarkupTextLiteral - [31..37)::6 - [<html>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59011. + OpenAngle;[<];
  59012. + Text;[html];
  59013. + CloseAngle;[>];
  59014. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/HandlesNewLineAndMarkupInNestedBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/HandlesNewLineAndMarkupInNestedBlock.stree.txt
  59015. index f2974576555..b1462eaf29b 100644
  59016. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/HandlesNewLineAndMarkupInNestedBlock.stree.txt
  59017. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/HandlesNewLineAndMarkupInNestedBlock.stree.txt
  59018. @@ -1,37 +1,41 @@
  59019. -Markup block - Gen<None> - 27 - (0:0,0)
  59020. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  59021. - SyntaxKind.Unknown;[];
  59022. - Statement block - Gen<None> - 27 - (0:0,0)
  59023. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  59024. - SyntaxKind.Transition;[@];
  59025. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  59026. - SyntaxKind.LeftBrace;[{];
  59027. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (2:0,2) - Tokens:1
  59028. - SyntaxKind.NewLine;[LF];
  59029. - Statement block - Gen<None> - 13 - (4:1,0)
  59030. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (4:1,0) - Tokens:1
  59031. - SyntaxKind.Transition;[@];
  59032. - Code span - Gen<Stmt> - [if(true){LF}] - SpanEditHandler;Accepts:Any - (5:1,1) - Tokens:7
  59033. - SyntaxKind.Keyword;[if];
  59034. - SyntaxKind.LeftParenthesis;[(];
  59035. - SyntaxKind.Keyword;[true];
  59036. - SyntaxKind.RightParenthesis;[)];
  59037. - SyntaxKind.LeftBrace;[{];
  59038. - SyntaxKind.NewLine;[LF];
  59039. - SyntaxKind.RightBrace;[}];
  59040. - Markup block - Gen<None> - 9 - (17:2,1)
  59041. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (17:2,1) - Tokens:1
  59042. - SyntaxKind.Whitespace;[ ];
  59043. - Tag block - Gen<None> - 7 - (18:2,2)
  59044. - Markup span - Gen<Markup> - [<input>] - SpanEditHandler;Accepts:None - (18:2,2) - Tokens:3
  59045. - SyntaxKind.OpenAngle;[<];
  59046. - SyntaxKind.Text;[input];
  59047. - SyntaxKind.CloseAngle;[>];
  59048. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (25:2,9) - Tokens:1
  59049. - SyntaxKind.Whitespace;[ ];
  59050. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (26:2,10) - Tokens:1
  59051. - SyntaxKind.Unknown;[];
  59052. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (26:2,10) - Tokens:1
  59053. - SyntaxKind.RightBrace;[}];
  59054. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (27:2,11) - Tokens:1
  59055. - SyntaxKind.Unknown;[];
  59056. +RazorDocument - [0..27)::27 - [@{LF@if(true){LF} <input> }]
  59057. + MarkupBlock - [0..27)::27
  59058. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59059. + Marker;[];
  59060. + CSharpCodeBlock - [0..27)::27
  59061. + CSharpStatement - [0..27)::27
  59062. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  59063. + Transition;[@];
  59064. + CSharpStatementBody - [1..27)::26
  59065. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  59066. + LeftBrace;[{];
  59067. + CSharpCodeBlock - [2..26)::24
  59068. + CSharpStatementLiteral - [2..4)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  59069. + NewLine;[LF];
  59070. + CSharpCodeBlock - [4..17)::13
  59071. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  59072. + Transition;[@];
  59073. + CSharpStatementLiteral - [5..17)::12 - [if(true){LF}] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  59074. + Keyword;[if];
  59075. + LeftParenthesis;[(];
  59076. + Keyword;[true];
  59077. + RightParenthesis;[)];
  59078. + LeftBrace;[{];
  59079. + NewLine;[LF];
  59080. + RightBrace;[}];
  59081. + MarkupBlock - [17..26)::9
  59082. + MarkupTextLiteral - [17..18)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59083. + Whitespace;[ ];
  59084. + MarkupTagBlock - [18..25)::7 - [<input>]
  59085. + MarkupTextLiteral - [18..25)::7 - [<input>] - Gen<Markup> - SpanEditHandler;Accepts:None
  59086. + OpenAngle;[<];
  59087. + Text;[input];
  59088. + CloseAngle;[>];
  59089. + MarkupTextLiteral - [25..26)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  59090. + Whitespace;[ ];
  59091. + CSharpStatementLiteral - [26..26)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  59092. + Marker;[];
  59093. + RazorMetaCode - [26..27)::1 - Gen<None> - SpanEditHandler;Accepts:None
  59094. + RightBrace;[}];
  59095. + MarkupTextLiteral - [27..27)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59096. + Marker;[];
  59097. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/HandlesNewLineInNestedBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/HandlesNewLineInNestedBlock.stree.txt
  59098. index 35287578bf6..8a7ee3056c0 100644
  59099. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/HandlesNewLineInNestedBlock.stree.txt
  59100. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/HandlesNewLineInNestedBlock.stree.txt
  59101. @@ -1,33 +1,37 @@
  59102. -Markup block - Gen<None> - 29 - (0:0,0)
  59103. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  59104. - SyntaxKind.Unknown;[];
  59105. - Statement block - Gen<None> - 21 - (0:0,0)
  59106. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  59107. - SyntaxKind.Transition;[@];
  59108. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  59109. - SyntaxKind.LeftBrace;[{];
  59110. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (2:0,2) - Tokens:1
  59111. - SyntaxKind.NewLine;[LF];
  59112. - Statement block - Gen<None> - 13 - (4:1,0)
  59113. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (4:1,0) - Tokens:1
  59114. - SyntaxKind.Transition;[@];
  59115. - Code span - Gen<Stmt> - [if(true){LF}] - SpanEditHandler;Accepts:Any - (5:1,1) - Tokens:7
  59116. - SyntaxKind.Keyword;[if];
  59117. - SyntaxKind.LeftParenthesis;[(];
  59118. - SyntaxKind.Keyword;[true];
  59119. - SyntaxKind.RightParenthesis;[)];
  59120. - SyntaxKind.LeftBrace;[{];
  59121. - SyntaxKind.NewLine;[LF];
  59122. - SyntaxKind.RightBrace;[}];
  59123. - Code span - Gen<Stmt> - [ LF] - SpanEditHandler;Accepts:Any - (17:2,1) - Tokens:2
  59124. - SyntaxKind.Whitespace;[ ];
  59125. - SyntaxKind.NewLine;[LF];
  59126. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (20:3,0) - Tokens:1
  59127. - SyntaxKind.RightBrace;[}];
  59128. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (21:3,1) - Tokens:1
  59129. - SyntaxKind.NewLine;[LF];
  59130. - Tag block - Gen<None> - 6 - (23:4,0)
  59131. - Markup span - Gen<Markup> - [<html>] - SpanEditHandler;Accepts:Any - (23:4,0) - Tokens:3
  59132. - SyntaxKind.OpenAngle;[<];
  59133. - SyntaxKind.Text;[html];
  59134. - SyntaxKind.CloseAngle;[>];
  59135. +RazorDocument - [0..29)::29 - [@{LF@if(true){LF} LF}LF<html>]
  59136. + MarkupBlock - [0..29)::29
  59137. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59138. + Marker;[];
  59139. + CSharpCodeBlock - [0..21)::21
  59140. + CSharpStatement - [0..21)::21
  59141. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  59142. + Transition;[@];
  59143. + CSharpStatementBody - [1..21)::20
  59144. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  59145. + LeftBrace;[{];
  59146. + CSharpCodeBlock - [2..20)::18
  59147. + CSharpStatementLiteral - [2..4)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  59148. + NewLine;[LF];
  59149. + CSharpCodeBlock - [4..17)::13
  59150. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  59151. + Transition;[@];
  59152. + CSharpStatementLiteral - [5..17)::12 - [if(true){LF}] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  59153. + Keyword;[if];
  59154. + LeftParenthesis;[(];
  59155. + Keyword;[true];
  59156. + RightParenthesis;[)];
  59157. + LeftBrace;[{];
  59158. + NewLine;[LF];
  59159. + RightBrace;[}];
  59160. + CSharpStatementLiteral - [17..20)::3 - [ LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  59161. + Whitespace;[ ];
  59162. + NewLine;[LF];
  59163. + RazorMetaCode - [20..21)::1 - Gen<None> - SpanEditHandler;Accepts:None
  59164. + RightBrace;[}];
  59165. + MarkupEphemeralTextLiteral - [21..23)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  59166. + NewLine;[LF];
  59167. + MarkupTagBlock - [23..29)::6 - [<html>]
  59168. + MarkupTextLiteral - [23..29)::6 - [<html>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59169. + OpenAngle;[<];
  59170. + Text;[html];
  59171. + CloseAngle;[>];
  59172. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/HandsParsingOverToCodeParserWhenAtSignEncounteredAndEmitsOutput.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/HandsParsingOverToCodeParserWhenAtSignEncounteredAndEmitsOutput.stree.txt
  59173. index 854d621f2b6..112b5dc4630 100644
  59174. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/HandsParsingOverToCodeParserWhenAtSignEncounteredAndEmitsOutput.stree.txt
  59175. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/HandsParsingOverToCodeParserWhenAtSignEncounteredAndEmitsOutput.stree.txt
  59176. @@ -1,12 +1,16 @@
  59177. -Markup block - Gen<None> - 12 - (0:0,0)
  59178. - Markup span - Gen<Markup> - [foo ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  59179. - SyntaxKind.Text;[foo];
  59180. - SyntaxKind.Whitespace;[ ];
  59181. - Expression block - Gen<Expr> - 4 - (4:0,4)
  59182. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (4:0,4) - Tokens:1
  59183. - SyntaxKind.Transition;[@];
  59184. - Code span - Gen<Expr> - [bar] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (5:0,5) - Tokens:1
  59185. - SyntaxKind.Identifier;[bar];
  59186. - Markup span - Gen<Markup> - [ baz] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:2
  59187. - SyntaxKind.Whitespace;[ ];
  59188. - SyntaxKind.Text;[baz];
  59189. +RazorDocument - [0..12)::12 - [foo @bar baz]
  59190. + MarkupBlock - [0..12)::12
  59191. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59192. + Text;[foo];
  59193. + Whitespace;[ ];
  59194. + CSharpCodeBlock - [4..8)::4
  59195. + CSharpImplicitExpression - [4..8)::4
  59196. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  59197. + Transition;[@];
  59198. + CSharpImplicitExpressionBody - [5..8)::3
  59199. + CSharpCodeBlock - [5..8)::3
  59200. + CSharpExpressionLiteral - [5..8)::3 - [bar] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  59201. + Identifier;[bar];
  59202. + MarkupTextLiteral - [8..12)::4 - [ baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59203. + Whitespace;[ ];
  59204. + Text;[baz];
  59205. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/IgnoresTagsInContentsOfScriptTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/IgnoresTagsInContentsOfScriptTag.stree.txt
  59206. index 9898890f2f0..697d3e5c849 100644
  59207. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/IgnoresTagsInContentsOfScriptTag.stree.txt
  59208. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/IgnoresTagsInContentsOfScriptTag.stree.txt
  59209. @@ -1,28 +1,32 @@
  59210. -Markup block - Gen<None> - 36 - (0:0,0)
  59211. - Tag block - Gen<None> - 8 - (0:0,0)
  59212. - Markup span - Gen<Markup> - [<script>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  59213. - SyntaxKind.OpenAngle;[<];
  59214. - SyntaxKind.Text;[script];
  59215. - SyntaxKind.CloseAngle;[>];
  59216. - Markup span - Gen<Markup> - [foo<bar baz='] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:7
  59217. - SyntaxKind.Text;[foo];
  59218. - SyntaxKind.OpenAngle;[<];
  59219. - SyntaxKind.Text;[bar];
  59220. - SyntaxKind.Whitespace;[ ];
  59221. - SyntaxKind.Text;[baz];
  59222. - SyntaxKind.Equals;[=];
  59223. - SyntaxKind.SingleQuote;['];
  59224. - Expression block - Gen<Expr> - 4 - (21:0,21)
  59225. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:1
  59226. - SyntaxKind.Transition;[@];
  59227. - Code span - Gen<Expr> - [boz] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (22:0,22) - Tokens:1
  59228. - SyntaxKind.Identifier;[boz];
  59229. - Markup span - Gen<Markup> - ['>] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:2
  59230. - SyntaxKind.SingleQuote;['];
  59231. - SyntaxKind.CloseAngle;[>];
  59232. - Tag block - Gen<None> - 9 - (27:0,27)
  59233. - Markup span - Gen<Markup> - [</script>] - SpanEditHandler;Accepts:Any - (27:0,27) - Tokens:4
  59234. - SyntaxKind.OpenAngle;[<];
  59235. - SyntaxKind.ForwardSlash;[/];
  59236. - SyntaxKind.Text;[script];
  59237. - SyntaxKind.CloseAngle;[>];
  59238. +RazorDocument - [0..36)::36 - [<script>foo<bar baz='@boz'></script>]
  59239. + MarkupBlock - [0..36)::36
  59240. + MarkupTagBlock - [0..8)::8 - [<script>]
  59241. + MarkupTextLiteral - [0..8)::8 - [<script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59242. + OpenAngle;[<];
  59243. + Text;[script];
  59244. + CloseAngle;[>];
  59245. + MarkupTextLiteral - [8..21)::13 - [foo<bar baz='] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59246. + Text;[foo];
  59247. + OpenAngle;[<];
  59248. + Text;[bar];
  59249. + Whitespace;[ ];
  59250. + Text;[baz];
  59251. + Equals;[=];
  59252. + SingleQuote;['];
  59253. + CSharpCodeBlock - [21..25)::4
  59254. + CSharpImplicitExpression - [21..25)::4
  59255. + CSharpTransition - [21..22)::1 - Gen<None> - SpanEditHandler;Accepts:None
  59256. + Transition;[@];
  59257. + CSharpImplicitExpressionBody - [22..25)::3
  59258. + CSharpCodeBlock - [22..25)::3
  59259. + CSharpExpressionLiteral - [22..25)::3 - [boz] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  59260. + Identifier;[boz];
  59261. + MarkupTextLiteral - [25..27)::2 - ['>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59262. + SingleQuote;['];
  59263. + CloseAngle;[>];
  59264. + MarkupTagBlock - [27..36)::9 - [</script>]
  59265. + MarkupTextLiteral - [27..36)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59266. + OpenAngle;[<];
  59267. + ForwardSlash;[/];
  59268. + Text;[script];
  59269. + CloseAngle;[>];
  59270. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/NestedCodeBlockWithMarkupSetsDotAsMarkup.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/NestedCodeBlockWithMarkupSetsDotAsMarkup.stree.txt
  59271. index 4de831cbb62..ce225dd4a05 100644
  59272. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/NestedCodeBlockWithMarkupSetsDotAsMarkup.stree.txt
  59273. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/NestedCodeBlockWithMarkupSetsDotAsMarkup.stree.txt
  59274. @@ -1,55 +1,59 @@
  59275. -Markup block - Gen<None> - 52 - (0:0,0)
  59276. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  59277. - SyntaxKind.Unknown;[];
  59278. - Statement block - Gen<None> - 52 - (0:0,0)
  59279. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  59280. - SyntaxKind.Transition;[@];
  59281. - Code span - Gen<Stmt> - [if (true) { ] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:8
  59282. - SyntaxKind.Keyword;[if];
  59283. - SyntaxKind.Whitespace;[ ];
  59284. - SyntaxKind.LeftParenthesis;[(];
  59285. - SyntaxKind.Keyword;[true];
  59286. - SyntaxKind.RightParenthesis;[)];
  59287. - SyntaxKind.Whitespace;[ ];
  59288. - SyntaxKind.LeftBrace;[{];
  59289. - SyntaxKind.Whitespace;[ ];
  59290. - Statement block - Gen<None> - 37 - (13:0,13)
  59291. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:1
  59292. - SyntaxKind.Transition;[@];
  59293. - Code span - Gen<Stmt> - [if(false) {] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:6
  59294. - SyntaxKind.Keyword;[if];
  59295. - SyntaxKind.LeftParenthesis;[(];
  59296. - SyntaxKind.Keyword;[false];
  59297. - SyntaxKind.RightParenthesis;[)];
  59298. - SyntaxKind.Whitespace;[ ];
  59299. - SyntaxKind.LeftBrace;[{];
  59300. - Markup block - Gen<None> - 24 - (25:0,25)
  59301. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:1
  59302. - SyntaxKind.Whitespace;[ ];
  59303. - Tag block - Gen<None> - 5 - (26:0,26)
  59304. - Markup span - Gen<Markup> - [<div>] - SpanEditHandler;Accepts:None - (26:0,26) - Tokens:3
  59305. - SyntaxKind.OpenAngle;[<];
  59306. - SyntaxKind.Text;[div];
  59307. - SyntaxKind.CloseAngle;[>];
  59308. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (31:0,31) - Tokens:1
  59309. - SyntaxKind.Unknown;[];
  59310. - Expression block - Gen<Expr> - 10 - (31:0,31)
  59311. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (31:0,31) - Tokens:1
  59312. - SyntaxKind.Transition;[@];
  59313. - Code span - Gen<Expr> - [something] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (32:0,32) - Tokens:1
  59314. - SyntaxKind.Identifier;[something];
  59315. - Markup span - Gen<Markup> - [.] - SpanEditHandler;Accepts:Any - (41:0,41) - Tokens:1
  59316. - SyntaxKind.Text;[.];
  59317. - Tag block - Gen<None> - 6 - (42:0,42)
  59318. - Markup span - Gen<Markup> - [</div>] - SpanEditHandler;Accepts:None - (42:0,42) - Tokens:4
  59319. - SyntaxKind.OpenAngle;[<];
  59320. - SyntaxKind.ForwardSlash;[/];
  59321. - SyntaxKind.Text;[div];
  59322. - SyntaxKind.CloseAngle;[>];
  59323. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (48:0,48) - Tokens:1
  59324. - SyntaxKind.Whitespace;[ ];
  59325. - Code span - Gen<Stmt> - [}] - SpanEditHandler;Accepts:Any - (49:0,49) - Tokens:1
  59326. - SyntaxKind.RightBrace;[}];
  59327. - Code span - Gen<Stmt> - [ }] - SpanEditHandler;Accepts:Any - (50:0,50) - Tokens:2
  59328. - SyntaxKind.Whitespace;[ ];
  59329. - SyntaxKind.RightBrace;[}];
  59330. +RazorDocument - [0..52)::52 - [@if (true) { @if(false) { <div>@something.</div> } }]
  59331. + MarkupBlock - [0..52)::52
  59332. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59333. + Marker;[];
  59334. + CSharpCodeBlock - [0..52)::52
  59335. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  59336. + Transition;[@];
  59337. + CSharpStatementLiteral - [1..13)::12 - [if (true) { ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  59338. + Keyword;[if];
  59339. + Whitespace;[ ];
  59340. + LeftParenthesis;[(];
  59341. + Keyword;[true];
  59342. + RightParenthesis;[)];
  59343. + Whitespace;[ ];
  59344. + LeftBrace;[{];
  59345. + Whitespace;[ ];
  59346. + CSharpCodeBlock - [13..50)::37
  59347. + CSharpTransition - [13..14)::1 - Gen<None> - SpanEditHandler;Accepts:None
  59348. + Transition;[@];
  59349. + CSharpStatementLiteral - [14..25)::11 - [if(false) {] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  59350. + Keyword;[if];
  59351. + LeftParenthesis;[(];
  59352. + Keyword;[false];
  59353. + RightParenthesis;[)];
  59354. + Whitespace;[ ];
  59355. + LeftBrace;[{];
  59356. + MarkupBlock - [25..49)::24
  59357. + MarkupTextLiteral - [25..26)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59358. + Whitespace;[ ];
  59359. + MarkupTagBlock - [26..31)::5 - [<div>]
  59360. + MarkupTextLiteral - [26..31)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:None
  59361. + OpenAngle;[<];
  59362. + Text;[div];
  59363. + CloseAngle;[>];
  59364. + MarkupTextLiteral - [31..31)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59365. + Marker;[];
  59366. + CSharpCodeBlock - [31..41)::10
  59367. + CSharpImplicitExpression - [31..41)::10
  59368. + CSharpTransition - [31..32)::1 - Gen<None> - SpanEditHandler;Accepts:None
  59369. + Transition;[@];
  59370. + CSharpImplicitExpressionBody - [32..41)::9
  59371. + CSharpCodeBlock - [32..41)::9
  59372. + CSharpExpressionLiteral - [32..41)::9 - [something] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  59373. + Identifier;[something];
  59374. + MarkupTextLiteral - [41..42)::1 - [.] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59375. + Text;[.];
  59376. + MarkupTagBlock - [42..48)::6 - [</div>]
  59377. + MarkupTextLiteral - [42..48)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:None
  59378. + OpenAngle;[<];
  59379. + ForwardSlash;[/];
  59380. + Text;[div];
  59381. + CloseAngle;[>];
  59382. + MarkupTextLiteral - [48..49)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  59383. + Whitespace;[ ];
  59384. + CSharpStatementLiteral - [49..50)::1 - [}] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  59385. + RightBrace;[}];
  59386. + CSharpStatementLiteral - [50..52)::2 - [ }] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  59387. + Whitespace;[ ];
  59388. + RightBrace;[}];
  59389. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/NoLongerSupportsDollarOpenBraceCombination.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/NoLongerSupportsDollarOpenBraceCombination.stree.txt
  59390. index f2a68845e24..83a58c80ec2 100644
  59391. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/NoLongerSupportsDollarOpenBraceCombination.stree.txt
  59392. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/NoLongerSupportsDollarOpenBraceCombination.stree.txt
  59393. @@ -1,14 +1,15 @@
  59394. -Markup block - Gen<None> - 17 - (0:0,0)
  59395. - Tag block - Gen<None> - 5 - (0:0,0)
  59396. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  59397. - SyntaxKind.OpenAngle;[<];
  59398. - SyntaxKind.Text;[foo];
  59399. - SyntaxKind.CloseAngle;[>];
  59400. - SyntaxKind.HtmlTextLiteral - [${bar}] - [5..11) - FullWidth: 6 - Slots: 1
  59401. - SyntaxKind.Text;[${bar}];
  59402. - Tag block - Gen<None> - 6 - (11:0,11)
  59403. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:4
  59404. - SyntaxKind.OpenAngle;[<];
  59405. - SyntaxKind.ForwardSlash;[/];
  59406. - SyntaxKind.Text;[foo];
  59407. - SyntaxKind.CloseAngle;[>];
  59408. +RazorDocument - [0..17)::17 - [<foo>${bar}</foo>]
  59409. + MarkupBlock - [0..17)::17
  59410. + MarkupTagBlock - [0..5)::5 - [<foo>]
  59411. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59412. + OpenAngle;[<];
  59413. + Text;[foo];
  59414. + CloseAngle;[>];
  59415. + MarkupTextLiteral - [5..11)::6 - [${bar}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59416. + Text;[${bar}];
  59417. + MarkupTagBlock - [11..17)::6 - [</foo>]
  59418. + MarkupTextLiteral - [11..17)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59419. + OpenAngle;[<];
  59420. + ForwardSlash;[/];
  59421. + Text;[foo];
  59422. + CloseAngle;[>];
  59423. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/OutputsEmptyBlockWithEmptyMarkupSpanIfContentIsEmptyString.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/OutputsEmptyBlockWithEmptyMarkupSpanIfContentIsEmptyString.stree.txt
  59424. index df48ed41907..dcd6e30919d 100644
  59425. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/OutputsEmptyBlockWithEmptyMarkupSpanIfContentIsEmptyString.stree.txt
  59426. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/OutputsEmptyBlockWithEmptyMarkupSpanIfContentIsEmptyString.stree.txt
  59427. @@ -1,3 +1,4 @@
  59428. -Markup block - Gen<None> - 0 - (0:0,0)
  59429. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  59430. - SyntaxKind.Unknown;[];
  59431. +RazorDocument - [0..0)::0 - []
  59432. + MarkupBlock - [0..0)::0
  59433. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59434. + Marker;[];
  59435. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/OutputsWhitespaceOnlyContentAsSingleWhitespaceMarkupSpan.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/OutputsWhitespaceOnlyContentAsSingleWhitespaceMarkupSpan.stree.txt
  59436. index e22974936b3..8ba87c13e55 100644
  59437. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/OutputsWhitespaceOnlyContentAsSingleWhitespaceMarkupSpan.stree.txt
  59438. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/OutputsWhitespaceOnlyContentAsSingleWhitespaceMarkupSpan.stree.txt
  59439. @@ -1,3 +1,4 @@
  59440. -Markup block - Gen<None> - 10 - (0:0,0)
  59441. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  59442. - SyntaxKind.Whitespace;[ ];
  59443. +RazorDocument - [0..10)::10 - [ ]
  59444. + MarkupBlock - [0..10)::10
  59445. + MarkupTextLiteral - [0..10)::10 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59446. + Whitespace;[ ];
  59447. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/ParseDocumentDoesNotSwitchToCodeOnEmailAddressInText.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/ParseDocumentDoesNotSwitchToCodeOnEmailAddressInText.stree.txt
  59448. index 6c9f0060abb..d745d521628 100644
  59449. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/ParseDocumentDoesNotSwitchToCodeOnEmailAddressInText.stree.txt
  59450. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/ParseDocumentDoesNotSwitchToCodeOnEmailAddressInText.stree.txt
  59451. @@ -1,3 +1,4 @@
  59452. -Markup block - Gen<None> - 21 - (0:0,0)
  59453. - Markup span - Gen<Markup> - [[email protected]] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  59454. - SyntaxKind.Text;[[email protected]];
  59455. +RazorDocument - [0..21)::21 - [[email protected]]
  59456. + MarkupBlock - [0..21)::21
  59457. + MarkupTextLiteral - [0..21)::21 - [[email protected]] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59458. + Text;[[email protected]];
  59459. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/ParseSectionIgnoresTagsInContentsOfScriptTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/ParseSectionIgnoresTagsInContentsOfScriptTag.stree.txt
  59460. index 9b49f113c87..a5e9b293b53 100644
  59461. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/ParseSectionIgnoresTagsInContentsOfScriptTag.stree.txt
  59462. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/ParseSectionIgnoresTagsInContentsOfScriptTag.stree.txt
  59463. @@ -1,52 +1,59 @@
  59464. -Markup block - Gen<None> - 53 - (0:0,0)
  59465. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  59466. - SyntaxKind.Unknown;[];
  59467. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted}> - 53 - (0:0,0)
  59468. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  59469. - SyntaxKind.Transition;[@];
  59470. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  59471. - SyntaxKind.Identifier;[section];
  59472. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  59473. - SyntaxKind.Whitespace;[ ];
  59474. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [Foo] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  59475. - SyntaxKind.Identifier;[Foo];
  59476. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (12:0,12) - Tokens:1
  59477. - SyntaxKind.Whitespace;[ ];
  59478. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd - (13:0,13) - Tokens:1
  59479. - SyntaxKind.LeftBrace;[{];
  59480. - Markup block - Gen<None> - 38 - (14:0,14)
  59481. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  59482. - SyntaxKind.Whitespace;[ ];
  59483. - Tag block - Gen<None> - 8 - (15:0,15)
  59484. - Markup span - Gen<Markup> - [<script>] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:3
  59485. - SyntaxKind.OpenAngle;[<];
  59486. - SyntaxKind.Text;[script];
  59487. - SyntaxKind.CloseAngle;[>];
  59488. - Markup span - Gen<Markup> - [foo<bar baz='] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:7
  59489. - SyntaxKind.Text;[foo];
  59490. - SyntaxKind.OpenAngle;[<];
  59491. - SyntaxKind.Text;[bar];
  59492. - SyntaxKind.Whitespace;[ ];
  59493. - SyntaxKind.Text;[baz];
  59494. - SyntaxKind.Equals;[=];
  59495. - SyntaxKind.SingleQuote;['];
  59496. - Expression block - Gen<Expr> - 4 - (36:0,36)
  59497. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (36:0,36) - Tokens:1
  59498. - SyntaxKind.Transition;[@];
  59499. - Code span - Gen<Expr> - [boz] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K15 - (37:0,37) - Tokens:1
  59500. - SyntaxKind.Identifier;[boz];
  59501. - Markup span - Gen<Markup> - ['>] - SpanEditHandler;Accepts:Any - (40:0,40) - Tokens:2
  59502. - SyntaxKind.SingleQuote;['];
  59503. - SyntaxKind.CloseAngle;[>];
  59504. - Tag block - Gen<None> - 9 - (42:0,42)
  59505. - Markup span - Gen<Markup> - [</script>] - SpanEditHandler;Accepts:Any - (42:0,42) - Tokens:4
  59506. - SyntaxKind.OpenAngle;[<];
  59507. - SyntaxKind.ForwardSlash;[/];
  59508. - SyntaxKind.Text;[script];
  59509. - SyntaxKind.CloseAngle;[>];
  59510. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (51:0,51) - Tokens:1
  59511. - SyntaxKind.Whitespace;[ ];
  59512. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (52:0,52) - Tokens:1
  59513. - SyntaxKind.RightBrace;[}];
  59514. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (53:0,53) - Tokens:1
  59515. - SyntaxKind.Unknown;[];
  59516. +RazorDocument - [0..53)::53 - [@section Foo { <script>foo<bar baz='@boz'></script> }]
  59517. + MarkupBlock - [0..53)::53
  59518. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59519. + Marker;[];
  59520. + CSharpCodeBlock - [0..53)::53
  59521. + RazorDirective - [0..53)::53 - Directive:{section;RazorBlock;Unrestricted}
  59522. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  59523. + Transition;[@];
  59524. + RazorDirectiveBody - [1..53)::52
  59525. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  59526. + Identifier;[section];
  59527. + CSharpCodeBlock - [8..53)::45
  59528. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  59529. + Whitespace;[ ];
  59530. + CSharpStatementLiteral - [9..12)::3 - [Foo] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  59531. + Identifier;[Foo];
  59532. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  59533. + Whitespace;[ ];
  59534. + RazorMetaCode - [13..14)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd
  59535. + LeftBrace;[{];
  59536. + MarkupBlock - [14..52)::38
  59537. + MarkupTextLiteral - [14..15)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59538. + Whitespace;[ ];
  59539. + MarkupTagBlock - [15..23)::8 - [<script>]
  59540. + MarkupTextLiteral - [15..23)::8 - [<script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59541. + OpenAngle;[<];
  59542. + Text;[script];
  59543. + CloseAngle;[>];
  59544. + MarkupTextLiteral - [23..36)::13 - [foo<bar baz='] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59545. + Text;[foo];
  59546. + OpenAngle;[<];
  59547. + Text;[bar];
  59548. + Whitespace;[ ];
  59549. + Text;[baz];
  59550. + Equals;[=];
  59551. + SingleQuote;['];
  59552. + CSharpCodeBlock - [36..40)::4
  59553. + CSharpImplicitExpression - [36..40)::4
  59554. + CSharpTransition - [36..37)::1 - Gen<None> - SpanEditHandler;Accepts:None
  59555. + Transition;[@];
  59556. + CSharpImplicitExpressionBody - [37..40)::3
  59557. + CSharpCodeBlock - [37..40)::3
  59558. + CSharpExpressionLiteral - [37..40)::3 - [boz] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K15
  59559. + Identifier;[boz];
  59560. + MarkupTextLiteral - [40..42)::2 - ['>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59561. + SingleQuote;['];
  59562. + CloseAngle;[>];
  59563. + MarkupTagBlock - [42..51)::9 - [</script>]
  59564. + MarkupTextLiteral - [42..51)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59565. + OpenAngle;[<];
  59566. + ForwardSlash;[/];
  59567. + Text;[script];
  59568. + CloseAngle;[>];
  59569. + MarkupTextLiteral - [51..52)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59570. + Whitespace;[ ];
  59571. + RazorMetaCode - [52..53)::1 - Gen<None> - SpanEditHandler;Accepts:None
  59572. + RightBrace;[}];
  59573. + MarkupTextLiteral - [53..53)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59574. + Marker;[];
  59575. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/ParsesWholeContentAsOneSpanIfNoSwapCharacterEncountered.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/ParsesWholeContentAsOneSpanIfNoSwapCharacterEncountered.stree.txt
  59576. index 5cf09d83c1a..30659bb00bd 100644
  59577. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/ParsesWholeContentAsOneSpanIfNoSwapCharacterEncountered.stree.txt
  59578. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/ParsesWholeContentAsOneSpanIfNoSwapCharacterEncountered.stree.txt
  59579. @@ -1,5 +1,6 @@
  59580. -Markup block - Gen<None> - 7 - (0:0,0)
  59581. - Markup span - Gen<Markup> - [foo baz] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  59582. - SyntaxKind.Text;[foo];
  59583. - SyntaxKind.Whitespace;[ ];
  59584. - SyntaxKind.Text;[baz];
  59585. +RazorDocument - [0..7)::7 - [foo baz]
  59586. + MarkupBlock - [0..7)::7
  59587. + MarkupTextLiteral - [0..7)::7 - [foo baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59588. + Text;[foo];
  59589. + Whitespace;[ ];
  59590. + Text;[baz];
  59591. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/RendersExtraNewlineAtTheEndTextTagInVerbatimBlockIfFollowedByHtml.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/RendersExtraNewlineAtTheEndTextTagInVerbatimBlockIfFollowedByHtml.stree.txt
  59592. index 16d62d8419d..5d23cceb4ae 100644
  59593. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/RendersExtraNewlineAtTheEndTextTagInVerbatimBlockIfFollowedByHtml.stree.txt
  59594. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/RendersExtraNewlineAtTheEndTextTagInVerbatimBlockIfFollowedByHtml.stree.txt
  59595. @@ -1,42 +1,46 @@
  59596. -Markup block - Gen<None> - 38 - (0:0,0)
  59597. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  59598. - SyntaxKind.Unknown;[];
  59599. - Statement block - Gen<None> - 32 - (0:0,0)
  59600. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  59601. - SyntaxKind.Transition;[@];
  59602. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  59603. - SyntaxKind.LeftBrace;[{];
  59604. - Markup block - Gen<None> - 19 - (2:0,2)
  59605. - Tag block - Gen<None> - 6 - (2:0,2)
  59606. - Transition span - Gen<None> - [<text>] - SpanEditHandler;Accepts:None - (2:0,2) - Tokens:3
  59607. - SyntaxKind.OpenAngle;[<];
  59608. - SyntaxKind.Text;[text];
  59609. - SyntaxKind.CloseAngle;[>];
  59610. - Markup span - Gen<Markup> - [Blah] - SpanEditHandler;Accepts:None - (8:0,8) - Tokens:1
  59611. - SyntaxKind.Text;[Blah];
  59612. - Tag block - Gen<None> - 7 - (12:0,12)
  59613. - Transition span - Gen<None> - [</text>] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:4
  59614. - SyntaxKind.OpenAngle;[<];
  59615. - SyntaxKind.ForwardSlash;[/];
  59616. - SyntaxKind.Text;[text];
  59617. - SyntaxKind.CloseAngle;[>];
  59618. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (19:0,19) - Tokens:1
  59619. - SyntaxKind.NewLine;[LF];
  59620. - Markup block - Gen<None> - 10 - (21:1,0)
  59621. - Tag block - Gen<None> - 8 - (21:1,0)
  59622. - Markup span - Gen<Markup> - [<input/>] - SpanEditHandler;Accepts:None - (21:1,0) - Tokens:4
  59623. - SyntaxKind.OpenAngle;[<];
  59624. - SyntaxKind.Text;[input];
  59625. - SyntaxKind.ForwardSlash;[/];
  59626. - SyntaxKind.CloseAngle;[>];
  59627. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (29:1,8) - Tokens:1
  59628. - SyntaxKind.NewLine;[LF];
  59629. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (31:2,0) - Tokens:1
  59630. - SyntaxKind.Unknown;[];
  59631. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (31:2,0) - Tokens:1
  59632. - SyntaxKind.RightBrace;[}];
  59633. - Tag block - Gen<None> - 6 - (32:2,1)
  59634. - Markup span - Gen<Markup> - [<html>] - SpanEditHandler;Accepts:Any - (32:2,1) - Tokens:3
  59635. - SyntaxKind.OpenAngle;[<];
  59636. - SyntaxKind.Text;[html];
  59637. - SyntaxKind.CloseAngle;[>];
  59638. +RazorDocument - [0..38)::38 - [@{<text>Blah</text>LF<input/>LF}<html>]
  59639. + MarkupBlock - [0..38)::38
  59640. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59641. + Marker;[];
  59642. + CSharpCodeBlock - [0..32)::32
  59643. + CSharpStatement - [0..32)::32
  59644. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  59645. + Transition;[@];
  59646. + CSharpStatementBody - [1..32)::31
  59647. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  59648. + LeftBrace;[{];
  59649. + CSharpCodeBlock - [2..31)::29
  59650. + MarkupBlock - [2..21)::19
  59651. + MarkupTagBlock - [2..8)::6 - [<text>]
  59652. + MarkupTransition - [2..8)::6 - Gen<None> - SpanEditHandler;Accepts:None
  59653. + OpenAngle;[<];
  59654. + Text;[text];
  59655. + CloseAngle;[>];
  59656. + MarkupTextLiteral - [8..12)::4 - [Blah] - Gen<Markup> - SpanEditHandler;Accepts:None
  59657. + Text;[Blah];
  59658. + MarkupTagBlock - [12..19)::7 - [</text>]
  59659. + MarkupTransition - [12..19)::7 - Gen<None> - SpanEditHandler;Accepts:None
  59660. + OpenAngle;[<];
  59661. + ForwardSlash;[/];
  59662. + Text;[text];
  59663. + CloseAngle;[>];
  59664. + MarkupTextLiteral - [19..21)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  59665. + NewLine;[LF];
  59666. + MarkupBlock - [21..31)::10
  59667. + MarkupTagBlock - [21..29)::8 - [<input/>]
  59668. + MarkupTextLiteral - [21..29)::8 - [<input/>] - Gen<Markup> - SpanEditHandler;Accepts:None
  59669. + OpenAngle;[<];
  59670. + Text;[input];
  59671. + ForwardSlash;[/];
  59672. + CloseAngle;[>];
  59673. + MarkupTextLiteral - [29..31)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  59674. + NewLine;[LF];
  59675. + CSharpStatementLiteral - [31..31)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  59676. + Marker;[];
  59677. + RazorMetaCode - [31..32)::1 - Gen<None> - SpanEditHandler;Accepts:None
  59678. + RightBrace;[}];
  59679. + MarkupTagBlock - [32..38)::6 - [<html>]
  59680. + MarkupTextLiteral - [32..38)::6 - [<html>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59681. + OpenAngle;[<];
  59682. + Text;[html];
  59683. + CloseAngle;[>];
  59684. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/RendersNewlineAfterTextTagInVerbatimBlockIfFollowedByMarkupTransition.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/RendersNewlineAfterTextTagInVerbatimBlockIfFollowedByMarkupTransition.stree.txt
  59685. index e0d84524384..08a17198015 100644
  59686. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/RendersNewlineAfterTextTagInVerbatimBlockIfFollowedByMarkupTransition.stree.txt
  59687. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/RendersNewlineAfterTextTagInVerbatimBlockIfFollowedByMarkupTransition.stree.txt
  59688. @@ -1,42 +1,46 @@
  59689. -Markup block - Gen<None> - 37 - (0:0,0)
  59690. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  59691. - SyntaxKind.Unknown;[];
  59692. - Statement block - Gen<None> - 31 - (0:0,0)
  59693. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  59694. - SyntaxKind.Transition;[@];
  59695. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  59696. - SyntaxKind.LeftBrace;[{];
  59697. - Markup block - Gen<None> - 19 - (2:0,2)
  59698. - Tag block - Gen<None> - 6 - (2:0,2)
  59699. - Transition span - Gen<None> - [<text>] - SpanEditHandler;Accepts:None - (2:0,2) - Tokens:3
  59700. - SyntaxKind.OpenAngle;[<];
  59701. - SyntaxKind.Text;[text];
  59702. - SyntaxKind.CloseAngle;[>];
  59703. - Markup span - Gen<Markup> - [Blah] - SpanEditHandler;Accepts:None - (8:0,8) - Tokens:1
  59704. - SyntaxKind.Text;[Blah];
  59705. - Tag block - Gen<None> - 7 - (12:0,12)
  59706. - Transition span - Gen<None> - [</text>] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:4
  59707. - SyntaxKind.OpenAngle;[<];
  59708. - SyntaxKind.ForwardSlash;[/];
  59709. - SyntaxKind.Text;[text];
  59710. - SyntaxKind.CloseAngle;[>];
  59711. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (19:0,19) - Tokens:1
  59712. - SyntaxKind.NewLine;[LF];
  59713. - Markup block - Gen<None> - 9 - (21:1,0)
  59714. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (21:1,0) - Tokens:1
  59715. - SyntaxKind.Transition;[@];
  59716. - MetaCode span - Gen<None> - [:] - SpanEditHandler;Accepts:Any - (22:1,1) - Tokens:1
  59717. - SyntaxKind.Colon;[:];
  59718. - Markup span - Gen<Markup> - [ BlehLF] - SpanEditHandler;Accepts:None - (23:1,2) - Tokens:3
  59719. - SyntaxKind.Whitespace;[ ];
  59720. - SyntaxKind.Text;[Bleh];
  59721. - SyntaxKind.NewLine;[LF];
  59722. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (30:2,0) - Tokens:1
  59723. - SyntaxKind.Unknown;[];
  59724. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (30:2,0) - Tokens:1
  59725. - SyntaxKind.RightBrace;[}];
  59726. - Tag block - Gen<None> - 6 - (31:2,1)
  59727. - Markup span - Gen<Markup> - [<html>] - SpanEditHandler;Accepts:Any - (31:2,1) - Tokens:3
  59728. - SyntaxKind.OpenAngle;[<];
  59729. - SyntaxKind.Text;[html];
  59730. - SyntaxKind.CloseAngle;[>];
  59731. +RazorDocument - [0..37)::37 - [@{<text>Blah</text>LF@: BlehLF}<html>]
  59732. + MarkupBlock - [0..37)::37
  59733. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59734. + Marker;[];
  59735. + CSharpCodeBlock - [0..31)::31
  59736. + CSharpStatement - [0..31)::31
  59737. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  59738. + Transition;[@];
  59739. + CSharpStatementBody - [1..31)::30
  59740. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  59741. + LeftBrace;[{];
  59742. + CSharpCodeBlock - [2..30)::28
  59743. + MarkupBlock - [2..21)::19
  59744. + MarkupTagBlock - [2..8)::6 - [<text>]
  59745. + MarkupTransition - [2..8)::6 - Gen<None> - SpanEditHandler;Accepts:None
  59746. + OpenAngle;[<];
  59747. + Text;[text];
  59748. + CloseAngle;[>];
  59749. + MarkupTextLiteral - [8..12)::4 - [Blah] - Gen<Markup> - SpanEditHandler;Accepts:None
  59750. + Text;[Blah];
  59751. + MarkupTagBlock - [12..19)::7 - [</text>]
  59752. + MarkupTransition - [12..19)::7 - Gen<None> - SpanEditHandler;Accepts:None
  59753. + OpenAngle;[<];
  59754. + ForwardSlash;[/];
  59755. + Text;[text];
  59756. + CloseAngle;[>];
  59757. + MarkupTextLiteral - [19..21)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  59758. + NewLine;[LF];
  59759. + MarkupBlock - [21..30)::9
  59760. + MarkupTransition - [21..22)::1 - Gen<None> - SpanEditHandler;Accepts:None
  59761. + Transition;[@];
  59762. + RazorMetaCode - [22..23)::1 - Gen<None> - SpanEditHandler;Accepts:Any
  59763. + Colon;[:];
  59764. + MarkupTextLiteral - [23..30)::7 - [ BlehLF] - Gen<Markup> - SpanEditHandler;Accepts:None
  59765. + Whitespace;[ ];
  59766. + Text;[Bleh];
  59767. + NewLine;[LF];
  59768. + CSharpStatementLiteral - [30..30)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  59769. + Marker;[];
  59770. + RazorMetaCode - [30..31)::1 - Gen<None> - SpanEditHandler;Accepts:None
  59771. + RightBrace;[}];
  59772. + MarkupTagBlock - [31..37)::6 - [<html>]
  59773. + MarkupTextLiteral - [31..37)::6 - [<html>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59774. + OpenAngle;[<];
  59775. + Text;[html];
  59776. + CloseAngle;[>];
  59777. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/RendersTextPseudoTagAsMarkup.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/RendersTextPseudoTagAsMarkup.stree.txt
  59778. index 3e301a21b6b..760960d472c 100644
  59779. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/RendersTextPseudoTagAsMarkup.stree.txt
  59780. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/RendersTextPseudoTagAsMarkup.stree.txt
  59781. @@ -1,17 +1,18 @@
  59782. -Markup block - Gen<None> - 20 - (0:0,0)
  59783. - Markup span - Gen<Markup> - [Foo ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  59784. - SyntaxKind.Text;[Foo];
  59785. - SyntaxKind.Whitespace;[ ];
  59786. - Tag block - Gen<None> - 6 - (4:0,4)
  59787. - Markup span - Gen<Markup> - [<text>] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:3
  59788. - SyntaxKind.OpenAngle;[<];
  59789. - SyntaxKind.Text;[text];
  59790. - SyntaxKind.CloseAngle;[>];
  59791. - SyntaxKind.HtmlTextLiteral - [Foo] - [10..13) - FullWidth: 3 - Slots: 1
  59792. - SyntaxKind.Text;[Foo];
  59793. - Tag block - Gen<None> - 7 - (13:0,13)
  59794. - Markup span - Gen<Markup> - [</text>] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:4
  59795. - SyntaxKind.OpenAngle;[<];
  59796. - SyntaxKind.ForwardSlash;[/];
  59797. - SyntaxKind.Text;[text];
  59798. - SyntaxKind.CloseAngle;[>];
  59799. +RazorDocument - [0..20)::20 - [Foo <text>Foo</text>]
  59800. + MarkupBlock - [0..20)::20
  59801. + MarkupTextLiteral - [0..4)::4 - [Foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59802. + Text;[Foo];
  59803. + Whitespace;[ ];
  59804. + MarkupTagBlock - [4..10)::6 - [<text>]
  59805. + MarkupTextLiteral - [4..10)::6 - [<text>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59806. + OpenAngle;[<];
  59807. + Text;[text];
  59808. + CloseAngle;[>];
  59809. + MarkupTextLiteral - [10..13)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59810. + Text;[Foo];
  59811. + MarkupTagBlock - [13..20)::7 - [</text>]
  59812. + MarkupTextLiteral - [13..20)::7 - [</text>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59813. + OpenAngle;[<];
  59814. + ForwardSlash;[/];
  59815. + Text;[text];
  59816. + CloseAngle;[>];
  59817. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/ReturnsOneMarkupSegmentIfNoCodeBlocksEncountered.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/ReturnsOneMarkupSegmentIfNoCodeBlocksEncountered.stree.txt
  59818. index 20d868ac48e..e9fd31b9455 100644
  59819. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/ReturnsOneMarkupSegmentIfNoCodeBlocksEncountered.stree.txt
  59820. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/ReturnsOneMarkupSegmentIfNoCodeBlocksEncountered.stree.txt
  59821. @@ -1,25 +1,26 @@
  59822. -Markup block - Gen<None> - 30 - (0:0,0)
  59823. - Markup span - Gen<Markup> - [Foo Baz] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  59824. - SyntaxKind.Text;[Foo];
  59825. - SyntaxKind.Whitespace;[ ];
  59826. - SyntaxKind.Text;[Baz];
  59827. - HtmlComment block - Gen<None> - 10 - (7:0,7)
  59828. - Markup span - Gen<Markup> - [<!--] - SpanEditHandler;Accepts:None - (7:0,7) - Tokens:3
  59829. - SyntaxKind.OpenAngle;[<];
  59830. - SyntaxKind.Bang;[!];
  59831. - SyntaxKind.DoubleHyphen;[--];
  59832. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:Whitespace - (11:0,11) - Tokens:1
  59833. - SyntaxKind.Text;[Foo];
  59834. - Markup span - Gen<Markup> - [-->] - SpanEditHandler;Accepts:None - (14:0,14) - Tokens:2
  59835. - SyntaxKind.DoubleHyphen;[--];
  59836. - SyntaxKind.CloseAngle;[>];
  59837. - Markup span - Gen<Markup> - [Bar] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:1
  59838. - SyntaxKind.Text;[Bar];
  59839. - Markup span - Gen<Markup> - [<!--F> Qux] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:7
  59840. - SyntaxKind.OpenAngle;[<];
  59841. - SyntaxKind.Bang;[!];
  59842. - SyntaxKind.DoubleHyphen;[--];
  59843. - SyntaxKind.Text;[F];
  59844. - SyntaxKind.CloseAngle;[>];
  59845. - SyntaxKind.Whitespace;[ ];
  59846. - SyntaxKind.Text;[Qux];
  59847. +RazorDocument - [0..30)::30 - [Foo Baz<!--Foo-->Bar<!--F> Qux]
  59848. + MarkupBlock - [0..30)::30
  59849. + MarkupTextLiteral - [0..7)::7 - [Foo Baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59850. + Text;[Foo];
  59851. + Whitespace;[ ];
  59852. + Text;[Baz];
  59853. + MarkupCommentBlock - [7..17)::10
  59854. + MarkupTextLiteral - [7..11)::4 - [<!--] - Gen<Markup> - SpanEditHandler;Accepts:None
  59855. + OpenAngle;[<];
  59856. + Bang;[!];
  59857. + DoubleHyphen;[--];
  59858. + MarkupTextLiteral - [11..14)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Whitespace
  59859. + Text;[Foo];
  59860. + MarkupTextLiteral - [14..17)::3 - [-->] - Gen<Markup> - SpanEditHandler;Accepts:None
  59861. + DoubleHyphen;[--];
  59862. + CloseAngle;[>];
  59863. + MarkupTextLiteral - [17..20)::3 - [Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59864. + Text;[Bar];
  59865. + MarkupTextLiteral - [20..30)::10 - [<!--F> Qux] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59866. + OpenAngle;[<];
  59867. + Bang;[!];
  59868. + DoubleHyphen;[--];
  59869. + Text;[F];
  59870. + CloseAngle;[>];
  59871. + Whitespace;[ ];
  59872. + Text;[Qux];
  59873. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionAtBeginningOfAttributeValue_DoesNotThrow.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionAtBeginningOfAttributeValue_DoesNotThrow.stree.txt
  59874. index e4b5313b751..03f6f941b0a 100644
  59875. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionAtBeginningOfAttributeValue_DoesNotThrow.stree.txt
  59876. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionAtBeginningOfAttributeValue_DoesNotThrow.stree.txt
  59877. @@ -1,28 +1,33 @@
  59878. -Markup block - Gen<None> - 22 - (0:0,0)
  59879. - Markup span - Gen<Markup> - [{] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  59880. - SyntaxKind.Text;[{];
  59881. - Tag block - Gen<None> - 20 - (1:0,1)
  59882. - Markup span - Gen<Markup> - [<span] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:2
  59883. - SyntaxKind.OpenAngle;[<];
  59884. - SyntaxKind.Text;[span];
  59885. - Markup block - Gen<Attr:foo, foo='@(6:0,6),'@(17:0,17)> - 12 - (6:0,6)
  59886. - Markup span - Gen<None> - [ foo='] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:4
  59887. - SyntaxKind.Whitespace;[ ];
  59888. - SyntaxKind.Text;[foo];
  59889. - SyntaxKind.Equals;[=];
  59890. - SyntaxKind.SingleQuote;['];
  59891. - Markup block - Gen<None> - 2 - (12:0,12)
  59892. - Markup span - Gen<LitAttr:@(12:0,12)> - [@] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:1
  59893. - SyntaxKind.Transition;[@];
  59894. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:1
  59895. - SyntaxKind.Transition;[@];
  59896. - Markup span - Gen<LitAttr:@(14:0,14)> - [def] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  59897. - SyntaxKind.Text;[def];
  59898. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:1
  59899. - SyntaxKind.SingleQuote;['];
  59900. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:3
  59901. - SyntaxKind.Whitespace;[ ];
  59902. - SyntaxKind.ForwardSlash;[/];
  59903. - SyntaxKind.CloseAngle;[>];
  59904. - Markup span - Gen<Markup> - [}] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:1
  59905. - SyntaxKind.Text;[}];
  59906. +RazorDocument - [0..22)::22 - [{<span foo='@@def' />}]
  59907. + MarkupBlock - [0..22)::22
  59908. + MarkupTextLiteral - [0..1)::1 - [{] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59909. + Text;[{];
  59910. + MarkupTagBlock - [1..21)::20 - [<span foo='@@def' />]
  59911. + MarkupTextLiteral - [1..6)::5 - [<span] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59912. + OpenAngle;[<];
  59913. + Text;[span];
  59914. + MarkupAttributeBlock - [6..18)::12 - [ foo='@@def']
  59915. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59916. + Whitespace;[ ];
  59917. + MarkupTextLiteral - [7..10)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59918. + Text;[foo];
  59919. + Equals;[=];
  59920. + MarkupTextLiteral - [11..12)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  59921. + SingleQuote;['];
  59922. + GenericBlock - [12..17)::5
  59923. + MarkupBlock - [12..14)::2
  59924. + MarkupTextLiteral - [12..13)::1 - [@] - Gen<LitAttr:@(12:0,12)> - SpanEditHandler;Accepts:None
  59925. + Transition;[@];
  59926. + MarkupEphemeralTextLiteral - [13..14)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  59927. + Transition;[@];
  59928. + MarkupLiteralAttributeValue - [14..17)::3 - [def]
  59929. + MarkupTextLiteral - [14..17)::3 - [def] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59930. + Text;[def];
  59931. + MarkupTextLiteral - [17..18)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  59932. + SingleQuote;['];
  59933. + MarkupTextLiteral - [18..21)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59934. + Whitespace;[ ];
  59935. + ForwardSlash;[/];
  59936. + CloseAngle;[>];
  59937. + MarkupTextLiteral - [21..22)::1 - [}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59938. + Text;[}];
  59939. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionAtEndOfAttributeValue_DoesNotThrow.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionAtEndOfAttributeValue_DoesNotThrow.stree.txt
  59940. index 6ff2b344075..ac5d126d193 100644
  59941. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionAtEndOfAttributeValue_DoesNotThrow.stree.txt
  59942. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionAtEndOfAttributeValue_DoesNotThrow.stree.txt
  59943. @@ -1,28 +1,33 @@
  59944. -Markup block - Gen<None> - 22 - (0:0,0)
  59945. - Markup span - Gen<Markup> - [{] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  59946. - SyntaxKind.Text;[{];
  59947. - Tag block - Gen<None> - 20 - (1:0,1)
  59948. - Markup span - Gen<Markup> - [<span] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:2
  59949. - SyntaxKind.OpenAngle;[<];
  59950. - SyntaxKind.Text;[span];
  59951. - Markup block - Gen<Attr:foo, foo='@(6:0,6),'@(17:0,17)> - 12 - (6:0,6)
  59952. - Markup span - Gen<None> - [ foo='] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:4
  59953. - SyntaxKind.Whitespace;[ ];
  59954. - SyntaxKind.Text;[foo];
  59955. - SyntaxKind.Equals;[=];
  59956. - SyntaxKind.SingleQuote;['];
  59957. - Markup span - Gen<LitAttr:@(12:0,12)> - [abc] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:1
  59958. - SyntaxKind.Text;[abc];
  59959. - Markup block - Gen<None> - 2 - (15:0,15)
  59960. - Markup span - Gen<LitAttr:@(15:0,15)> - [@] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:1
  59961. - SyntaxKind.Transition;[@];
  59962. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  59963. - SyntaxKind.Transition;[@];
  59964. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:1
  59965. - SyntaxKind.SingleQuote;['];
  59966. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:3
  59967. - SyntaxKind.Whitespace;[ ];
  59968. - SyntaxKind.ForwardSlash;[/];
  59969. - SyntaxKind.CloseAngle;[>];
  59970. - Markup span - Gen<Markup> - [}] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:1
  59971. - SyntaxKind.Text;[}];
  59972. +RazorDocument - [0..22)::22 - [{<span foo='abc@@' />}]
  59973. + MarkupBlock - [0..22)::22
  59974. + MarkupTextLiteral - [0..1)::1 - [{] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59975. + Text;[{];
  59976. + MarkupTagBlock - [1..21)::20 - [<span foo='abc@@' />]
  59977. + MarkupTextLiteral - [1..6)::5 - [<span] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59978. + OpenAngle;[<];
  59979. + Text;[span];
  59980. + MarkupAttributeBlock - [6..18)::12 - [ foo='abc@@']
  59981. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59982. + Whitespace;[ ];
  59983. + MarkupTextLiteral - [7..10)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59984. + Text;[foo];
  59985. + Equals;[=];
  59986. + MarkupTextLiteral - [11..12)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  59987. + SingleQuote;['];
  59988. + GenericBlock - [12..17)::5
  59989. + MarkupLiteralAttributeValue - [12..15)::3 - [abc]
  59990. + MarkupTextLiteral - [12..15)::3 - [abc] - Gen<Markup> - SpanEditHandler;Accepts:Any
  59991. + Text;[abc];
  59992. + MarkupBlock - [15..17)::2
  59993. + MarkupTextLiteral - [15..16)::1 - [@] - Gen<LitAttr:@(15:0,15)> - SpanEditHandler;Accepts:None
  59994. + Transition;[@];
  59995. + MarkupEphemeralTextLiteral - [16..17)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  59996. + Transition;[@];
  59997. + MarkupTextLiteral - [17..18)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  59998. + SingleQuote;['];
  59999. + MarkupTextLiteral - [18..21)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60000. + Whitespace;[ ];
  60001. + ForwardSlash;[/];
  60002. + CloseAngle;[>];
  60003. + MarkupTextLiteral - [21..22)::1 - [}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60004. + Text;[}];
  60005. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionBetweenAttributeValue_DoesNotThrow.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionBetweenAttributeValue_DoesNotThrow.stree.txt
  60006. index 1038ccb0a58..68c7fba3304 100644
  60007. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionBetweenAttributeValue_DoesNotThrow.stree.txt
  60008. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionBetweenAttributeValue_DoesNotThrow.stree.txt
  60009. @@ -1,32 +1,39 @@
  60010. -Markup block - Gen<None> - 27 - (0:0,0)
  60011. - Markup span - Gen<Markup> - [{] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  60012. - SyntaxKind.Text;[{];
  60013. - Tag block - Gen<None> - 25 - (1:0,1)
  60014. - Markup span - Gen<Markup> - [<span] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:2
  60015. - SyntaxKind.OpenAngle;[<];
  60016. - SyntaxKind.Text;[span];
  60017. - Markup block - Gen<Attr:foo, foo='@(6:0,6),'@(22:0,22)> - 17 - (6:0,6)
  60018. - Markup span - Gen<None> - [ foo='] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:4
  60019. - SyntaxKind.Whitespace;[ ];
  60020. - SyntaxKind.Text;[foo];
  60021. - SyntaxKind.Equals;[=];
  60022. - SyntaxKind.SingleQuote;['];
  60023. - Markup span - Gen<LitAttr:@(12:0,12)> - [abc] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:1
  60024. - SyntaxKind.Text;[abc];
  60025. - Markup block - Gen<None> - 3 - (15:0,15)
  60026. - Markup span - Gen<LitAttr: @(15:0,15)> - [ @] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:2
  60027. - SyntaxKind.Whitespace;[ ];
  60028. - SyntaxKind.Transition;[@];
  60029. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (17:0,17) - Tokens:1
  60030. - SyntaxKind.Transition;[@];
  60031. - Markup span - Gen<LitAttr: @(18:0,18)> - [ def] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:2
  60032. - SyntaxKind.Whitespace;[ ];
  60033. - SyntaxKind.Text;[def];
  60034. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:1
  60035. - SyntaxKind.SingleQuote;['];
  60036. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:3
  60037. - SyntaxKind.Whitespace;[ ];
  60038. - SyntaxKind.ForwardSlash;[/];
  60039. - SyntaxKind.CloseAngle;[>];
  60040. - Markup span - Gen<Markup> - [}] - SpanEditHandler;Accepts:Any - (26:0,26) - Tokens:1
  60041. - SyntaxKind.Text;[}];
  60042. +RazorDocument - [0..27)::27 - [{<span foo='abc @@ def' />}]
  60043. + MarkupBlock - [0..27)::27
  60044. + MarkupTextLiteral - [0..1)::1 - [{] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60045. + Text;[{];
  60046. + MarkupTagBlock - [1..26)::25 - [<span foo='abc @@ def' />]
  60047. + MarkupTextLiteral - [1..6)::5 - [<span] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60048. + OpenAngle;[<];
  60049. + Text;[span];
  60050. + MarkupAttributeBlock - [6..23)::17 - [ foo='abc @@ def']
  60051. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60052. + Whitespace;[ ];
  60053. + MarkupTextLiteral - [7..10)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60054. + Text;[foo];
  60055. + Equals;[=];
  60056. + MarkupTextLiteral - [11..12)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  60057. + SingleQuote;['];
  60058. + GenericBlock - [12..22)::10
  60059. + MarkupLiteralAttributeValue - [12..15)::3 - [abc]
  60060. + MarkupTextLiteral - [12..15)::3 - [abc] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60061. + Text;[abc];
  60062. + MarkupBlock - [15..18)::3
  60063. + MarkupTextLiteral - [15..17)::2 - [ @] - Gen<LitAttr: @(15:0,15)> - SpanEditHandler;Accepts:None
  60064. + Whitespace;[ ];
  60065. + Transition;[@];
  60066. + MarkupEphemeralTextLiteral - [17..18)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  60067. + Transition;[@];
  60068. + MarkupLiteralAttributeValue - [18..22)::4 - [ def]
  60069. + MarkupTextLiteral - [18..19)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60070. + Whitespace;[ ];
  60071. + MarkupTextLiteral - [19..22)::3 - [def] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60072. + Text;[def];
  60073. + MarkupTextLiteral - [22..23)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  60074. + SingleQuote;['];
  60075. + MarkupTextLiteral - [23..26)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60076. + Whitespace;[ ];
  60077. + ForwardSlash;[/];
  60078. + CloseAngle;[>];
  60079. + MarkupTextLiteral - [26..27)::1 - [}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60080. + Text;[}];
  60081. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionInAttributeValue_DoesNotThrow.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionInAttributeValue_DoesNotThrow.stree.txt
  60082. index f04d8a5d15e..92a82643e77 100644
  60083. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionInAttributeValue_DoesNotThrow.stree.txt
  60084. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionInAttributeValue_DoesNotThrow.stree.txt
  60085. @@ -1,26 +1,30 @@
  60086. -Markup block - Gen<None> - 19 - (0:0,0)
  60087. - Markup span - Gen<Markup> - [{] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  60088. - SyntaxKind.Text;[{];
  60089. - Tag block - Gen<None> - 17 - (1:0,1)
  60090. - Markup span - Gen<Markup> - [<span] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:2
  60091. - SyntaxKind.OpenAngle;[<];
  60092. - SyntaxKind.Text;[span];
  60093. - Markup block - Gen<Attr:foo, foo='@(6:0,6),'@(14:0,14)> - 9 - (6:0,6)
  60094. - Markup span - Gen<None> - [ foo='] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:4
  60095. - SyntaxKind.Whitespace;[ ];
  60096. - SyntaxKind.Text;[foo];
  60097. - SyntaxKind.Equals;[=];
  60098. - SyntaxKind.SingleQuote;['];
  60099. - Markup block - Gen<None> - 2 - (12:0,12)
  60100. - Markup span - Gen<LitAttr:@(12:0,12)> - [@] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:1
  60101. - SyntaxKind.Transition;[@];
  60102. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:1
  60103. - SyntaxKind.Transition;[@];
  60104. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  60105. - SyntaxKind.SingleQuote;['];
  60106. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:3
  60107. - SyntaxKind.Whitespace;[ ];
  60108. - SyntaxKind.ForwardSlash;[/];
  60109. - SyntaxKind.CloseAngle;[>];
  60110. - Markup span - Gen<Markup> - [}] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:1
  60111. - SyntaxKind.Text;[}];
  60112. +RazorDocument - [0..19)::19 - [{<span foo='@@' />}]
  60113. + MarkupBlock - [0..19)::19
  60114. + MarkupTextLiteral - [0..1)::1 - [{] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60115. + Text;[{];
  60116. + MarkupTagBlock - [1..18)::17 - [<span foo='@@' />]
  60117. + MarkupTextLiteral - [1..6)::5 - [<span] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60118. + OpenAngle;[<];
  60119. + Text;[span];
  60120. + MarkupAttributeBlock - [6..15)::9 - [ foo='@@']
  60121. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60122. + Whitespace;[ ];
  60123. + MarkupTextLiteral - [7..10)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60124. + Text;[foo];
  60125. + Equals;[=];
  60126. + MarkupTextLiteral - [11..12)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  60127. + SingleQuote;['];
  60128. + GenericBlock - [12..14)::2
  60129. + MarkupBlock - [12..14)::2
  60130. + MarkupTextLiteral - [12..13)::1 - [@] - Gen<LitAttr:@(12:0,12)> - SpanEditHandler;Accepts:None
  60131. + Transition;[@];
  60132. + MarkupEphemeralTextLiteral - [13..14)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  60133. + Transition;[@];
  60134. + MarkupTextLiteral - [14..15)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  60135. + SingleQuote;['];
  60136. + MarkupTextLiteral - [15..18)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60137. + Whitespace;[ ];
  60138. + ForwardSlash;[/];
  60139. + CloseAngle;[>];
  60140. + MarkupTextLiteral - [18..19)::1 - [}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60141. + Text;[}];
  60142. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionInEmail_DoesNotThrow.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionInEmail_DoesNotThrow.stree.txt
  60143. index 4eab838c4a9..f4e7c4098c6 100644
  60144. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionInEmail_DoesNotThrow.stree.txt
  60145. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionInEmail_DoesNotThrow.stree.txt
  60146. @@ -1,39 +1,47 @@
  60147. -Markup block - Gen<None> - 44 - (0:0,0)
  60148. - Markup span - Gen<Markup> - [{] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  60149. - SyntaxKind.Text;[{];
  60150. - Tag block - Gen<None> - 42 - (1:0,1)
  60151. - Markup span - Gen<Markup> - [<span] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:2
  60152. - SyntaxKind.OpenAngle;[<];
  60153. - SyntaxKind.Text;[span];
  60154. - Markup block - Gen<Attr:foo, foo='@(6:0,6),'@(39:0,39)> - 34 - (6:0,6)
  60155. - Markup span - Gen<None> - [ foo='] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:4
  60156. - SyntaxKind.Whitespace;[ ];
  60157. - SyntaxKind.Text;[foo];
  60158. - SyntaxKind.Equals;[=];
  60159. - SyntaxKind.SingleQuote;['];
  60160. - Markup span - Gen<LitAttr:@(12:0,12)> - [[email protected]] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:1
  60161. - SyntaxKind.Text;[[email protected]];
  60162. - Markup span - Gen<LitAttr: @(23:0,23)> - [ abc] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:2
  60163. - SyntaxKind.Whitespace;[ ];
  60164. - SyntaxKind.Text;[abc];
  60165. - Markup block - Gen<None> - 2 - (27:0,27)
  60166. - Markup span - Gen<LitAttr:@(27:0,27)> - [@] - SpanEditHandler;Accepts:None - (27:0,27) - Tokens:1
  60167. - SyntaxKind.Transition;[@];
  60168. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (28:0,28) - Tokens:1
  60169. - SyntaxKind.Transition;[@];
  60170. - Markup span - Gen<LitAttr:@(29:0,29)> - [def.com] - SpanEditHandler;Accepts:Any - (29:0,29) - Tokens:1
  60171. - SyntaxKind.Text;[def.com];
  60172. - Markup block - Gen<None> - 3 - (36:0,36)
  60173. - Markup span - Gen<LitAttr: @(36:0,36)> - [ @] - SpanEditHandler;Accepts:None - (36:0,36) - Tokens:2
  60174. - SyntaxKind.Whitespace;[ ];
  60175. - SyntaxKind.Transition;[@];
  60176. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (38:0,38) - Tokens:1
  60177. - SyntaxKind.Transition;[@];
  60178. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (39:0,39) - Tokens:1
  60179. - SyntaxKind.SingleQuote;['];
  60180. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:Any - (40:0,40) - Tokens:3
  60181. - SyntaxKind.Whitespace;[ ];
  60182. - SyntaxKind.ForwardSlash;[/];
  60183. - SyntaxKind.CloseAngle;[>];
  60184. - Markup span - Gen<Markup> - [}] - SpanEditHandler;Accepts:Any - (43:0,43) - Tokens:1
  60185. - SyntaxKind.Text;[}];
  60186. +RazorDocument - [0..44)::44 - [{<span foo='[email protected] abc@@def.com @@' />}]
  60187. + MarkupBlock - [0..44)::44
  60188. + MarkupTextLiteral - [0..1)::1 - [{] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60189. + Text;[{];
  60190. + MarkupTagBlock - [1..43)::42 - [<span foo='[email protected] abc@@def.com @@' />]
  60191. + MarkupTextLiteral - [1..6)::5 - [<span] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60192. + OpenAngle;[<];
  60193. + Text;[span];
  60194. + MarkupAttributeBlock - [6..40)::34 - [ foo='[email protected] abc@@def.com @@']
  60195. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60196. + Whitespace;[ ];
  60197. + MarkupTextLiteral - [7..10)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60198. + Text;[foo];
  60199. + Equals;[=];
  60200. + MarkupTextLiteral - [11..12)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  60201. + SingleQuote;['];
  60202. + GenericBlock - [12..39)::27
  60203. + MarkupLiteralAttributeValue - [12..23)::11 - [[email protected]]
  60204. + MarkupTextLiteral - [12..23)::11 - [[email protected]] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60205. + Text;[[email protected]];
  60206. + MarkupLiteralAttributeValue - [23..27)::4 - [ abc]
  60207. + MarkupTextLiteral - [23..24)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60208. + Whitespace;[ ];
  60209. + MarkupTextLiteral - [24..27)::3 - [abc] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60210. + Text;[abc];
  60211. + MarkupBlock - [27..29)::2
  60212. + MarkupTextLiteral - [27..28)::1 - [@] - Gen<LitAttr:@(27:0,27)> - SpanEditHandler;Accepts:None
  60213. + Transition;[@];
  60214. + MarkupEphemeralTextLiteral - [28..29)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  60215. + Transition;[@];
  60216. + MarkupLiteralAttributeValue - [29..36)::7 - [def.com]
  60217. + MarkupTextLiteral - [29..36)::7 - [def.com] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60218. + Text;[def.com];
  60219. + MarkupBlock - [36..39)::3
  60220. + MarkupTextLiteral - [36..38)::2 - [ @] - Gen<LitAttr: @(36:0,36)> - SpanEditHandler;Accepts:None
  60221. + Whitespace;[ ];
  60222. + Transition;[@];
  60223. + MarkupEphemeralTextLiteral - [38..39)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  60224. + Transition;[@];
  60225. + MarkupTextLiteral - [39..40)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  60226. + SingleQuote;['];
  60227. + MarkupTextLiteral - [40..43)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60228. + Whitespace;[ ];
  60229. + ForwardSlash;[/];
  60230. + CloseAngle;[>];
  60231. + MarkupTextLiteral - [43..44)::1 - [}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60232. + Text;[}];
  60233. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionInRegex_DoesNotThrow.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionInRegex_DoesNotThrow.stree.txt
  60234. index 46882069a2e..fce7daaceb6 100644
  60235. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionInRegex_DoesNotThrow.stree.txt
  60236. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionInRegex_DoesNotThrow.stree.txt
  60237. @@ -1,72 +1,78 @@
  60238. -Markup block - Gen<None> - 117 - (0:0,0)
  60239. - Markup span - Gen<Markup> - [{] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  60240. - SyntaxKind.Text;[{];
  60241. - Tag block - Gen<None> - 115 - (1:0,1)
  60242. - Markup span - Gen<Markup> - [<span] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:2
  60243. - SyntaxKind.OpenAngle;[<];
  60244. - SyntaxKind.Text;[span];
  60245. - Markup block - Gen<Attr:foo, foo="@(6:0,6),"@(112:0,112)> - 107 - (6:0,6)
  60246. - Markup span - Gen<None> - [ foo="] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:4
  60247. - SyntaxKind.Whitespace;[ ];
  60248. - SyntaxKind.Text;[foo];
  60249. - SyntaxKind.Equals;[=];
  60250. - SyntaxKind.DoubleQuote;["];
  60251. - Markup span - Gen<LitAttr:@(12:0,12)> - [/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:14
  60252. - SyntaxKind.ForwardSlash;[/];
  60253. - SyntaxKind.Text;[^];
  60254. - SyntaxKind.LeftBracket;[[];
  60255. - SyntaxKind.Text;[a-z0-9];
  60256. - SyntaxKind.Bang;[!];
  60257. - SyntaxKind.Text;[#$%&];
  60258. - SyntaxKind.SingleQuote;['];
  60259. - SyntaxKind.Text;[*+\];
  60260. - SyntaxKind.ForwardSlash;[/];
  60261. - SyntaxKind.Equals;[=];
  60262. - SyntaxKind.QuestionMark;[?];
  60263. - SyntaxKind.Text;[^_`{|}~.-];
  60264. - SyntaxKind.RightBracket;[]];
  60265. - SyntaxKind.Text;[+];
  60266. - Markup block - Gen<None> - 2 - (44:0,44)
  60267. - Markup span - Gen<LitAttr:@(44:0,44)> - [@] - SpanEditHandler;Accepts:None - (44:0,44) - Tokens:1
  60268. - SyntaxKind.Transition;[@];
  60269. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (45:0,45) - Tokens:1
  60270. - SyntaxKind.Transition;[@];
  60271. - Markup span - Gen<LitAttr:@(46:0,46)> - [[a-z0-9]([a-z0-9-]*[a-z0-9])?\.([a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i] - SpanEditHandler;Accepts:Any - (46:0,46) - Tokens:30
  60272. - SyntaxKind.LeftBracket;[[];
  60273. - SyntaxKind.Text;[a-z0-9];
  60274. - SyntaxKind.RightBracket;[]];
  60275. - SyntaxKind.Text;[(];
  60276. - SyntaxKind.LeftBracket;[[];
  60277. - SyntaxKind.Text;[a-z0-9-];
  60278. - SyntaxKind.RightBracket;[]];
  60279. - SyntaxKind.Text;[*];
  60280. - SyntaxKind.LeftBracket;[[];
  60281. - SyntaxKind.Text;[a-z0-9];
  60282. - SyntaxKind.RightBracket;[]];
  60283. - SyntaxKind.Text;[)];
  60284. - SyntaxKind.QuestionMark;[?];
  60285. - SyntaxKind.Text;[\.(];
  60286. - SyntaxKind.LeftBracket;[[];
  60287. - SyntaxKind.Text;[a-z0-9];
  60288. - SyntaxKind.RightBracket;[]];
  60289. - SyntaxKind.Text;[(];
  60290. - SyntaxKind.LeftBracket;[[];
  60291. - SyntaxKind.Text;[a-z0-9-];
  60292. - SyntaxKind.RightBracket;[]];
  60293. - SyntaxKind.Text;[*];
  60294. - SyntaxKind.LeftBracket;[[];
  60295. - SyntaxKind.Text;[a-z0-9];
  60296. - SyntaxKind.RightBracket;[]];
  60297. - SyntaxKind.Text;[)];
  60298. - SyntaxKind.QuestionMark;[?];
  60299. - SyntaxKind.Text;[)*$];
  60300. - SyntaxKind.ForwardSlash;[/];
  60301. - SyntaxKind.Text;[i];
  60302. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (112:0,112) - Tokens:1
  60303. - SyntaxKind.DoubleQuote;["];
  60304. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:Any - (113:0,113) - Tokens:3
  60305. - SyntaxKind.Whitespace;[ ];
  60306. - SyntaxKind.ForwardSlash;[/];
  60307. - SyntaxKind.CloseAngle;[>];
  60308. - Markup span - Gen<Markup> - [}] - SpanEditHandler;Accepts:Any - (116:0,116) - Tokens:1
  60309. - SyntaxKind.Text;[}];
  60310. +RazorDocument - [0..117)::117 - [{<span foo="/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@@[a-z0-9]([a-z0-9-]*[a-z0-9])?\.([a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i" />}]
  60311. + MarkupBlock - [0..117)::117
  60312. + MarkupTextLiteral - [0..1)::1 - [{] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60313. + Text;[{];
  60314. + MarkupTagBlock - [1..116)::115 - [<span foo="/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@@[a-z0-9]([a-z0-9-]*[a-z0-9])?\.([a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i" />]
  60315. + MarkupTextLiteral - [1..6)::5 - [<span] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60316. + OpenAngle;[<];
  60317. + Text;[span];
  60318. + MarkupAttributeBlock - [6..113)::107 - [ foo="/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@@[a-z0-9]([a-z0-9-]*[a-z0-9])?\.([a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i"]
  60319. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60320. + Whitespace;[ ];
  60321. + MarkupTextLiteral - [7..10)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60322. + Text;[foo];
  60323. + Equals;[=];
  60324. + MarkupTextLiteral - [11..12)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  60325. + DoubleQuote;["];
  60326. + GenericBlock - [12..112)::100
  60327. + MarkupLiteralAttributeValue - [12..44)::32 - [/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+]
  60328. + MarkupTextLiteral - [12..44)::32 - [/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60329. + ForwardSlash;[/];
  60330. + Text;[^];
  60331. + LeftBracket;[[];
  60332. + Text;[a-z0-9];
  60333. + Bang;[!];
  60334. + Text;[#$%&];
  60335. + SingleQuote;['];
  60336. + Text;[*+\];
  60337. + ForwardSlash;[/];
  60338. + Equals;[=];
  60339. + QuestionMark;[?];
  60340. + Text;[^_`{|}~.-];
  60341. + RightBracket;[]];
  60342. + Text;[+];
  60343. + MarkupBlock - [44..46)::2
  60344. + MarkupTextLiteral - [44..45)::1 - [@] - Gen<LitAttr:@(44:0,44)> - SpanEditHandler;Accepts:None
  60345. + Transition;[@];
  60346. + MarkupEphemeralTextLiteral - [45..46)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  60347. + Transition;[@];
  60348. + MarkupLiteralAttributeValue - [46..112)::66 - [[a-z0-9]([a-z0-9-]*[a-z0-9])?\.([a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i]
  60349. + MarkupTextLiteral - [46..112)::66 - [[a-z0-9]([a-z0-9-]*[a-z0-9])?\.([a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60350. + LeftBracket;[[];
  60351. + Text;[a-z0-9];
  60352. + RightBracket;[]];
  60353. + Text;[(];
  60354. + LeftBracket;[[];
  60355. + Text;[a-z0-9-];
  60356. + RightBracket;[]];
  60357. + Text;[*];
  60358. + LeftBracket;[[];
  60359. + Text;[a-z0-9];
  60360. + RightBracket;[]];
  60361. + Text;[)];
  60362. + QuestionMark;[?];
  60363. + Text;[\.(];
  60364. + LeftBracket;[[];
  60365. + Text;[a-z0-9];
  60366. + RightBracket;[]];
  60367. + Text;[(];
  60368. + LeftBracket;[[];
  60369. + Text;[a-z0-9-];
  60370. + RightBracket;[]];
  60371. + Text;[*];
  60372. + LeftBracket;[[];
  60373. + Text;[a-z0-9];
  60374. + RightBracket;[]];
  60375. + Text;[)];
  60376. + QuestionMark;[?];
  60377. + Text;[)*$];
  60378. + ForwardSlash;[/];
  60379. + Text;[i];
  60380. + MarkupTextLiteral - [112..113)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  60381. + DoubleQuote;["];
  60382. + MarkupTextLiteral - [113..116)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60383. + Whitespace;[ ];
  60384. + ForwardSlash;[/];
  60385. + CloseAngle;[>];
  60386. + MarkupTextLiteral - [116..117)::1 - [}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60387. + Text;[}];
  60388. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionWithExpressionBlock_DoesNotThrow.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionWithExpressionBlock_DoesNotThrow.stree.txt
  60389. index 951e69447ef..389c5da4e5d 100644
  60390. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionWithExpressionBlock_DoesNotThrow.stree.txt
  60391. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithDoubleTransitionWithExpressionBlock_DoesNotThrow.stree.txt
  60392. @@ -1,141 +1,181 @@
  60393. -Markup block - Gen<None> - 120 - (0:0,0)
  60394. - Markup span - Gen<Markup> - [{] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  60395. - SyntaxKind.Text;[{];
  60396. - Tag block - Gen<None> - 118 - (1:0,1)
  60397. - Markup span - Gen<Markup> - [<span] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:2
  60398. - SyntaxKind.OpenAngle;[<];
  60399. - SyntaxKind.Text;[span];
  60400. - Markup block - Gen<Attr:foo, foo='@(6:0,6),'@(20:0,20)> - 15 - (6:0,6)
  60401. - Markup span - Gen<None> - [ foo='] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:4
  60402. - SyntaxKind.Whitespace;[ ];
  60403. - SyntaxKind.Text;[foo];
  60404. - SyntaxKind.Equals;[=];
  60405. - SyntaxKind.SingleQuote;['];
  60406. - Markup block - Gen<None> - 2 - (12:0,12)
  60407. - Markup span - Gen<LitAttr:@(12:0,12)> - [@] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:1
  60408. - SyntaxKind.Transition;[@];
  60409. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:1
  60410. - SyntaxKind.Transition;[@];
  60411. - Markup block - Gen<DynAttr:@(14:0,14)> - 6 - (14:0,14)
  60412. - Markup span - Gen<None> - [] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  60413. - SyntaxKind.Unknown;[];
  60414. - Expression block - Gen<Expr> - 6 - (14:0,14)
  60415. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (14:0,14) - Tokens:1
  60416. - SyntaxKind.Transition;[@];
  60417. - MetaCode span - Gen<None> - [(] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:1
  60418. - SyntaxKind.LeftParenthesis;[(];
  60419. - Code span - Gen<Expr> - [2+3] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:3
  60420. - SyntaxKind.IntegerLiteral;[2];
  60421. - SyntaxKind.Plus;[+];
  60422. - SyntaxKind.IntegerLiteral;[3];
  60423. - MetaCode span - Gen<None> - [)] - SpanEditHandler;Accepts:None - (19:0,19) - Tokens:1
  60424. - SyntaxKind.RightParenthesis;[)];
  60425. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:1
  60426. - SyntaxKind.SingleQuote;['];
  60427. - Markup block - Gen<Attr:bar, bar='@(21:0,21),'@(48:0,48)> - 28 - (21:0,21)
  60428. - Markup span - Gen<None> - [ bar='] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:4
  60429. - SyntaxKind.Whitespace;[ ];
  60430. - SyntaxKind.Text;[bar];
  60431. - SyntaxKind.Equals;[=];
  60432. - SyntaxKind.SingleQuote;['];
  60433. - Markup block - Gen<DynAttr:@(27:0,27)> - 6 - (27:0,27)
  60434. - Expression block - Gen<Expr> - 6 - (27:0,27)
  60435. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (27:0,27) - Tokens:1
  60436. - SyntaxKind.Transition;[@];
  60437. - MetaCode span - Gen<None> - [(] - SpanEditHandler;Accepts:None - (28:0,28) - Tokens:1
  60438. - SyntaxKind.LeftParenthesis;[(];
  60439. - Code span - Gen<Expr> - [2+3] - SpanEditHandler;Accepts:Any - (29:0,29) - Tokens:3
  60440. - SyntaxKind.IntegerLiteral;[2];
  60441. - SyntaxKind.Plus;[+];
  60442. - SyntaxKind.IntegerLiteral;[3];
  60443. - MetaCode span - Gen<None> - [)] - SpanEditHandler;Accepts:None - (32:0,32) - Tokens:1
  60444. - SyntaxKind.RightParenthesis;[)];
  60445. - Markup block - Gen<None> - 2 - (33:0,33)
  60446. - Markup span - Gen<LitAttr:@(33:0,33)> - [@] - SpanEditHandler;Accepts:None - (33:0,33) - Tokens:1
  60447. - SyntaxKind.Transition;[@];
  60448. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (34:0,34) - Tokens:1
  60449. - SyntaxKind.Transition;[@];
  60450. - Markup block - Gen<DynAttr:@(35:0,35)> - 13 - (35:0,35)
  60451. - Markup span - Gen<None> - [] - SpanEditHandler;Accepts:Any - (35:0,35) - Tokens:1
  60452. - SyntaxKind.Unknown;[];
  60453. - Expression block - Gen<Expr> - 13 - (35:0,35)
  60454. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (35:0,35) - Tokens:1
  60455. - SyntaxKind.Transition;[@];
  60456. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (36:0,36) - Tokens:3
  60457. - SyntaxKind.Identifier;[DateTime];
  60458. - SyntaxKind.Dot;[.];
  60459. - SyntaxKind.Identifier;[Now];
  60460. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (48:0,48) - Tokens:1
  60461. - SyntaxKind.SingleQuote;['];
  60462. - Markup block - Gen<Attr:baz, baz='@(49:0,49),'@(70:0,70)> - 22 - (49:0,49)
  60463. - Markup span - Gen<None> - [ baz='] - SpanEditHandler;Accepts:Any - (49:0,49) - Tokens:4
  60464. - SyntaxKind.Whitespace;[ ];
  60465. - SyntaxKind.Text;[baz];
  60466. - SyntaxKind.Equals;[=];
  60467. - SyntaxKind.SingleQuote;['];
  60468. - Markup block - Gen<DynAttr:@(55:0,55)> - 13 - (55:0,55)
  60469. - Expression block - Gen<Expr> - 13 - (55:0,55)
  60470. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (55:0,55) - Tokens:1
  60471. - SyntaxKind.Transition;[@];
  60472. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (56:0,56) - Tokens:3
  60473. - SyntaxKind.Identifier;[DateTime];
  60474. - SyntaxKind.Dot;[.];
  60475. - SyntaxKind.Identifier;[Now];
  60476. - Markup block - Gen<None> - 2 - (68:0,68)
  60477. - Markup span - Gen<LitAttr:@(68:0,68)> - [@] - SpanEditHandler;Accepts:None - (68:0,68) - Tokens:1
  60478. - SyntaxKind.Transition;[@];
  60479. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (69:0,69) - Tokens:1
  60480. - SyntaxKind.Transition;[@];
  60481. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (70:0,70) - Tokens:1
  60482. - SyntaxKind.SingleQuote;['];
  60483. - Markup block - Gen<Attr:bat, bat='@(71:0,71),'@(93:0,93)> - 23 - (71:0,71)
  60484. - Markup span - Gen<None> - [ bat='] - SpanEditHandler;Accepts:Any - (71:0,71) - Tokens:4
  60485. - SyntaxKind.Whitespace;[ ];
  60486. - SyntaxKind.Text;[bat];
  60487. - SyntaxKind.Equals;[=];
  60488. - SyntaxKind.SingleQuote;['];
  60489. - Markup block - Gen<DynAttr:@(77:0,77)> - 13 - (77:0,77)
  60490. - Expression block - Gen<Expr> - 13 - (77:0,77)
  60491. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (77:0,77) - Tokens:1
  60492. - SyntaxKind.Transition;[@];
  60493. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (78:0,78) - Tokens:3
  60494. - SyntaxKind.Identifier;[DateTime];
  60495. - SyntaxKind.Dot;[.];
  60496. - SyntaxKind.Identifier;[Now];
  60497. - Markup block - Gen<None> - 3 - (90:0,90)
  60498. - Markup span - Gen<LitAttr: @(90:0,90)> - [ @] - SpanEditHandler;Accepts:None - (90:0,90) - Tokens:2
  60499. - SyntaxKind.Whitespace;[ ];
  60500. - SyntaxKind.Transition;[@];
  60501. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (92:0,92) - Tokens:1
  60502. - SyntaxKind.Transition;[@];
  60503. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (93:0,93) - Tokens:1
  60504. - SyntaxKind.SingleQuote;['];
  60505. - Markup block - Gen<Attr:zoo, zoo='@(94:0,94),'@(115:0,115)> - 22 - (94:0,94)
  60506. - Markup span - Gen<None> - [ zoo='] - SpanEditHandler;Accepts:Any - (94:0,94) - Tokens:4
  60507. - SyntaxKind.Whitespace;[ ];
  60508. - SyntaxKind.Text;[zoo];
  60509. - SyntaxKind.Equals;[=];
  60510. - SyntaxKind.SingleQuote;['];
  60511. - Markup block - Gen<None> - 2 - (100:0,100)
  60512. - Markup span - Gen<LitAttr:@(100:0,100)> - [@] - SpanEditHandler;Accepts:None - (100:0,100) - Tokens:1
  60513. - SyntaxKind.Transition;[@];
  60514. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (101:0,101) - Tokens:1
  60515. - SyntaxKind.Transition;[@];
  60516. - Markup block - Gen<DynAttr:@(102:0,102)> - 13 - (102:0,102)
  60517. - Markup span - Gen<None> - [] - SpanEditHandler;Accepts:Any - (102:0,102) - Tokens:1
  60518. - SyntaxKind.Unknown;[];
  60519. - Expression block - Gen<Expr> - 13 - (102:0,102)
  60520. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (102:0,102) - Tokens:1
  60521. - SyntaxKind.Transition;[@];
  60522. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (103:0,103) - Tokens:3
  60523. - SyntaxKind.Identifier;[DateTime];
  60524. - SyntaxKind.Dot;[.];
  60525. - SyntaxKind.Identifier;[Now];
  60526. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (115:0,115) - Tokens:1
  60527. - SyntaxKind.SingleQuote;['];
  60528. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:Any - (116:0,116) - Tokens:3
  60529. - SyntaxKind.Whitespace;[ ];
  60530. - SyntaxKind.ForwardSlash;[/];
  60531. - SyntaxKind.CloseAngle;[>];
  60532. - Markup span - Gen<Markup> - [}] - SpanEditHandler;Accepts:Any - (119:0,119) - Tokens:1
  60533. - SyntaxKind.Text;[}];
  60534. +RazorDocument - [0..120)::120 - [{<span foo='@@@(2+3)' bar='@(2+3)@@@DateTime.Now' baz='@DateTime.Now@@' bat='@DateTime.Now @@' zoo='@@@DateTime.Now' />}]
  60535. + MarkupBlock - [0..120)::120
  60536. + MarkupTextLiteral - [0..1)::1 - [{] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60537. + Text;[{];
  60538. + MarkupTagBlock - [1..119)::118 - [<span foo='@@@(2+3)' bar='@(2+3)@@@DateTime.Now' baz='@DateTime.Now@@' bat='@DateTime.Now @@' zoo='@@@DateTime.Now' />]
  60539. + MarkupTextLiteral - [1..6)::5 - [<span] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60540. + OpenAngle;[<];
  60541. + Text;[span];
  60542. + MarkupAttributeBlock - [6..21)::15 - [ foo='@@@(2+3)']
  60543. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60544. + Whitespace;[ ];
  60545. + MarkupTextLiteral - [7..10)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60546. + Text;[foo];
  60547. + Equals;[=];
  60548. + MarkupTextLiteral - [11..12)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  60549. + SingleQuote;['];
  60550. + GenericBlock - [12..20)::8
  60551. + MarkupBlock - [12..14)::2
  60552. + MarkupTextLiteral - [12..13)::1 - [@] - Gen<LitAttr:@(12:0,12)> - SpanEditHandler;Accepts:None
  60553. + Transition;[@];
  60554. + MarkupEphemeralTextLiteral - [13..14)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  60555. + Transition;[@];
  60556. + MarkupDynamicAttributeValue - [14..20)::6 - [@(2+3)]
  60557. + GenericBlock - [14..20)::6
  60558. + MarkupTextLiteral - [14..14)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60559. + Marker;[];
  60560. + CSharpCodeBlock - [14..20)::6
  60561. + CSharpExplicitExpression - [14..20)::6
  60562. + CSharpTransition - [14..15)::1 - Gen<None> - SpanEditHandler;Accepts:None
  60563. + Transition;[@];
  60564. + CSharpExplicitExpressionBody - [15..20)::5
  60565. + RazorMetaCode - [15..16)::1 - Gen<None> - SpanEditHandler;Accepts:None
  60566. + LeftParenthesis;[(];
  60567. + CSharpCodeBlock - [16..19)::3
  60568. + CSharpExpressionLiteral - [16..19)::3 - [2+3] - Gen<Expr> - SpanEditHandler;Accepts:Any
  60569. + IntegerLiteral;[2];
  60570. + Plus;[+];
  60571. + IntegerLiteral;[3];
  60572. + RazorMetaCode - [19..20)::1 - Gen<None> - SpanEditHandler;Accepts:None
  60573. + RightParenthesis;[)];
  60574. + MarkupTextLiteral - [20..21)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  60575. + SingleQuote;['];
  60576. + MarkupAttributeBlock - [21..49)::28 - [ bar='@(2+3)@@@DateTime.Now']
  60577. + MarkupTextLiteral - [21..22)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60578. + Whitespace;[ ];
  60579. + MarkupTextLiteral - [22..25)::3 - [bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60580. + Text;[bar];
  60581. + Equals;[=];
  60582. + MarkupTextLiteral - [26..27)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  60583. + SingleQuote;['];
  60584. + GenericBlock - [27..48)::21
  60585. + MarkupDynamicAttributeValue - [27..33)::6 - [@(2+3)]
  60586. + GenericBlock - [27..33)::6
  60587. + CSharpCodeBlock - [27..33)::6
  60588. + CSharpExplicitExpression - [27..33)::6
  60589. + CSharpTransition - [27..28)::1 - Gen<None> - SpanEditHandler;Accepts:None
  60590. + Transition;[@];
  60591. + CSharpExplicitExpressionBody - [28..33)::5
  60592. + RazorMetaCode - [28..29)::1 - Gen<None> - SpanEditHandler;Accepts:None
  60593. + LeftParenthesis;[(];
  60594. + CSharpCodeBlock - [29..32)::3
  60595. + CSharpExpressionLiteral - [29..32)::3 - [2+3] - Gen<Expr> - SpanEditHandler;Accepts:Any
  60596. + IntegerLiteral;[2];
  60597. + Plus;[+];
  60598. + IntegerLiteral;[3];
  60599. + RazorMetaCode - [32..33)::1 - Gen<None> - SpanEditHandler;Accepts:None
  60600. + RightParenthesis;[)];
  60601. + MarkupBlock - [33..35)::2
  60602. + MarkupTextLiteral - [33..34)::1 - [@] - Gen<LitAttr:@(33:0,33)> - SpanEditHandler;Accepts:None
  60603. + Transition;[@];
  60604. + MarkupEphemeralTextLiteral - [34..35)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  60605. + Transition;[@];
  60606. + MarkupDynamicAttributeValue - [35..48)::13 - [@DateTime.Now]
  60607. + GenericBlock - [35..48)::13
  60608. + MarkupTextLiteral - [35..35)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60609. + Marker;[];
  60610. + CSharpCodeBlock - [35..48)::13
  60611. + CSharpImplicitExpression - [35..48)::13
  60612. + CSharpTransition - [35..36)::1 - Gen<None> - SpanEditHandler;Accepts:None
  60613. + Transition;[@];
  60614. + CSharpImplicitExpressionBody - [36..48)::12
  60615. + CSharpCodeBlock - [36..48)::12
  60616. + CSharpExpressionLiteral - [36..48)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  60617. + Identifier;[DateTime];
  60618. + Dot;[.];
  60619. + Identifier;[Now];
  60620. + MarkupTextLiteral - [48..49)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  60621. + SingleQuote;['];
  60622. + MarkupAttributeBlock - [49..71)::22 - [ baz='@DateTime.Now@@']
  60623. + MarkupTextLiteral - [49..50)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60624. + Whitespace;[ ];
  60625. + MarkupTextLiteral - [50..53)::3 - [baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60626. + Text;[baz];
  60627. + Equals;[=];
  60628. + MarkupTextLiteral - [54..55)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  60629. + SingleQuote;['];
  60630. + GenericBlock - [55..70)::15
  60631. + MarkupDynamicAttributeValue - [55..68)::13 - [@DateTime.Now]
  60632. + GenericBlock - [55..68)::13
  60633. + CSharpCodeBlock - [55..68)::13
  60634. + CSharpImplicitExpression - [55..68)::13
  60635. + CSharpTransition - [55..56)::1 - Gen<None> - SpanEditHandler;Accepts:None
  60636. + Transition;[@];
  60637. + CSharpImplicitExpressionBody - [56..68)::12
  60638. + CSharpCodeBlock - [56..68)::12
  60639. + CSharpExpressionLiteral - [56..68)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  60640. + Identifier;[DateTime];
  60641. + Dot;[.];
  60642. + Identifier;[Now];
  60643. + MarkupBlock - [68..70)::2
  60644. + MarkupTextLiteral - [68..69)::1 - [@] - Gen<LitAttr:@(68:0,68)> - SpanEditHandler;Accepts:None
  60645. + Transition;[@];
  60646. + MarkupEphemeralTextLiteral - [69..70)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  60647. + Transition;[@];
  60648. + MarkupTextLiteral - [70..71)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  60649. + SingleQuote;['];
  60650. + MarkupAttributeBlock - [71..94)::23 - [ bat='@DateTime.Now @@']
  60651. + MarkupTextLiteral - [71..72)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60652. + Whitespace;[ ];
  60653. + MarkupTextLiteral - [72..75)::3 - [bat] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60654. + Text;[bat];
  60655. + Equals;[=];
  60656. + MarkupTextLiteral - [76..77)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  60657. + SingleQuote;['];
  60658. + GenericBlock - [77..93)::16
  60659. + MarkupDynamicAttributeValue - [77..90)::13 - [@DateTime.Now]
  60660. + GenericBlock - [77..90)::13
  60661. + CSharpCodeBlock - [77..90)::13
  60662. + CSharpImplicitExpression - [77..90)::13
  60663. + CSharpTransition - [77..78)::1 - Gen<None> - SpanEditHandler;Accepts:None
  60664. + Transition;[@];
  60665. + CSharpImplicitExpressionBody - [78..90)::12
  60666. + CSharpCodeBlock - [78..90)::12
  60667. + CSharpExpressionLiteral - [78..90)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  60668. + Identifier;[DateTime];
  60669. + Dot;[.];
  60670. + Identifier;[Now];
  60671. + MarkupBlock - [90..93)::3
  60672. + MarkupTextLiteral - [90..92)::2 - [ @] - Gen<LitAttr: @(90:0,90)> - SpanEditHandler;Accepts:None
  60673. + Whitespace;[ ];
  60674. + Transition;[@];
  60675. + MarkupEphemeralTextLiteral - [92..93)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  60676. + Transition;[@];
  60677. + MarkupTextLiteral - [93..94)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  60678. + SingleQuote;['];
  60679. + MarkupAttributeBlock - [94..116)::22 - [ zoo='@@@DateTime.Now']
  60680. + MarkupTextLiteral - [94..95)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60681. + Whitespace;[ ];
  60682. + MarkupTextLiteral - [95..98)::3 - [zoo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60683. + Text;[zoo];
  60684. + Equals;[=];
  60685. + MarkupTextLiteral - [99..100)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  60686. + SingleQuote;['];
  60687. + GenericBlock - [100..115)::15
  60688. + MarkupBlock - [100..102)::2
  60689. + MarkupTextLiteral - [100..101)::1 - [@] - Gen<LitAttr:@(100:0,100)> - SpanEditHandler;Accepts:None
  60690. + Transition;[@];
  60691. + MarkupEphemeralTextLiteral - [101..102)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  60692. + Transition;[@];
  60693. + MarkupDynamicAttributeValue - [102..115)::13 - [@DateTime.Now]
  60694. + GenericBlock - [102..115)::13
  60695. + MarkupTextLiteral - [102..102)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60696. + Marker;[];
  60697. + CSharpCodeBlock - [102..115)::13
  60698. + CSharpImplicitExpression - [102..115)::13
  60699. + CSharpTransition - [102..103)::1 - Gen<None> - SpanEditHandler;Accepts:None
  60700. + Transition;[@];
  60701. + CSharpImplicitExpressionBody - [103..115)::12
  60702. + CSharpCodeBlock - [103..115)::12
  60703. + CSharpExpressionLiteral - [103..115)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  60704. + Identifier;[DateTime];
  60705. + Dot;[.];
  60706. + Identifier;[Now];
  60707. + MarkupTextLiteral - [115..116)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  60708. + SingleQuote;['];
  60709. + MarkupTextLiteral - [116..119)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60710. + Whitespace;[ ];
  60711. + ForwardSlash;[/];
  60712. + CloseAngle;[>];
  60713. + MarkupTextLiteral - [119..120)::1 - [}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60714. + Text;[}];
  60715. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithUnexpectedTransitionsInAttributeValue_Throws.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithUnexpectedTransitionsInAttributeValue_Throws.stree.txt
  60716. index 8ee62c82788..9a9b532a821 100644
  60717. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithUnexpectedTransitionsInAttributeValue_Throws.stree.txt
  60718. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithUnexpectedTransitionsInAttributeValue_Throws.stree.txt
  60719. @@ -1,31 +1,43 @@
  60720. -Markup block - Gen<None> - 18 - (0:0,0)
  60721. - Tag block - Gen<None> - 18 - (0:0,0)
  60722. - Markup span - Gen<Markup> - [<span] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  60723. - SyntaxKind.OpenAngle;[<];
  60724. - SyntaxKind.Text;[span];
  60725. - Markup block - Gen<Attr:foo, foo='@(5:0,5),'@(14:0,14)> - 10 - (5:0,5)
  60726. - Markup span - Gen<None> - [ foo='] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:4
  60727. - SyntaxKind.Whitespace;[ ];
  60728. - SyntaxKind.Text;[foo];
  60729. - SyntaxKind.Equals;[=];
  60730. - SyntaxKind.SingleQuote;['];
  60731. - Markup block - Gen<DynAttr:@(11:0,11)> - 1 - (11:0,11)
  60732. - Expression block - Gen<Expr> - 1 - (11:0,11)
  60733. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (11:0,11) - Tokens:1
  60734. - SyntaxKind.Transition;[@];
  60735. - Code span - Gen<Expr> - [] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (12:0,12) - Tokens:1
  60736. - SyntaxKind.Unknown;[];
  60737. - Markup block - Gen<DynAttr: @(12:0,12)> - 2 - (12:0,12)
  60738. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:1
  60739. - SyntaxKind.Whitespace;[ ];
  60740. - Expression block - Gen<Expr> - 1 - (13:0,13)
  60741. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:1
  60742. - SyntaxKind.Transition;[@];
  60743. - Code span - Gen<Expr> - [] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (14:0,14) - Tokens:1
  60744. - SyntaxKind.Unknown;[];
  60745. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  60746. - SyntaxKind.SingleQuote;['];
  60747. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:3
  60748. - SyntaxKind.Whitespace;[ ];
  60749. - SyntaxKind.ForwardSlash;[/];
  60750. - SyntaxKind.CloseAngle;[>];
  60751. +RazorDocument - [0..18)::18 - [<span foo='@ @' />]
  60752. + MarkupBlock - [0..18)::18
  60753. + MarkupTagBlock - [0..18)::18 - [<span foo='@ @' />]
  60754. + MarkupTextLiteral - [0..5)::5 - [<span] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60755. + OpenAngle;[<];
  60756. + Text;[span];
  60757. + MarkupAttributeBlock - [5..15)::10 - [ foo='@ @']
  60758. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60759. + Whitespace;[ ];
  60760. + MarkupTextLiteral - [6..9)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60761. + Text;[foo];
  60762. + Equals;[=];
  60763. + MarkupTextLiteral - [10..11)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  60764. + SingleQuote;['];
  60765. + GenericBlock - [11..14)::3
  60766. + MarkupDynamicAttributeValue - [11..12)::1 - [@]
  60767. + GenericBlock - [11..12)::1
  60768. + CSharpCodeBlock - [11..12)::1
  60769. + CSharpImplicitExpression - [11..12)::1
  60770. + CSharpTransition - [11..12)::1 - Gen<None> - SpanEditHandler;Accepts:None
  60771. + Transition;[@];
  60772. + CSharpImplicitExpressionBody - [12..12)::0
  60773. + CSharpCodeBlock - [12..12)::0
  60774. + CSharpExpressionLiteral - [12..12)::0 - [] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  60775. + Marker;[];
  60776. + MarkupDynamicAttributeValue - [12..14)::2 - [ @]
  60777. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60778. + Whitespace;[ ];
  60779. + GenericBlock - [13..14)::1
  60780. + CSharpCodeBlock - [13..14)::1
  60781. + CSharpImplicitExpression - [13..14)::1
  60782. + CSharpTransition - [13..14)::1 - Gen<None> - SpanEditHandler;Accepts:None
  60783. + Transition;[@];
  60784. + CSharpImplicitExpressionBody - [14..14)::0
  60785. + CSharpCodeBlock - [14..14)::0
  60786. + CSharpExpressionLiteral - [14..14)::0 - [] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  60787. + Marker;[];
  60788. + MarkupTextLiteral - [14..15)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  60789. + SingleQuote;['];
  60790. + MarkupTextLiteral - [15..18)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60791. + Whitespace;[ ];
  60792. + ForwardSlash;[/];
  60793. + CloseAngle;[>];
  60794. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithinSectionDoesNotCreateDocumentLevelSpan.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithinSectionDoesNotCreateDocumentLevelSpan.stree.txt
  60795. index 01a9434ec5c..1234b0dbeb8 100644
  60796. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithinSectionDoesNotCreateDocumentLevelSpan.stree.txt
  60797. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlDocumentTest/WithinSectionDoesNotCreateDocumentLevelSpan.stree.txt
  60798. @@ -1,37 +1,41 @@
  60799. -Markup block - Gen<None> - 36 - (0:0,0)
  60800. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  60801. - SyntaxKind.Unknown;[];
  60802. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted}> - 36 - (0:0,0)
  60803. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  60804. - SyntaxKind.Transition;[@];
  60805. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  60806. - SyntaxKind.Identifier;[section];
  60807. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  60808. - SyntaxKind.Whitespace;[ ];
  60809. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [Foo] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  60810. - SyntaxKind.Identifier;[Foo];
  60811. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (12:0,12) - Tokens:1
  60812. - SyntaxKind.Whitespace;[ ];
  60813. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd - (13:0,13) - Tokens:1
  60814. - SyntaxKind.LeftBrace;[{];
  60815. - Markup block - Gen<None> - 21 - (14:0,14)
  60816. - Markup span - Gen<Markup> - [LF ] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:2
  60817. - SyntaxKind.NewLine;[LF];
  60818. - SyntaxKind.Whitespace;[ ];
  60819. - Tag block - Gen<None> - 6 - (20:1,4)
  60820. - Markup span - Gen<Markup> - [<html>] - SpanEditHandler;Accepts:Any - (20:1,4) - Tokens:3
  60821. - SyntaxKind.OpenAngle;[<];
  60822. - SyntaxKind.Text;[html];
  60823. - SyntaxKind.CloseAngle;[>];
  60824. - Tag block - Gen<None> - 7 - (26:1,10)
  60825. - Markup span - Gen<Markup> - [</html>] - SpanEditHandler;Accepts:Any - (26:1,10) - Tokens:4
  60826. - SyntaxKind.OpenAngle;[<];
  60827. - SyntaxKind.ForwardSlash;[/];
  60828. - SyntaxKind.Text;[html];
  60829. - SyntaxKind.CloseAngle;[>];
  60830. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:Any - (33:1,17) - Tokens:1
  60831. - SyntaxKind.NewLine;[LF];
  60832. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (35:2,0) - Tokens:1
  60833. - SyntaxKind.RightBrace;[}];
  60834. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (36:2,1) - Tokens:1
  60835. - SyntaxKind.Unknown;[];
  60836. +RazorDocument - [0..36)::36 - [@section Foo {LF <html></html>LF}]
  60837. + MarkupBlock - [0..36)::36
  60838. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60839. + Marker;[];
  60840. + CSharpCodeBlock - [0..36)::36
  60841. + RazorDirective - [0..36)::36 - Directive:{section;RazorBlock;Unrestricted}
  60842. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  60843. + Transition;[@];
  60844. + RazorDirectiveBody - [1..36)::35
  60845. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  60846. + Identifier;[section];
  60847. + CSharpCodeBlock - [8..36)::28
  60848. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  60849. + Whitespace;[ ];
  60850. + CSharpStatementLiteral - [9..12)::3 - [Foo] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  60851. + Identifier;[Foo];
  60852. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  60853. + Whitespace;[ ];
  60854. + RazorMetaCode - [13..14)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd
  60855. + LeftBrace;[{];
  60856. + MarkupBlock - [14..35)::21
  60857. + MarkupTextLiteral - [14..20)::6 - [LF ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60858. + NewLine;[LF];
  60859. + Whitespace;[ ];
  60860. + MarkupTagBlock - [20..26)::6 - [<html>]
  60861. + MarkupTextLiteral - [20..26)::6 - [<html>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60862. + OpenAngle;[<];
  60863. + Text;[html];
  60864. + CloseAngle;[>];
  60865. + MarkupTagBlock - [26..33)::7 - [</html>]
  60866. + MarkupTextLiteral - [26..33)::7 - [</html>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60867. + OpenAngle;[<];
  60868. + ForwardSlash;[/];
  60869. + Text;[html];
  60870. + CloseAngle;[>];
  60871. + MarkupTextLiteral - [33..35)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60872. + NewLine;[LF];
  60873. + RazorMetaCode - [35..36)::1 - Gen<None> - SpanEditHandler;Accepts:None
  60874. + RightBrace;[}];
  60875. + MarkupTextLiteral - [36..36)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60876. + Marker;[];
  60877. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/AllowsInvalidTagNamesAsLongAsParserCanIdentifyEndTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/AllowsInvalidTagNamesAsLongAsParserCanIdentifyEndTag.stree.txt
  60878. index acdaed83d5d..dfe21ba582e 100644
  60879. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/AllowsInvalidTagNamesAsLongAsParserCanIdentifyEndTag.stree.txt
  60880. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/AllowsInvalidTagNamesAsLongAsParserCanIdentifyEndTag.stree.txt
  60881. @@ -1,14 +1,14 @@
  60882. -Markup block - Gen<None> - 26 - (0:0,0)
  60883. - Tag block - Gen<None> - 11 - (0:0,0)
  60884. - Markup span - Gen<Markup> - [<1-foo+bar>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  60885. - SyntaxKind.OpenAngle;[<];
  60886. - SyntaxKind.Text;[1-foo+bar];
  60887. - SyntaxKind.CloseAngle;[>];
  60888. - Markup span - Gen<Markup> - [foo] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:1
  60889. - SyntaxKind.Text;[foo];
  60890. - Tag block - Gen<None> - 12 - (14:0,14)
  60891. - Markup span - Gen<Markup> - [</1-foo+bar>] - SpanEditHandler;Accepts:None - (14:0,14) - Tokens:4
  60892. - SyntaxKind.OpenAngle;[<];
  60893. - SyntaxKind.ForwardSlash;[/];
  60894. - SyntaxKind.Text;[1-foo+bar];
  60895. - SyntaxKind.CloseAngle;[>];
  60896. +MarkupBlock - [0..26)::26 - [<1-foo+bar>foo</1-foo+bar>]
  60897. + MarkupTagBlock - [0..11)::11 - [<1-foo+bar>]
  60898. + MarkupTextLiteral - [0..11)::11 - [<1-foo+bar>] - Gen<Markup> - SpanEditHandler;Accepts:None
  60899. + OpenAngle;[<];
  60900. + Text;[1-foo+bar];
  60901. + CloseAngle;[>];
  60902. + MarkupTextLiteral - [11..14)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  60903. + Text;[foo];
  60904. + MarkupTagBlock - [14..26)::12 - [</1-foo+bar>]
  60905. + MarkupTextLiteral - [14..26)::12 - [</1-foo+bar>] - Gen<Markup> - SpanEditHandler;Accepts:None
  60906. + OpenAngle;[<];
  60907. + ForwardSlash;[/];
  60908. + Text;[1-foo+bar];
  60909. + CloseAngle;[>];
  60910. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/StartingWithEndTagErrorsThenOutputsMarkupSegmentAndEndsBlock.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/StartingWithEndTagErrorsThenOutputsMarkupSegmentAndEndsBlock.stree.txt
  60911. index 251c70fc8af..9ed9c109971 100644
  60912. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/StartingWithEndTagErrorsThenOutputsMarkupSegmentAndEndsBlock.stree.txt
  60913. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/StartingWithEndTagErrorsThenOutputsMarkupSegmentAndEndsBlock.stree.txt
  60914. @@ -1,9 +1,9 @@
  60915. -Markup block - Gen<None> - 7 - (0:0,0)
  60916. - Tag block - Gen<None> - 6 - (0:0,0)
  60917. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:4
  60918. - SyntaxKind.OpenAngle;[<];
  60919. - SyntaxKind.ForwardSlash;[/];
  60920. - SyntaxKind.Text;[foo];
  60921. - SyntaxKind.CloseAngle;[>];
  60922. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (6:0,6) - Tokens:1
  60923. - SyntaxKind.Whitespace;[ ];
  60924. +MarkupBlock - [0..7)::7 - [</foo> ]
  60925. + MarkupTagBlock - [0..6)::6 - [</foo>]
  60926. + MarkupTextLiteral - [0..6)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  60927. + OpenAngle;[<];
  60928. + ForwardSlash;[/];
  60929. + Text;[foo];
  60930. + CloseAngle;[>];
  60931. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  60932. + Whitespace;[ ];
  60933. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/ThrowsErrorIfEndTextTagContainsTextAfterName.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/ThrowsErrorIfEndTextTagContainsTextAfterName.stree.txt
  60934. index 1eae2e650d5..d69632231c7 100644
  60935. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/ThrowsErrorIfEndTextTagContainsTextAfterName.stree.txt
  60936. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/ThrowsErrorIfEndTextTagContainsTextAfterName.stree.txt
  60937. @@ -1,16 +1,16 @@
  60938. -Markup block - Gen<None> - 21 - (0:0,0)
  60939. - Tag block - Gen<None> - 6 - (0:0,0)
  60940. - Transition span - Gen<None> - [<text>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  60941. - SyntaxKind.OpenAngle;[<];
  60942. - SyntaxKind.Text;[text];
  60943. - SyntaxKind.CloseAngle;[>];
  60944. - Tag block - Gen<None> - 15 - (6:0,6)
  60945. - Transition span - Gen<None> - [</text foo bar>] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:8
  60946. - SyntaxKind.OpenAngle;[<];
  60947. - SyntaxKind.ForwardSlash;[/];
  60948. - SyntaxKind.Text;[text];
  60949. - SyntaxKind.Whitespace;[ ];
  60950. - SyntaxKind.Text;[foo];
  60951. - SyntaxKind.Whitespace;[ ];
  60952. - SyntaxKind.Text;[bar];
  60953. - SyntaxKind.CloseAngle;[>];
  60954. +MarkupBlock - [0..21)::21 - [<text></text foo bar>]
  60955. + MarkupTagBlock - [0..6)::6 - [<text>]
  60956. + MarkupTransition - [0..6)::6 - Gen<None> - SpanEditHandler;Accepts:None
  60957. + OpenAngle;[<];
  60958. + Text;[text];
  60959. + CloseAngle;[>];
  60960. + MarkupTagBlock - [6..21)::15 - [</text foo bar>]
  60961. + MarkupTransition - [6..21)::15 - Gen<None> - SpanEditHandler;Accepts:Any
  60962. + OpenAngle;[<];
  60963. + ForwardSlash;[/];
  60964. + Text;[text];
  60965. + Whitespace;[ ];
  60966. + Text;[foo];
  60967. + Whitespace;[ ];
  60968. + Text;[bar];
  60969. + CloseAngle;[>];
  60970. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/ThrowsErrorIfStartTextTagContainsTextAfterName.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/ThrowsErrorIfStartTextTagContainsTextAfterName.stree.txt
  60971. index 1594281e3ff..f8f40edfbed 100644
  60972. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/ThrowsErrorIfStartTextTagContainsTextAfterName.stree.txt
  60973. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/ThrowsErrorIfStartTextTagContainsTextAfterName.stree.txt
  60974. @@ -1,16 +1,16 @@
  60975. -Markup block - Gen<None> - 21 - (0:0,0)
  60976. - Tag block - Gen<None> - 14 - (0:0,0)
  60977. - Transition span - Gen<None> - [<text foo bar>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:7
  60978. - SyntaxKind.OpenAngle;[<];
  60979. - SyntaxKind.Text;[text];
  60980. - SyntaxKind.Whitespace;[ ];
  60981. - SyntaxKind.Text;[foo];
  60982. - SyntaxKind.Whitespace;[ ];
  60983. - SyntaxKind.Text;[bar];
  60984. - SyntaxKind.CloseAngle;[>];
  60985. - Tag block - Gen<None> - 7 - (14:0,14)
  60986. - Transition span - Gen<None> - [</text>] - SpanEditHandler;Accepts:None - (14:0,14) - Tokens:4
  60987. - SyntaxKind.OpenAngle;[<];
  60988. - SyntaxKind.ForwardSlash;[/];
  60989. - SyntaxKind.Text;[text];
  60990. - SyntaxKind.CloseAngle;[>];
  60991. +MarkupBlock - [0..21)::21 - [<text foo bar></text>]
  60992. + MarkupTagBlock - [0..14)::14 - [<text foo bar>]
  60993. + MarkupTransition - [0..14)::14 - Gen<None> - SpanEditHandler;Accepts:Any
  60994. + OpenAngle;[<];
  60995. + Text;[text];
  60996. + Whitespace;[ ];
  60997. + Text;[foo];
  60998. + Whitespace;[ ];
  60999. + Text;[bar];
  61000. + CloseAngle;[>];
  61001. + MarkupTagBlock - [14..21)::7 - [</text>]
  61002. + MarkupTransition - [14..21)::7 - Gen<None> - SpanEditHandler;Accepts:None
  61003. + OpenAngle;[<];
  61004. + ForwardSlash;[/];
  61005. + Text;[text];
  61006. + CloseAngle;[>];
  61007. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/ThrowsExceptionIfBlockDoesNotStartWithTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/ThrowsExceptionIfBlockDoesNotStartWithTag.stree.txt
  61008. index 2817f303075..a2e6827340f 100644
  61009. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/ThrowsExceptionIfBlockDoesNotStartWithTag.stree.txt
  61010. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/ThrowsExceptionIfBlockDoesNotStartWithTag.stree.txt
  61011. @@ -1 +1 @@
  61012. -Markup block - Gen<None> - 0 - (0:0,0)
  61013. +MarkupBlock - [0..0)::0 - []
  61014. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/WithUnclosedTagAtEOFThrowsMissingEndTagException.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/WithUnclosedTagAtEOFThrowsMissingEndTagException.stree.txt
  61015. index a2b30a26865..94982bdc600 100644
  61016. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/WithUnclosedTagAtEOFThrowsMissingEndTagException.stree.txt
  61017. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/WithUnclosedTagAtEOFThrowsMissingEndTagException.stree.txt
  61018. @@ -1,16 +1,16 @@
  61019. -Markup block - Gen<None> - 29 - (0:0,0)
  61020. - Tag block - Gen<None> - 5 - (0:0,0)
  61021. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  61022. - SyntaxKind.OpenAngle;[<];
  61023. - SyntaxKind.Text;[foo];
  61024. - SyntaxKind.CloseAngle;[>];
  61025. - Markup span - Gen<Markup> - [blah blah blah blah blah] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:9
  61026. - SyntaxKind.Text;[blah];
  61027. - SyntaxKind.Whitespace;[ ];
  61028. - SyntaxKind.Text;[blah];
  61029. - SyntaxKind.Whitespace;[ ];
  61030. - SyntaxKind.Text;[blah];
  61031. - SyntaxKind.Whitespace;[ ];
  61032. - SyntaxKind.Text;[blah];
  61033. - SyntaxKind.Whitespace;[ ];
  61034. - SyntaxKind.Text;[blah];
  61035. +MarkupBlock - [0..29)::29 - [<foo>blah blah blah blah blah]
  61036. + MarkupTagBlock - [0..5)::5 - [<foo>]
  61037. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61038. + OpenAngle;[<];
  61039. + Text;[foo];
  61040. + CloseAngle;[>];
  61041. + MarkupTextLiteral - [5..29)::24 - [blah blah blah blah blah] - Gen<Markup> - SpanEditHandler;Accepts:Any
  61042. + Text;[blah];
  61043. + Whitespace;[ ];
  61044. + Text;[blah];
  61045. + Whitespace;[ ];
  61046. + Text;[blah];
  61047. + Whitespace;[ ];
  61048. + Text;[blah];
  61049. + Whitespace;[ ];
  61050. + Text;[blah];
  61051. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/WithUnclosedTopLevelTagThrowsOnOutermostUnclosedTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/WithUnclosedTopLevelTagThrowsOnOutermostUnclosedTag.stree.txt
  61052. index 3c729cd8813..891cb8a911a 100644
  61053. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/WithUnclosedTopLevelTagThrowsOnOutermostUnclosedTag.stree.txt
  61054. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/WithUnclosedTopLevelTagThrowsOnOutermostUnclosedTag.stree.txt
  61055. @@ -1,17 +1,17 @@
  61056. -Markup block - Gen<None> - 14 - (0:0,0)
  61057. - Tag block - Gen<None> - 3 - (0:0,0)
  61058. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  61059. - SyntaxKind.OpenAngle;[<];
  61060. - SyntaxKind.Text;[p];
  61061. - SyntaxKind.CloseAngle;[>];
  61062. - Tag block - Gen<None> - 5 - (3:0,3)
  61063. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:3
  61064. - SyntaxKind.OpenAngle;[<];
  61065. - SyntaxKind.Text;[foo];
  61066. - SyntaxKind.CloseAngle;[>];
  61067. - Tag block - Gen<None> - 6 - (8:0,8)
  61068. - Markup span - Gen<Markup> - [</bar>] - SpanEditHandler;Accepts:None - (8:0,8) - Tokens:4
  61069. - SyntaxKind.OpenAngle;[<];
  61070. - SyntaxKind.ForwardSlash;[/];
  61071. - SyntaxKind.Text;[bar];
  61072. - SyntaxKind.CloseAngle;[>];
  61073. +MarkupBlock - [0..14)::14 - [<p><foo></bar>]
  61074. + MarkupTagBlock - [0..3)::3 - [<p>]
  61075. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61076. + OpenAngle;[<];
  61077. + Text;[p];
  61078. + CloseAngle;[>];
  61079. + MarkupTagBlock - [3..8)::5 - [<foo>]
  61080. + MarkupTextLiteral - [3..8)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61081. + OpenAngle;[<];
  61082. + Text;[foo];
  61083. + CloseAngle;[>];
  61084. + MarkupTagBlock - [8..14)::6 - [</bar>]
  61085. + MarkupTextLiteral - [8..14)::6 - [</bar>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61086. + OpenAngle;[<];
  61087. + ForwardSlash;[/];
  61088. + Text;[bar];
  61089. + CloseAngle;[>];
  61090. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/WithUnfinishedTagAtEOFThrowsIncompleteTagException.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/WithUnfinishedTagAtEOFThrowsIncompleteTagException.stree.txt
  61091. index ff8733cb8d5..0ccf897e938 100644
  61092. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/WithUnfinishedTagAtEOFThrowsIncompleteTagException.stree.txt
  61093. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlErrorTest/WithUnfinishedTagAtEOFThrowsIncompleteTagException.stree.txt
  61094. @@ -1,12 +1,15 @@
  61095. -Markup block - Gen<None> - 12 - (0:0,0)
  61096. - Tag block - Gen<None> - 12 - (0:0,0)
  61097. - Markup span - Gen<Markup> - [<foo] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  61098. - SyntaxKind.OpenAngle;[<];
  61099. - SyntaxKind.Text;[foo];
  61100. - Markup block - Gen<Attr:bar, bar=@(4:0,4),@(12:0,12)> - 8 - (4:0,4)
  61101. - Markup span - Gen<None> - [ bar=] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:3
  61102. - SyntaxKind.Whitespace;[ ];
  61103. - SyntaxKind.Text;[bar];
  61104. - SyntaxKind.Equals;[=];
  61105. - Markup span - Gen<LitAttr:@(9:0,9)> - [baz] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:1
  61106. - SyntaxKind.Text;[baz];
  61107. +MarkupBlock - [0..12)::12 - [<foo bar=baz]
  61108. + MarkupTagBlock - [0..12)::12 - [<foo bar=baz]
  61109. + MarkupTextLiteral - [0..4)::4 - [<foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  61110. + OpenAngle;[<];
  61111. + Text;[foo];
  61112. + MarkupAttributeBlock - [4..12)::8 - [ bar=baz]
  61113. + MarkupTextLiteral - [4..5)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  61114. + Whitespace;[ ];
  61115. + MarkupTextLiteral - [5..8)::3 - [bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  61116. + Text;[bar];
  61117. + Equals;[=];
  61118. + GenericBlock - [9..12)::3
  61119. + MarkupLiteralAttributeValue - [9..12)::3 - [baz]
  61120. + MarkupTextLiteral - [9..12)::3 - [baz] - Gen<None> - SpanEditHandler;Accepts:Any
  61121. + Text;[baz];
  61122. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/CDataTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/CDataTag.stree.txt
  61123. index 81445b0185d..6bb87cce3e6 100644
  61124. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/CDataTag.stree.txt
  61125. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/CDataTag.stree.txt
  61126. @@ -1,13 +1,13 @@
  61127. -Markup block - Gen<None> - 16 - (0:0,0)
  61128. - Markup span - Gen<Markup> - [<![CDATA[Foo]]>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:9
  61129. - SyntaxKind.OpenAngle;[<];
  61130. - SyntaxKind.Bang;[!];
  61131. - SyntaxKind.LeftBracket;[[];
  61132. - SyntaxKind.Text;[CDATA];
  61133. - SyntaxKind.LeftBracket;[[];
  61134. - SyntaxKind.Text;[Foo];
  61135. - SyntaxKind.RightBracket;[]];
  61136. - SyntaxKind.RightBracket;[]];
  61137. - SyntaxKind.CloseAngle;[>];
  61138. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:1
  61139. - SyntaxKind.Whitespace;[ ];
  61140. +MarkupBlock - [0..16)::16 - [<![CDATA[Foo]]> ]
  61141. + MarkupTextLiteral - [0..15)::15 - [<![CDATA[Foo]]>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61142. + OpenAngle;[<];
  61143. + Bang;[!];
  61144. + LeftBracket;[[];
  61145. + Text;[CDATA];
  61146. + LeftBracket;[[];
  61147. + Text;[Foo];
  61148. + RightBracket;[]];
  61149. + RightBracket;[]];
  61150. + CloseAngle;[>];
  61151. + MarkupTextLiteral - [15..16)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  61152. + Whitespace;[ ];
  61153. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/CommentTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/CommentTag.stree.txt
  61154. index 621dbb980d8..3b8b289539d 100644
  61155. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/CommentTag.stree.txt
  61156. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/CommentTag.stree.txt
  61157. @@ -1,13 +1,13 @@
  61158. -Markup block - Gen<None> - 11 - (0:0,0)
  61159. - HtmlComment block - Gen<None> - 10 - (0:0,0)
  61160. - Markup span - Gen<Markup> - [<!--] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  61161. - SyntaxKind.OpenAngle;[<];
  61162. - SyntaxKind.Bang;[!];
  61163. - SyntaxKind.DoubleHyphen;[--];
  61164. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:Whitespace - (4:0,4) - Tokens:1
  61165. - SyntaxKind.Text;[Foo];
  61166. - Markup span - Gen<Markup> - [-->] - SpanEditHandler;Accepts:None - (7:0,7) - Tokens:2
  61167. - SyntaxKind.DoubleHyphen;[--];
  61168. - SyntaxKind.CloseAngle;[>];
  61169. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  61170. - SyntaxKind.Whitespace;[ ];
  61171. +MarkupBlock - [0..11)::11 - [<!--Foo--> ]
  61172. + MarkupCommentBlock - [0..10)::10
  61173. + MarkupTextLiteral - [0..4)::4 - [<!--] - Gen<Markup> - SpanEditHandler;Accepts:None
  61174. + OpenAngle;[<];
  61175. + Bang;[!];
  61176. + DoubleHyphen;[--];
  61177. + MarkupTextLiteral - [4..7)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Whitespace
  61178. + Text;[Foo];
  61179. + MarkupTextLiteral - [7..10)::3 - [-->] - Gen<Markup> - SpanEditHandler;Accepts:None
  61180. + DoubleHyphen;[--];
  61181. + CloseAngle;[>];
  61182. + MarkupTextLiteral - [10..11)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  61183. + Whitespace;[ ];
  61184. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/DocTypeTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/DocTypeTag.stree.txt
  61185. index 32f7fa87720..c2e81cdca78 100644
  61186. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/DocTypeTag.stree.txt
  61187. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/DocTypeTag.stree.txt
  61188. @@ -1,10 +1,10 @@
  61189. -Markup block - Gen<None> - 16 - (0:0,0)
  61190. - Markup span - Gen<Markup> - [<!DOCTYPE html>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:6
  61191. - SyntaxKind.OpenAngle;[<];
  61192. - SyntaxKind.Bang;[!];
  61193. - SyntaxKind.Text;[DOCTYPE];
  61194. - SyntaxKind.Whitespace;[ ];
  61195. - SyntaxKind.Text;[html];
  61196. - SyntaxKind.CloseAngle;[>];
  61197. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:1
  61198. - SyntaxKind.Whitespace;[ ];
  61199. +MarkupBlock - [0..16)::16 - [<!DOCTYPE html> ]
  61200. + MarkupTextLiteral - [0..15)::15 - [<!DOCTYPE html>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61201. + OpenAngle;[<];
  61202. + Bang;[!];
  61203. + Text;[DOCTYPE];
  61204. + Whitespace;[ ];
  61205. + Text;[html];
  61206. + CloseAngle;[>];
  61207. + MarkupTextLiteral - [15..16)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  61208. + Whitespace;[ ];
  61209. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ElementTags.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ElementTags.stree.txt
  61210. index 58655a02bf0..595d9b84490 100644
  61211. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ElementTags.stree.txt
  61212. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ElementTags.stree.txt
  61213. @@ -1,16 +1,16 @@
  61214. -Markup block - Gen<None> - 11 - (0:0,0)
  61215. - Tag block - Gen<None> - 3 - (0:0,0)
  61216. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  61217. - SyntaxKind.OpenAngle;[<];
  61218. - SyntaxKind.Text;[p];
  61219. - SyntaxKind.CloseAngle;[>];
  61220. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:1
  61221. - SyntaxKind.Text;[Foo];
  61222. - Tag block - Gen<None> - 4 - (6:0,6)
  61223. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (6:0,6) - Tokens:4
  61224. - SyntaxKind.OpenAngle;[<];
  61225. - SyntaxKind.ForwardSlash;[/];
  61226. - SyntaxKind.Text;[p];
  61227. - SyntaxKind.CloseAngle;[>];
  61228. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  61229. - SyntaxKind.Whitespace;[ ];
  61230. +MarkupBlock - [0..11)::11 - [<p>Foo</p> ]
  61231. + MarkupTagBlock - [0..3)::3 - [<p>]
  61232. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61233. + OpenAngle;[<];
  61234. + Text;[p];
  61235. + CloseAngle;[>];
  61236. + MarkupTextLiteral - [3..6)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  61237. + Text;[Foo];
  61238. + MarkupTagBlock - [6..10)::4 - [</p>]
  61239. + MarkupTextLiteral - [6..10)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61240. + OpenAngle;[<];
  61241. + ForwardSlash;[/];
  61242. + Text;[p];
  61243. + CloseAngle;[>];
  61244. + MarkupTextLiteral - [10..11)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  61245. + Whitespace;[ ];
  61246. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/EmptyTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/EmptyTag.stree.txt
  61247. index baf0d66631e..54c9c3aaa30 100644
  61248. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/EmptyTag.stree.txt
  61249. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/EmptyTag.stree.txt
  61250. @@ -1,12 +1,12 @@
  61251. -Markup block - Gen<None> - 6 - (0:0,0)
  61252. - Tag block - Gen<None> - 2 - (0:0,0)
  61253. - Markup span - Gen<Markup> - [<>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:2
  61254. - SyntaxKind.OpenAngle;[<];
  61255. - SyntaxKind.CloseAngle;[>];
  61256. - Tag block - Gen<None> - 3 - (2:0,2)
  61257. - Markup span - Gen<Markup> - [</>] - SpanEditHandler;Accepts:None - (2:0,2) - Tokens:3
  61258. - SyntaxKind.OpenAngle;[<];
  61259. - SyntaxKind.ForwardSlash;[/];
  61260. - SyntaxKind.CloseAngle;[>];
  61261. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (5:0,5) - Tokens:1
  61262. - SyntaxKind.Whitespace;[ ];
  61263. +MarkupBlock - [0..6)::6 - [<></> ]
  61264. + MarkupTagBlock - [0..2)::2 - [<>]
  61265. + MarkupTextLiteral - [0..2)::2 - [<>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61266. + OpenAngle;[<];
  61267. + CloseAngle;[>];
  61268. + MarkupTagBlock - [2..5)::3 - [</>]
  61269. + MarkupTextLiteral - [2..5)::3 - [</>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61270. + OpenAngle;[<];
  61271. + ForwardSlash;[/];
  61272. + CloseAngle;[>];
  61273. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  61274. + Whitespace;[ ];
  61275. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/EmptyTagNestsLikeNormalTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/EmptyTagNestsLikeNormalTag.stree.txt
  61276. index a67b6a15f2e..10e4bae77c0 100644
  61277. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/EmptyTagNestsLikeNormalTag.stree.txt
  61278. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/EmptyTagNestsLikeNormalTag.stree.txt
  61279. @@ -1,13 +1,13 @@
  61280. -Markup block - Gen<None> - 7 - (0:0,0)
  61281. - Tag block - Gen<None> - 3 - (0:0,0)
  61282. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  61283. - SyntaxKind.OpenAngle;[<];
  61284. - SyntaxKind.Text;[p];
  61285. - SyntaxKind.CloseAngle;[>];
  61286. - Tag block - Gen<None> - 3 - (3:0,3)
  61287. - Markup span - Gen<Markup> - [</>] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:3
  61288. - SyntaxKind.OpenAngle;[<];
  61289. - SyntaxKind.ForwardSlash;[/];
  61290. - SyntaxKind.CloseAngle;[>];
  61291. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (6:0,6) - Tokens:1
  61292. - SyntaxKind.Whitespace;[ ];
  61293. +MarkupBlock - [0..7)::7 - [<p></> ]
  61294. + MarkupTagBlock - [0..3)::3 - [<p>]
  61295. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61296. + OpenAngle;[<];
  61297. + Text;[p];
  61298. + CloseAngle;[>];
  61299. + MarkupTagBlock - [3..6)::3 - [</>]
  61300. + MarkupTextLiteral - [3..6)::3 - [</>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61301. + OpenAngle;[<];
  61302. + ForwardSlash;[/];
  61303. + CloseAngle;[>];
  61304. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  61305. + Whitespace;[ ];
  61306. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/IncompleteVoidElementEndTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/IncompleteVoidElementEndTag.stree.txt
  61307. index e0fac8062ab..19dd914fa39 100644
  61308. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/IncompleteVoidElementEndTag.stree.txt
  61309. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/IncompleteVoidElementEndTag.stree.txt
  61310. @@ -1,279 +1,285 @@
  61311. -Markup block - Gen<None> - 344 - (0:0,0)
  61312. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  61313. - SyntaxKind.Unknown;[];
  61314. - Statement block - Gen<None> - 344 - (0:0,0)
  61315. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  61316. - SyntaxKind.Transition;[@];
  61317. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  61318. - SyntaxKind.LeftBrace;[{];
  61319. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[}];AtEOL - (2:0,2) - Tokens:1
  61320. - SyntaxKind.NewLine;[LF];
  61321. - Markup block - Gen<None> - 21 - (4:1,0)
  61322. - Tag block - Gen<None> - 6 - (4:1,0)
  61323. - Markup span - Gen<Markup> - [<area>] - SpanEditHandler;Accepts:None - (4:1,0) - Tokens:3
  61324. - SyntaxKind.OpenAngle;[<];
  61325. - SyntaxKind.Text;[area];
  61326. - SyntaxKind.CloseAngle;[>];
  61327. - Tag block - Gen<None> - 15 - (10:1,6)
  61328. - Markup span - Gen<Markup> - [</areaLF}LF@{LF] - SpanEditHandler;Accepts:Any - (10:1,6) - Tokens:9
  61329. - SyntaxKind.OpenAngle;[<];
  61330. - SyntaxKind.ForwardSlash;[/];
  61331. - SyntaxKind.Text;[area];
  61332. - SyntaxKind.NewLine;[LF];
  61333. - SyntaxKind.Text;[}];
  61334. - SyntaxKind.NewLine;[LF];
  61335. - SyntaxKind.Transition;[@];
  61336. - SyntaxKind.Text;[{];
  61337. - SyntaxKind.NewLine;[LF];
  61338. - Markup block - Gen<None> - 21 - (25:4,0)
  61339. - Tag block - Gen<None> - 6 - (25:4,0)
  61340. - Markup span - Gen<Markup> - [<base>] - SpanEditHandler;Accepts:None - (25:4,0) - Tokens:3
  61341. - SyntaxKind.OpenAngle;[<];
  61342. - SyntaxKind.Text;[base];
  61343. - SyntaxKind.CloseAngle;[>];
  61344. - Tag block - Gen<None> - 15 - (31:4,6)
  61345. - Markup span - Gen<Markup> - [</baseLF}LF@{LF] - SpanEditHandler;Accepts:Any - (31:4,6) - Tokens:9
  61346. - SyntaxKind.OpenAngle;[<];
  61347. - SyntaxKind.ForwardSlash;[/];
  61348. - SyntaxKind.Text;[base];
  61349. - SyntaxKind.NewLine;[LF];
  61350. - SyntaxKind.Text;[}];
  61351. - SyntaxKind.NewLine;[LF];
  61352. - SyntaxKind.Transition;[@];
  61353. - SyntaxKind.Text;[{];
  61354. - SyntaxKind.NewLine;[LF];
  61355. - Markup block - Gen<None> - 17 - (46:7,0)
  61356. - Tag block - Gen<None> - 4 - (46:7,0)
  61357. - Markup span - Gen<Markup> - [<br>] - SpanEditHandler;Accepts:None - (46:7,0) - Tokens:3
  61358. - SyntaxKind.OpenAngle;[<];
  61359. - SyntaxKind.Text;[br];
  61360. - SyntaxKind.CloseAngle;[>];
  61361. - Tag block - Gen<None> - 13 - (50:7,4)
  61362. - Markup span - Gen<Markup> - [</brLF}LF@{LF] - SpanEditHandler;Accepts:Any - (50:7,4) - Tokens:9
  61363. - SyntaxKind.OpenAngle;[<];
  61364. - SyntaxKind.ForwardSlash;[/];
  61365. - SyntaxKind.Text;[br];
  61366. - SyntaxKind.NewLine;[LF];
  61367. - SyntaxKind.Text;[}];
  61368. - SyntaxKind.NewLine;[LF];
  61369. - SyntaxKind.Transition;[@];
  61370. - SyntaxKind.Text;[{];
  61371. - SyntaxKind.NewLine;[LF];
  61372. - Markup block - Gen<None> - 19 - (63:10,0)
  61373. - Tag block - Gen<None> - 5 - (63:10,0)
  61374. - Markup span - Gen<Markup> - [<col>] - SpanEditHandler;Accepts:None - (63:10,0) - Tokens:3
  61375. - SyntaxKind.OpenAngle;[<];
  61376. - SyntaxKind.Text;[col];
  61377. - SyntaxKind.CloseAngle;[>];
  61378. - Tag block - Gen<None> - 14 - (68:10,5)
  61379. - Markup span - Gen<Markup> - [</colLF}LF@{LF] - SpanEditHandler;Accepts:Any - (68:10,5) - Tokens:9
  61380. - SyntaxKind.OpenAngle;[<];
  61381. - SyntaxKind.ForwardSlash;[/];
  61382. - SyntaxKind.Text;[col];
  61383. - SyntaxKind.NewLine;[LF];
  61384. - SyntaxKind.Text;[}];
  61385. - SyntaxKind.NewLine;[LF];
  61386. - SyntaxKind.Transition;[@];
  61387. - SyntaxKind.Text;[{];
  61388. - SyntaxKind.NewLine;[LF];
  61389. - Markup block - Gen<None> - 27 - (82:13,0)
  61390. - Tag block - Gen<None> - 9 - (82:13,0)
  61391. - Markup span - Gen<Markup> - [<command>] - SpanEditHandler;Accepts:None - (82:13,0) - Tokens:3
  61392. - SyntaxKind.OpenAngle;[<];
  61393. - SyntaxKind.Text;[command];
  61394. - SyntaxKind.CloseAngle;[>];
  61395. - Tag block - Gen<None> - 18 - (91:13,9)
  61396. - Markup span - Gen<Markup> - [</commandLF}LF@{LF] - SpanEditHandler;Accepts:Any - (91:13,9) - Tokens:9
  61397. - SyntaxKind.OpenAngle;[<];
  61398. - SyntaxKind.ForwardSlash;[/];
  61399. - SyntaxKind.Text;[command];
  61400. - SyntaxKind.NewLine;[LF];
  61401. - SyntaxKind.Text;[}];
  61402. - SyntaxKind.NewLine;[LF];
  61403. - SyntaxKind.Transition;[@];
  61404. - SyntaxKind.Text;[{];
  61405. - SyntaxKind.NewLine;[LF];
  61406. - Markup block - Gen<None> - 23 - (109:16,0)
  61407. - Tag block - Gen<None> - 7 - (109:16,0)
  61408. - Markup span - Gen<Markup> - [<embed>] - SpanEditHandler;Accepts:None - (109:16,0) - Tokens:3
  61409. - SyntaxKind.OpenAngle;[<];
  61410. - SyntaxKind.Text;[embed];
  61411. - SyntaxKind.CloseAngle;[>];
  61412. - Tag block - Gen<None> - 16 - (116:16,7)
  61413. - Markup span - Gen<Markup> - [</embedLF}LF@{LF] - SpanEditHandler;Accepts:Any - (116:16,7) - Tokens:9
  61414. - SyntaxKind.OpenAngle;[<];
  61415. - SyntaxKind.ForwardSlash;[/];
  61416. - SyntaxKind.Text;[embed];
  61417. - SyntaxKind.NewLine;[LF];
  61418. - SyntaxKind.Text;[}];
  61419. - SyntaxKind.NewLine;[LF];
  61420. - SyntaxKind.Transition;[@];
  61421. - SyntaxKind.Text;[{];
  61422. - SyntaxKind.NewLine;[LF];
  61423. - Markup block - Gen<None> - 17 - (132:19,0)
  61424. - Tag block - Gen<None> - 4 - (132:19,0)
  61425. - Markup span - Gen<Markup> - [<hr>] - SpanEditHandler;Accepts:None - (132:19,0) - Tokens:3
  61426. - SyntaxKind.OpenAngle;[<];
  61427. - SyntaxKind.Text;[hr];
  61428. - SyntaxKind.CloseAngle;[>];
  61429. - Tag block - Gen<None> - 13 - (136:19,4)
  61430. - Markup span - Gen<Markup> - [</hrLF}LF@{LF] - SpanEditHandler;Accepts:Any - (136:19,4) - Tokens:9
  61431. - SyntaxKind.OpenAngle;[<];
  61432. - SyntaxKind.ForwardSlash;[/];
  61433. - SyntaxKind.Text;[hr];
  61434. - SyntaxKind.NewLine;[LF];
  61435. - SyntaxKind.Text;[}];
  61436. - SyntaxKind.NewLine;[LF];
  61437. - SyntaxKind.Transition;[@];
  61438. - SyntaxKind.Text;[{];
  61439. - SyntaxKind.NewLine;[LF];
  61440. - Markup block - Gen<None> - 19 - (149:22,0)
  61441. - Tag block - Gen<None> - 5 - (149:22,0)
  61442. - Markup span - Gen<Markup> - [<img>] - SpanEditHandler;Accepts:None - (149:22,0) - Tokens:3
  61443. - SyntaxKind.OpenAngle;[<];
  61444. - SyntaxKind.Text;[img];
  61445. - SyntaxKind.CloseAngle;[>];
  61446. - Tag block - Gen<None> - 14 - (154:22,5)
  61447. - Markup span - Gen<Markup> - [</imgLF}LF@{LF] - SpanEditHandler;Accepts:Any - (154:22,5) - Tokens:9
  61448. - SyntaxKind.OpenAngle;[<];
  61449. - SyntaxKind.ForwardSlash;[/];
  61450. - SyntaxKind.Text;[img];
  61451. - SyntaxKind.NewLine;[LF];
  61452. - SyntaxKind.Text;[}];
  61453. - SyntaxKind.NewLine;[LF];
  61454. - SyntaxKind.Transition;[@];
  61455. - SyntaxKind.Text;[{];
  61456. - SyntaxKind.NewLine;[LF];
  61457. - Markup block - Gen<None> - 23 - (168:25,0)
  61458. - Tag block - Gen<None> - 7 - (168:25,0)
  61459. - Markup span - Gen<Markup> - [<input>] - SpanEditHandler;Accepts:None - (168:25,0) - Tokens:3
  61460. - SyntaxKind.OpenAngle;[<];
  61461. - SyntaxKind.Text;[input];
  61462. - SyntaxKind.CloseAngle;[>];
  61463. - Tag block - Gen<None> - 16 - (175:25,7)
  61464. - Markup span - Gen<Markup> - [</inputLF}LF@{LF] - SpanEditHandler;Accepts:Any - (175:25,7) - Tokens:9
  61465. - SyntaxKind.OpenAngle;[<];
  61466. - SyntaxKind.ForwardSlash;[/];
  61467. - SyntaxKind.Text;[input];
  61468. - SyntaxKind.NewLine;[LF];
  61469. - SyntaxKind.Text;[}];
  61470. - SyntaxKind.NewLine;[LF];
  61471. - SyntaxKind.Transition;[@];
  61472. - SyntaxKind.Text;[{];
  61473. - SyntaxKind.NewLine;[LF];
  61474. - Markup block - Gen<None> - 25 - (191:28,0)
  61475. - Tag block - Gen<None> - 8 - (191:28,0)
  61476. - Markup span - Gen<Markup> - [<keygen>] - SpanEditHandler;Accepts:None - (191:28,0) - Tokens:3
  61477. - SyntaxKind.OpenAngle;[<];
  61478. - SyntaxKind.Text;[keygen];
  61479. - SyntaxKind.CloseAngle;[>];
  61480. - Tag block - Gen<None> - 17 - (199:28,8)
  61481. - Markup span - Gen<Markup> - [</keygenLF}LF@{LF] - SpanEditHandler;Accepts:Any - (199:28,8) - Tokens:9
  61482. - SyntaxKind.OpenAngle;[<];
  61483. - SyntaxKind.ForwardSlash;[/];
  61484. - SyntaxKind.Text;[keygen];
  61485. - SyntaxKind.NewLine;[LF];
  61486. - SyntaxKind.Text;[}];
  61487. - SyntaxKind.NewLine;[LF];
  61488. - SyntaxKind.Transition;[@];
  61489. - SyntaxKind.Text;[{];
  61490. - SyntaxKind.NewLine;[LF];
  61491. - Markup block - Gen<None> - 21 - (216:31,0)
  61492. - Tag block - Gen<None> - 6 - (216:31,0)
  61493. - Markup span - Gen<Markup> - [<link>] - SpanEditHandler;Accepts:None - (216:31,0) - Tokens:3
  61494. - SyntaxKind.OpenAngle;[<];
  61495. - SyntaxKind.Text;[link];
  61496. - SyntaxKind.CloseAngle;[>];
  61497. - Tag block - Gen<None> - 15 - (222:31,6)
  61498. - Markup span - Gen<Markup> - [</linkLF}LF@{LF] - SpanEditHandler;Accepts:Any - (222:31,6) - Tokens:9
  61499. - SyntaxKind.OpenAngle;[<];
  61500. - SyntaxKind.ForwardSlash;[/];
  61501. - SyntaxKind.Text;[link];
  61502. - SyntaxKind.NewLine;[LF];
  61503. - SyntaxKind.Text;[}];
  61504. - SyntaxKind.NewLine;[LF];
  61505. - SyntaxKind.Transition;[@];
  61506. - SyntaxKind.Text;[{];
  61507. - SyntaxKind.NewLine;[LF];
  61508. - Markup block - Gen<None> - 21 - (237:34,0)
  61509. - Tag block - Gen<None> - 6 - (237:34,0)
  61510. - Markup span - Gen<Markup> - [<meta>] - SpanEditHandler;Accepts:None - (237:34,0) - Tokens:3
  61511. - SyntaxKind.OpenAngle;[<];
  61512. - SyntaxKind.Text;[meta];
  61513. - SyntaxKind.CloseAngle;[>];
  61514. - Tag block - Gen<None> - 15 - (243:34,6)
  61515. - Markup span - Gen<Markup> - [</metaLF}LF@{LF] - SpanEditHandler;Accepts:Any - (243:34,6) - Tokens:9
  61516. - SyntaxKind.OpenAngle;[<];
  61517. - SyntaxKind.ForwardSlash;[/];
  61518. - SyntaxKind.Text;[meta];
  61519. - SyntaxKind.NewLine;[LF];
  61520. - SyntaxKind.Text;[}];
  61521. - SyntaxKind.NewLine;[LF];
  61522. - SyntaxKind.Transition;[@];
  61523. - SyntaxKind.Text;[{];
  61524. - SyntaxKind.NewLine;[LF];
  61525. - Markup block - Gen<None> - 23 - (258:37,0)
  61526. - Tag block - Gen<None> - 7 - (258:37,0)
  61527. - Markup span - Gen<Markup> - [<param>] - SpanEditHandler;Accepts:None - (258:37,0) - Tokens:3
  61528. - SyntaxKind.OpenAngle;[<];
  61529. - SyntaxKind.Text;[param];
  61530. - SyntaxKind.CloseAngle;[>];
  61531. - Tag block - Gen<None> - 16 - (265:37,7)
  61532. - Markup span - Gen<Markup> - [</paramLF}LF@{LF] - SpanEditHandler;Accepts:Any - (265:37,7) - Tokens:9
  61533. - SyntaxKind.OpenAngle;[<];
  61534. - SyntaxKind.ForwardSlash;[/];
  61535. - SyntaxKind.Text;[param];
  61536. - SyntaxKind.NewLine;[LF];
  61537. - SyntaxKind.Text;[}];
  61538. - SyntaxKind.NewLine;[LF];
  61539. - SyntaxKind.Transition;[@];
  61540. - SyntaxKind.Text;[{];
  61541. - SyntaxKind.NewLine;[LF];
  61542. - Markup block - Gen<None> - 25 - (281:40,0)
  61543. - Tag block - Gen<None> - 8 - (281:40,0)
  61544. - Markup span - Gen<Markup> - [<source>] - SpanEditHandler;Accepts:None - (281:40,0) - Tokens:3
  61545. - SyntaxKind.OpenAngle;[<];
  61546. - SyntaxKind.Text;[source];
  61547. - SyntaxKind.CloseAngle;[>];
  61548. - Tag block - Gen<None> - 17 - (289:40,8)
  61549. - Markup span - Gen<Markup> - [</sourceLF}LF@{LF] - SpanEditHandler;Accepts:Any - (289:40,8) - Tokens:9
  61550. - SyntaxKind.OpenAngle;[<];
  61551. - SyntaxKind.ForwardSlash;[/];
  61552. - SyntaxKind.Text;[source];
  61553. - SyntaxKind.NewLine;[LF];
  61554. - SyntaxKind.Text;[}];
  61555. - SyntaxKind.NewLine;[LF];
  61556. - SyntaxKind.Transition;[@];
  61557. - SyntaxKind.Text;[{];
  61558. - SyntaxKind.NewLine;[LF];
  61559. - Markup block - Gen<None> - 23 - (306:43,0)
  61560. - Tag block - Gen<None> - 7 - (306:43,0)
  61561. - Markup span - Gen<Markup> - [<track>] - SpanEditHandler;Accepts:None - (306:43,0) - Tokens:3
  61562. - SyntaxKind.OpenAngle;[<];
  61563. - SyntaxKind.Text;[track];
  61564. - SyntaxKind.CloseAngle;[>];
  61565. - Tag block - Gen<None> - 16 - (313:43,7)
  61566. - Markup span - Gen<Markup> - [</trackLF}LF@{LF] - SpanEditHandler;Accepts:Any - (313:43,7) - Tokens:9
  61567. - SyntaxKind.OpenAngle;[<];
  61568. - SyntaxKind.ForwardSlash;[/];
  61569. - SyntaxKind.Text;[track];
  61570. - SyntaxKind.NewLine;[LF];
  61571. - SyntaxKind.Text;[}];
  61572. - SyntaxKind.NewLine;[LF];
  61573. - SyntaxKind.Transition;[@];
  61574. - SyntaxKind.Text;[{];
  61575. - SyntaxKind.NewLine;[LF];
  61576. - Markup block - Gen<None> - 15 - (329:46,0)
  61577. - Tag block - Gen<None> - 5 - (329:46,0)
  61578. - Markup span - Gen<Markup> - [<wbr>] - SpanEditHandler;Accepts:None - (329:46,0) - Tokens:3
  61579. - SyntaxKind.OpenAngle;[<];
  61580. - SyntaxKind.Text;[wbr];
  61581. - SyntaxKind.CloseAngle;[>];
  61582. - Tag block - Gen<None> - 10 - (334:46,5)
  61583. - Markup span - Gen<Markup> - [</wbrLF}LF] - SpanEditHandler;Accepts:Any - (334:46,5) - Tokens:6
  61584. - SyntaxKind.OpenAngle;[<];
  61585. - SyntaxKind.ForwardSlash;[/];
  61586. - SyntaxKind.Text;[wbr];
  61587. - SyntaxKind.NewLine;[LF];
  61588. - SyntaxKind.Text;[}];
  61589. - SyntaxKind.NewLine;[LF];
  61590. +RazorDocument - [0..344)::344 - [@{LF<area></areaLF}LF@{LF<base></baseLF}LF@{LF<br></brLF}LF@{LF<col></colLF}LF@{LF<command></commandLF}LF@{LF<embed></embedLF}LF@{LF<hr></hrLF}LF@{LF<img></imgLF}LF@{LF<input></inputLF}LF@{LF<keygen></keygenLF}LF@{LF<link></linkLF}LF@{LF<meta></metaLF}LF@{LF<param></paramLF}LF@{LF<source></sourceLF}LF@{LF<track></trackLF}LF@{LF<wbr></wbrLF}LF]
  61591. + MarkupBlock - [0..344)::344
  61592. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  61593. + Marker;[];
  61594. + CSharpCodeBlock - [0..344)::344
  61595. + CSharpStatement - [0..344)::344
  61596. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  61597. + Transition;[@];
  61598. + CSharpStatementBody - [1..344)::343
  61599. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  61600. + LeftBrace;[{];
  61601. + CSharpCodeBlock - [2..344)::342
  61602. + CSharpStatementLiteral - [2..4)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[}];AtEOL
  61603. + NewLine;[LF];
  61604. + MarkupBlock - [4..25)::21
  61605. + MarkupTagBlock - [4..10)::6 - [<area>]
  61606. + MarkupTextLiteral - [4..10)::6 - [<area>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61607. + OpenAngle;[<];
  61608. + Text;[area];
  61609. + CloseAngle;[>];
  61610. + MarkupTagBlock - [10..25)::15 - [</areaLF}LF@{LF]
  61611. + MarkupTextLiteral - [10..25)::15 - [</areaLF}LF@{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  61612. + OpenAngle;[<];
  61613. + ForwardSlash;[/];
  61614. + Text;[area];
  61615. + NewLine;[LF];
  61616. + Text;[}];
  61617. + NewLine;[LF];
  61618. + Transition;[@];
  61619. + Text;[{];
  61620. + NewLine;[LF];
  61621. + MarkupBlock - [25..46)::21
  61622. + MarkupTagBlock - [25..31)::6 - [<base>]
  61623. + MarkupTextLiteral - [25..31)::6 - [<base>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61624. + OpenAngle;[<];
  61625. + Text;[base];
  61626. + CloseAngle;[>];
  61627. + MarkupTagBlock - [31..46)::15 - [</baseLF}LF@{LF]
  61628. + MarkupTextLiteral - [31..46)::15 - [</baseLF}LF@{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  61629. + OpenAngle;[<];
  61630. + ForwardSlash;[/];
  61631. + Text;[base];
  61632. + NewLine;[LF];
  61633. + Text;[}];
  61634. + NewLine;[LF];
  61635. + Transition;[@];
  61636. + Text;[{];
  61637. + NewLine;[LF];
  61638. + MarkupBlock - [46..63)::17
  61639. + MarkupTagBlock - [46..50)::4 - [<br>]
  61640. + MarkupTextLiteral - [46..50)::4 - [<br>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61641. + OpenAngle;[<];
  61642. + Text;[br];
  61643. + CloseAngle;[>];
  61644. + MarkupTagBlock - [50..63)::13 - [</brLF}LF@{LF]
  61645. + MarkupTextLiteral - [50..63)::13 - [</brLF}LF@{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  61646. + OpenAngle;[<];
  61647. + ForwardSlash;[/];
  61648. + Text;[br];
  61649. + NewLine;[LF];
  61650. + Text;[}];
  61651. + NewLine;[LF];
  61652. + Transition;[@];
  61653. + Text;[{];
  61654. + NewLine;[LF];
  61655. + MarkupBlock - [63..82)::19
  61656. + MarkupTagBlock - [63..68)::5 - [<col>]
  61657. + MarkupTextLiteral - [63..68)::5 - [<col>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61658. + OpenAngle;[<];
  61659. + Text;[col];
  61660. + CloseAngle;[>];
  61661. + MarkupTagBlock - [68..82)::14 - [</colLF}LF@{LF]
  61662. + MarkupTextLiteral - [68..82)::14 - [</colLF}LF@{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  61663. + OpenAngle;[<];
  61664. + ForwardSlash;[/];
  61665. + Text;[col];
  61666. + NewLine;[LF];
  61667. + Text;[}];
  61668. + NewLine;[LF];
  61669. + Transition;[@];
  61670. + Text;[{];
  61671. + NewLine;[LF];
  61672. + MarkupBlock - [82..109)::27
  61673. + MarkupTagBlock - [82..91)::9 - [<command>]
  61674. + MarkupTextLiteral - [82..91)::9 - [<command>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61675. + OpenAngle;[<];
  61676. + Text;[command];
  61677. + CloseAngle;[>];
  61678. + MarkupTagBlock - [91..109)::18 - [</commandLF}LF@{LF]
  61679. + MarkupTextLiteral - [91..109)::18 - [</commandLF}LF@{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  61680. + OpenAngle;[<];
  61681. + ForwardSlash;[/];
  61682. + Text;[command];
  61683. + NewLine;[LF];
  61684. + Text;[}];
  61685. + NewLine;[LF];
  61686. + Transition;[@];
  61687. + Text;[{];
  61688. + NewLine;[LF];
  61689. + MarkupBlock - [109..132)::23
  61690. + MarkupTagBlock - [109..116)::7 - [<embed>]
  61691. + MarkupTextLiteral - [109..116)::7 - [<embed>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61692. + OpenAngle;[<];
  61693. + Text;[embed];
  61694. + CloseAngle;[>];
  61695. + MarkupTagBlock - [116..132)::16 - [</embedLF}LF@{LF]
  61696. + MarkupTextLiteral - [116..132)::16 - [</embedLF}LF@{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  61697. + OpenAngle;[<];
  61698. + ForwardSlash;[/];
  61699. + Text;[embed];
  61700. + NewLine;[LF];
  61701. + Text;[}];
  61702. + NewLine;[LF];
  61703. + Transition;[@];
  61704. + Text;[{];
  61705. + NewLine;[LF];
  61706. + MarkupBlock - [132..149)::17
  61707. + MarkupTagBlock - [132..136)::4 - [<hr>]
  61708. + MarkupTextLiteral - [132..136)::4 - [<hr>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61709. + OpenAngle;[<];
  61710. + Text;[hr];
  61711. + CloseAngle;[>];
  61712. + MarkupTagBlock - [136..149)::13 - [</hrLF}LF@{LF]
  61713. + MarkupTextLiteral - [136..149)::13 - [</hrLF}LF@{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  61714. + OpenAngle;[<];
  61715. + ForwardSlash;[/];
  61716. + Text;[hr];
  61717. + NewLine;[LF];
  61718. + Text;[}];
  61719. + NewLine;[LF];
  61720. + Transition;[@];
  61721. + Text;[{];
  61722. + NewLine;[LF];
  61723. + MarkupBlock - [149..168)::19
  61724. + MarkupTagBlock - [149..154)::5 - [<img>]
  61725. + MarkupTextLiteral - [149..154)::5 - [<img>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61726. + OpenAngle;[<];
  61727. + Text;[img];
  61728. + CloseAngle;[>];
  61729. + MarkupTagBlock - [154..168)::14 - [</imgLF}LF@{LF]
  61730. + MarkupTextLiteral - [154..168)::14 - [</imgLF}LF@{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  61731. + OpenAngle;[<];
  61732. + ForwardSlash;[/];
  61733. + Text;[img];
  61734. + NewLine;[LF];
  61735. + Text;[}];
  61736. + NewLine;[LF];
  61737. + Transition;[@];
  61738. + Text;[{];
  61739. + NewLine;[LF];
  61740. + MarkupBlock - [168..191)::23
  61741. + MarkupTagBlock - [168..175)::7 - [<input>]
  61742. + MarkupTextLiteral - [168..175)::7 - [<input>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61743. + OpenAngle;[<];
  61744. + Text;[input];
  61745. + CloseAngle;[>];
  61746. + MarkupTagBlock - [175..191)::16 - [</inputLF}LF@{LF]
  61747. + MarkupTextLiteral - [175..191)::16 - [</inputLF}LF@{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  61748. + OpenAngle;[<];
  61749. + ForwardSlash;[/];
  61750. + Text;[input];
  61751. + NewLine;[LF];
  61752. + Text;[}];
  61753. + NewLine;[LF];
  61754. + Transition;[@];
  61755. + Text;[{];
  61756. + NewLine;[LF];
  61757. + MarkupBlock - [191..216)::25
  61758. + MarkupTagBlock - [191..199)::8 - [<keygen>]
  61759. + MarkupTextLiteral - [191..199)::8 - [<keygen>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61760. + OpenAngle;[<];
  61761. + Text;[keygen];
  61762. + CloseAngle;[>];
  61763. + MarkupTagBlock - [199..216)::17 - [</keygenLF}LF@{LF]
  61764. + MarkupTextLiteral - [199..216)::17 - [</keygenLF}LF@{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  61765. + OpenAngle;[<];
  61766. + ForwardSlash;[/];
  61767. + Text;[keygen];
  61768. + NewLine;[LF];
  61769. + Text;[}];
  61770. + NewLine;[LF];
  61771. + Transition;[@];
  61772. + Text;[{];
  61773. + NewLine;[LF];
  61774. + MarkupBlock - [216..237)::21
  61775. + MarkupTagBlock - [216..222)::6 - [<link>]
  61776. + MarkupTextLiteral - [216..222)::6 - [<link>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61777. + OpenAngle;[<];
  61778. + Text;[link];
  61779. + CloseAngle;[>];
  61780. + MarkupTagBlock - [222..237)::15 - [</linkLF}LF@{LF]
  61781. + MarkupTextLiteral - [222..237)::15 - [</linkLF}LF@{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  61782. + OpenAngle;[<];
  61783. + ForwardSlash;[/];
  61784. + Text;[link];
  61785. + NewLine;[LF];
  61786. + Text;[}];
  61787. + NewLine;[LF];
  61788. + Transition;[@];
  61789. + Text;[{];
  61790. + NewLine;[LF];
  61791. + MarkupBlock - [237..258)::21
  61792. + MarkupTagBlock - [237..243)::6 - [<meta>]
  61793. + MarkupTextLiteral - [237..243)::6 - [<meta>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61794. + OpenAngle;[<];
  61795. + Text;[meta];
  61796. + CloseAngle;[>];
  61797. + MarkupTagBlock - [243..258)::15 - [</metaLF}LF@{LF]
  61798. + MarkupTextLiteral - [243..258)::15 - [</metaLF}LF@{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  61799. + OpenAngle;[<];
  61800. + ForwardSlash;[/];
  61801. + Text;[meta];
  61802. + NewLine;[LF];
  61803. + Text;[}];
  61804. + NewLine;[LF];
  61805. + Transition;[@];
  61806. + Text;[{];
  61807. + NewLine;[LF];
  61808. + MarkupBlock - [258..281)::23
  61809. + MarkupTagBlock - [258..265)::7 - [<param>]
  61810. + MarkupTextLiteral - [258..265)::7 - [<param>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61811. + OpenAngle;[<];
  61812. + Text;[param];
  61813. + CloseAngle;[>];
  61814. + MarkupTagBlock - [265..281)::16 - [</paramLF}LF@{LF]
  61815. + MarkupTextLiteral - [265..281)::16 - [</paramLF}LF@{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  61816. + OpenAngle;[<];
  61817. + ForwardSlash;[/];
  61818. + Text;[param];
  61819. + NewLine;[LF];
  61820. + Text;[}];
  61821. + NewLine;[LF];
  61822. + Transition;[@];
  61823. + Text;[{];
  61824. + NewLine;[LF];
  61825. + MarkupBlock - [281..306)::25
  61826. + MarkupTagBlock - [281..289)::8 - [<source>]
  61827. + MarkupTextLiteral - [281..289)::8 - [<source>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61828. + OpenAngle;[<];
  61829. + Text;[source];
  61830. + CloseAngle;[>];
  61831. + MarkupTagBlock - [289..306)::17 - [</sourceLF}LF@{LF]
  61832. + MarkupTextLiteral - [289..306)::17 - [</sourceLF}LF@{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  61833. + OpenAngle;[<];
  61834. + ForwardSlash;[/];
  61835. + Text;[source];
  61836. + NewLine;[LF];
  61837. + Text;[}];
  61838. + NewLine;[LF];
  61839. + Transition;[@];
  61840. + Text;[{];
  61841. + NewLine;[LF];
  61842. + MarkupBlock - [306..329)::23
  61843. + MarkupTagBlock - [306..313)::7 - [<track>]
  61844. + MarkupTextLiteral - [306..313)::7 - [<track>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61845. + OpenAngle;[<];
  61846. + Text;[track];
  61847. + CloseAngle;[>];
  61848. + MarkupTagBlock - [313..329)::16 - [</trackLF}LF@{LF]
  61849. + MarkupTextLiteral - [313..329)::16 - [</trackLF}LF@{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  61850. + OpenAngle;[<];
  61851. + ForwardSlash;[/];
  61852. + Text;[track];
  61853. + NewLine;[LF];
  61854. + Text;[}];
  61855. + NewLine;[LF];
  61856. + Transition;[@];
  61857. + Text;[{];
  61858. + NewLine;[LF];
  61859. + MarkupBlock - [329..344)::15
  61860. + MarkupTagBlock - [329..334)::5 - [<wbr>]
  61861. + MarkupTextLiteral - [329..334)::5 - [<wbr>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61862. + OpenAngle;[<];
  61863. + Text;[wbr];
  61864. + CloseAngle;[>];
  61865. + MarkupTagBlock - [334..344)::10 - [</wbrLF}LF]
  61866. + MarkupTextLiteral - [334..344)::10 - [</wbrLF}LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  61867. + OpenAngle;[<];
  61868. + ForwardSlash;[/];
  61869. + Text;[wbr];
  61870. + NewLine;[LF];
  61871. + Text;[}];
  61872. + NewLine;[LF];
  61873. + RazorMetaCode - [344..344)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  61874. + RightBrace;[<Missing>];
  61875. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ProcessingInstructionTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ProcessingInstructionTag.stree.txt
  61876. index dddadc8c952..e239ffba00e 100644
  61877. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ProcessingInstructionTag.stree.txt
  61878. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ProcessingInstructionTag.stree.txt
  61879. @@ -1,16 +1,16 @@
  61880. -Markup block - Gen<None> - 23 - (0:0,0)
  61881. - Markup span - Gen<Markup> - [<?xml version="1.0" ?>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:12
  61882. - SyntaxKind.OpenAngle;[<];
  61883. - SyntaxKind.QuestionMark;[?];
  61884. - SyntaxKind.Text;[xml];
  61885. - SyntaxKind.Whitespace;[ ];
  61886. - SyntaxKind.Text;[version];
  61887. - SyntaxKind.Equals;[=];
  61888. - SyntaxKind.DoubleQuote;["];
  61889. - SyntaxKind.Text;[1.0];
  61890. - SyntaxKind.DoubleQuote;["];
  61891. - SyntaxKind.Whitespace;[ ];
  61892. - SyntaxKind.QuestionMark;[?];
  61893. - SyntaxKind.CloseAngle;[>];
  61894. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (22:0,22) - Tokens:1
  61895. - SyntaxKind.Whitespace;[ ];
  61896. +MarkupBlock - [0..23)::23 - [<?xml version="1.0" ?> ]
  61897. + MarkupTextLiteral - [0..22)::22 - [<?xml version="1.0" ?>] - Gen<Markup> - SpanEditHandler;Accepts:None
  61898. + OpenAngle;[<];
  61899. + QuestionMark;[?];
  61900. + Text;[xml];
  61901. + Whitespace;[ ];
  61902. + Text;[version];
  61903. + Equals;[=];
  61904. + DoubleQuote;["];
  61905. + Text;[1.0];
  61906. + DoubleQuote;["];
  61907. + Whitespace;[ ];
  61908. + QuestionMark;[?];
  61909. + CloseAngle;[>];
  61910. + MarkupTextLiteral - [22..23)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  61911. + Whitespace;[ ];
  61912. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ScriptTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ScriptTag.stree.txt
  61913. index ec50996e13d..7f99f00f9a0 100644
  61914. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ScriptTag.stree.txt
  61915. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ScriptTag.stree.txt
  61916. @@ -1,28 +1,29 @@
  61917. -Markup block - Gen<None> - 68 - (0:0,0)
  61918. - Tag block - Gen<None> - 8 - (0:0,0)
  61919. - Markup span - Gen<Markup> - [<script>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  61920. - SyntaxKind.OpenAngle;[<];
  61921. - SyntaxKind.Text;[script];
  61922. - SyntaxKind.CloseAngle;[>];
  61923. - Markup span - Gen<Markup> - [foo < bar && quantity.toString() !== orderQty.val()] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:15
  61924. - SyntaxKind.Text;[foo];
  61925. - SyntaxKind.Whitespace;[ ];
  61926. - SyntaxKind.OpenAngle;[<];
  61927. - SyntaxKind.Whitespace;[ ];
  61928. - SyntaxKind.Text;[bar];
  61929. - SyntaxKind.Whitespace;[ ];
  61930. - SyntaxKind.Text;[&&];
  61931. - SyntaxKind.Whitespace;[ ];
  61932. - SyntaxKind.Text;[quantity.toString()];
  61933. - SyntaxKind.Whitespace;[ ];
  61934. - SyntaxKind.Bang;[!];
  61935. - SyntaxKind.Equals;[=];
  61936. - SyntaxKind.Equals;[=];
  61937. - SyntaxKind.Whitespace;[ ];
  61938. - SyntaxKind.Text;[orderQty.val()];
  61939. - Tag block - Gen<None> - 9 - (59:0,59)
  61940. - Markup span - Gen<Markup> - [</script>] - SpanEditHandler;Accepts:Any - (59:0,59) - Tokens:4
  61941. - SyntaxKind.OpenAngle;[<];
  61942. - SyntaxKind.ForwardSlash;[/];
  61943. - SyntaxKind.Text;[script];
  61944. - SyntaxKind.CloseAngle;[>];
  61945. +RazorDocument - [0..68)::68 - [<script>foo < bar && quantity.toString() !== orderQty.val()</script>]
  61946. + MarkupBlock - [0..68)::68
  61947. + MarkupTagBlock - [0..8)::8 - [<script>]
  61948. + MarkupTextLiteral - [0..8)::8 - [<script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  61949. + OpenAngle;[<];
  61950. + Text;[script];
  61951. + CloseAngle;[>];
  61952. + MarkupTextLiteral - [8..59)::51 - [foo < bar && quantity.toString() !== orderQty.val()] - Gen<Markup> - SpanEditHandler;Accepts:Any
  61953. + Text;[foo];
  61954. + Whitespace;[ ];
  61955. + OpenAngle;[<];
  61956. + Whitespace;[ ];
  61957. + Text;[bar];
  61958. + Whitespace;[ ];
  61959. + Text;[&&];
  61960. + Whitespace;[ ];
  61961. + Text;[quantity.toString()];
  61962. + Whitespace;[ ];
  61963. + Bang;[!];
  61964. + Equals;[=];
  61965. + Equals;[=];
  61966. + Whitespace;[ ];
  61967. + Text;[orderQty.val()];
  61968. + MarkupTagBlock - [59..68)::9 - [</script>]
  61969. + MarkupTextLiteral - [59..68)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  61970. + OpenAngle;[<];
  61971. + ForwardSlash;[/];
  61972. + Text;[script];
  61973. + CloseAngle;[>];
  61974. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ScriptTag_WithNestedBeginTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ScriptTag_WithNestedBeginTag.stree.txt
  61975. index 0875523d10d..56d08090e9b 100644
  61976. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ScriptTag_WithNestedBeginTag.stree.txt
  61977. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ScriptTag_WithNestedBeginTag.stree.txt
  61978. @@ -1,16 +1,17 @@
  61979. -Markup block - Gen<None> - 20 - (0:0,0)
  61980. - Tag block - Gen<None> - 8 - (0:0,0)
  61981. - Markup span - Gen<Markup> - [<script>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  61982. - SyntaxKind.OpenAngle;[<];
  61983. - SyntaxKind.Text;[script];
  61984. - SyntaxKind.CloseAngle;[>];
  61985. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:3
  61986. - SyntaxKind.OpenAngle;[<];
  61987. - SyntaxKind.Text;[p];
  61988. - SyntaxKind.CloseAngle;[>];
  61989. - Tag block - Gen<None> - 9 - (11:0,11)
  61990. - Markup span - Gen<Markup> - [</script>] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:4
  61991. - SyntaxKind.OpenAngle;[<];
  61992. - SyntaxKind.ForwardSlash;[/];
  61993. - SyntaxKind.Text;[script];
  61994. - SyntaxKind.CloseAngle;[>];
  61995. +RazorDocument - [0..20)::20 - [<script><p></script>]
  61996. + MarkupBlock - [0..20)::20
  61997. + MarkupTagBlock - [0..8)::8 - [<script>]
  61998. + MarkupTextLiteral - [0..8)::8 - [<script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  61999. + OpenAngle;[<];
  62000. + Text;[script];
  62001. + CloseAngle;[>];
  62002. + MarkupTextLiteral - [8..11)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  62003. + OpenAngle;[<];
  62004. + Text;[p];
  62005. + CloseAngle;[>];
  62006. + MarkupTagBlock - [11..20)::9 - [</script>]
  62007. + MarkupTextLiteral - [11..20)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  62008. + OpenAngle;[<];
  62009. + ForwardSlash;[/];
  62010. + Text;[script];
  62011. + CloseAngle;[>];
  62012. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ScriptTag_WithNestedEndTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ScriptTag_WithNestedEndTag.stree.txt
  62013. index b567fc17c90..24eda177d74 100644
  62014. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ScriptTag_WithNestedEndTag.stree.txt
  62015. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ScriptTag_WithNestedEndTag.stree.txt
  62016. @@ -1,17 +1,18 @@
  62017. -Markup block - Gen<None> - 21 - (0:0,0)
  62018. - Tag block - Gen<None> - 8 - (0:0,0)
  62019. - Markup span - Gen<Markup> - [<script>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  62020. - SyntaxKind.OpenAngle;[<];
  62021. - SyntaxKind.Text;[script];
  62022. - SyntaxKind.CloseAngle;[>];
  62023. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:4
  62024. - SyntaxKind.OpenAngle;[<];
  62025. - SyntaxKind.ForwardSlash;[/];
  62026. - SyntaxKind.Text;[p];
  62027. - SyntaxKind.CloseAngle;[>];
  62028. - Tag block - Gen<None> - 9 - (12:0,12)
  62029. - Markup span - Gen<Markup> - [</script>] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:4
  62030. - SyntaxKind.OpenAngle;[<];
  62031. - SyntaxKind.ForwardSlash;[/];
  62032. - SyntaxKind.Text;[script];
  62033. - SyntaxKind.CloseAngle;[>];
  62034. +RazorDocument - [0..21)::21 - [<script></p></script>]
  62035. + MarkupBlock - [0..21)::21
  62036. + MarkupTagBlock - [0..8)::8 - [<script>]
  62037. + MarkupTextLiteral - [0..8)::8 - [<script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  62038. + OpenAngle;[<];
  62039. + Text;[script];
  62040. + CloseAngle;[>];
  62041. + MarkupTextLiteral - [8..12)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  62042. + OpenAngle;[<];
  62043. + ForwardSlash;[/];
  62044. + Text;[p];
  62045. + CloseAngle;[>];
  62046. + MarkupTagBlock - [12..21)::9 - [</script>]
  62047. + MarkupTextLiteral - [12..21)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  62048. + OpenAngle;[<];
  62049. + ForwardSlash;[/];
  62050. + Text;[script];
  62051. + CloseAngle;[>];
  62052. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ScriptTag_WithNestedMalformedTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ScriptTag_WithNestedMalformedTag.stree.txt
  62053. index 8239da199f9..9652a8ea754 100644
  62054. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ScriptTag_WithNestedMalformedTag.stree.txt
  62055. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ScriptTag_WithNestedMalformedTag.stree.txt
  62056. @@ -1,29 +1,30 @@
  62057. -Markup block - Gen<None> - 39 - (0:0,0)
  62058. - Tag block - Gen<None> - 8 - (0:0,0)
  62059. - Markup span - Gen<Markup> - [<script>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  62060. - SyntaxKind.OpenAngle;[<];
  62061. - SyntaxKind.Text;[script];
  62062. - SyntaxKind.CloseAngle;[>];
  62063. - Markup span - Gen<Markup> - [var four = 4; /* </ */] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:16
  62064. - SyntaxKind.Text;[var];
  62065. - SyntaxKind.Whitespace;[ ];
  62066. - SyntaxKind.Text;[four];
  62067. - SyntaxKind.Whitespace;[ ];
  62068. - SyntaxKind.Equals;[=];
  62069. - SyntaxKind.Whitespace;[ ];
  62070. - SyntaxKind.Text;[4;];
  62071. - SyntaxKind.Whitespace;[ ];
  62072. - SyntaxKind.ForwardSlash;[/];
  62073. - SyntaxKind.Text;[*];
  62074. - SyntaxKind.Whitespace;[ ];
  62075. - SyntaxKind.OpenAngle;[<];
  62076. - SyntaxKind.ForwardSlash;[/];
  62077. - SyntaxKind.Whitespace;[ ];
  62078. - SyntaxKind.Text;[*];
  62079. - SyntaxKind.ForwardSlash;[/];
  62080. - Tag block - Gen<None> - 9 - (30:0,30)
  62081. - Markup span - Gen<Markup> - [</script>] - SpanEditHandler;Accepts:Any - (30:0,30) - Tokens:4
  62082. - SyntaxKind.OpenAngle;[<];
  62083. - SyntaxKind.ForwardSlash;[/];
  62084. - SyntaxKind.Text;[script];
  62085. - SyntaxKind.CloseAngle;[>];
  62086. +RazorDocument - [0..39)::39 - [<script>var four = 4; /* </ */</script>]
  62087. + MarkupBlock - [0..39)::39
  62088. + MarkupTagBlock - [0..8)::8 - [<script>]
  62089. + MarkupTextLiteral - [0..8)::8 - [<script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  62090. + OpenAngle;[<];
  62091. + Text;[script];
  62092. + CloseAngle;[>];
  62093. + MarkupTextLiteral - [8..30)::22 - [var four = 4; /* </ */] - Gen<Markup> - SpanEditHandler;Accepts:Any
  62094. + Text;[var];
  62095. + Whitespace;[ ];
  62096. + Text;[four];
  62097. + Whitespace;[ ];
  62098. + Equals;[=];
  62099. + Whitespace;[ ];
  62100. + Text;[4;];
  62101. + Whitespace;[ ];
  62102. + ForwardSlash;[/];
  62103. + Text;[*];
  62104. + Whitespace;[ ];
  62105. + OpenAngle;[<];
  62106. + ForwardSlash;[/];
  62107. + Whitespace;[ ];
  62108. + Text;[*];
  62109. + ForwardSlash;[/];
  62110. + MarkupTagBlock - [30..39)::9 - [</script>]
  62111. + MarkupTextLiteral - [30..39)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  62112. + OpenAngle;[<];
  62113. + ForwardSlash;[/];
  62114. + Text;[script];
  62115. + CloseAngle;[>];
  62116. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ScriptTag_WithNestedTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ScriptTag_WithNestedTag.stree.txt
  62117. index e8cc723508d..161404efd29 100644
  62118. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ScriptTag_WithNestedTag.stree.txt
  62119. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/ScriptTag_WithNestedTag.stree.txt
  62120. @@ -1,20 +1,21 @@
  62121. -Markup block - Gen<None> - 24 - (0:0,0)
  62122. - Tag block - Gen<None> - 8 - (0:0,0)
  62123. - Markup span - Gen<Markup> - [<script>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  62124. - SyntaxKind.OpenAngle;[<];
  62125. - SyntaxKind.Text;[script];
  62126. - SyntaxKind.CloseAngle;[>];
  62127. - Markup span - Gen<Markup> - [<p></p>] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:7
  62128. - SyntaxKind.OpenAngle;[<];
  62129. - SyntaxKind.Text;[p];
  62130. - SyntaxKind.CloseAngle;[>];
  62131. - SyntaxKind.OpenAngle;[<];
  62132. - SyntaxKind.ForwardSlash;[/];
  62133. - SyntaxKind.Text;[p];
  62134. - SyntaxKind.CloseAngle;[>];
  62135. - Tag block - Gen<None> - 9 - (15:0,15)
  62136. - Markup span - Gen<Markup> - [</script>] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:4
  62137. - SyntaxKind.OpenAngle;[<];
  62138. - SyntaxKind.ForwardSlash;[/];
  62139. - SyntaxKind.Text;[script];
  62140. - SyntaxKind.CloseAngle;[>];
  62141. +RazorDocument - [0..24)::24 - [<script><p></p></script>]
  62142. + MarkupBlock - [0..24)::24
  62143. + MarkupTagBlock - [0..8)::8 - [<script>]
  62144. + MarkupTextLiteral - [0..8)::8 - [<script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  62145. + OpenAngle;[<];
  62146. + Text;[script];
  62147. + CloseAngle;[>];
  62148. + MarkupTextLiteral - [8..15)::7 - [<p></p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  62149. + OpenAngle;[<];
  62150. + Text;[p];
  62151. + CloseAngle;[>];
  62152. + OpenAngle;[<];
  62153. + ForwardSlash;[/];
  62154. + Text;[p];
  62155. + CloseAngle;[>];
  62156. + MarkupTagBlock - [15..24)::9 - [</script>]
  62157. + MarkupTextLiteral - [15..24)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  62158. + OpenAngle;[<];
  62159. + ForwardSlash;[/];
  62160. + Text;[script];
  62161. + CloseAngle;[>];
  62162. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/TextTags.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/TextTags.stree.txt
  62163. index 0448c3594ab..7c6e8f6fdd2 100644
  62164. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/TextTags.stree.txt
  62165. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/TextTags.stree.txt
  62166. @@ -1,14 +1,14 @@
  62167. -Markup block - Gen<None> - 16 - (0:0,0)
  62168. - Tag block - Gen<None> - 6 - (0:0,0)
  62169. - Transition span - Gen<None> - [<text>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  62170. - SyntaxKind.OpenAngle;[<];
  62171. - SyntaxKind.Text;[text];
  62172. - SyntaxKind.CloseAngle;[>];
  62173. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:None - (6:0,6) - Tokens:1
  62174. - SyntaxKind.Text;[Foo];
  62175. - Tag block - Gen<None> - 7 - (9:0,9)
  62176. - Transition span - Gen<None> - [</text>] - SpanEditHandler;Accepts:None - (9:0,9) - Tokens:4
  62177. - SyntaxKind.OpenAngle;[<];
  62178. - SyntaxKind.ForwardSlash;[/];
  62179. - SyntaxKind.Text;[text];
  62180. - SyntaxKind.CloseAngle;[>];
  62181. +MarkupBlock - [0..16)::16 - [<text>Foo</text>]
  62182. + MarkupTagBlock - [0..6)::6 - [<text>]
  62183. + MarkupTransition - [0..6)::6 - Gen<None> - SpanEditHandler;Accepts:None
  62184. + OpenAngle;[<];
  62185. + Text;[text];
  62186. + CloseAngle;[>];
  62187. + MarkupTextLiteral - [6..9)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:None
  62188. + Text;[Foo];
  62189. + MarkupTagBlock - [9..16)::7 - [</text>]
  62190. + MarkupTransition - [9..16)::7 - Gen<None> - SpanEditHandler;Accepts:None
  62191. + OpenAngle;[<];
  62192. + ForwardSlash;[/];
  62193. + Text;[text];
  62194. + CloseAngle;[>];
  62195. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/VoidElementFollowedByCloseTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/VoidElementFollowedByCloseTag.stree.txt
  62196. index 11b37fa430b..205e42d6a68 100644
  62197. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/VoidElementFollowedByCloseTag.stree.txt
  62198. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/VoidElementFollowedByCloseTag.stree.txt
  62199. @@ -1,563 +1,612 @@
  62200. -Markup block - Gen<None> - 584 - (0:0,0)
  62201. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  62202. - SyntaxKind.Unknown;[];
  62203. - Statement block - Gen<None> - 34 - (0:0,0)
  62204. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  62205. - SyntaxKind.Transition;[@];
  62206. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  62207. - SyntaxKind.LeftBrace;[{];
  62208. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (2:0,2) - Tokens:1
  62209. - SyntaxKind.NewLine;[LF];
  62210. - Markup block - Gen<None> - 14 - (4:1,0)
  62211. - Tag block - Gen<None> - 6 - (4:1,0)
  62212. - Markup span - Gen<Markup> - [<area>] - SpanEditHandler;Accepts:None - (4:1,0) - Tokens:3
  62213. - SyntaxKind.OpenAngle;[<];
  62214. - SyntaxKind.Text;[area];
  62215. - SyntaxKind.CloseAngle;[>];
  62216. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (10:1,6) - Tokens:1
  62217. - SyntaxKind.Whitespace;[ ];
  62218. - Tag block - Gen<None> - 7 - (11:1,7)
  62219. - Markup span - Gen<Markup> - [</area>] - SpanEditHandler;Accepts:None - (11:1,7) - Tokens:4
  62220. - SyntaxKind.OpenAngle;[<];
  62221. - SyntaxKind.ForwardSlash;[/];
  62222. - SyntaxKind.Text;[area];
  62223. - SyntaxKind.CloseAngle;[>];
  62224. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (18:1,14) - Tokens:9
  62225. - SyntaxKind.Identifier;[var];
  62226. - SyntaxKind.Whitespace;[ ];
  62227. - SyntaxKind.Identifier;[x];
  62228. - SyntaxKind.Whitespace;[ ];
  62229. - SyntaxKind.Assign;[=];
  62230. - SyntaxKind.Whitespace;[ ];
  62231. - SyntaxKind.Keyword;[true];
  62232. - SyntaxKind.Semicolon;[;];
  62233. - SyntaxKind.NewLine;[LF];
  62234. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (33:2,0) - Tokens:1
  62235. - SyntaxKind.RightBrace;[}];
  62236. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (34:2,1) - Tokens:1
  62237. - SyntaxKind.NewLine;[LF];
  62238. - Statement block - Gen<None> - 34 - (36:3,0)
  62239. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (36:3,0) - Tokens:1
  62240. - SyntaxKind.Transition;[@];
  62241. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (37:3,1) - Tokens:1
  62242. - SyntaxKind.LeftBrace;[{];
  62243. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (38:3,2) - Tokens:1
  62244. - SyntaxKind.NewLine;[LF];
  62245. - Markup block - Gen<None> - 14 - (40:4,0)
  62246. - Tag block - Gen<None> - 6 - (40:4,0)
  62247. - Markup span - Gen<Markup> - [<base>] - SpanEditHandler;Accepts:None - (40:4,0) - Tokens:3
  62248. - SyntaxKind.OpenAngle;[<];
  62249. - SyntaxKind.Text;[base];
  62250. - SyntaxKind.CloseAngle;[>];
  62251. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (46:4,6) - Tokens:1
  62252. - SyntaxKind.Whitespace;[ ];
  62253. - Tag block - Gen<None> - 7 - (47:4,7)
  62254. - Markup span - Gen<Markup> - [</base>] - SpanEditHandler;Accepts:None - (47:4,7) - Tokens:4
  62255. - SyntaxKind.OpenAngle;[<];
  62256. - SyntaxKind.ForwardSlash;[/];
  62257. - SyntaxKind.Text;[base];
  62258. - SyntaxKind.CloseAngle;[>];
  62259. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (54:4,14) - Tokens:9
  62260. - SyntaxKind.Identifier;[var];
  62261. - SyntaxKind.Whitespace;[ ];
  62262. - SyntaxKind.Identifier;[x];
  62263. - SyntaxKind.Whitespace;[ ];
  62264. - SyntaxKind.Assign;[=];
  62265. - SyntaxKind.Whitespace;[ ];
  62266. - SyntaxKind.Keyword;[true];
  62267. - SyntaxKind.Semicolon;[;];
  62268. - SyntaxKind.NewLine;[LF];
  62269. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (69:5,0) - Tokens:1
  62270. - SyntaxKind.RightBrace;[}];
  62271. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (70:5,1) - Tokens:1
  62272. - SyntaxKind.NewLine;[LF];
  62273. - Statement block - Gen<None> - 30 - (72:6,0)
  62274. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (72:6,0) - Tokens:1
  62275. - SyntaxKind.Transition;[@];
  62276. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (73:6,1) - Tokens:1
  62277. - SyntaxKind.LeftBrace;[{];
  62278. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (74:6,2) - Tokens:1
  62279. - SyntaxKind.NewLine;[LF];
  62280. - Markup block - Gen<None> - 10 - (76:7,0)
  62281. - Tag block - Gen<None> - 4 - (76:7,0)
  62282. - Markup span - Gen<Markup> - [<br>] - SpanEditHandler;Accepts:None - (76:7,0) - Tokens:3
  62283. - SyntaxKind.OpenAngle;[<];
  62284. - SyntaxKind.Text;[br];
  62285. - SyntaxKind.CloseAngle;[>];
  62286. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (80:7,4) - Tokens:1
  62287. - SyntaxKind.Whitespace;[ ];
  62288. - Tag block - Gen<None> - 5 - (81:7,5)
  62289. - Markup span - Gen<Markup> - [</br>] - SpanEditHandler;Accepts:None - (81:7,5) - Tokens:4
  62290. - SyntaxKind.OpenAngle;[<];
  62291. - SyntaxKind.ForwardSlash;[/];
  62292. - SyntaxKind.Text;[br];
  62293. - SyntaxKind.CloseAngle;[>];
  62294. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (86:7,10) - Tokens:9
  62295. - SyntaxKind.Identifier;[var];
  62296. - SyntaxKind.Whitespace;[ ];
  62297. - SyntaxKind.Identifier;[x];
  62298. - SyntaxKind.Whitespace;[ ];
  62299. - SyntaxKind.Assign;[=];
  62300. - SyntaxKind.Whitespace;[ ];
  62301. - SyntaxKind.Keyword;[true];
  62302. - SyntaxKind.Semicolon;[;];
  62303. - SyntaxKind.NewLine;[LF];
  62304. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (101:8,0) - Tokens:1
  62305. - SyntaxKind.RightBrace;[}];
  62306. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (102:8,1) - Tokens:1
  62307. - SyntaxKind.NewLine;[LF];
  62308. - Statement block - Gen<None> - 32 - (104:9,0)
  62309. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (104:9,0) - Tokens:1
  62310. - SyntaxKind.Transition;[@];
  62311. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (105:9,1) - Tokens:1
  62312. - SyntaxKind.LeftBrace;[{];
  62313. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (106:9,2) - Tokens:1
  62314. - SyntaxKind.NewLine;[LF];
  62315. - Markup block - Gen<None> - 12 - (108:10,0)
  62316. - Tag block - Gen<None> - 5 - (108:10,0)
  62317. - Markup span - Gen<Markup> - [<col>] - SpanEditHandler;Accepts:None - (108:10,0) - Tokens:3
  62318. - SyntaxKind.OpenAngle;[<];
  62319. - SyntaxKind.Text;[col];
  62320. - SyntaxKind.CloseAngle;[>];
  62321. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (113:10,5) - Tokens:1
  62322. - SyntaxKind.Whitespace;[ ];
  62323. - Tag block - Gen<None> - 6 - (114:10,6)
  62324. - Markup span - Gen<Markup> - [</col>] - SpanEditHandler;Accepts:None - (114:10,6) - Tokens:4
  62325. - SyntaxKind.OpenAngle;[<];
  62326. - SyntaxKind.ForwardSlash;[/];
  62327. - SyntaxKind.Text;[col];
  62328. - SyntaxKind.CloseAngle;[>];
  62329. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (120:10,12) - Tokens:9
  62330. - SyntaxKind.Identifier;[var];
  62331. - SyntaxKind.Whitespace;[ ];
  62332. - SyntaxKind.Identifier;[x];
  62333. - SyntaxKind.Whitespace;[ ];
  62334. - SyntaxKind.Assign;[=];
  62335. - SyntaxKind.Whitespace;[ ];
  62336. - SyntaxKind.Keyword;[true];
  62337. - SyntaxKind.Semicolon;[;];
  62338. - SyntaxKind.NewLine;[LF];
  62339. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (135:11,0) - Tokens:1
  62340. - SyntaxKind.RightBrace;[}];
  62341. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (136:11,1) - Tokens:1
  62342. - SyntaxKind.NewLine;[LF];
  62343. - Statement block - Gen<None> - 40 - (138:12,0)
  62344. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (138:12,0) - Tokens:1
  62345. - SyntaxKind.Transition;[@];
  62346. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (139:12,1) - Tokens:1
  62347. - SyntaxKind.LeftBrace;[{];
  62348. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (140:12,2) - Tokens:1
  62349. - SyntaxKind.NewLine;[LF];
  62350. - Markup block - Gen<None> - 20 - (142:13,0)
  62351. - Tag block - Gen<None> - 9 - (142:13,0)
  62352. - Markup span - Gen<Markup> - [<command>] - SpanEditHandler;Accepts:None - (142:13,0) - Tokens:3
  62353. - SyntaxKind.OpenAngle;[<];
  62354. - SyntaxKind.Text;[command];
  62355. - SyntaxKind.CloseAngle;[>];
  62356. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (151:13,9) - Tokens:1
  62357. - SyntaxKind.Whitespace;[ ];
  62358. - Tag block - Gen<None> - 10 - (152:13,10)
  62359. - Markup span - Gen<Markup> - [</command>] - SpanEditHandler;Accepts:None - (152:13,10) - Tokens:4
  62360. - SyntaxKind.OpenAngle;[<];
  62361. - SyntaxKind.ForwardSlash;[/];
  62362. - SyntaxKind.Text;[command];
  62363. - SyntaxKind.CloseAngle;[>];
  62364. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (162:13,20) - Tokens:9
  62365. - SyntaxKind.Identifier;[var];
  62366. - SyntaxKind.Whitespace;[ ];
  62367. - SyntaxKind.Identifier;[x];
  62368. - SyntaxKind.Whitespace;[ ];
  62369. - SyntaxKind.Assign;[=];
  62370. - SyntaxKind.Whitespace;[ ];
  62371. - SyntaxKind.Keyword;[true];
  62372. - SyntaxKind.Semicolon;[;];
  62373. - SyntaxKind.NewLine;[LF];
  62374. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (177:14,0) - Tokens:1
  62375. - SyntaxKind.RightBrace;[}];
  62376. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (178:14,1) - Tokens:1
  62377. - SyntaxKind.NewLine;[LF];
  62378. - Statement block - Gen<None> - 36 - (180:15,0)
  62379. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (180:15,0) - Tokens:1
  62380. - SyntaxKind.Transition;[@];
  62381. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (181:15,1) - Tokens:1
  62382. - SyntaxKind.LeftBrace;[{];
  62383. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (182:15,2) - Tokens:1
  62384. - SyntaxKind.NewLine;[LF];
  62385. - Markup block - Gen<None> - 16 - (184:16,0)
  62386. - Tag block - Gen<None> - 7 - (184:16,0)
  62387. - Markup span - Gen<Markup> - [<embed>] - SpanEditHandler;Accepts:None - (184:16,0) - Tokens:3
  62388. - SyntaxKind.OpenAngle;[<];
  62389. - SyntaxKind.Text;[embed];
  62390. - SyntaxKind.CloseAngle;[>];
  62391. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (191:16,7) - Tokens:1
  62392. - SyntaxKind.Whitespace;[ ];
  62393. - Tag block - Gen<None> - 8 - (192:16,8)
  62394. - Markup span - Gen<Markup> - [</embed>] - SpanEditHandler;Accepts:None - (192:16,8) - Tokens:4
  62395. - SyntaxKind.OpenAngle;[<];
  62396. - SyntaxKind.ForwardSlash;[/];
  62397. - SyntaxKind.Text;[embed];
  62398. - SyntaxKind.CloseAngle;[>];
  62399. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (200:16,16) - Tokens:9
  62400. - SyntaxKind.Identifier;[var];
  62401. - SyntaxKind.Whitespace;[ ];
  62402. - SyntaxKind.Identifier;[x];
  62403. - SyntaxKind.Whitespace;[ ];
  62404. - SyntaxKind.Assign;[=];
  62405. - SyntaxKind.Whitespace;[ ];
  62406. - SyntaxKind.Keyword;[true];
  62407. - SyntaxKind.Semicolon;[;];
  62408. - SyntaxKind.NewLine;[LF];
  62409. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (215:17,0) - Tokens:1
  62410. - SyntaxKind.RightBrace;[}];
  62411. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (216:17,1) - Tokens:1
  62412. - SyntaxKind.NewLine;[LF];
  62413. - Statement block - Gen<None> - 30 - (218:18,0)
  62414. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (218:18,0) - Tokens:1
  62415. - SyntaxKind.Transition;[@];
  62416. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (219:18,1) - Tokens:1
  62417. - SyntaxKind.LeftBrace;[{];
  62418. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (220:18,2) - Tokens:1
  62419. - SyntaxKind.NewLine;[LF];
  62420. - Markup block - Gen<None> - 10 - (222:19,0)
  62421. - Tag block - Gen<None> - 4 - (222:19,0)
  62422. - Markup span - Gen<Markup> - [<hr>] - SpanEditHandler;Accepts:None - (222:19,0) - Tokens:3
  62423. - SyntaxKind.OpenAngle;[<];
  62424. - SyntaxKind.Text;[hr];
  62425. - SyntaxKind.CloseAngle;[>];
  62426. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (226:19,4) - Tokens:1
  62427. - SyntaxKind.Whitespace;[ ];
  62428. - Tag block - Gen<None> - 5 - (227:19,5)
  62429. - Markup span - Gen<Markup> - [</hr>] - SpanEditHandler;Accepts:None - (227:19,5) - Tokens:4
  62430. - SyntaxKind.OpenAngle;[<];
  62431. - SyntaxKind.ForwardSlash;[/];
  62432. - SyntaxKind.Text;[hr];
  62433. - SyntaxKind.CloseAngle;[>];
  62434. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (232:19,10) - Tokens:9
  62435. - SyntaxKind.Identifier;[var];
  62436. - SyntaxKind.Whitespace;[ ];
  62437. - SyntaxKind.Identifier;[x];
  62438. - SyntaxKind.Whitespace;[ ];
  62439. - SyntaxKind.Assign;[=];
  62440. - SyntaxKind.Whitespace;[ ];
  62441. - SyntaxKind.Keyword;[true];
  62442. - SyntaxKind.Semicolon;[;];
  62443. - SyntaxKind.NewLine;[LF];
  62444. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (247:20,0) - Tokens:1
  62445. - SyntaxKind.RightBrace;[}];
  62446. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (248:20,1) - Tokens:1
  62447. - SyntaxKind.NewLine;[LF];
  62448. - Statement block - Gen<None> - 32 - (250:21,0)
  62449. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (250:21,0) - Tokens:1
  62450. - SyntaxKind.Transition;[@];
  62451. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (251:21,1) - Tokens:1
  62452. - SyntaxKind.LeftBrace;[{];
  62453. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (252:21,2) - Tokens:1
  62454. - SyntaxKind.NewLine;[LF];
  62455. - Markup block - Gen<None> - 12 - (254:22,0)
  62456. - Tag block - Gen<None> - 5 - (254:22,0)
  62457. - Markup span - Gen<Markup> - [<img>] - SpanEditHandler;Accepts:None - (254:22,0) - Tokens:3
  62458. - SyntaxKind.OpenAngle;[<];
  62459. - SyntaxKind.Text;[img];
  62460. - SyntaxKind.CloseAngle;[>];
  62461. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (259:22,5) - Tokens:1
  62462. - SyntaxKind.Whitespace;[ ];
  62463. - Tag block - Gen<None> - 6 - (260:22,6)
  62464. - Markup span - Gen<Markup> - [</img>] - SpanEditHandler;Accepts:None - (260:22,6) - Tokens:4
  62465. - SyntaxKind.OpenAngle;[<];
  62466. - SyntaxKind.ForwardSlash;[/];
  62467. - SyntaxKind.Text;[img];
  62468. - SyntaxKind.CloseAngle;[>];
  62469. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (266:22,12) - Tokens:9
  62470. - SyntaxKind.Identifier;[var];
  62471. - SyntaxKind.Whitespace;[ ];
  62472. - SyntaxKind.Identifier;[x];
  62473. - SyntaxKind.Whitespace;[ ];
  62474. - SyntaxKind.Assign;[=];
  62475. - SyntaxKind.Whitespace;[ ];
  62476. - SyntaxKind.Keyword;[true];
  62477. - SyntaxKind.Semicolon;[;];
  62478. - SyntaxKind.NewLine;[LF];
  62479. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (281:23,0) - Tokens:1
  62480. - SyntaxKind.RightBrace;[}];
  62481. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (282:23,1) - Tokens:1
  62482. - SyntaxKind.NewLine;[LF];
  62483. - Statement block - Gen<None> - 36 - (284:24,0)
  62484. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (284:24,0) - Tokens:1
  62485. - SyntaxKind.Transition;[@];
  62486. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (285:24,1) - Tokens:1
  62487. - SyntaxKind.LeftBrace;[{];
  62488. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (286:24,2) - Tokens:1
  62489. - SyntaxKind.NewLine;[LF];
  62490. - Markup block - Gen<None> - 16 - (288:25,0)
  62491. - Tag block - Gen<None> - 7 - (288:25,0)
  62492. - Markup span - Gen<Markup> - [<input>] - SpanEditHandler;Accepts:None - (288:25,0) - Tokens:3
  62493. - SyntaxKind.OpenAngle;[<];
  62494. - SyntaxKind.Text;[input];
  62495. - SyntaxKind.CloseAngle;[>];
  62496. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (295:25,7) - Tokens:1
  62497. - SyntaxKind.Whitespace;[ ];
  62498. - Tag block - Gen<None> - 8 - (296:25,8)
  62499. - Markup span - Gen<Markup> - [</input>] - SpanEditHandler;Accepts:None - (296:25,8) - Tokens:4
  62500. - SyntaxKind.OpenAngle;[<];
  62501. - SyntaxKind.ForwardSlash;[/];
  62502. - SyntaxKind.Text;[input];
  62503. - SyntaxKind.CloseAngle;[>];
  62504. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (304:25,16) - Tokens:9
  62505. - SyntaxKind.Identifier;[var];
  62506. - SyntaxKind.Whitespace;[ ];
  62507. - SyntaxKind.Identifier;[x];
  62508. - SyntaxKind.Whitespace;[ ];
  62509. - SyntaxKind.Assign;[=];
  62510. - SyntaxKind.Whitespace;[ ];
  62511. - SyntaxKind.Keyword;[true];
  62512. - SyntaxKind.Semicolon;[;];
  62513. - SyntaxKind.NewLine;[LF];
  62514. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (319:26,0) - Tokens:1
  62515. - SyntaxKind.RightBrace;[}];
  62516. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (320:26,1) - Tokens:1
  62517. - SyntaxKind.NewLine;[LF];
  62518. - Statement block - Gen<None> - 38 - (322:27,0)
  62519. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (322:27,0) - Tokens:1
  62520. - SyntaxKind.Transition;[@];
  62521. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (323:27,1) - Tokens:1
  62522. - SyntaxKind.LeftBrace;[{];
  62523. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (324:27,2) - Tokens:1
  62524. - SyntaxKind.NewLine;[LF];
  62525. - Markup block - Gen<None> - 18 - (326:28,0)
  62526. - Tag block - Gen<None> - 8 - (326:28,0)
  62527. - Markup span - Gen<Markup> - [<keygen>] - SpanEditHandler;Accepts:None - (326:28,0) - Tokens:3
  62528. - SyntaxKind.OpenAngle;[<];
  62529. - SyntaxKind.Text;[keygen];
  62530. - SyntaxKind.CloseAngle;[>];
  62531. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (334:28,8) - Tokens:1
  62532. - SyntaxKind.Whitespace;[ ];
  62533. - Tag block - Gen<None> - 9 - (335:28,9)
  62534. - Markup span - Gen<Markup> - [</keygen>] - SpanEditHandler;Accepts:None - (335:28,9) - Tokens:4
  62535. - SyntaxKind.OpenAngle;[<];
  62536. - SyntaxKind.ForwardSlash;[/];
  62537. - SyntaxKind.Text;[keygen];
  62538. - SyntaxKind.CloseAngle;[>];
  62539. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (344:28,18) - Tokens:9
  62540. - SyntaxKind.Identifier;[var];
  62541. - SyntaxKind.Whitespace;[ ];
  62542. - SyntaxKind.Identifier;[x];
  62543. - SyntaxKind.Whitespace;[ ];
  62544. - SyntaxKind.Assign;[=];
  62545. - SyntaxKind.Whitespace;[ ];
  62546. - SyntaxKind.Keyword;[true];
  62547. - SyntaxKind.Semicolon;[;];
  62548. - SyntaxKind.NewLine;[LF];
  62549. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (359:29,0) - Tokens:1
  62550. - SyntaxKind.RightBrace;[}];
  62551. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (360:29,1) - Tokens:1
  62552. - SyntaxKind.NewLine;[LF];
  62553. - Statement block - Gen<None> - 34 - (362:30,0)
  62554. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (362:30,0) - Tokens:1
  62555. - SyntaxKind.Transition;[@];
  62556. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (363:30,1) - Tokens:1
  62557. - SyntaxKind.LeftBrace;[{];
  62558. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (364:30,2) - Tokens:1
  62559. - SyntaxKind.NewLine;[LF];
  62560. - Markup block - Gen<None> - 14 - (366:31,0)
  62561. - Tag block - Gen<None> - 6 - (366:31,0)
  62562. - Markup span - Gen<Markup> - [<link>] - SpanEditHandler;Accepts:None - (366:31,0) - Tokens:3
  62563. - SyntaxKind.OpenAngle;[<];
  62564. - SyntaxKind.Text;[link];
  62565. - SyntaxKind.CloseAngle;[>];
  62566. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (372:31,6) - Tokens:1
  62567. - SyntaxKind.Whitespace;[ ];
  62568. - Tag block - Gen<None> - 7 - (373:31,7)
  62569. - Markup span - Gen<Markup> - [</link>] - SpanEditHandler;Accepts:None - (373:31,7) - Tokens:4
  62570. - SyntaxKind.OpenAngle;[<];
  62571. - SyntaxKind.ForwardSlash;[/];
  62572. - SyntaxKind.Text;[link];
  62573. - SyntaxKind.CloseAngle;[>];
  62574. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (380:31,14) - Tokens:9
  62575. - SyntaxKind.Identifier;[var];
  62576. - SyntaxKind.Whitespace;[ ];
  62577. - SyntaxKind.Identifier;[x];
  62578. - SyntaxKind.Whitespace;[ ];
  62579. - SyntaxKind.Assign;[=];
  62580. - SyntaxKind.Whitespace;[ ];
  62581. - SyntaxKind.Keyword;[true];
  62582. - SyntaxKind.Semicolon;[;];
  62583. - SyntaxKind.NewLine;[LF];
  62584. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (395:32,0) - Tokens:1
  62585. - SyntaxKind.RightBrace;[}];
  62586. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (396:32,1) - Tokens:1
  62587. - SyntaxKind.NewLine;[LF];
  62588. - Statement block - Gen<None> - 34 - (398:33,0)
  62589. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (398:33,0) - Tokens:1
  62590. - SyntaxKind.Transition;[@];
  62591. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (399:33,1) - Tokens:1
  62592. - SyntaxKind.LeftBrace;[{];
  62593. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (400:33,2) - Tokens:1
  62594. - SyntaxKind.NewLine;[LF];
  62595. - Markup block - Gen<None> - 14 - (402:34,0)
  62596. - Tag block - Gen<None> - 6 - (402:34,0)
  62597. - Markup span - Gen<Markup> - [<meta>] - SpanEditHandler;Accepts:None - (402:34,0) - Tokens:3
  62598. - SyntaxKind.OpenAngle;[<];
  62599. - SyntaxKind.Text;[meta];
  62600. - SyntaxKind.CloseAngle;[>];
  62601. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (408:34,6) - Tokens:1
  62602. - SyntaxKind.Whitespace;[ ];
  62603. - Tag block - Gen<None> - 7 - (409:34,7)
  62604. - Markup span - Gen<Markup> - [</meta>] - SpanEditHandler;Accepts:None - (409:34,7) - Tokens:4
  62605. - SyntaxKind.OpenAngle;[<];
  62606. - SyntaxKind.ForwardSlash;[/];
  62607. - SyntaxKind.Text;[meta];
  62608. - SyntaxKind.CloseAngle;[>];
  62609. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (416:34,14) - Tokens:9
  62610. - SyntaxKind.Identifier;[var];
  62611. - SyntaxKind.Whitespace;[ ];
  62612. - SyntaxKind.Identifier;[x];
  62613. - SyntaxKind.Whitespace;[ ];
  62614. - SyntaxKind.Assign;[=];
  62615. - SyntaxKind.Whitespace;[ ];
  62616. - SyntaxKind.Keyword;[true];
  62617. - SyntaxKind.Semicolon;[;];
  62618. - SyntaxKind.NewLine;[LF];
  62619. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (431:35,0) - Tokens:1
  62620. - SyntaxKind.RightBrace;[}];
  62621. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (432:35,1) - Tokens:1
  62622. - SyntaxKind.NewLine;[LF];
  62623. - Statement block - Gen<None> - 36 - (434:36,0)
  62624. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (434:36,0) - Tokens:1
  62625. - SyntaxKind.Transition;[@];
  62626. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (435:36,1) - Tokens:1
  62627. - SyntaxKind.LeftBrace;[{];
  62628. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (436:36,2) - Tokens:1
  62629. - SyntaxKind.NewLine;[LF];
  62630. - Markup block - Gen<None> - 16 - (438:37,0)
  62631. - Tag block - Gen<None> - 7 - (438:37,0)
  62632. - Markup span - Gen<Markup> - [<param>] - SpanEditHandler;Accepts:None - (438:37,0) - Tokens:3
  62633. - SyntaxKind.OpenAngle;[<];
  62634. - SyntaxKind.Text;[param];
  62635. - SyntaxKind.CloseAngle;[>];
  62636. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (445:37,7) - Tokens:1
  62637. - SyntaxKind.Whitespace;[ ];
  62638. - Tag block - Gen<None> - 8 - (446:37,8)
  62639. - Markup span - Gen<Markup> - [</param>] - SpanEditHandler;Accepts:None - (446:37,8) - Tokens:4
  62640. - SyntaxKind.OpenAngle;[<];
  62641. - SyntaxKind.ForwardSlash;[/];
  62642. - SyntaxKind.Text;[param];
  62643. - SyntaxKind.CloseAngle;[>];
  62644. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (454:37,16) - Tokens:9
  62645. - SyntaxKind.Identifier;[var];
  62646. - SyntaxKind.Whitespace;[ ];
  62647. - SyntaxKind.Identifier;[x];
  62648. - SyntaxKind.Whitespace;[ ];
  62649. - SyntaxKind.Assign;[=];
  62650. - SyntaxKind.Whitespace;[ ];
  62651. - SyntaxKind.Keyword;[true];
  62652. - SyntaxKind.Semicolon;[;];
  62653. - SyntaxKind.NewLine;[LF];
  62654. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (469:38,0) - Tokens:1
  62655. - SyntaxKind.RightBrace;[}];
  62656. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (470:38,1) - Tokens:1
  62657. - SyntaxKind.NewLine;[LF];
  62658. - Statement block - Gen<None> - 38 - (472:39,0)
  62659. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (472:39,0) - Tokens:1
  62660. - SyntaxKind.Transition;[@];
  62661. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (473:39,1) - Tokens:1
  62662. - SyntaxKind.LeftBrace;[{];
  62663. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (474:39,2) - Tokens:1
  62664. - SyntaxKind.NewLine;[LF];
  62665. - Markup block - Gen<None> - 18 - (476:40,0)
  62666. - Tag block - Gen<None> - 8 - (476:40,0)
  62667. - Markup span - Gen<Markup> - [<source>] - SpanEditHandler;Accepts:None - (476:40,0) - Tokens:3
  62668. - SyntaxKind.OpenAngle;[<];
  62669. - SyntaxKind.Text;[source];
  62670. - SyntaxKind.CloseAngle;[>];
  62671. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (484:40,8) - Tokens:1
  62672. - SyntaxKind.Whitespace;[ ];
  62673. - Tag block - Gen<None> - 9 - (485:40,9)
  62674. - Markup span - Gen<Markup> - [</source>] - SpanEditHandler;Accepts:None - (485:40,9) - Tokens:4
  62675. - SyntaxKind.OpenAngle;[<];
  62676. - SyntaxKind.ForwardSlash;[/];
  62677. - SyntaxKind.Text;[source];
  62678. - SyntaxKind.CloseAngle;[>];
  62679. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (494:40,18) - Tokens:9
  62680. - SyntaxKind.Identifier;[var];
  62681. - SyntaxKind.Whitespace;[ ];
  62682. - SyntaxKind.Identifier;[x];
  62683. - SyntaxKind.Whitespace;[ ];
  62684. - SyntaxKind.Assign;[=];
  62685. - SyntaxKind.Whitespace;[ ];
  62686. - SyntaxKind.Keyword;[true];
  62687. - SyntaxKind.Semicolon;[;];
  62688. - SyntaxKind.NewLine;[LF];
  62689. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (509:41,0) - Tokens:1
  62690. - SyntaxKind.RightBrace;[}];
  62691. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (510:41,1) - Tokens:1
  62692. - SyntaxKind.NewLine;[LF];
  62693. - Statement block - Gen<None> - 36 - (512:42,0)
  62694. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (512:42,0) - Tokens:1
  62695. - SyntaxKind.Transition;[@];
  62696. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (513:42,1) - Tokens:1
  62697. - SyntaxKind.LeftBrace;[{];
  62698. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (514:42,2) - Tokens:1
  62699. - SyntaxKind.NewLine;[LF];
  62700. - Markup block - Gen<None> - 16 - (516:43,0)
  62701. - Tag block - Gen<None> - 7 - (516:43,0)
  62702. - Markup span - Gen<Markup> - [<track>] - SpanEditHandler;Accepts:None - (516:43,0) - Tokens:3
  62703. - SyntaxKind.OpenAngle;[<];
  62704. - SyntaxKind.Text;[track];
  62705. - SyntaxKind.CloseAngle;[>];
  62706. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (523:43,7) - Tokens:1
  62707. - SyntaxKind.Whitespace;[ ];
  62708. - Tag block - Gen<None> - 8 - (524:43,8)
  62709. - Markup span - Gen<Markup> - [</track>] - SpanEditHandler;Accepts:None - (524:43,8) - Tokens:4
  62710. - SyntaxKind.OpenAngle;[<];
  62711. - SyntaxKind.ForwardSlash;[/];
  62712. - SyntaxKind.Text;[track];
  62713. - SyntaxKind.CloseAngle;[>];
  62714. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (532:43,16) - Tokens:9
  62715. - SyntaxKind.Identifier;[var];
  62716. - SyntaxKind.Whitespace;[ ];
  62717. - SyntaxKind.Identifier;[x];
  62718. - SyntaxKind.Whitespace;[ ];
  62719. - SyntaxKind.Assign;[=];
  62720. - SyntaxKind.Whitespace;[ ];
  62721. - SyntaxKind.Keyword;[true];
  62722. - SyntaxKind.Semicolon;[;];
  62723. - SyntaxKind.NewLine;[LF];
  62724. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (547:44,0) - Tokens:1
  62725. - SyntaxKind.RightBrace;[}];
  62726. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (548:44,1) - Tokens:1
  62727. - SyntaxKind.NewLine;[LF];
  62728. - Statement block - Gen<None> - 32 - (550:45,0)
  62729. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (550:45,0) - Tokens:1
  62730. - SyntaxKind.Transition;[@];
  62731. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (551:45,1) - Tokens:1
  62732. - SyntaxKind.LeftBrace;[{];
  62733. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (552:45,2) - Tokens:1
  62734. - SyntaxKind.NewLine;[LF];
  62735. - Markup block - Gen<None> - 12 - (554:46,0)
  62736. - Tag block - Gen<None> - 5 - (554:46,0)
  62737. - Markup span - Gen<Markup> - [<wbr>] - SpanEditHandler;Accepts:None - (554:46,0) - Tokens:3
  62738. - SyntaxKind.OpenAngle;[<];
  62739. - SyntaxKind.Text;[wbr];
  62740. - SyntaxKind.CloseAngle;[>];
  62741. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (559:46,5) - Tokens:1
  62742. - SyntaxKind.Whitespace;[ ];
  62743. - Tag block - Gen<None> - 6 - (560:46,6)
  62744. - Markup span - Gen<Markup> - [</wbr>] - SpanEditHandler;Accepts:None - (560:46,6) - Tokens:4
  62745. - SyntaxKind.OpenAngle;[<];
  62746. - SyntaxKind.ForwardSlash;[/];
  62747. - SyntaxKind.Text;[wbr];
  62748. - SyntaxKind.CloseAngle;[>];
  62749. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (566:46,12) - Tokens:9
  62750. - SyntaxKind.Identifier;[var];
  62751. - SyntaxKind.Whitespace;[ ];
  62752. - SyntaxKind.Identifier;[x];
  62753. - SyntaxKind.Whitespace;[ ];
  62754. - SyntaxKind.Assign;[=];
  62755. - SyntaxKind.Whitespace;[ ];
  62756. - SyntaxKind.Keyword;[true];
  62757. - SyntaxKind.Semicolon;[;];
  62758. - SyntaxKind.NewLine;[LF];
  62759. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (581:47,0) - Tokens:1
  62760. - SyntaxKind.RightBrace;[}];
  62761. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (582:47,1) - Tokens:1
  62762. - SyntaxKind.NewLine;[LF];
  62763. +RazorDocument - [0..584)::584 - [@{LF<area> </area>var x = true;LF}LF@{LF<base> </base>var x = true;LF}LF@{LF<br> </br>var x = true;LF}LF@{LF<col> </col>var x = true;LF}LF@{LF<command> </command>var x = true;LF}LF@{LF<embed> </embed>var x = true;LF}LF@{LF<hr> </hr>var x = true;LF}LF@{LF<img> </img>var x = true;LF}LF@{LF<input> </input>var x = true;LF}LF@{LF<keygen> </keygen>var x = true;LF}LF@{LF<link> </link>var x = true;LF}LF@{LF<meta> </meta>var x = true;LF}LF@{LF<param> </param>var x = true;LF}LF@{LF<source> </source>var x = true;LF}LF@{LF<track> </track>var x = true;LF}LF@{LF<wbr> </wbr>var x = true;LF}LF]
  62764. + MarkupBlock - [0..584)::584
  62765. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  62766. + Marker;[];
  62767. + CSharpCodeBlock - [0..34)::34
  62768. + CSharpStatement - [0..34)::34
  62769. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  62770. + Transition;[@];
  62771. + CSharpStatementBody - [1..34)::33
  62772. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  62773. + LeftBrace;[{];
  62774. + CSharpCodeBlock - [2..33)::31
  62775. + CSharpStatementLiteral - [2..4)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  62776. + NewLine;[LF];
  62777. + MarkupBlock - [4..18)::14
  62778. + MarkupTagBlock - [4..10)::6 - [<area>]
  62779. + MarkupTextLiteral - [4..10)::6 - [<area>] - Gen<Markup> - SpanEditHandler;Accepts:None
  62780. + OpenAngle;[<];
  62781. + Text;[area];
  62782. + CloseAngle;[>];
  62783. + MarkupTextLiteral - [10..11)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  62784. + Whitespace;[ ];
  62785. + MarkupTagBlock - [11..18)::7 - [</area>]
  62786. + MarkupTextLiteral - [11..18)::7 - [</area>] - Gen<Markup> - SpanEditHandler;Accepts:None
  62787. + OpenAngle;[<];
  62788. + ForwardSlash;[/];
  62789. + Text;[area];
  62790. + CloseAngle;[>];
  62791. + CSharpStatementLiteral - [18..33)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  62792. + Identifier;[var];
  62793. + Whitespace;[ ];
  62794. + Identifier;[x];
  62795. + Whitespace;[ ];
  62796. + Assign;[=];
  62797. + Whitespace;[ ];
  62798. + Keyword;[true];
  62799. + Semicolon;[;];
  62800. + NewLine;[LF];
  62801. + RazorMetaCode - [33..34)::1 - Gen<None> - SpanEditHandler;Accepts:None
  62802. + RightBrace;[}];
  62803. + MarkupEphemeralTextLiteral - [34..36)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  62804. + NewLine;[LF];
  62805. + CSharpCodeBlock - [36..70)::34
  62806. + CSharpStatement - [36..70)::34
  62807. + CSharpTransition - [36..37)::1 - Gen<None> - SpanEditHandler;Accepts:None
  62808. + Transition;[@];
  62809. + CSharpStatementBody - [37..70)::33
  62810. + RazorMetaCode - [37..38)::1 - Gen<None> - SpanEditHandler;Accepts:None
  62811. + LeftBrace;[{];
  62812. + CSharpCodeBlock - [38..69)::31
  62813. + CSharpStatementLiteral - [38..40)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  62814. + NewLine;[LF];
  62815. + MarkupBlock - [40..54)::14
  62816. + MarkupTagBlock - [40..46)::6 - [<base>]
  62817. + MarkupTextLiteral - [40..46)::6 - [<base>] - Gen<Markup> - SpanEditHandler;Accepts:None
  62818. + OpenAngle;[<];
  62819. + Text;[base];
  62820. + CloseAngle;[>];
  62821. + MarkupTextLiteral - [46..47)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  62822. + Whitespace;[ ];
  62823. + MarkupTagBlock - [47..54)::7 - [</base>]
  62824. + MarkupTextLiteral - [47..54)::7 - [</base>] - Gen<Markup> - SpanEditHandler;Accepts:None
  62825. + OpenAngle;[<];
  62826. + ForwardSlash;[/];
  62827. + Text;[base];
  62828. + CloseAngle;[>];
  62829. + CSharpStatementLiteral - [54..69)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  62830. + Identifier;[var];
  62831. + Whitespace;[ ];
  62832. + Identifier;[x];
  62833. + Whitespace;[ ];
  62834. + Assign;[=];
  62835. + Whitespace;[ ];
  62836. + Keyword;[true];
  62837. + Semicolon;[;];
  62838. + NewLine;[LF];
  62839. + RazorMetaCode - [69..70)::1 - Gen<None> - SpanEditHandler;Accepts:None
  62840. + RightBrace;[}];
  62841. + MarkupEphemeralTextLiteral - [70..72)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  62842. + NewLine;[LF];
  62843. + CSharpCodeBlock - [72..102)::30
  62844. + CSharpStatement - [72..102)::30
  62845. + CSharpTransition - [72..73)::1 - Gen<None> - SpanEditHandler;Accepts:None
  62846. + Transition;[@];
  62847. + CSharpStatementBody - [73..102)::29
  62848. + RazorMetaCode - [73..74)::1 - Gen<None> - SpanEditHandler;Accepts:None
  62849. + LeftBrace;[{];
  62850. + CSharpCodeBlock - [74..101)::27
  62851. + CSharpStatementLiteral - [74..76)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  62852. + NewLine;[LF];
  62853. + MarkupBlock - [76..86)::10
  62854. + MarkupTagBlock - [76..80)::4 - [<br>]
  62855. + MarkupTextLiteral - [76..80)::4 - [<br>] - Gen<Markup> - SpanEditHandler;Accepts:None
  62856. + OpenAngle;[<];
  62857. + Text;[br];
  62858. + CloseAngle;[>];
  62859. + MarkupTextLiteral - [80..81)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  62860. + Whitespace;[ ];
  62861. + MarkupTagBlock - [81..86)::5 - [</br>]
  62862. + MarkupTextLiteral - [81..86)::5 - [</br>] - Gen<Markup> - SpanEditHandler;Accepts:None
  62863. + OpenAngle;[<];
  62864. + ForwardSlash;[/];
  62865. + Text;[br];
  62866. + CloseAngle;[>];
  62867. + CSharpStatementLiteral - [86..101)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  62868. + Identifier;[var];
  62869. + Whitespace;[ ];
  62870. + Identifier;[x];
  62871. + Whitespace;[ ];
  62872. + Assign;[=];
  62873. + Whitespace;[ ];
  62874. + Keyword;[true];
  62875. + Semicolon;[;];
  62876. + NewLine;[LF];
  62877. + RazorMetaCode - [101..102)::1 - Gen<None> - SpanEditHandler;Accepts:None
  62878. + RightBrace;[}];
  62879. + MarkupEphemeralTextLiteral - [102..104)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  62880. + NewLine;[LF];
  62881. + CSharpCodeBlock - [104..136)::32
  62882. + CSharpStatement - [104..136)::32
  62883. + CSharpTransition - [104..105)::1 - Gen<None> - SpanEditHandler;Accepts:None
  62884. + Transition;[@];
  62885. + CSharpStatementBody - [105..136)::31
  62886. + RazorMetaCode - [105..106)::1 - Gen<None> - SpanEditHandler;Accepts:None
  62887. + LeftBrace;[{];
  62888. + CSharpCodeBlock - [106..135)::29
  62889. + CSharpStatementLiteral - [106..108)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  62890. + NewLine;[LF];
  62891. + MarkupBlock - [108..120)::12
  62892. + MarkupTagBlock - [108..113)::5 - [<col>]
  62893. + MarkupTextLiteral - [108..113)::5 - [<col>] - Gen<Markup> - SpanEditHandler;Accepts:None
  62894. + OpenAngle;[<];
  62895. + Text;[col];
  62896. + CloseAngle;[>];
  62897. + MarkupTextLiteral - [113..114)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  62898. + Whitespace;[ ];
  62899. + MarkupTagBlock - [114..120)::6 - [</col>]
  62900. + MarkupTextLiteral - [114..120)::6 - [</col>] - Gen<Markup> - SpanEditHandler;Accepts:None
  62901. + OpenAngle;[<];
  62902. + ForwardSlash;[/];
  62903. + Text;[col];
  62904. + CloseAngle;[>];
  62905. + CSharpStatementLiteral - [120..135)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  62906. + Identifier;[var];
  62907. + Whitespace;[ ];
  62908. + Identifier;[x];
  62909. + Whitespace;[ ];
  62910. + Assign;[=];
  62911. + Whitespace;[ ];
  62912. + Keyword;[true];
  62913. + Semicolon;[;];
  62914. + NewLine;[LF];
  62915. + RazorMetaCode - [135..136)::1 - Gen<None> - SpanEditHandler;Accepts:None
  62916. + RightBrace;[}];
  62917. + MarkupEphemeralTextLiteral - [136..138)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  62918. + NewLine;[LF];
  62919. + CSharpCodeBlock - [138..178)::40
  62920. + CSharpStatement - [138..178)::40
  62921. + CSharpTransition - [138..139)::1 - Gen<None> - SpanEditHandler;Accepts:None
  62922. + Transition;[@];
  62923. + CSharpStatementBody - [139..178)::39
  62924. + RazorMetaCode - [139..140)::1 - Gen<None> - SpanEditHandler;Accepts:None
  62925. + LeftBrace;[{];
  62926. + CSharpCodeBlock - [140..177)::37
  62927. + CSharpStatementLiteral - [140..142)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  62928. + NewLine;[LF];
  62929. + MarkupBlock - [142..162)::20
  62930. + MarkupTagBlock - [142..151)::9 - [<command>]
  62931. + MarkupTextLiteral - [142..151)::9 - [<command>] - Gen<Markup> - SpanEditHandler;Accepts:None
  62932. + OpenAngle;[<];
  62933. + Text;[command];
  62934. + CloseAngle;[>];
  62935. + MarkupTextLiteral - [151..152)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  62936. + Whitespace;[ ];
  62937. + MarkupTagBlock - [152..162)::10 - [</command>]
  62938. + MarkupTextLiteral - [152..162)::10 - [</command>] - Gen<Markup> - SpanEditHandler;Accepts:None
  62939. + OpenAngle;[<];
  62940. + ForwardSlash;[/];
  62941. + Text;[command];
  62942. + CloseAngle;[>];
  62943. + CSharpStatementLiteral - [162..177)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  62944. + Identifier;[var];
  62945. + Whitespace;[ ];
  62946. + Identifier;[x];
  62947. + Whitespace;[ ];
  62948. + Assign;[=];
  62949. + Whitespace;[ ];
  62950. + Keyword;[true];
  62951. + Semicolon;[;];
  62952. + NewLine;[LF];
  62953. + RazorMetaCode - [177..178)::1 - Gen<None> - SpanEditHandler;Accepts:None
  62954. + RightBrace;[}];
  62955. + MarkupEphemeralTextLiteral - [178..180)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  62956. + NewLine;[LF];
  62957. + CSharpCodeBlock - [180..216)::36
  62958. + CSharpStatement - [180..216)::36
  62959. + CSharpTransition - [180..181)::1 - Gen<None> - SpanEditHandler;Accepts:None
  62960. + Transition;[@];
  62961. + CSharpStatementBody - [181..216)::35
  62962. + RazorMetaCode - [181..182)::1 - Gen<None> - SpanEditHandler;Accepts:None
  62963. + LeftBrace;[{];
  62964. + CSharpCodeBlock - [182..215)::33
  62965. + CSharpStatementLiteral - [182..184)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  62966. + NewLine;[LF];
  62967. + MarkupBlock - [184..200)::16
  62968. + MarkupTagBlock - [184..191)::7 - [<embed>]
  62969. + MarkupTextLiteral - [184..191)::7 - [<embed>] - Gen<Markup> - SpanEditHandler;Accepts:None
  62970. + OpenAngle;[<];
  62971. + Text;[embed];
  62972. + CloseAngle;[>];
  62973. + MarkupTextLiteral - [191..192)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  62974. + Whitespace;[ ];
  62975. + MarkupTagBlock - [192..200)::8 - [</embed>]
  62976. + MarkupTextLiteral - [192..200)::8 - [</embed>] - Gen<Markup> - SpanEditHandler;Accepts:None
  62977. + OpenAngle;[<];
  62978. + ForwardSlash;[/];
  62979. + Text;[embed];
  62980. + CloseAngle;[>];
  62981. + CSharpStatementLiteral - [200..215)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  62982. + Identifier;[var];
  62983. + Whitespace;[ ];
  62984. + Identifier;[x];
  62985. + Whitespace;[ ];
  62986. + Assign;[=];
  62987. + Whitespace;[ ];
  62988. + Keyword;[true];
  62989. + Semicolon;[;];
  62990. + NewLine;[LF];
  62991. + RazorMetaCode - [215..216)::1 - Gen<None> - SpanEditHandler;Accepts:None
  62992. + RightBrace;[}];
  62993. + MarkupEphemeralTextLiteral - [216..218)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  62994. + NewLine;[LF];
  62995. + CSharpCodeBlock - [218..248)::30
  62996. + CSharpStatement - [218..248)::30
  62997. + CSharpTransition - [218..219)::1 - Gen<None> - SpanEditHandler;Accepts:None
  62998. + Transition;[@];
  62999. + CSharpStatementBody - [219..248)::29
  63000. + RazorMetaCode - [219..220)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63001. + LeftBrace;[{];
  63002. + CSharpCodeBlock - [220..247)::27
  63003. + CSharpStatementLiteral - [220..222)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  63004. + NewLine;[LF];
  63005. + MarkupBlock - [222..232)::10
  63006. + MarkupTagBlock - [222..226)::4 - [<hr>]
  63007. + MarkupTextLiteral - [222..226)::4 - [<hr>] - Gen<Markup> - SpanEditHandler;Accepts:None
  63008. + OpenAngle;[<];
  63009. + Text;[hr];
  63010. + CloseAngle;[>];
  63011. + MarkupTextLiteral - [226..227)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  63012. + Whitespace;[ ];
  63013. + MarkupTagBlock - [227..232)::5 - [</hr>]
  63014. + MarkupTextLiteral - [227..232)::5 - [</hr>] - Gen<Markup> - SpanEditHandler;Accepts:None
  63015. + OpenAngle;[<];
  63016. + ForwardSlash;[/];
  63017. + Text;[hr];
  63018. + CloseAngle;[>];
  63019. + CSharpStatementLiteral - [232..247)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  63020. + Identifier;[var];
  63021. + Whitespace;[ ];
  63022. + Identifier;[x];
  63023. + Whitespace;[ ];
  63024. + Assign;[=];
  63025. + Whitespace;[ ];
  63026. + Keyword;[true];
  63027. + Semicolon;[;];
  63028. + NewLine;[LF];
  63029. + RazorMetaCode - [247..248)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63030. + RightBrace;[}];
  63031. + MarkupEphemeralTextLiteral - [248..250)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  63032. + NewLine;[LF];
  63033. + CSharpCodeBlock - [250..282)::32
  63034. + CSharpStatement - [250..282)::32
  63035. + CSharpTransition - [250..251)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63036. + Transition;[@];
  63037. + CSharpStatementBody - [251..282)::31
  63038. + RazorMetaCode - [251..252)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63039. + LeftBrace;[{];
  63040. + CSharpCodeBlock - [252..281)::29
  63041. + CSharpStatementLiteral - [252..254)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  63042. + NewLine;[LF];
  63043. + MarkupBlock - [254..266)::12
  63044. + MarkupTagBlock - [254..259)::5 - [<img>]
  63045. + MarkupTextLiteral - [254..259)::5 - [<img>] - Gen<Markup> - SpanEditHandler;Accepts:None
  63046. + OpenAngle;[<];
  63047. + Text;[img];
  63048. + CloseAngle;[>];
  63049. + MarkupTextLiteral - [259..260)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  63050. + Whitespace;[ ];
  63051. + MarkupTagBlock - [260..266)::6 - [</img>]
  63052. + MarkupTextLiteral - [260..266)::6 - [</img>] - Gen<Markup> - SpanEditHandler;Accepts:None
  63053. + OpenAngle;[<];
  63054. + ForwardSlash;[/];
  63055. + Text;[img];
  63056. + CloseAngle;[>];
  63057. + CSharpStatementLiteral - [266..281)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  63058. + Identifier;[var];
  63059. + Whitespace;[ ];
  63060. + Identifier;[x];
  63061. + Whitespace;[ ];
  63062. + Assign;[=];
  63063. + Whitespace;[ ];
  63064. + Keyword;[true];
  63065. + Semicolon;[;];
  63066. + NewLine;[LF];
  63067. + RazorMetaCode - [281..282)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63068. + RightBrace;[}];
  63069. + MarkupEphemeralTextLiteral - [282..284)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  63070. + NewLine;[LF];
  63071. + CSharpCodeBlock - [284..320)::36
  63072. + CSharpStatement - [284..320)::36
  63073. + CSharpTransition - [284..285)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63074. + Transition;[@];
  63075. + CSharpStatementBody - [285..320)::35
  63076. + RazorMetaCode - [285..286)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63077. + LeftBrace;[{];
  63078. + CSharpCodeBlock - [286..319)::33
  63079. + CSharpStatementLiteral - [286..288)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  63080. + NewLine;[LF];
  63081. + MarkupBlock - [288..304)::16
  63082. + MarkupTagBlock - [288..295)::7 - [<input>]
  63083. + MarkupTextLiteral - [288..295)::7 - [<input>] - Gen<Markup> - SpanEditHandler;Accepts:None
  63084. + OpenAngle;[<];
  63085. + Text;[input];
  63086. + CloseAngle;[>];
  63087. + MarkupTextLiteral - [295..296)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  63088. + Whitespace;[ ];
  63089. + MarkupTagBlock - [296..304)::8 - [</input>]
  63090. + MarkupTextLiteral - [296..304)::8 - [</input>] - Gen<Markup> - SpanEditHandler;Accepts:None
  63091. + OpenAngle;[<];
  63092. + ForwardSlash;[/];
  63093. + Text;[input];
  63094. + CloseAngle;[>];
  63095. + CSharpStatementLiteral - [304..319)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  63096. + Identifier;[var];
  63097. + Whitespace;[ ];
  63098. + Identifier;[x];
  63099. + Whitespace;[ ];
  63100. + Assign;[=];
  63101. + Whitespace;[ ];
  63102. + Keyword;[true];
  63103. + Semicolon;[;];
  63104. + NewLine;[LF];
  63105. + RazorMetaCode - [319..320)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63106. + RightBrace;[}];
  63107. + MarkupEphemeralTextLiteral - [320..322)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  63108. + NewLine;[LF];
  63109. + CSharpCodeBlock - [322..360)::38
  63110. + CSharpStatement - [322..360)::38
  63111. + CSharpTransition - [322..323)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63112. + Transition;[@];
  63113. + CSharpStatementBody - [323..360)::37
  63114. + RazorMetaCode - [323..324)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63115. + LeftBrace;[{];
  63116. + CSharpCodeBlock - [324..359)::35
  63117. + CSharpStatementLiteral - [324..326)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  63118. + NewLine;[LF];
  63119. + MarkupBlock - [326..344)::18
  63120. + MarkupTagBlock - [326..334)::8 - [<keygen>]
  63121. + MarkupTextLiteral - [326..334)::8 - [<keygen>] - Gen<Markup> - SpanEditHandler;Accepts:None
  63122. + OpenAngle;[<];
  63123. + Text;[keygen];
  63124. + CloseAngle;[>];
  63125. + MarkupTextLiteral - [334..335)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  63126. + Whitespace;[ ];
  63127. + MarkupTagBlock - [335..344)::9 - [</keygen>]
  63128. + MarkupTextLiteral - [335..344)::9 - [</keygen>] - Gen<Markup> - SpanEditHandler;Accepts:None
  63129. + OpenAngle;[<];
  63130. + ForwardSlash;[/];
  63131. + Text;[keygen];
  63132. + CloseAngle;[>];
  63133. + CSharpStatementLiteral - [344..359)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  63134. + Identifier;[var];
  63135. + Whitespace;[ ];
  63136. + Identifier;[x];
  63137. + Whitespace;[ ];
  63138. + Assign;[=];
  63139. + Whitespace;[ ];
  63140. + Keyword;[true];
  63141. + Semicolon;[;];
  63142. + NewLine;[LF];
  63143. + RazorMetaCode - [359..360)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63144. + RightBrace;[}];
  63145. + MarkupEphemeralTextLiteral - [360..362)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  63146. + NewLine;[LF];
  63147. + CSharpCodeBlock - [362..396)::34
  63148. + CSharpStatement - [362..396)::34
  63149. + CSharpTransition - [362..363)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63150. + Transition;[@];
  63151. + CSharpStatementBody - [363..396)::33
  63152. + RazorMetaCode - [363..364)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63153. + LeftBrace;[{];
  63154. + CSharpCodeBlock - [364..395)::31
  63155. + CSharpStatementLiteral - [364..366)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  63156. + NewLine;[LF];
  63157. + MarkupBlock - [366..380)::14
  63158. + MarkupTagBlock - [366..372)::6 - [<link>]
  63159. + MarkupTextLiteral - [366..372)::6 - [<link>] - Gen<Markup> - SpanEditHandler;Accepts:None
  63160. + OpenAngle;[<];
  63161. + Text;[link];
  63162. + CloseAngle;[>];
  63163. + MarkupTextLiteral - [372..373)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  63164. + Whitespace;[ ];
  63165. + MarkupTagBlock - [373..380)::7 - [</link>]
  63166. + MarkupTextLiteral - [373..380)::7 - [</link>] - Gen<Markup> - SpanEditHandler;Accepts:None
  63167. + OpenAngle;[<];
  63168. + ForwardSlash;[/];
  63169. + Text;[link];
  63170. + CloseAngle;[>];
  63171. + CSharpStatementLiteral - [380..395)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  63172. + Identifier;[var];
  63173. + Whitespace;[ ];
  63174. + Identifier;[x];
  63175. + Whitespace;[ ];
  63176. + Assign;[=];
  63177. + Whitespace;[ ];
  63178. + Keyword;[true];
  63179. + Semicolon;[;];
  63180. + NewLine;[LF];
  63181. + RazorMetaCode - [395..396)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63182. + RightBrace;[}];
  63183. + MarkupEphemeralTextLiteral - [396..398)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  63184. + NewLine;[LF];
  63185. + CSharpCodeBlock - [398..432)::34
  63186. + CSharpStatement - [398..432)::34
  63187. + CSharpTransition - [398..399)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63188. + Transition;[@];
  63189. + CSharpStatementBody - [399..432)::33
  63190. + RazorMetaCode - [399..400)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63191. + LeftBrace;[{];
  63192. + CSharpCodeBlock - [400..431)::31
  63193. + CSharpStatementLiteral - [400..402)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  63194. + NewLine;[LF];
  63195. + MarkupBlock - [402..416)::14
  63196. + MarkupTagBlock - [402..408)::6 - [<meta>]
  63197. + MarkupTextLiteral - [402..408)::6 - [<meta>] - Gen<Markup> - SpanEditHandler;Accepts:None
  63198. + OpenAngle;[<];
  63199. + Text;[meta];
  63200. + CloseAngle;[>];
  63201. + MarkupTextLiteral - [408..409)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  63202. + Whitespace;[ ];
  63203. + MarkupTagBlock - [409..416)::7 - [</meta>]
  63204. + MarkupTextLiteral - [409..416)::7 - [</meta>] - Gen<Markup> - SpanEditHandler;Accepts:None
  63205. + OpenAngle;[<];
  63206. + ForwardSlash;[/];
  63207. + Text;[meta];
  63208. + CloseAngle;[>];
  63209. + CSharpStatementLiteral - [416..431)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  63210. + Identifier;[var];
  63211. + Whitespace;[ ];
  63212. + Identifier;[x];
  63213. + Whitespace;[ ];
  63214. + Assign;[=];
  63215. + Whitespace;[ ];
  63216. + Keyword;[true];
  63217. + Semicolon;[;];
  63218. + NewLine;[LF];
  63219. + RazorMetaCode - [431..432)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63220. + RightBrace;[}];
  63221. + MarkupEphemeralTextLiteral - [432..434)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  63222. + NewLine;[LF];
  63223. + CSharpCodeBlock - [434..470)::36
  63224. + CSharpStatement - [434..470)::36
  63225. + CSharpTransition - [434..435)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63226. + Transition;[@];
  63227. + CSharpStatementBody - [435..470)::35
  63228. + RazorMetaCode - [435..436)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63229. + LeftBrace;[{];
  63230. + CSharpCodeBlock - [436..469)::33
  63231. + CSharpStatementLiteral - [436..438)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  63232. + NewLine;[LF];
  63233. + MarkupBlock - [438..454)::16
  63234. + MarkupTagBlock - [438..445)::7 - [<param>]
  63235. + MarkupTextLiteral - [438..445)::7 - [<param>] - Gen<Markup> - SpanEditHandler;Accepts:None
  63236. + OpenAngle;[<];
  63237. + Text;[param];
  63238. + CloseAngle;[>];
  63239. + MarkupTextLiteral - [445..446)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  63240. + Whitespace;[ ];
  63241. + MarkupTagBlock - [446..454)::8 - [</param>]
  63242. + MarkupTextLiteral - [446..454)::8 - [</param>] - Gen<Markup> - SpanEditHandler;Accepts:None
  63243. + OpenAngle;[<];
  63244. + ForwardSlash;[/];
  63245. + Text;[param];
  63246. + CloseAngle;[>];
  63247. + CSharpStatementLiteral - [454..469)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  63248. + Identifier;[var];
  63249. + Whitespace;[ ];
  63250. + Identifier;[x];
  63251. + Whitespace;[ ];
  63252. + Assign;[=];
  63253. + Whitespace;[ ];
  63254. + Keyword;[true];
  63255. + Semicolon;[;];
  63256. + NewLine;[LF];
  63257. + RazorMetaCode - [469..470)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63258. + RightBrace;[}];
  63259. + MarkupEphemeralTextLiteral - [470..472)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  63260. + NewLine;[LF];
  63261. + CSharpCodeBlock - [472..510)::38
  63262. + CSharpStatement - [472..510)::38
  63263. + CSharpTransition - [472..473)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63264. + Transition;[@];
  63265. + CSharpStatementBody - [473..510)::37
  63266. + RazorMetaCode - [473..474)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63267. + LeftBrace;[{];
  63268. + CSharpCodeBlock - [474..509)::35
  63269. + CSharpStatementLiteral - [474..476)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  63270. + NewLine;[LF];
  63271. + MarkupBlock - [476..494)::18
  63272. + MarkupTagBlock - [476..484)::8 - [<source>]
  63273. + MarkupTextLiteral - [476..484)::8 - [<source>] - Gen<Markup> - SpanEditHandler;Accepts:None
  63274. + OpenAngle;[<];
  63275. + Text;[source];
  63276. + CloseAngle;[>];
  63277. + MarkupTextLiteral - [484..485)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  63278. + Whitespace;[ ];
  63279. + MarkupTagBlock - [485..494)::9 - [</source>]
  63280. + MarkupTextLiteral - [485..494)::9 - [</source>] - Gen<Markup> - SpanEditHandler;Accepts:None
  63281. + OpenAngle;[<];
  63282. + ForwardSlash;[/];
  63283. + Text;[source];
  63284. + CloseAngle;[>];
  63285. + CSharpStatementLiteral - [494..509)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  63286. + Identifier;[var];
  63287. + Whitespace;[ ];
  63288. + Identifier;[x];
  63289. + Whitespace;[ ];
  63290. + Assign;[=];
  63291. + Whitespace;[ ];
  63292. + Keyword;[true];
  63293. + Semicolon;[;];
  63294. + NewLine;[LF];
  63295. + RazorMetaCode - [509..510)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63296. + RightBrace;[}];
  63297. + MarkupEphemeralTextLiteral - [510..512)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  63298. + NewLine;[LF];
  63299. + CSharpCodeBlock - [512..548)::36
  63300. + CSharpStatement - [512..548)::36
  63301. + CSharpTransition - [512..513)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63302. + Transition;[@];
  63303. + CSharpStatementBody - [513..548)::35
  63304. + RazorMetaCode - [513..514)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63305. + LeftBrace;[{];
  63306. + CSharpCodeBlock - [514..547)::33
  63307. + CSharpStatementLiteral - [514..516)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  63308. + NewLine;[LF];
  63309. + MarkupBlock - [516..532)::16
  63310. + MarkupTagBlock - [516..523)::7 - [<track>]
  63311. + MarkupTextLiteral - [516..523)::7 - [<track>] - Gen<Markup> - SpanEditHandler;Accepts:None
  63312. + OpenAngle;[<];
  63313. + Text;[track];
  63314. + CloseAngle;[>];
  63315. + MarkupTextLiteral - [523..524)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  63316. + Whitespace;[ ];
  63317. + MarkupTagBlock - [524..532)::8 - [</track>]
  63318. + MarkupTextLiteral - [524..532)::8 - [</track>] - Gen<Markup> - SpanEditHandler;Accepts:None
  63319. + OpenAngle;[<];
  63320. + ForwardSlash;[/];
  63321. + Text;[track];
  63322. + CloseAngle;[>];
  63323. + CSharpStatementLiteral - [532..547)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  63324. + Identifier;[var];
  63325. + Whitespace;[ ];
  63326. + Identifier;[x];
  63327. + Whitespace;[ ];
  63328. + Assign;[=];
  63329. + Whitespace;[ ];
  63330. + Keyword;[true];
  63331. + Semicolon;[;];
  63332. + NewLine;[LF];
  63333. + RazorMetaCode - [547..548)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63334. + RightBrace;[}];
  63335. + MarkupEphemeralTextLiteral - [548..550)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  63336. + NewLine;[LF];
  63337. + CSharpCodeBlock - [550..582)::32
  63338. + CSharpStatement - [550..582)::32
  63339. + CSharpTransition - [550..551)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63340. + Transition;[@];
  63341. + CSharpStatementBody - [551..582)::31
  63342. + RazorMetaCode - [551..552)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63343. + LeftBrace;[{];
  63344. + CSharpCodeBlock - [552..581)::29
  63345. + CSharpStatementLiteral - [552..554)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  63346. + NewLine;[LF];
  63347. + MarkupBlock - [554..566)::12
  63348. + MarkupTagBlock - [554..559)::5 - [<wbr>]
  63349. + MarkupTextLiteral - [554..559)::5 - [<wbr>] - Gen<Markup> - SpanEditHandler;Accepts:None
  63350. + OpenAngle;[<];
  63351. + Text;[wbr];
  63352. + CloseAngle;[>];
  63353. + MarkupTextLiteral - [559..560)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  63354. + Whitespace;[ ];
  63355. + MarkupTagBlock - [560..566)::6 - [</wbr>]
  63356. + MarkupTextLiteral - [560..566)::6 - [</wbr>] - Gen<Markup> - SpanEditHandler;Accepts:None
  63357. + OpenAngle;[<];
  63358. + ForwardSlash;[/];
  63359. + Text;[wbr];
  63360. + CloseAngle;[>];
  63361. + CSharpStatementLiteral - [566..581)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  63362. + Identifier;[var];
  63363. + Whitespace;[ ];
  63364. + Identifier;[x];
  63365. + Whitespace;[ ];
  63366. + Assign;[=];
  63367. + Whitespace;[ ];
  63368. + Keyword;[true];
  63369. + Semicolon;[;];
  63370. + NewLine;[LF];
  63371. + RazorMetaCode - [581..582)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63372. + RightBrace;[}];
  63373. + MarkupEphemeralTextLiteral - [582..584)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  63374. + NewLine;[LF];
  63375. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/VoidElementFollowedByContent.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/VoidElementFollowedByContent.stree.txt
  63376. index c0f1082468c..216fe622ff7 100644
  63377. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/VoidElementFollowedByContent.stree.txt
  63378. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/VoidElementFollowedByContent.stree.txt
  63379. @@ -1,435 +1,484 @@
  63380. -Markup block - Gen<None> - 452 - (0:0,0)
  63381. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  63382. - SyntaxKind.Unknown;[];
  63383. - Statement block - Gen<None> - 26 - (0:0,0)
  63384. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  63385. - SyntaxKind.Transition;[@];
  63386. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  63387. - SyntaxKind.LeftBrace;[{];
  63388. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (2:0,2) - Tokens:1
  63389. - SyntaxKind.NewLine;[LF];
  63390. - Markup block - Gen<None> - 6 - (4:1,0)
  63391. - Tag block - Gen<None> - 6 - (4:1,0)
  63392. - Markup span - Gen<Markup> - [<area>] - SpanEditHandler;Accepts:None - (4:1,0) - Tokens:3
  63393. - SyntaxKind.OpenAngle;[<];
  63394. - SyntaxKind.Text;[area];
  63395. - SyntaxKind.CloseAngle;[>];
  63396. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (10:1,6) - Tokens:9
  63397. - SyntaxKind.Identifier;[var];
  63398. - SyntaxKind.Whitespace;[ ];
  63399. - SyntaxKind.Identifier;[x];
  63400. - SyntaxKind.Whitespace;[ ];
  63401. - SyntaxKind.Assign;[=];
  63402. - SyntaxKind.Whitespace;[ ];
  63403. - SyntaxKind.Keyword;[true];
  63404. - SyntaxKind.Semicolon;[;];
  63405. - SyntaxKind.NewLine;[LF];
  63406. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (25:2,0) - Tokens:1
  63407. - SyntaxKind.RightBrace;[}];
  63408. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (26:2,1) - Tokens:1
  63409. - SyntaxKind.NewLine;[LF];
  63410. - Statement block - Gen<None> - 26 - (28:3,0)
  63411. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (28:3,0) - Tokens:1
  63412. - SyntaxKind.Transition;[@];
  63413. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (29:3,1) - Tokens:1
  63414. - SyntaxKind.LeftBrace;[{];
  63415. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (30:3,2) - Tokens:1
  63416. - SyntaxKind.NewLine;[LF];
  63417. - Markup block - Gen<None> - 6 - (32:4,0)
  63418. - Tag block - Gen<None> - 6 - (32:4,0)
  63419. - Markup span - Gen<Markup> - [<base>] - SpanEditHandler;Accepts:None - (32:4,0) - Tokens:3
  63420. - SyntaxKind.OpenAngle;[<];
  63421. - SyntaxKind.Text;[base];
  63422. - SyntaxKind.CloseAngle;[>];
  63423. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (38:4,6) - Tokens:9
  63424. - SyntaxKind.Identifier;[var];
  63425. - SyntaxKind.Whitespace;[ ];
  63426. - SyntaxKind.Identifier;[x];
  63427. - SyntaxKind.Whitespace;[ ];
  63428. - SyntaxKind.Assign;[=];
  63429. - SyntaxKind.Whitespace;[ ];
  63430. - SyntaxKind.Keyword;[true];
  63431. - SyntaxKind.Semicolon;[;];
  63432. - SyntaxKind.NewLine;[LF];
  63433. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (53:5,0) - Tokens:1
  63434. - SyntaxKind.RightBrace;[}];
  63435. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (54:5,1) - Tokens:1
  63436. - SyntaxKind.NewLine;[LF];
  63437. - Statement block - Gen<None> - 24 - (56:6,0)
  63438. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (56:6,0) - Tokens:1
  63439. - SyntaxKind.Transition;[@];
  63440. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (57:6,1) - Tokens:1
  63441. - SyntaxKind.LeftBrace;[{];
  63442. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (58:6,2) - Tokens:1
  63443. - SyntaxKind.NewLine;[LF];
  63444. - Markup block - Gen<None> - 4 - (60:7,0)
  63445. - Tag block - Gen<None> - 4 - (60:7,0)
  63446. - Markup span - Gen<Markup> - [<br>] - SpanEditHandler;Accepts:None - (60:7,0) - Tokens:3
  63447. - SyntaxKind.OpenAngle;[<];
  63448. - SyntaxKind.Text;[br];
  63449. - SyntaxKind.CloseAngle;[>];
  63450. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (64:7,4) - Tokens:9
  63451. - SyntaxKind.Identifier;[var];
  63452. - SyntaxKind.Whitespace;[ ];
  63453. - SyntaxKind.Identifier;[x];
  63454. - SyntaxKind.Whitespace;[ ];
  63455. - SyntaxKind.Assign;[=];
  63456. - SyntaxKind.Whitespace;[ ];
  63457. - SyntaxKind.Keyword;[true];
  63458. - SyntaxKind.Semicolon;[;];
  63459. - SyntaxKind.NewLine;[LF];
  63460. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (79:8,0) - Tokens:1
  63461. - SyntaxKind.RightBrace;[}];
  63462. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (80:8,1) - Tokens:1
  63463. - SyntaxKind.NewLine;[LF];
  63464. - Statement block - Gen<None> - 25 - (82:9,0)
  63465. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (82:9,0) - Tokens:1
  63466. - SyntaxKind.Transition;[@];
  63467. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (83:9,1) - Tokens:1
  63468. - SyntaxKind.LeftBrace;[{];
  63469. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (84:9,2) - Tokens:1
  63470. - SyntaxKind.NewLine;[LF];
  63471. - Markup block - Gen<None> - 5 - (86:10,0)
  63472. - Tag block - Gen<None> - 5 - (86:10,0)
  63473. - Markup span - Gen<Markup> - [<col>] - SpanEditHandler;Accepts:None - (86:10,0) - Tokens:3
  63474. - SyntaxKind.OpenAngle;[<];
  63475. - SyntaxKind.Text;[col];
  63476. - SyntaxKind.CloseAngle;[>];
  63477. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (91:10,5) - Tokens:9
  63478. - SyntaxKind.Identifier;[var];
  63479. - SyntaxKind.Whitespace;[ ];
  63480. - SyntaxKind.Identifier;[x];
  63481. - SyntaxKind.Whitespace;[ ];
  63482. - SyntaxKind.Assign;[=];
  63483. - SyntaxKind.Whitespace;[ ];
  63484. - SyntaxKind.Keyword;[true];
  63485. - SyntaxKind.Semicolon;[;];
  63486. - SyntaxKind.NewLine;[LF];
  63487. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (106:11,0) - Tokens:1
  63488. - SyntaxKind.RightBrace;[}];
  63489. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (107:11,1) - Tokens:1
  63490. - SyntaxKind.NewLine;[LF];
  63491. - Statement block - Gen<None> - 29 - (109:12,0)
  63492. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (109:12,0) - Tokens:1
  63493. - SyntaxKind.Transition;[@];
  63494. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (110:12,1) - Tokens:1
  63495. - SyntaxKind.LeftBrace;[{];
  63496. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (111:12,2) - Tokens:1
  63497. - SyntaxKind.NewLine;[LF];
  63498. - Markup block - Gen<None> - 9 - (113:13,0)
  63499. - Tag block - Gen<None> - 9 - (113:13,0)
  63500. - Markup span - Gen<Markup> - [<command>] - SpanEditHandler;Accepts:None - (113:13,0) - Tokens:3
  63501. - SyntaxKind.OpenAngle;[<];
  63502. - SyntaxKind.Text;[command];
  63503. - SyntaxKind.CloseAngle;[>];
  63504. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (122:13,9) - Tokens:9
  63505. - SyntaxKind.Identifier;[var];
  63506. - SyntaxKind.Whitespace;[ ];
  63507. - SyntaxKind.Identifier;[x];
  63508. - SyntaxKind.Whitespace;[ ];
  63509. - SyntaxKind.Assign;[=];
  63510. - SyntaxKind.Whitespace;[ ];
  63511. - SyntaxKind.Keyword;[true];
  63512. - SyntaxKind.Semicolon;[;];
  63513. - SyntaxKind.NewLine;[LF];
  63514. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (137:14,0) - Tokens:1
  63515. - SyntaxKind.RightBrace;[}];
  63516. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (138:14,1) - Tokens:1
  63517. - SyntaxKind.NewLine;[LF];
  63518. - Statement block - Gen<None> - 27 - (140:15,0)
  63519. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (140:15,0) - Tokens:1
  63520. - SyntaxKind.Transition;[@];
  63521. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (141:15,1) - Tokens:1
  63522. - SyntaxKind.LeftBrace;[{];
  63523. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (142:15,2) - Tokens:1
  63524. - SyntaxKind.NewLine;[LF];
  63525. - Markup block - Gen<None> - 7 - (144:16,0)
  63526. - Tag block - Gen<None> - 7 - (144:16,0)
  63527. - Markup span - Gen<Markup> - [<embed>] - SpanEditHandler;Accepts:None - (144:16,0) - Tokens:3
  63528. - SyntaxKind.OpenAngle;[<];
  63529. - SyntaxKind.Text;[embed];
  63530. - SyntaxKind.CloseAngle;[>];
  63531. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (151:16,7) - Tokens:9
  63532. - SyntaxKind.Identifier;[var];
  63533. - SyntaxKind.Whitespace;[ ];
  63534. - SyntaxKind.Identifier;[x];
  63535. - SyntaxKind.Whitespace;[ ];
  63536. - SyntaxKind.Assign;[=];
  63537. - SyntaxKind.Whitespace;[ ];
  63538. - SyntaxKind.Keyword;[true];
  63539. - SyntaxKind.Semicolon;[;];
  63540. - SyntaxKind.NewLine;[LF];
  63541. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (166:17,0) - Tokens:1
  63542. - SyntaxKind.RightBrace;[}];
  63543. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (167:17,1) - Tokens:1
  63544. - SyntaxKind.NewLine;[LF];
  63545. - Statement block - Gen<None> - 24 - (169:18,0)
  63546. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (169:18,0) - Tokens:1
  63547. - SyntaxKind.Transition;[@];
  63548. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (170:18,1) - Tokens:1
  63549. - SyntaxKind.LeftBrace;[{];
  63550. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (171:18,2) - Tokens:1
  63551. - SyntaxKind.NewLine;[LF];
  63552. - Markup block - Gen<None> - 4 - (173:19,0)
  63553. - Tag block - Gen<None> - 4 - (173:19,0)
  63554. - Markup span - Gen<Markup> - [<hr>] - SpanEditHandler;Accepts:None - (173:19,0) - Tokens:3
  63555. - SyntaxKind.OpenAngle;[<];
  63556. - SyntaxKind.Text;[hr];
  63557. - SyntaxKind.CloseAngle;[>];
  63558. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (177:19,4) - Tokens:9
  63559. - SyntaxKind.Identifier;[var];
  63560. - SyntaxKind.Whitespace;[ ];
  63561. - SyntaxKind.Identifier;[x];
  63562. - SyntaxKind.Whitespace;[ ];
  63563. - SyntaxKind.Assign;[=];
  63564. - SyntaxKind.Whitespace;[ ];
  63565. - SyntaxKind.Keyword;[true];
  63566. - SyntaxKind.Semicolon;[;];
  63567. - SyntaxKind.NewLine;[LF];
  63568. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (192:20,0) - Tokens:1
  63569. - SyntaxKind.RightBrace;[}];
  63570. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (193:20,1) - Tokens:1
  63571. - SyntaxKind.NewLine;[LF];
  63572. - Statement block - Gen<None> - 25 - (195:21,0)
  63573. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (195:21,0) - Tokens:1
  63574. - SyntaxKind.Transition;[@];
  63575. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (196:21,1) - Tokens:1
  63576. - SyntaxKind.LeftBrace;[{];
  63577. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (197:21,2) - Tokens:1
  63578. - SyntaxKind.NewLine;[LF];
  63579. - Markup block - Gen<None> - 5 - (199:22,0)
  63580. - Tag block - Gen<None> - 5 - (199:22,0)
  63581. - Markup span - Gen<Markup> - [<img>] - SpanEditHandler;Accepts:None - (199:22,0) - Tokens:3
  63582. - SyntaxKind.OpenAngle;[<];
  63583. - SyntaxKind.Text;[img];
  63584. - SyntaxKind.CloseAngle;[>];
  63585. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (204:22,5) - Tokens:9
  63586. - SyntaxKind.Identifier;[var];
  63587. - SyntaxKind.Whitespace;[ ];
  63588. - SyntaxKind.Identifier;[x];
  63589. - SyntaxKind.Whitespace;[ ];
  63590. - SyntaxKind.Assign;[=];
  63591. - SyntaxKind.Whitespace;[ ];
  63592. - SyntaxKind.Keyword;[true];
  63593. - SyntaxKind.Semicolon;[;];
  63594. - SyntaxKind.NewLine;[LF];
  63595. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (219:23,0) - Tokens:1
  63596. - SyntaxKind.RightBrace;[}];
  63597. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (220:23,1) - Tokens:1
  63598. - SyntaxKind.NewLine;[LF];
  63599. - Statement block - Gen<None> - 27 - (222:24,0)
  63600. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (222:24,0) - Tokens:1
  63601. - SyntaxKind.Transition;[@];
  63602. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (223:24,1) - Tokens:1
  63603. - SyntaxKind.LeftBrace;[{];
  63604. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (224:24,2) - Tokens:1
  63605. - SyntaxKind.NewLine;[LF];
  63606. - Markup block - Gen<None> - 7 - (226:25,0)
  63607. - Tag block - Gen<None> - 7 - (226:25,0)
  63608. - Markup span - Gen<Markup> - [<input>] - SpanEditHandler;Accepts:None - (226:25,0) - Tokens:3
  63609. - SyntaxKind.OpenAngle;[<];
  63610. - SyntaxKind.Text;[input];
  63611. - SyntaxKind.CloseAngle;[>];
  63612. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (233:25,7) - Tokens:9
  63613. - SyntaxKind.Identifier;[var];
  63614. - SyntaxKind.Whitespace;[ ];
  63615. - SyntaxKind.Identifier;[x];
  63616. - SyntaxKind.Whitespace;[ ];
  63617. - SyntaxKind.Assign;[=];
  63618. - SyntaxKind.Whitespace;[ ];
  63619. - SyntaxKind.Keyword;[true];
  63620. - SyntaxKind.Semicolon;[;];
  63621. - SyntaxKind.NewLine;[LF];
  63622. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (248:26,0) - Tokens:1
  63623. - SyntaxKind.RightBrace;[}];
  63624. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (249:26,1) - Tokens:1
  63625. - SyntaxKind.NewLine;[LF];
  63626. - Statement block - Gen<None> - 28 - (251:27,0)
  63627. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (251:27,0) - Tokens:1
  63628. - SyntaxKind.Transition;[@];
  63629. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (252:27,1) - Tokens:1
  63630. - SyntaxKind.LeftBrace;[{];
  63631. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (253:27,2) - Tokens:1
  63632. - SyntaxKind.NewLine;[LF];
  63633. - Markup block - Gen<None> - 8 - (255:28,0)
  63634. - Tag block - Gen<None> - 8 - (255:28,0)
  63635. - Markup span - Gen<Markup> - [<keygen>] - SpanEditHandler;Accepts:None - (255:28,0) - Tokens:3
  63636. - SyntaxKind.OpenAngle;[<];
  63637. - SyntaxKind.Text;[keygen];
  63638. - SyntaxKind.CloseAngle;[>];
  63639. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (263:28,8) - Tokens:9
  63640. - SyntaxKind.Identifier;[var];
  63641. - SyntaxKind.Whitespace;[ ];
  63642. - SyntaxKind.Identifier;[x];
  63643. - SyntaxKind.Whitespace;[ ];
  63644. - SyntaxKind.Assign;[=];
  63645. - SyntaxKind.Whitespace;[ ];
  63646. - SyntaxKind.Keyword;[true];
  63647. - SyntaxKind.Semicolon;[;];
  63648. - SyntaxKind.NewLine;[LF];
  63649. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (278:29,0) - Tokens:1
  63650. - SyntaxKind.RightBrace;[}];
  63651. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (279:29,1) - Tokens:1
  63652. - SyntaxKind.NewLine;[LF];
  63653. - Statement block - Gen<None> - 26 - (281:30,0)
  63654. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (281:30,0) - Tokens:1
  63655. - SyntaxKind.Transition;[@];
  63656. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (282:30,1) - Tokens:1
  63657. - SyntaxKind.LeftBrace;[{];
  63658. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (283:30,2) - Tokens:1
  63659. - SyntaxKind.NewLine;[LF];
  63660. - Markup block - Gen<None> - 6 - (285:31,0)
  63661. - Tag block - Gen<None> - 6 - (285:31,0)
  63662. - Markup span - Gen<Markup> - [<link>] - SpanEditHandler;Accepts:None - (285:31,0) - Tokens:3
  63663. - SyntaxKind.OpenAngle;[<];
  63664. - SyntaxKind.Text;[link];
  63665. - SyntaxKind.CloseAngle;[>];
  63666. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (291:31,6) - Tokens:9
  63667. - SyntaxKind.Identifier;[var];
  63668. - SyntaxKind.Whitespace;[ ];
  63669. - SyntaxKind.Identifier;[x];
  63670. - SyntaxKind.Whitespace;[ ];
  63671. - SyntaxKind.Assign;[=];
  63672. - SyntaxKind.Whitespace;[ ];
  63673. - SyntaxKind.Keyword;[true];
  63674. - SyntaxKind.Semicolon;[;];
  63675. - SyntaxKind.NewLine;[LF];
  63676. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (306:32,0) - Tokens:1
  63677. - SyntaxKind.RightBrace;[}];
  63678. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (307:32,1) - Tokens:1
  63679. - SyntaxKind.NewLine;[LF];
  63680. - Statement block - Gen<None> - 26 - (309:33,0)
  63681. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (309:33,0) - Tokens:1
  63682. - SyntaxKind.Transition;[@];
  63683. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (310:33,1) - Tokens:1
  63684. - SyntaxKind.LeftBrace;[{];
  63685. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (311:33,2) - Tokens:1
  63686. - SyntaxKind.NewLine;[LF];
  63687. - Markup block - Gen<None> - 6 - (313:34,0)
  63688. - Tag block - Gen<None> - 6 - (313:34,0)
  63689. - Markup span - Gen<Markup> - [<meta>] - SpanEditHandler;Accepts:None - (313:34,0) - Tokens:3
  63690. - SyntaxKind.OpenAngle;[<];
  63691. - SyntaxKind.Text;[meta];
  63692. - SyntaxKind.CloseAngle;[>];
  63693. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (319:34,6) - Tokens:9
  63694. - SyntaxKind.Identifier;[var];
  63695. - SyntaxKind.Whitespace;[ ];
  63696. - SyntaxKind.Identifier;[x];
  63697. - SyntaxKind.Whitespace;[ ];
  63698. - SyntaxKind.Assign;[=];
  63699. - SyntaxKind.Whitespace;[ ];
  63700. - SyntaxKind.Keyword;[true];
  63701. - SyntaxKind.Semicolon;[;];
  63702. - SyntaxKind.NewLine;[LF];
  63703. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (334:35,0) - Tokens:1
  63704. - SyntaxKind.RightBrace;[}];
  63705. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (335:35,1) - Tokens:1
  63706. - SyntaxKind.NewLine;[LF];
  63707. - Statement block - Gen<None> - 27 - (337:36,0)
  63708. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (337:36,0) - Tokens:1
  63709. - SyntaxKind.Transition;[@];
  63710. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (338:36,1) - Tokens:1
  63711. - SyntaxKind.LeftBrace;[{];
  63712. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (339:36,2) - Tokens:1
  63713. - SyntaxKind.NewLine;[LF];
  63714. - Markup block - Gen<None> - 7 - (341:37,0)
  63715. - Tag block - Gen<None> - 7 - (341:37,0)
  63716. - Markup span - Gen<Markup> - [<param>] - SpanEditHandler;Accepts:None - (341:37,0) - Tokens:3
  63717. - SyntaxKind.OpenAngle;[<];
  63718. - SyntaxKind.Text;[param];
  63719. - SyntaxKind.CloseAngle;[>];
  63720. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (348:37,7) - Tokens:9
  63721. - SyntaxKind.Identifier;[var];
  63722. - SyntaxKind.Whitespace;[ ];
  63723. - SyntaxKind.Identifier;[x];
  63724. - SyntaxKind.Whitespace;[ ];
  63725. - SyntaxKind.Assign;[=];
  63726. - SyntaxKind.Whitespace;[ ];
  63727. - SyntaxKind.Keyword;[true];
  63728. - SyntaxKind.Semicolon;[;];
  63729. - SyntaxKind.NewLine;[LF];
  63730. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (363:38,0) - Tokens:1
  63731. - SyntaxKind.RightBrace;[}];
  63732. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (364:38,1) - Tokens:1
  63733. - SyntaxKind.NewLine;[LF];
  63734. - Statement block - Gen<None> - 28 - (366:39,0)
  63735. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (366:39,0) - Tokens:1
  63736. - SyntaxKind.Transition;[@];
  63737. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (367:39,1) - Tokens:1
  63738. - SyntaxKind.LeftBrace;[{];
  63739. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (368:39,2) - Tokens:1
  63740. - SyntaxKind.NewLine;[LF];
  63741. - Markup block - Gen<None> - 8 - (370:40,0)
  63742. - Tag block - Gen<None> - 8 - (370:40,0)
  63743. - Markup span - Gen<Markup> - [<source>] - SpanEditHandler;Accepts:None - (370:40,0) - Tokens:3
  63744. - SyntaxKind.OpenAngle;[<];
  63745. - SyntaxKind.Text;[source];
  63746. - SyntaxKind.CloseAngle;[>];
  63747. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (378:40,8) - Tokens:9
  63748. - SyntaxKind.Identifier;[var];
  63749. - SyntaxKind.Whitespace;[ ];
  63750. - SyntaxKind.Identifier;[x];
  63751. - SyntaxKind.Whitespace;[ ];
  63752. - SyntaxKind.Assign;[=];
  63753. - SyntaxKind.Whitespace;[ ];
  63754. - SyntaxKind.Keyword;[true];
  63755. - SyntaxKind.Semicolon;[;];
  63756. - SyntaxKind.NewLine;[LF];
  63757. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (393:41,0) - Tokens:1
  63758. - SyntaxKind.RightBrace;[}];
  63759. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (394:41,1) - Tokens:1
  63760. - SyntaxKind.NewLine;[LF];
  63761. - Statement block - Gen<None> - 27 - (396:42,0)
  63762. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (396:42,0) - Tokens:1
  63763. - SyntaxKind.Transition;[@];
  63764. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (397:42,1) - Tokens:1
  63765. - SyntaxKind.LeftBrace;[{];
  63766. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (398:42,2) - Tokens:1
  63767. - SyntaxKind.NewLine;[LF];
  63768. - Markup block - Gen<None> - 7 - (400:43,0)
  63769. - Tag block - Gen<None> - 7 - (400:43,0)
  63770. - Markup span - Gen<Markup> - [<track>] - SpanEditHandler;Accepts:None - (400:43,0) - Tokens:3
  63771. - SyntaxKind.OpenAngle;[<];
  63772. - SyntaxKind.Text;[track];
  63773. - SyntaxKind.CloseAngle;[>];
  63774. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (407:43,7) - Tokens:9
  63775. - SyntaxKind.Identifier;[var];
  63776. - SyntaxKind.Whitespace;[ ];
  63777. - SyntaxKind.Identifier;[x];
  63778. - SyntaxKind.Whitespace;[ ];
  63779. - SyntaxKind.Assign;[=];
  63780. - SyntaxKind.Whitespace;[ ];
  63781. - SyntaxKind.Keyword;[true];
  63782. - SyntaxKind.Semicolon;[;];
  63783. - SyntaxKind.NewLine;[LF];
  63784. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (422:44,0) - Tokens:1
  63785. - SyntaxKind.RightBrace;[}];
  63786. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (423:44,1) - Tokens:1
  63787. - SyntaxKind.NewLine;[LF];
  63788. - Statement block - Gen<None> - 25 - (425:45,0)
  63789. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (425:45,0) - Tokens:1
  63790. - SyntaxKind.Transition;[@];
  63791. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (426:45,1) - Tokens:1
  63792. - SyntaxKind.LeftBrace;[{];
  63793. - Code span - Gen<Stmt> - [LF] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL - (427:45,2) - Tokens:1
  63794. - SyntaxKind.NewLine;[LF];
  63795. - Markup block - Gen<None> - 5 - (429:46,0)
  63796. - Tag block - Gen<None> - 5 - (429:46,0)
  63797. - Markup span - Gen<Markup> - [<wbr>] - SpanEditHandler;Accepts:None - (429:46,0) - Tokens:3
  63798. - SyntaxKind.OpenAngle;[<];
  63799. - SyntaxKind.Text;[wbr];
  63800. - SyntaxKind.CloseAngle;[>];
  63801. - Code span - Gen<Stmt> - [var x = true;LF] - SpanEditHandler;Accepts:Any - (434:46,5) - Tokens:9
  63802. - SyntaxKind.Identifier;[var];
  63803. - SyntaxKind.Whitespace;[ ];
  63804. - SyntaxKind.Identifier;[x];
  63805. - SyntaxKind.Whitespace;[ ];
  63806. - SyntaxKind.Assign;[=];
  63807. - SyntaxKind.Whitespace;[ ];
  63808. - SyntaxKind.Keyword;[true];
  63809. - SyntaxKind.Semicolon;[;];
  63810. - SyntaxKind.NewLine;[LF];
  63811. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (449:47,0) - Tokens:1
  63812. - SyntaxKind.RightBrace;[}];
  63813. - Markup span - Gen<None> - [LF] - SpanEditHandler;Accepts:Any - (450:47,1) - Tokens:1
  63814. - SyntaxKind.NewLine;[LF];
  63815. +RazorDocument - [0..452)::452 - [@{LF<area>var x = true;LF}LF@{LF<base>var x = true;LF}LF@{LF<br>var x = true;LF}LF@{LF<col>var x = true;LF}LF@{LF<command>var x = true;LF}LF@{LF<embed>var x = true;LF}LF@{LF<hr>var x = true;LF}LF@{LF<img>var x = true;LF}LF@{LF<input>var x = true;LF}LF@{LF<keygen>var x = true;LF}LF@{LF<link>var x = true;LF}LF@{LF<meta>var x = true;LF}LF@{LF<param>var x = true;LF}LF@{LF<source>var x = true;LF}LF@{LF<track>var x = true;LF}LF@{LF<wbr>var x = true;LF}LF]
  63816. + MarkupBlock - [0..452)::452
  63817. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  63818. + Marker;[];
  63819. + CSharpCodeBlock - [0..26)::26
  63820. + CSharpStatement - [0..26)::26
  63821. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63822. + Transition;[@];
  63823. + CSharpStatementBody - [1..26)::25
  63824. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63825. + LeftBrace;[{];
  63826. + CSharpCodeBlock - [2..25)::23
  63827. + CSharpStatementLiteral - [2..4)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  63828. + NewLine;[LF];
  63829. + MarkupBlock - [4..10)::6
  63830. + MarkupTagBlock - [4..10)::6 - [<area>]
  63831. + MarkupTextLiteral - [4..10)::6 - [<area>] - Gen<Markup> - SpanEditHandler;Accepts:None
  63832. + OpenAngle;[<];
  63833. + Text;[area];
  63834. + CloseAngle;[>];
  63835. + CSharpStatementLiteral - [10..25)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  63836. + Identifier;[var];
  63837. + Whitespace;[ ];
  63838. + Identifier;[x];
  63839. + Whitespace;[ ];
  63840. + Assign;[=];
  63841. + Whitespace;[ ];
  63842. + Keyword;[true];
  63843. + Semicolon;[;];
  63844. + NewLine;[LF];
  63845. + RazorMetaCode - [25..26)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63846. + RightBrace;[}];
  63847. + MarkupEphemeralTextLiteral - [26..28)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  63848. + NewLine;[LF];
  63849. + CSharpCodeBlock - [28..54)::26
  63850. + CSharpStatement - [28..54)::26
  63851. + CSharpTransition - [28..29)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63852. + Transition;[@];
  63853. + CSharpStatementBody - [29..54)::25
  63854. + RazorMetaCode - [29..30)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63855. + LeftBrace;[{];
  63856. + CSharpCodeBlock - [30..53)::23
  63857. + CSharpStatementLiteral - [30..32)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  63858. + NewLine;[LF];
  63859. + MarkupBlock - [32..38)::6
  63860. + MarkupTagBlock - [32..38)::6 - [<base>]
  63861. + MarkupTextLiteral - [32..38)::6 - [<base>] - Gen<Markup> - SpanEditHandler;Accepts:None
  63862. + OpenAngle;[<];
  63863. + Text;[base];
  63864. + CloseAngle;[>];
  63865. + CSharpStatementLiteral - [38..53)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  63866. + Identifier;[var];
  63867. + Whitespace;[ ];
  63868. + Identifier;[x];
  63869. + Whitespace;[ ];
  63870. + Assign;[=];
  63871. + Whitespace;[ ];
  63872. + Keyword;[true];
  63873. + Semicolon;[;];
  63874. + NewLine;[LF];
  63875. + RazorMetaCode - [53..54)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63876. + RightBrace;[}];
  63877. + MarkupEphemeralTextLiteral - [54..56)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  63878. + NewLine;[LF];
  63879. + CSharpCodeBlock - [56..80)::24
  63880. + CSharpStatement - [56..80)::24
  63881. + CSharpTransition - [56..57)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63882. + Transition;[@];
  63883. + CSharpStatementBody - [57..80)::23
  63884. + RazorMetaCode - [57..58)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63885. + LeftBrace;[{];
  63886. + CSharpCodeBlock - [58..79)::21
  63887. + CSharpStatementLiteral - [58..60)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  63888. + NewLine;[LF];
  63889. + MarkupBlock - [60..64)::4
  63890. + MarkupTagBlock - [60..64)::4 - [<br>]
  63891. + MarkupTextLiteral - [60..64)::4 - [<br>] - Gen<Markup> - SpanEditHandler;Accepts:None
  63892. + OpenAngle;[<];
  63893. + Text;[br];
  63894. + CloseAngle;[>];
  63895. + CSharpStatementLiteral - [64..79)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  63896. + Identifier;[var];
  63897. + Whitespace;[ ];
  63898. + Identifier;[x];
  63899. + Whitespace;[ ];
  63900. + Assign;[=];
  63901. + Whitespace;[ ];
  63902. + Keyword;[true];
  63903. + Semicolon;[;];
  63904. + NewLine;[LF];
  63905. + RazorMetaCode - [79..80)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63906. + RightBrace;[}];
  63907. + MarkupEphemeralTextLiteral - [80..82)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  63908. + NewLine;[LF];
  63909. + CSharpCodeBlock - [82..107)::25
  63910. + CSharpStatement - [82..107)::25
  63911. + CSharpTransition - [82..83)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63912. + Transition;[@];
  63913. + CSharpStatementBody - [83..107)::24
  63914. + RazorMetaCode - [83..84)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63915. + LeftBrace;[{];
  63916. + CSharpCodeBlock - [84..106)::22
  63917. + CSharpStatementLiteral - [84..86)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  63918. + NewLine;[LF];
  63919. + MarkupBlock - [86..91)::5
  63920. + MarkupTagBlock - [86..91)::5 - [<col>]
  63921. + MarkupTextLiteral - [86..91)::5 - [<col>] - Gen<Markup> - SpanEditHandler;Accepts:None
  63922. + OpenAngle;[<];
  63923. + Text;[col];
  63924. + CloseAngle;[>];
  63925. + CSharpStatementLiteral - [91..106)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  63926. + Identifier;[var];
  63927. + Whitespace;[ ];
  63928. + Identifier;[x];
  63929. + Whitespace;[ ];
  63930. + Assign;[=];
  63931. + Whitespace;[ ];
  63932. + Keyword;[true];
  63933. + Semicolon;[;];
  63934. + NewLine;[LF];
  63935. + RazorMetaCode - [106..107)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63936. + RightBrace;[}];
  63937. + MarkupEphemeralTextLiteral - [107..109)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  63938. + NewLine;[LF];
  63939. + CSharpCodeBlock - [109..138)::29
  63940. + CSharpStatement - [109..138)::29
  63941. + CSharpTransition - [109..110)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63942. + Transition;[@];
  63943. + CSharpStatementBody - [110..138)::28
  63944. + RazorMetaCode - [110..111)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63945. + LeftBrace;[{];
  63946. + CSharpCodeBlock - [111..137)::26
  63947. + CSharpStatementLiteral - [111..113)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  63948. + NewLine;[LF];
  63949. + MarkupBlock - [113..122)::9
  63950. + MarkupTagBlock - [113..122)::9 - [<command>]
  63951. + MarkupTextLiteral - [113..122)::9 - [<command>] - Gen<Markup> - SpanEditHandler;Accepts:None
  63952. + OpenAngle;[<];
  63953. + Text;[command];
  63954. + CloseAngle;[>];
  63955. + CSharpStatementLiteral - [122..137)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  63956. + Identifier;[var];
  63957. + Whitespace;[ ];
  63958. + Identifier;[x];
  63959. + Whitespace;[ ];
  63960. + Assign;[=];
  63961. + Whitespace;[ ];
  63962. + Keyword;[true];
  63963. + Semicolon;[;];
  63964. + NewLine;[LF];
  63965. + RazorMetaCode - [137..138)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63966. + RightBrace;[}];
  63967. + MarkupEphemeralTextLiteral - [138..140)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  63968. + NewLine;[LF];
  63969. + CSharpCodeBlock - [140..167)::27
  63970. + CSharpStatement - [140..167)::27
  63971. + CSharpTransition - [140..141)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63972. + Transition;[@];
  63973. + CSharpStatementBody - [141..167)::26
  63974. + RazorMetaCode - [141..142)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63975. + LeftBrace;[{];
  63976. + CSharpCodeBlock - [142..166)::24
  63977. + CSharpStatementLiteral - [142..144)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  63978. + NewLine;[LF];
  63979. + MarkupBlock - [144..151)::7
  63980. + MarkupTagBlock - [144..151)::7 - [<embed>]
  63981. + MarkupTextLiteral - [144..151)::7 - [<embed>] - Gen<Markup> - SpanEditHandler;Accepts:None
  63982. + OpenAngle;[<];
  63983. + Text;[embed];
  63984. + CloseAngle;[>];
  63985. + CSharpStatementLiteral - [151..166)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  63986. + Identifier;[var];
  63987. + Whitespace;[ ];
  63988. + Identifier;[x];
  63989. + Whitespace;[ ];
  63990. + Assign;[=];
  63991. + Whitespace;[ ];
  63992. + Keyword;[true];
  63993. + Semicolon;[;];
  63994. + NewLine;[LF];
  63995. + RazorMetaCode - [166..167)::1 - Gen<None> - SpanEditHandler;Accepts:None
  63996. + RightBrace;[}];
  63997. + MarkupEphemeralTextLiteral - [167..169)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  63998. + NewLine;[LF];
  63999. + CSharpCodeBlock - [169..193)::24
  64000. + CSharpStatement - [169..193)::24
  64001. + CSharpTransition - [169..170)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64002. + Transition;[@];
  64003. + CSharpStatementBody - [170..193)::23
  64004. + RazorMetaCode - [170..171)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64005. + LeftBrace;[{];
  64006. + CSharpCodeBlock - [171..192)::21
  64007. + CSharpStatementLiteral - [171..173)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  64008. + NewLine;[LF];
  64009. + MarkupBlock - [173..177)::4
  64010. + MarkupTagBlock - [173..177)::4 - [<hr>]
  64011. + MarkupTextLiteral - [173..177)::4 - [<hr>] - Gen<Markup> - SpanEditHandler;Accepts:None
  64012. + OpenAngle;[<];
  64013. + Text;[hr];
  64014. + CloseAngle;[>];
  64015. + CSharpStatementLiteral - [177..192)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  64016. + Identifier;[var];
  64017. + Whitespace;[ ];
  64018. + Identifier;[x];
  64019. + Whitespace;[ ];
  64020. + Assign;[=];
  64021. + Whitespace;[ ];
  64022. + Keyword;[true];
  64023. + Semicolon;[;];
  64024. + NewLine;[LF];
  64025. + RazorMetaCode - [192..193)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64026. + RightBrace;[}];
  64027. + MarkupEphemeralTextLiteral - [193..195)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  64028. + NewLine;[LF];
  64029. + CSharpCodeBlock - [195..220)::25
  64030. + CSharpStatement - [195..220)::25
  64031. + CSharpTransition - [195..196)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64032. + Transition;[@];
  64033. + CSharpStatementBody - [196..220)::24
  64034. + RazorMetaCode - [196..197)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64035. + LeftBrace;[{];
  64036. + CSharpCodeBlock - [197..219)::22
  64037. + CSharpStatementLiteral - [197..199)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  64038. + NewLine;[LF];
  64039. + MarkupBlock - [199..204)::5
  64040. + MarkupTagBlock - [199..204)::5 - [<img>]
  64041. + MarkupTextLiteral - [199..204)::5 - [<img>] - Gen<Markup> - SpanEditHandler;Accepts:None
  64042. + OpenAngle;[<];
  64043. + Text;[img];
  64044. + CloseAngle;[>];
  64045. + CSharpStatementLiteral - [204..219)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  64046. + Identifier;[var];
  64047. + Whitespace;[ ];
  64048. + Identifier;[x];
  64049. + Whitespace;[ ];
  64050. + Assign;[=];
  64051. + Whitespace;[ ];
  64052. + Keyword;[true];
  64053. + Semicolon;[;];
  64054. + NewLine;[LF];
  64055. + RazorMetaCode - [219..220)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64056. + RightBrace;[}];
  64057. + MarkupEphemeralTextLiteral - [220..222)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  64058. + NewLine;[LF];
  64059. + CSharpCodeBlock - [222..249)::27
  64060. + CSharpStatement - [222..249)::27
  64061. + CSharpTransition - [222..223)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64062. + Transition;[@];
  64063. + CSharpStatementBody - [223..249)::26
  64064. + RazorMetaCode - [223..224)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64065. + LeftBrace;[{];
  64066. + CSharpCodeBlock - [224..248)::24
  64067. + CSharpStatementLiteral - [224..226)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  64068. + NewLine;[LF];
  64069. + MarkupBlock - [226..233)::7
  64070. + MarkupTagBlock - [226..233)::7 - [<input>]
  64071. + MarkupTextLiteral - [226..233)::7 - [<input>] - Gen<Markup> - SpanEditHandler;Accepts:None
  64072. + OpenAngle;[<];
  64073. + Text;[input];
  64074. + CloseAngle;[>];
  64075. + CSharpStatementLiteral - [233..248)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  64076. + Identifier;[var];
  64077. + Whitespace;[ ];
  64078. + Identifier;[x];
  64079. + Whitespace;[ ];
  64080. + Assign;[=];
  64081. + Whitespace;[ ];
  64082. + Keyword;[true];
  64083. + Semicolon;[;];
  64084. + NewLine;[LF];
  64085. + RazorMetaCode - [248..249)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64086. + RightBrace;[}];
  64087. + MarkupEphemeralTextLiteral - [249..251)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  64088. + NewLine;[LF];
  64089. + CSharpCodeBlock - [251..279)::28
  64090. + CSharpStatement - [251..279)::28
  64091. + CSharpTransition - [251..252)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64092. + Transition;[@];
  64093. + CSharpStatementBody - [252..279)::27
  64094. + RazorMetaCode - [252..253)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64095. + LeftBrace;[{];
  64096. + CSharpCodeBlock - [253..278)::25
  64097. + CSharpStatementLiteral - [253..255)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  64098. + NewLine;[LF];
  64099. + MarkupBlock - [255..263)::8
  64100. + MarkupTagBlock - [255..263)::8 - [<keygen>]
  64101. + MarkupTextLiteral - [255..263)::8 - [<keygen>] - Gen<Markup> - SpanEditHandler;Accepts:None
  64102. + OpenAngle;[<];
  64103. + Text;[keygen];
  64104. + CloseAngle;[>];
  64105. + CSharpStatementLiteral - [263..278)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  64106. + Identifier;[var];
  64107. + Whitespace;[ ];
  64108. + Identifier;[x];
  64109. + Whitespace;[ ];
  64110. + Assign;[=];
  64111. + Whitespace;[ ];
  64112. + Keyword;[true];
  64113. + Semicolon;[;];
  64114. + NewLine;[LF];
  64115. + RazorMetaCode - [278..279)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64116. + RightBrace;[}];
  64117. + MarkupEphemeralTextLiteral - [279..281)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  64118. + NewLine;[LF];
  64119. + CSharpCodeBlock - [281..307)::26
  64120. + CSharpStatement - [281..307)::26
  64121. + CSharpTransition - [281..282)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64122. + Transition;[@];
  64123. + CSharpStatementBody - [282..307)::25
  64124. + RazorMetaCode - [282..283)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64125. + LeftBrace;[{];
  64126. + CSharpCodeBlock - [283..306)::23
  64127. + CSharpStatementLiteral - [283..285)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  64128. + NewLine;[LF];
  64129. + MarkupBlock - [285..291)::6
  64130. + MarkupTagBlock - [285..291)::6 - [<link>]
  64131. + MarkupTextLiteral - [285..291)::6 - [<link>] - Gen<Markup> - SpanEditHandler;Accepts:None
  64132. + OpenAngle;[<];
  64133. + Text;[link];
  64134. + CloseAngle;[>];
  64135. + CSharpStatementLiteral - [291..306)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  64136. + Identifier;[var];
  64137. + Whitespace;[ ];
  64138. + Identifier;[x];
  64139. + Whitespace;[ ];
  64140. + Assign;[=];
  64141. + Whitespace;[ ];
  64142. + Keyword;[true];
  64143. + Semicolon;[;];
  64144. + NewLine;[LF];
  64145. + RazorMetaCode - [306..307)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64146. + RightBrace;[}];
  64147. + MarkupEphemeralTextLiteral - [307..309)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  64148. + NewLine;[LF];
  64149. + CSharpCodeBlock - [309..335)::26
  64150. + CSharpStatement - [309..335)::26
  64151. + CSharpTransition - [309..310)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64152. + Transition;[@];
  64153. + CSharpStatementBody - [310..335)::25
  64154. + RazorMetaCode - [310..311)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64155. + LeftBrace;[{];
  64156. + CSharpCodeBlock - [311..334)::23
  64157. + CSharpStatementLiteral - [311..313)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  64158. + NewLine;[LF];
  64159. + MarkupBlock - [313..319)::6
  64160. + MarkupTagBlock - [313..319)::6 - [<meta>]
  64161. + MarkupTextLiteral - [313..319)::6 - [<meta>] - Gen<Markup> - SpanEditHandler;Accepts:None
  64162. + OpenAngle;[<];
  64163. + Text;[meta];
  64164. + CloseAngle;[>];
  64165. + CSharpStatementLiteral - [319..334)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  64166. + Identifier;[var];
  64167. + Whitespace;[ ];
  64168. + Identifier;[x];
  64169. + Whitespace;[ ];
  64170. + Assign;[=];
  64171. + Whitespace;[ ];
  64172. + Keyword;[true];
  64173. + Semicolon;[;];
  64174. + NewLine;[LF];
  64175. + RazorMetaCode - [334..335)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64176. + RightBrace;[}];
  64177. + MarkupEphemeralTextLiteral - [335..337)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  64178. + NewLine;[LF];
  64179. + CSharpCodeBlock - [337..364)::27
  64180. + CSharpStatement - [337..364)::27
  64181. + CSharpTransition - [337..338)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64182. + Transition;[@];
  64183. + CSharpStatementBody - [338..364)::26
  64184. + RazorMetaCode - [338..339)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64185. + LeftBrace;[{];
  64186. + CSharpCodeBlock - [339..363)::24
  64187. + CSharpStatementLiteral - [339..341)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  64188. + NewLine;[LF];
  64189. + MarkupBlock - [341..348)::7
  64190. + MarkupTagBlock - [341..348)::7 - [<param>]
  64191. + MarkupTextLiteral - [341..348)::7 - [<param>] - Gen<Markup> - SpanEditHandler;Accepts:None
  64192. + OpenAngle;[<];
  64193. + Text;[param];
  64194. + CloseAngle;[>];
  64195. + CSharpStatementLiteral - [348..363)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  64196. + Identifier;[var];
  64197. + Whitespace;[ ];
  64198. + Identifier;[x];
  64199. + Whitespace;[ ];
  64200. + Assign;[=];
  64201. + Whitespace;[ ];
  64202. + Keyword;[true];
  64203. + Semicolon;[;];
  64204. + NewLine;[LF];
  64205. + RazorMetaCode - [363..364)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64206. + RightBrace;[}];
  64207. + MarkupEphemeralTextLiteral - [364..366)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  64208. + NewLine;[LF];
  64209. + CSharpCodeBlock - [366..394)::28
  64210. + CSharpStatement - [366..394)::28
  64211. + CSharpTransition - [366..367)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64212. + Transition;[@];
  64213. + CSharpStatementBody - [367..394)::27
  64214. + RazorMetaCode - [367..368)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64215. + LeftBrace;[{];
  64216. + CSharpCodeBlock - [368..393)::25
  64217. + CSharpStatementLiteral - [368..370)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  64218. + NewLine;[LF];
  64219. + MarkupBlock - [370..378)::8
  64220. + MarkupTagBlock - [370..378)::8 - [<source>]
  64221. + MarkupTextLiteral - [370..378)::8 - [<source>] - Gen<Markup> - SpanEditHandler;Accepts:None
  64222. + OpenAngle;[<];
  64223. + Text;[source];
  64224. + CloseAngle;[>];
  64225. + CSharpStatementLiteral - [378..393)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  64226. + Identifier;[var];
  64227. + Whitespace;[ ];
  64228. + Identifier;[x];
  64229. + Whitespace;[ ];
  64230. + Assign;[=];
  64231. + Whitespace;[ ];
  64232. + Keyword;[true];
  64233. + Semicolon;[;];
  64234. + NewLine;[LF];
  64235. + RazorMetaCode - [393..394)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64236. + RightBrace;[}];
  64237. + MarkupEphemeralTextLiteral - [394..396)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  64238. + NewLine;[LF];
  64239. + CSharpCodeBlock - [396..423)::27
  64240. + CSharpStatement - [396..423)::27
  64241. + CSharpTransition - [396..397)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64242. + Transition;[@];
  64243. + CSharpStatementBody - [397..423)::26
  64244. + RazorMetaCode - [397..398)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64245. + LeftBrace;[{];
  64246. + CSharpCodeBlock - [398..422)::24
  64247. + CSharpStatementLiteral - [398..400)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  64248. + NewLine;[LF];
  64249. + MarkupBlock - [400..407)::7
  64250. + MarkupTagBlock - [400..407)::7 - [<track>]
  64251. + MarkupTextLiteral - [400..407)::7 - [<track>] - Gen<Markup> - SpanEditHandler;Accepts:None
  64252. + OpenAngle;[<];
  64253. + Text;[track];
  64254. + CloseAngle;[>];
  64255. + CSharpStatementLiteral - [407..422)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  64256. + Identifier;[var];
  64257. + Whitespace;[ ];
  64258. + Identifier;[x];
  64259. + Whitespace;[ ];
  64260. + Assign;[=];
  64261. + Whitespace;[ ];
  64262. + Keyword;[true];
  64263. + Semicolon;[;];
  64264. + NewLine;[LF];
  64265. + RazorMetaCode - [422..423)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64266. + RightBrace;[}];
  64267. + MarkupEphemeralTextLiteral - [423..425)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  64268. + NewLine;[LF];
  64269. + CSharpCodeBlock - [425..450)::25
  64270. + CSharpStatement - [425..450)::25
  64271. + CSharpTransition - [425..426)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64272. + Transition;[@];
  64273. + CSharpStatementBody - [426..450)::24
  64274. + RazorMetaCode - [426..427)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64275. + LeftBrace;[{];
  64276. + CSharpCodeBlock - [427..449)::22
  64277. + CSharpStatementLiteral - [427..429)::2 - [LF] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  64278. + NewLine;[LF];
  64279. + MarkupBlock - [429..434)::5
  64280. + MarkupTagBlock - [429..434)::5 - [<wbr>]
  64281. + MarkupTextLiteral - [429..434)::5 - [<wbr>] - Gen<Markup> - SpanEditHandler;Accepts:None
  64282. + OpenAngle;[<];
  64283. + Text;[wbr];
  64284. + CloseAngle;[>];
  64285. + CSharpStatementLiteral - [434..449)::15 - [var x = true;LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  64286. + Identifier;[var];
  64287. + Whitespace;[ ];
  64288. + Identifier;[x];
  64289. + Whitespace;[ ];
  64290. + Assign;[=];
  64291. + Whitespace;[ ];
  64292. + Keyword;[true];
  64293. + Semicolon;[;];
  64294. + NewLine;[LF];
  64295. + RazorMetaCode - [449..450)::1 - Gen<None> - SpanEditHandler;Accepts:None
  64296. + RightBrace;[}];
  64297. + MarkupEphemeralTextLiteral - [450..452)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  64298. + NewLine;[LF];
  64299. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/VoidElementFollowedByOtherTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/VoidElementFollowedByOtherTag.stree.txt
  64300. index f25abf09014..dec1f7732bf 100644
  64301. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/VoidElementFollowedByOtherTag.stree.txt
  64302. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlTagsTest/VoidElementFollowedByOtherTag.stree.txt
  64303. @@ -1,401 +1,387 @@
  64304. -Markup block - Gen<None> - 564 - (0:0,0)
  64305. - Markup span - Gen<Markup> - [{LF] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  64306. - SyntaxKind.Text;[{];
  64307. - SyntaxKind.NewLine;[LF];
  64308. - Tag block - Gen<None> - 6 - (3:1,0)
  64309. - Markup span - Gen<Markup> - [<area>] - SpanEditHandler;Accepts:Any - (3:1,0) - Tokens:3
  64310. - SyntaxKind.OpenAngle;[<];
  64311. - SyntaxKind.Text;[area];
  64312. - SyntaxKind.CloseAngle;[>];
  64313. - Tag block - Gen<None> - 7 - (9:1,6)
  64314. - Markup span - Gen<Markup> - [<other>] - SpanEditHandler;Accepts:Any - (9:1,6) - Tokens:3
  64315. - SyntaxKind.OpenAngle;[<];
  64316. - SyntaxKind.Text;[other];
  64317. - SyntaxKind.CloseAngle;[>];
  64318. - SyntaxKind.HtmlTextLiteral - [ var x = true;LF}LF{LF] - [16..38) - FullWidth: 22 - Slots: 1
  64319. - SyntaxKind.List - [ var x = true;LF}LF{LF] - [16..38) - FullWidth: 22 - Slots: 13
  64320. - SyntaxKind.Whitespace;[ ];
  64321. - SyntaxKind.Text;[var];
  64322. - SyntaxKind.Whitespace;[ ];
  64323. - SyntaxKind.Text;[x];
  64324. - SyntaxKind.Whitespace;[ ];
  64325. - SyntaxKind.Equals;[=];
  64326. - SyntaxKind.Whitespace;[ ];
  64327. - SyntaxKind.Text;[true;];
  64328. - SyntaxKind.NewLine;[LF];
  64329. - SyntaxKind.Text;[}];
  64330. - SyntaxKind.NewLine;[LF];
  64331. - SyntaxKind.Text;[{];
  64332. - SyntaxKind.NewLine;[LF];
  64333. - Tag block - Gen<None> - 6 - (38:4,0)
  64334. - Markup span - Gen<Markup> - [<base>] - SpanEditHandler;Accepts:Any - (38:4,0) - Tokens:3
  64335. - SyntaxKind.OpenAngle;[<];
  64336. - SyntaxKind.Text;[base];
  64337. - SyntaxKind.CloseAngle;[>];
  64338. - Tag block - Gen<None> - 7 - (44:4,6)
  64339. - Markup span - Gen<Markup> - [<other>] - SpanEditHandler;Accepts:Any - (44:4,6) - Tokens:3
  64340. - SyntaxKind.OpenAngle;[<];
  64341. - SyntaxKind.Text;[other];
  64342. - SyntaxKind.CloseAngle;[>];
  64343. - SyntaxKind.HtmlTextLiteral - [ var x = true;LF}LF{LF] - [51..73) - FullWidth: 22 - Slots: 1
  64344. - SyntaxKind.List - [ var x = true;LF}LF{LF] - [51..73) - FullWidth: 22 - Slots: 13
  64345. - SyntaxKind.Whitespace;[ ];
  64346. - SyntaxKind.Text;[var];
  64347. - SyntaxKind.Whitespace;[ ];
  64348. - SyntaxKind.Text;[x];
  64349. - SyntaxKind.Whitespace;[ ];
  64350. - SyntaxKind.Equals;[=];
  64351. - SyntaxKind.Whitespace;[ ];
  64352. - SyntaxKind.Text;[true;];
  64353. - SyntaxKind.NewLine;[LF];
  64354. - SyntaxKind.Text;[}];
  64355. - SyntaxKind.NewLine;[LF];
  64356. - SyntaxKind.Text;[{];
  64357. - SyntaxKind.NewLine;[LF];
  64358. - Tag block - Gen<None> - 4 - (73:7,0)
  64359. - Markup span - Gen<Markup> - [<br>] - SpanEditHandler;Accepts:Any - (73:7,0) - Tokens:3
  64360. - SyntaxKind.OpenAngle;[<];
  64361. - SyntaxKind.Text;[br];
  64362. - SyntaxKind.CloseAngle;[>];
  64363. - Tag block - Gen<None> - 7 - (77:7,4)
  64364. - Markup span - Gen<Markup> - [<other>] - SpanEditHandler;Accepts:Any - (77:7,4) - Tokens:3
  64365. - SyntaxKind.OpenAngle;[<];
  64366. - SyntaxKind.Text;[other];
  64367. - SyntaxKind.CloseAngle;[>];
  64368. - SyntaxKind.HtmlTextLiteral - [ var x = true;LF}LF{LF] - [84..106) - FullWidth: 22 - Slots: 1
  64369. - SyntaxKind.List - [ var x = true;LF}LF{LF] - [84..106) - FullWidth: 22 - Slots: 13
  64370. - SyntaxKind.Whitespace;[ ];
  64371. - SyntaxKind.Text;[var];
  64372. - SyntaxKind.Whitespace;[ ];
  64373. - SyntaxKind.Text;[x];
  64374. - SyntaxKind.Whitespace;[ ];
  64375. - SyntaxKind.Equals;[=];
  64376. - SyntaxKind.Whitespace;[ ];
  64377. - SyntaxKind.Text;[true;];
  64378. - SyntaxKind.NewLine;[LF];
  64379. - SyntaxKind.Text;[}];
  64380. - SyntaxKind.NewLine;[LF];
  64381. - SyntaxKind.Text;[{];
  64382. - SyntaxKind.NewLine;[LF];
  64383. - Tag block - Gen<None> - 5 - (106:10,0)
  64384. - Markup span - Gen<Markup> - [<col>] - SpanEditHandler;Accepts:Any - (106:10,0) - Tokens:3
  64385. - SyntaxKind.OpenAngle;[<];
  64386. - SyntaxKind.Text;[col];
  64387. - SyntaxKind.CloseAngle;[>];
  64388. - Tag block - Gen<None> - 7 - (111:10,5)
  64389. - Markup span - Gen<Markup> - [<other>] - SpanEditHandler;Accepts:Any - (111:10,5) - Tokens:3
  64390. - SyntaxKind.OpenAngle;[<];
  64391. - SyntaxKind.Text;[other];
  64392. - SyntaxKind.CloseAngle;[>];
  64393. - SyntaxKind.HtmlTextLiteral - [ var x = true;LF}LF{LF] - [118..140) - FullWidth: 22 - Slots: 1
  64394. - SyntaxKind.List - [ var x = true;LF}LF{LF] - [118..140) - FullWidth: 22 - Slots: 13
  64395. - SyntaxKind.Whitespace;[ ];
  64396. - SyntaxKind.Text;[var];
  64397. - SyntaxKind.Whitespace;[ ];
  64398. - SyntaxKind.Text;[x];
  64399. - SyntaxKind.Whitespace;[ ];
  64400. - SyntaxKind.Equals;[=];
  64401. - SyntaxKind.Whitespace;[ ];
  64402. - SyntaxKind.Text;[true;];
  64403. - SyntaxKind.NewLine;[LF];
  64404. - SyntaxKind.Text;[}];
  64405. - SyntaxKind.NewLine;[LF];
  64406. - SyntaxKind.Text;[{];
  64407. - SyntaxKind.NewLine;[LF];
  64408. - Tag block - Gen<None> - 9 - (140:13,0)
  64409. - Markup span - Gen<Markup> - [<command>] - SpanEditHandler;Accepts:Any - (140:13,0) - Tokens:3
  64410. - SyntaxKind.OpenAngle;[<];
  64411. - SyntaxKind.Text;[command];
  64412. - SyntaxKind.CloseAngle;[>];
  64413. - Tag block - Gen<None> - 7 - (149:13,9)
  64414. - Markup span - Gen<Markup> - [<other>] - SpanEditHandler;Accepts:Any - (149:13,9) - Tokens:3
  64415. - SyntaxKind.OpenAngle;[<];
  64416. - SyntaxKind.Text;[other];
  64417. - SyntaxKind.CloseAngle;[>];
  64418. - SyntaxKind.HtmlTextLiteral - [ var x = true;LF}LF{LF] - [156..178) - FullWidth: 22 - Slots: 1
  64419. - SyntaxKind.List - [ var x = true;LF}LF{LF] - [156..178) - FullWidth: 22 - Slots: 13
  64420. - SyntaxKind.Whitespace;[ ];
  64421. - SyntaxKind.Text;[var];
  64422. - SyntaxKind.Whitespace;[ ];
  64423. - SyntaxKind.Text;[x];
  64424. - SyntaxKind.Whitespace;[ ];
  64425. - SyntaxKind.Equals;[=];
  64426. - SyntaxKind.Whitespace;[ ];
  64427. - SyntaxKind.Text;[true;];
  64428. - SyntaxKind.NewLine;[LF];
  64429. - SyntaxKind.Text;[}];
  64430. - SyntaxKind.NewLine;[LF];
  64431. - SyntaxKind.Text;[{];
  64432. - SyntaxKind.NewLine;[LF];
  64433. - Tag block - Gen<None> - 7 - (178:16,0)
  64434. - Markup span - Gen<Markup> - [<embed>] - SpanEditHandler;Accepts:Any - (178:16,0) - Tokens:3
  64435. - SyntaxKind.OpenAngle;[<];
  64436. - SyntaxKind.Text;[embed];
  64437. - SyntaxKind.CloseAngle;[>];
  64438. - Tag block - Gen<None> - 7 - (185:16,7)
  64439. - Markup span - Gen<Markup> - [<other>] - SpanEditHandler;Accepts:Any - (185:16,7) - Tokens:3
  64440. - SyntaxKind.OpenAngle;[<];
  64441. - SyntaxKind.Text;[other];
  64442. - SyntaxKind.CloseAngle;[>];
  64443. - SyntaxKind.HtmlTextLiteral - [ var x = true;LF}LF{LF] - [192..214) - FullWidth: 22 - Slots: 1
  64444. - SyntaxKind.List - [ var x = true;LF}LF{LF] - [192..214) - FullWidth: 22 - Slots: 13
  64445. - SyntaxKind.Whitespace;[ ];
  64446. - SyntaxKind.Text;[var];
  64447. - SyntaxKind.Whitespace;[ ];
  64448. - SyntaxKind.Text;[x];
  64449. - SyntaxKind.Whitespace;[ ];
  64450. - SyntaxKind.Equals;[=];
  64451. - SyntaxKind.Whitespace;[ ];
  64452. - SyntaxKind.Text;[true;];
  64453. - SyntaxKind.NewLine;[LF];
  64454. - SyntaxKind.Text;[}];
  64455. - SyntaxKind.NewLine;[LF];
  64456. - SyntaxKind.Text;[{];
  64457. - SyntaxKind.NewLine;[LF];
  64458. - Tag block - Gen<None> - 4 - (214:19,0)
  64459. - Markup span - Gen<Markup> - [<hr>] - SpanEditHandler;Accepts:Any - (214:19,0) - Tokens:3
  64460. - SyntaxKind.OpenAngle;[<];
  64461. - SyntaxKind.Text;[hr];
  64462. - SyntaxKind.CloseAngle;[>];
  64463. - Tag block - Gen<None> - 7 - (218:19,4)
  64464. - Markup span - Gen<Markup> - [<other>] - SpanEditHandler;Accepts:Any - (218:19,4) - Tokens:3
  64465. - SyntaxKind.OpenAngle;[<];
  64466. - SyntaxKind.Text;[other];
  64467. - SyntaxKind.CloseAngle;[>];
  64468. - SyntaxKind.HtmlTextLiteral - [ var x = true;LF}LF{LF] - [225..247) - FullWidth: 22 - Slots: 1
  64469. - SyntaxKind.List - [ var x = true;LF}LF{LF] - [225..247) - FullWidth: 22 - Slots: 13
  64470. - SyntaxKind.Whitespace;[ ];
  64471. - SyntaxKind.Text;[var];
  64472. - SyntaxKind.Whitespace;[ ];
  64473. - SyntaxKind.Text;[x];
  64474. - SyntaxKind.Whitespace;[ ];
  64475. - SyntaxKind.Equals;[=];
  64476. - SyntaxKind.Whitespace;[ ];
  64477. - SyntaxKind.Text;[true;];
  64478. - SyntaxKind.NewLine;[LF];
  64479. - SyntaxKind.Text;[}];
  64480. - SyntaxKind.NewLine;[LF];
  64481. - SyntaxKind.Text;[{];
  64482. - SyntaxKind.NewLine;[LF];
  64483. - Tag block - Gen<None> - 5 - (247:22,0)
  64484. - Markup span - Gen<Markup> - [<img>] - SpanEditHandler;Accepts:Any - (247:22,0) - Tokens:3
  64485. - SyntaxKind.OpenAngle;[<];
  64486. - SyntaxKind.Text;[img];
  64487. - SyntaxKind.CloseAngle;[>];
  64488. - Tag block - Gen<None> - 7 - (252:22,5)
  64489. - Markup span - Gen<Markup> - [<other>] - SpanEditHandler;Accepts:Any - (252:22,5) - Tokens:3
  64490. - SyntaxKind.OpenAngle;[<];
  64491. - SyntaxKind.Text;[other];
  64492. - SyntaxKind.CloseAngle;[>];
  64493. - SyntaxKind.HtmlTextLiteral - [ var x = true;LF}LF{LF] - [259..281) - FullWidth: 22 - Slots: 1
  64494. - SyntaxKind.List - [ var x = true;LF}LF{LF] - [259..281) - FullWidth: 22 - Slots: 13
  64495. - SyntaxKind.Whitespace;[ ];
  64496. - SyntaxKind.Text;[var];
  64497. - SyntaxKind.Whitespace;[ ];
  64498. - SyntaxKind.Text;[x];
  64499. - SyntaxKind.Whitespace;[ ];
  64500. - SyntaxKind.Equals;[=];
  64501. - SyntaxKind.Whitespace;[ ];
  64502. - SyntaxKind.Text;[true;];
  64503. - SyntaxKind.NewLine;[LF];
  64504. - SyntaxKind.Text;[}];
  64505. - SyntaxKind.NewLine;[LF];
  64506. - SyntaxKind.Text;[{];
  64507. - SyntaxKind.NewLine;[LF];
  64508. - Tag block - Gen<None> - 7 - (281:25,0)
  64509. - Markup span - Gen<Markup> - [<input>] - SpanEditHandler;Accepts:Any - (281:25,0) - Tokens:3
  64510. - SyntaxKind.OpenAngle;[<];
  64511. - SyntaxKind.Text;[input];
  64512. - SyntaxKind.CloseAngle;[>];
  64513. - Tag block - Gen<None> - 7 - (288:25,7)
  64514. - Markup span - Gen<Markup> - [<other>] - SpanEditHandler;Accepts:Any - (288:25,7) - Tokens:3
  64515. - SyntaxKind.OpenAngle;[<];
  64516. - SyntaxKind.Text;[other];
  64517. - SyntaxKind.CloseAngle;[>];
  64518. - SyntaxKind.HtmlTextLiteral - [ var x = true;LF}LF{LF] - [295..317) - FullWidth: 22 - Slots: 1
  64519. - SyntaxKind.List - [ var x = true;LF}LF{LF] - [295..317) - FullWidth: 22 - Slots: 13
  64520. - SyntaxKind.Whitespace;[ ];
  64521. - SyntaxKind.Text;[var];
  64522. - SyntaxKind.Whitespace;[ ];
  64523. - SyntaxKind.Text;[x];
  64524. - SyntaxKind.Whitespace;[ ];
  64525. - SyntaxKind.Equals;[=];
  64526. - SyntaxKind.Whitespace;[ ];
  64527. - SyntaxKind.Text;[true;];
  64528. - SyntaxKind.NewLine;[LF];
  64529. - SyntaxKind.Text;[}];
  64530. - SyntaxKind.NewLine;[LF];
  64531. - SyntaxKind.Text;[{];
  64532. - SyntaxKind.NewLine;[LF];
  64533. - Tag block - Gen<None> - 8 - (317:28,0)
  64534. - Markup span - Gen<Markup> - [<keygen>] - SpanEditHandler;Accepts:Any - (317:28,0) - Tokens:3
  64535. - SyntaxKind.OpenAngle;[<];
  64536. - SyntaxKind.Text;[keygen];
  64537. - SyntaxKind.CloseAngle;[>];
  64538. - Tag block - Gen<None> - 7 - (325:28,8)
  64539. - Markup span - Gen<Markup> - [<other>] - SpanEditHandler;Accepts:Any - (325:28,8) - Tokens:3
  64540. - SyntaxKind.OpenAngle;[<];
  64541. - SyntaxKind.Text;[other];
  64542. - SyntaxKind.CloseAngle;[>];
  64543. - SyntaxKind.HtmlTextLiteral - [ var x = true;LF}LF{LF] - [332..354) - FullWidth: 22 - Slots: 1
  64544. - SyntaxKind.List - [ var x = true;LF}LF{LF] - [332..354) - FullWidth: 22 - Slots: 13
  64545. - SyntaxKind.Whitespace;[ ];
  64546. - SyntaxKind.Text;[var];
  64547. - SyntaxKind.Whitespace;[ ];
  64548. - SyntaxKind.Text;[x];
  64549. - SyntaxKind.Whitespace;[ ];
  64550. - SyntaxKind.Equals;[=];
  64551. - SyntaxKind.Whitespace;[ ];
  64552. - SyntaxKind.Text;[true;];
  64553. - SyntaxKind.NewLine;[LF];
  64554. - SyntaxKind.Text;[}];
  64555. - SyntaxKind.NewLine;[LF];
  64556. - SyntaxKind.Text;[{];
  64557. - SyntaxKind.NewLine;[LF];
  64558. - Tag block - Gen<None> - 6 - (354:31,0)
  64559. - Markup span - Gen<Markup> - [<link>] - SpanEditHandler;Accepts:Any - (354:31,0) - Tokens:3
  64560. - SyntaxKind.OpenAngle;[<];
  64561. - SyntaxKind.Text;[link];
  64562. - SyntaxKind.CloseAngle;[>];
  64563. - Tag block - Gen<None> - 7 - (360:31,6)
  64564. - Markup span - Gen<Markup> - [<other>] - SpanEditHandler;Accepts:Any - (360:31,6) - Tokens:3
  64565. - SyntaxKind.OpenAngle;[<];
  64566. - SyntaxKind.Text;[other];
  64567. - SyntaxKind.CloseAngle;[>];
  64568. - SyntaxKind.HtmlTextLiteral - [ var x = true;LF}LF{LF] - [367..389) - FullWidth: 22 - Slots: 1
  64569. - SyntaxKind.List - [ var x = true;LF}LF{LF] - [367..389) - FullWidth: 22 - Slots: 13
  64570. - SyntaxKind.Whitespace;[ ];
  64571. - SyntaxKind.Text;[var];
  64572. - SyntaxKind.Whitespace;[ ];
  64573. - SyntaxKind.Text;[x];
  64574. - SyntaxKind.Whitespace;[ ];
  64575. - SyntaxKind.Equals;[=];
  64576. - SyntaxKind.Whitespace;[ ];
  64577. - SyntaxKind.Text;[true;];
  64578. - SyntaxKind.NewLine;[LF];
  64579. - SyntaxKind.Text;[}];
  64580. - SyntaxKind.NewLine;[LF];
  64581. - SyntaxKind.Text;[{];
  64582. - SyntaxKind.NewLine;[LF];
  64583. - Tag block - Gen<None> - 6 - (389:34,0)
  64584. - Markup span - Gen<Markup> - [<meta>] - SpanEditHandler;Accepts:Any - (389:34,0) - Tokens:3
  64585. - SyntaxKind.OpenAngle;[<];
  64586. - SyntaxKind.Text;[meta];
  64587. - SyntaxKind.CloseAngle;[>];
  64588. - Tag block - Gen<None> - 7 - (395:34,6)
  64589. - Markup span - Gen<Markup> - [<other>] - SpanEditHandler;Accepts:Any - (395:34,6) - Tokens:3
  64590. - SyntaxKind.OpenAngle;[<];
  64591. - SyntaxKind.Text;[other];
  64592. - SyntaxKind.CloseAngle;[>];
  64593. - SyntaxKind.HtmlTextLiteral - [ var x = true;LF}LF{LF] - [402..424) - FullWidth: 22 - Slots: 1
  64594. - SyntaxKind.List - [ var x = true;LF}LF{LF] - [402..424) - FullWidth: 22 - Slots: 13
  64595. - SyntaxKind.Whitespace;[ ];
  64596. - SyntaxKind.Text;[var];
  64597. - SyntaxKind.Whitespace;[ ];
  64598. - SyntaxKind.Text;[x];
  64599. - SyntaxKind.Whitespace;[ ];
  64600. - SyntaxKind.Equals;[=];
  64601. - SyntaxKind.Whitespace;[ ];
  64602. - SyntaxKind.Text;[true;];
  64603. - SyntaxKind.NewLine;[LF];
  64604. - SyntaxKind.Text;[}];
  64605. - SyntaxKind.NewLine;[LF];
  64606. - SyntaxKind.Text;[{];
  64607. - SyntaxKind.NewLine;[LF];
  64608. - Tag block - Gen<None> - 7 - (424:37,0)
  64609. - Markup span - Gen<Markup> - [<param>] - SpanEditHandler;Accepts:Any - (424:37,0) - Tokens:3
  64610. - SyntaxKind.OpenAngle;[<];
  64611. - SyntaxKind.Text;[param];
  64612. - SyntaxKind.CloseAngle;[>];
  64613. - Tag block - Gen<None> - 7 - (431:37,7)
  64614. - Markup span - Gen<Markup> - [<other>] - SpanEditHandler;Accepts:Any - (431:37,7) - Tokens:3
  64615. - SyntaxKind.OpenAngle;[<];
  64616. - SyntaxKind.Text;[other];
  64617. - SyntaxKind.CloseAngle;[>];
  64618. - SyntaxKind.HtmlTextLiteral - [ var x = true;LF}LF{LF] - [438..460) - FullWidth: 22 - Slots: 1
  64619. - SyntaxKind.List - [ var x = true;LF}LF{LF] - [438..460) - FullWidth: 22 - Slots: 13
  64620. - SyntaxKind.Whitespace;[ ];
  64621. - SyntaxKind.Text;[var];
  64622. - SyntaxKind.Whitespace;[ ];
  64623. - SyntaxKind.Text;[x];
  64624. - SyntaxKind.Whitespace;[ ];
  64625. - SyntaxKind.Equals;[=];
  64626. - SyntaxKind.Whitespace;[ ];
  64627. - SyntaxKind.Text;[true;];
  64628. - SyntaxKind.NewLine;[LF];
  64629. - SyntaxKind.Text;[}];
  64630. - SyntaxKind.NewLine;[LF];
  64631. - SyntaxKind.Text;[{];
  64632. - SyntaxKind.NewLine;[LF];
  64633. - Tag block - Gen<None> - 8 - (460:40,0)
  64634. - Markup span - Gen<Markup> - [<source>] - SpanEditHandler;Accepts:Any - (460:40,0) - Tokens:3
  64635. - SyntaxKind.OpenAngle;[<];
  64636. - SyntaxKind.Text;[source];
  64637. - SyntaxKind.CloseAngle;[>];
  64638. - Tag block - Gen<None> - 7 - (468:40,8)
  64639. - Markup span - Gen<Markup> - [<other>] - SpanEditHandler;Accepts:Any - (468:40,8) - Tokens:3
  64640. - SyntaxKind.OpenAngle;[<];
  64641. - SyntaxKind.Text;[other];
  64642. - SyntaxKind.CloseAngle;[>];
  64643. - SyntaxKind.HtmlTextLiteral - [ var x = true;LF}LF{LF] - [475..497) - FullWidth: 22 - Slots: 1
  64644. - SyntaxKind.List - [ var x = true;LF}LF{LF] - [475..497) - FullWidth: 22 - Slots: 13
  64645. - SyntaxKind.Whitespace;[ ];
  64646. - SyntaxKind.Text;[var];
  64647. - SyntaxKind.Whitespace;[ ];
  64648. - SyntaxKind.Text;[x];
  64649. - SyntaxKind.Whitespace;[ ];
  64650. - SyntaxKind.Equals;[=];
  64651. - SyntaxKind.Whitespace;[ ];
  64652. - SyntaxKind.Text;[true;];
  64653. - SyntaxKind.NewLine;[LF];
  64654. - SyntaxKind.Text;[}];
  64655. - SyntaxKind.NewLine;[LF];
  64656. - SyntaxKind.Text;[{];
  64657. - SyntaxKind.NewLine;[LF];
  64658. - Tag block - Gen<None> - 7 - (497:43,0)
  64659. - Markup span - Gen<Markup> - [<track>] - SpanEditHandler;Accepts:Any - (497:43,0) - Tokens:3
  64660. - SyntaxKind.OpenAngle;[<];
  64661. - SyntaxKind.Text;[track];
  64662. - SyntaxKind.CloseAngle;[>];
  64663. - Tag block - Gen<None> - 7 - (504:43,7)
  64664. - Markup span - Gen<Markup> - [<other>] - SpanEditHandler;Accepts:Any - (504:43,7) - Tokens:3
  64665. - SyntaxKind.OpenAngle;[<];
  64666. - SyntaxKind.Text;[other];
  64667. - SyntaxKind.CloseAngle;[>];
  64668. - SyntaxKind.HtmlTextLiteral - [ var x = true;LF}LF{LF] - [511..533) - FullWidth: 22 - Slots: 1
  64669. - SyntaxKind.List - [ var x = true;LF}LF{LF] - [511..533) - FullWidth: 22 - Slots: 13
  64670. - SyntaxKind.Whitespace;[ ];
  64671. - SyntaxKind.Text;[var];
  64672. - SyntaxKind.Whitespace;[ ];
  64673. - SyntaxKind.Text;[x];
  64674. - SyntaxKind.Whitespace;[ ];
  64675. - SyntaxKind.Equals;[=];
  64676. - SyntaxKind.Whitespace;[ ];
  64677. - SyntaxKind.Text;[true;];
  64678. - SyntaxKind.NewLine;[LF];
  64679. - SyntaxKind.Text;[}];
  64680. - SyntaxKind.NewLine;[LF];
  64681. - SyntaxKind.Text;[{];
  64682. - SyntaxKind.NewLine;[LF];
  64683. - Tag block - Gen<None> - 5 - (533:46,0)
  64684. - Markup span - Gen<Markup> - [<wbr>] - SpanEditHandler;Accepts:Any - (533:46,0) - Tokens:3
  64685. - SyntaxKind.OpenAngle;[<];
  64686. - SyntaxKind.Text;[wbr];
  64687. - SyntaxKind.CloseAngle;[>];
  64688. - Tag block - Gen<None> - 7 - (538:46,5)
  64689. - Markup span - Gen<Markup> - [<other>] - SpanEditHandler;Accepts:Any - (538:46,5) - Tokens:3
  64690. - SyntaxKind.OpenAngle;[<];
  64691. - SyntaxKind.Text;[other];
  64692. - SyntaxKind.CloseAngle;[>];
  64693. - Markup span - Gen<Markup> - [ var x = true;LF}LF] - SpanEditHandler;Accepts:Any - (545:46,12) - Tokens:11
  64694. - SyntaxKind.Whitespace;[ ];
  64695. - SyntaxKind.Text;[var];
  64696. - SyntaxKind.Whitespace;[ ];
  64697. - SyntaxKind.Text;[x];
  64698. - SyntaxKind.Whitespace;[ ];
  64699. - SyntaxKind.Equals;[=];
  64700. - SyntaxKind.Whitespace;[ ];
  64701. - SyntaxKind.Text;[true;];
  64702. - SyntaxKind.NewLine;[LF];
  64703. - SyntaxKind.Text;[}];
  64704. - SyntaxKind.NewLine;[LF];
  64705. +RazorDocument - [0..564)::564 - [{LF<area><other> var x = true;LF}LF{LF<base><other> var x = true;LF}LF{LF<br><other> var x = true;LF}LF{LF<col><other> var x = true;LF}LF{LF<command><other> var x = true;LF}LF{LF<embed><other> var x = true;LF}LF{LF<hr><other> var x = true;LF}LF{LF<img><other> var x = true;LF}LF{LF<input><other> var x = true;LF}LF{LF<keygen><other> var x = true;LF}LF{LF<link><other> var x = true;LF}LF{LF<meta><other> var x = true;LF}LF{LF<param><other> var x = true;LF}LF{LF<source><other> var x = true;LF}LF{LF<track><other> var x = true;LF}LF{LF<wbr><other> var x = true;LF}LF]
  64706. + MarkupBlock - [0..564)::564
  64707. + MarkupTextLiteral - [0..3)::3 - [{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64708. + Text;[{];
  64709. + NewLine;[LF];
  64710. + MarkupTagBlock - [3..9)::6 - [<area>]
  64711. + MarkupTextLiteral - [3..9)::6 - [<area>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64712. + OpenAngle;[<];
  64713. + Text;[area];
  64714. + CloseAngle;[>];
  64715. + MarkupTagBlock - [9..16)::7 - [<other>]
  64716. + MarkupTextLiteral - [9..16)::7 - [<other>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64717. + OpenAngle;[<];
  64718. + Text;[other];
  64719. + CloseAngle;[>];
  64720. + MarkupTextLiteral - [16..38)::22 - [ var x = true;LF}LF{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64721. + Whitespace;[ ];
  64722. + Text;[var];
  64723. + Whitespace;[ ];
  64724. + Text;[x];
  64725. + Whitespace;[ ];
  64726. + Equals;[=];
  64727. + Whitespace;[ ];
  64728. + Text;[true;];
  64729. + NewLine;[LF];
  64730. + Text;[}];
  64731. + NewLine;[LF];
  64732. + Text;[{];
  64733. + NewLine;[LF];
  64734. + MarkupTagBlock - [38..44)::6 - [<base>]
  64735. + MarkupTextLiteral - [38..44)::6 - [<base>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64736. + OpenAngle;[<];
  64737. + Text;[base];
  64738. + CloseAngle;[>];
  64739. + MarkupTagBlock - [44..51)::7 - [<other>]
  64740. + MarkupTextLiteral - [44..51)::7 - [<other>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64741. + OpenAngle;[<];
  64742. + Text;[other];
  64743. + CloseAngle;[>];
  64744. + MarkupTextLiteral - [51..73)::22 - [ var x = true;LF}LF{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64745. + Whitespace;[ ];
  64746. + Text;[var];
  64747. + Whitespace;[ ];
  64748. + Text;[x];
  64749. + Whitespace;[ ];
  64750. + Equals;[=];
  64751. + Whitespace;[ ];
  64752. + Text;[true;];
  64753. + NewLine;[LF];
  64754. + Text;[}];
  64755. + NewLine;[LF];
  64756. + Text;[{];
  64757. + NewLine;[LF];
  64758. + MarkupTagBlock - [73..77)::4 - [<br>]
  64759. + MarkupTextLiteral - [73..77)::4 - [<br>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64760. + OpenAngle;[<];
  64761. + Text;[br];
  64762. + CloseAngle;[>];
  64763. + MarkupTagBlock - [77..84)::7 - [<other>]
  64764. + MarkupTextLiteral - [77..84)::7 - [<other>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64765. + OpenAngle;[<];
  64766. + Text;[other];
  64767. + CloseAngle;[>];
  64768. + MarkupTextLiteral - [84..106)::22 - [ var x = true;LF}LF{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64769. + Whitespace;[ ];
  64770. + Text;[var];
  64771. + Whitespace;[ ];
  64772. + Text;[x];
  64773. + Whitespace;[ ];
  64774. + Equals;[=];
  64775. + Whitespace;[ ];
  64776. + Text;[true;];
  64777. + NewLine;[LF];
  64778. + Text;[}];
  64779. + NewLine;[LF];
  64780. + Text;[{];
  64781. + NewLine;[LF];
  64782. + MarkupTagBlock - [106..111)::5 - [<col>]
  64783. + MarkupTextLiteral - [106..111)::5 - [<col>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64784. + OpenAngle;[<];
  64785. + Text;[col];
  64786. + CloseAngle;[>];
  64787. + MarkupTagBlock - [111..118)::7 - [<other>]
  64788. + MarkupTextLiteral - [111..118)::7 - [<other>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64789. + OpenAngle;[<];
  64790. + Text;[other];
  64791. + CloseAngle;[>];
  64792. + MarkupTextLiteral - [118..140)::22 - [ var x = true;LF}LF{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64793. + Whitespace;[ ];
  64794. + Text;[var];
  64795. + Whitespace;[ ];
  64796. + Text;[x];
  64797. + Whitespace;[ ];
  64798. + Equals;[=];
  64799. + Whitespace;[ ];
  64800. + Text;[true;];
  64801. + NewLine;[LF];
  64802. + Text;[}];
  64803. + NewLine;[LF];
  64804. + Text;[{];
  64805. + NewLine;[LF];
  64806. + MarkupTagBlock - [140..149)::9 - [<command>]
  64807. + MarkupTextLiteral - [140..149)::9 - [<command>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64808. + OpenAngle;[<];
  64809. + Text;[command];
  64810. + CloseAngle;[>];
  64811. + MarkupTagBlock - [149..156)::7 - [<other>]
  64812. + MarkupTextLiteral - [149..156)::7 - [<other>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64813. + OpenAngle;[<];
  64814. + Text;[other];
  64815. + CloseAngle;[>];
  64816. + MarkupTextLiteral - [156..178)::22 - [ var x = true;LF}LF{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64817. + Whitespace;[ ];
  64818. + Text;[var];
  64819. + Whitespace;[ ];
  64820. + Text;[x];
  64821. + Whitespace;[ ];
  64822. + Equals;[=];
  64823. + Whitespace;[ ];
  64824. + Text;[true;];
  64825. + NewLine;[LF];
  64826. + Text;[}];
  64827. + NewLine;[LF];
  64828. + Text;[{];
  64829. + NewLine;[LF];
  64830. + MarkupTagBlock - [178..185)::7 - [<embed>]
  64831. + MarkupTextLiteral - [178..185)::7 - [<embed>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64832. + OpenAngle;[<];
  64833. + Text;[embed];
  64834. + CloseAngle;[>];
  64835. + MarkupTagBlock - [185..192)::7 - [<other>]
  64836. + MarkupTextLiteral - [185..192)::7 - [<other>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64837. + OpenAngle;[<];
  64838. + Text;[other];
  64839. + CloseAngle;[>];
  64840. + MarkupTextLiteral - [192..214)::22 - [ var x = true;LF}LF{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64841. + Whitespace;[ ];
  64842. + Text;[var];
  64843. + Whitespace;[ ];
  64844. + Text;[x];
  64845. + Whitespace;[ ];
  64846. + Equals;[=];
  64847. + Whitespace;[ ];
  64848. + Text;[true;];
  64849. + NewLine;[LF];
  64850. + Text;[}];
  64851. + NewLine;[LF];
  64852. + Text;[{];
  64853. + NewLine;[LF];
  64854. + MarkupTagBlock - [214..218)::4 - [<hr>]
  64855. + MarkupTextLiteral - [214..218)::4 - [<hr>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64856. + OpenAngle;[<];
  64857. + Text;[hr];
  64858. + CloseAngle;[>];
  64859. + MarkupTagBlock - [218..225)::7 - [<other>]
  64860. + MarkupTextLiteral - [218..225)::7 - [<other>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64861. + OpenAngle;[<];
  64862. + Text;[other];
  64863. + CloseAngle;[>];
  64864. + MarkupTextLiteral - [225..247)::22 - [ var x = true;LF}LF{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64865. + Whitespace;[ ];
  64866. + Text;[var];
  64867. + Whitespace;[ ];
  64868. + Text;[x];
  64869. + Whitespace;[ ];
  64870. + Equals;[=];
  64871. + Whitespace;[ ];
  64872. + Text;[true;];
  64873. + NewLine;[LF];
  64874. + Text;[}];
  64875. + NewLine;[LF];
  64876. + Text;[{];
  64877. + NewLine;[LF];
  64878. + MarkupTagBlock - [247..252)::5 - [<img>]
  64879. + MarkupTextLiteral - [247..252)::5 - [<img>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64880. + OpenAngle;[<];
  64881. + Text;[img];
  64882. + CloseAngle;[>];
  64883. + MarkupTagBlock - [252..259)::7 - [<other>]
  64884. + MarkupTextLiteral - [252..259)::7 - [<other>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64885. + OpenAngle;[<];
  64886. + Text;[other];
  64887. + CloseAngle;[>];
  64888. + MarkupTextLiteral - [259..281)::22 - [ var x = true;LF}LF{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64889. + Whitespace;[ ];
  64890. + Text;[var];
  64891. + Whitespace;[ ];
  64892. + Text;[x];
  64893. + Whitespace;[ ];
  64894. + Equals;[=];
  64895. + Whitespace;[ ];
  64896. + Text;[true;];
  64897. + NewLine;[LF];
  64898. + Text;[}];
  64899. + NewLine;[LF];
  64900. + Text;[{];
  64901. + NewLine;[LF];
  64902. + MarkupTagBlock - [281..288)::7 - [<input>]
  64903. + MarkupTextLiteral - [281..288)::7 - [<input>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64904. + OpenAngle;[<];
  64905. + Text;[input];
  64906. + CloseAngle;[>];
  64907. + MarkupTagBlock - [288..295)::7 - [<other>]
  64908. + MarkupTextLiteral - [288..295)::7 - [<other>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64909. + OpenAngle;[<];
  64910. + Text;[other];
  64911. + CloseAngle;[>];
  64912. + MarkupTextLiteral - [295..317)::22 - [ var x = true;LF}LF{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64913. + Whitespace;[ ];
  64914. + Text;[var];
  64915. + Whitespace;[ ];
  64916. + Text;[x];
  64917. + Whitespace;[ ];
  64918. + Equals;[=];
  64919. + Whitespace;[ ];
  64920. + Text;[true;];
  64921. + NewLine;[LF];
  64922. + Text;[}];
  64923. + NewLine;[LF];
  64924. + Text;[{];
  64925. + NewLine;[LF];
  64926. + MarkupTagBlock - [317..325)::8 - [<keygen>]
  64927. + MarkupTextLiteral - [317..325)::8 - [<keygen>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64928. + OpenAngle;[<];
  64929. + Text;[keygen];
  64930. + CloseAngle;[>];
  64931. + MarkupTagBlock - [325..332)::7 - [<other>]
  64932. + MarkupTextLiteral - [325..332)::7 - [<other>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64933. + OpenAngle;[<];
  64934. + Text;[other];
  64935. + CloseAngle;[>];
  64936. + MarkupTextLiteral - [332..354)::22 - [ var x = true;LF}LF{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64937. + Whitespace;[ ];
  64938. + Text;[var];
  64939. + Whitespace;[ ];
  64940. + Text;[x];
  64941. + Whitespace;[ ];
  64942. + Equals;[=];
  64943. + Whitespace;[ ];
  64944. + Text;[true;];
  64945. + NewLine;[LF];
  64946. + Text;[}];
  64947. + NewLine;[LF];
  64948. + Text;[{];
  64949. + NewLine;[LF];
  64950. + MarkupTagBlock - [354..360)::6 - [<link>]
  64951. + MarkupTextLiteral - [354..360)::6 - [<link>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64952. + OpenAngle;[<];
  64953. + Text;[link];
  64954. + CloseAngle;[>];
  64955. + MarkupTagBlock - [360..367)::7 - [<other>]
  64956. + MarkupTextLiteral - [360..367)::7 - [<other>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64957. + OpenAngle;[<];
  64958. + Text;[other];
  64959. + CloseAngle;[>];
  64960. + MarkupTextLiteral - [367..389)::22 - [ var x = true;LF}LF{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64961. + Whitespace;[ ];
  64962. + Text;[var];
  64963. + Whitespace;[ ];
  64964. + Text;[x];
  64965. + Whitespace;[ ];
  64966. + Equals;[=];
  64967. + Whitespace;[ ];
  64968. + Text;[true;];
  64969. + NewLine;[LF];
  64970. + Text;[}];
  64971. + NewLine;[LF];
  64972. + Text;[{];
  64973. + NewLine;[LF];
  64974. + MarkupTagBlock - [389..395)::6 - [<meta>]
  64975. + MarkupTextLiteral - [389..395)::6 - [<meta>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64976. + OpenAngle;[<];
  64977. + Text;[meta];
  64978. + CloseAngle;[>];
  64979. + MarkupTagBlock - [395..402)::7 - [<other>]
  64980. + MarkupTextLiteral - [395..402)::7 - [<other>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64981. + OpenAngle;[<];
  64982. + Text;[other];
  64983. + CloseAngle;[>];
  64984. + MarkupTextLiteral - [402..424)::22 - [ var x = true;LF}LF{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  64985. + Whitespace;[ ];
  64986. + Text;[var];
  64987. + Whitespace;[ ];
  64988. + Text;[x];
  64989. + Whitespace;[ ];
  64990. + Equals;[=];
  64991. + Whitespace;[ ];
  64992. + Text;[true;];
  64993. + NewLine;[LF];
  64994. + Text;[}];
  64995. + NewLine;[LF];
  64996. + Text;[{];
  64997. + NewLine;[LF];
  64998. + MarkupTagBlock - [424..431)::7 - [<param>]
  64999. + MarkupTextLiteral - [424..431)::7 - [<param>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65000. + OpenAngle;[<];
  65001. + Text;[param];
  65002. + CloseAngle;[>];
  65003. + MarkupTagBlock - [431..438)::7 - [<other>]
  65004. + MarkupTextLiteral - [431..438)::7 - [<other>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65005. + OpenAngle;[<];
  65006. + Text;[other];
  65007. + CloseAngle;[>];
  65008. + MarkupTextLiteral - [438..460)::22 - [ var x = true;LF}LF{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65009. + Whitespace;[ ];
  65010. + Text;[var];
  65011. + Whitespace;[ ];
  65012. + Text;[x];
  65013. + Whitespace;[ ];
  65014. + Equals;[=];
  65015. + Whitespace;[ ];
  65016. + Text;[true;];
  65017. + NewLine;[LF];
  65018. + Text;[}];
  65019. + NewLine;[LF];
  65020. + Text;[{];
  65021. + NewLine;[LF];
  65022. + MarkupTagBlock - [460..468)::8 - [<source>]
  65023. + MarkupTextLiteral - [460..468)::8 - [<source>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65024. + OpenAngle;[<];
  65025. + Text;[source];
  65026. + CloseAngle;[>];
  65027. + MarkupTagBlock - [468..475)::7 - [<other>]
  65028. + MarkupTextLiteral - [468..475)::7 - [<other>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65029. + OpenAngle;[<];
  65030. + Text;[other];
  65031. + CloseAngle;[>];
  65032. + MarkupTextLiteral - [475..497)::22 - [ var x = true;LF}LF{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65033. + Whitespace;[ ];
  65034. + Text;[var];
  65035. + Whitespace;[ ];
  65036. + Text;[x];
  65037. + Whitespace;[ ];
  65038. + Equals;[=];
  65039. + Whitespace;[ ];
  65040. + Text;[true;];
  65041. + NewLine;[LF];
  65042. + Text;[}];
  65043. + NewLine;[LF];
  65044. + Text;[{];
  65045. + NewLine;[LF];
  65046. + MarkupTagBlock - [497..504)::7 - [<track>]
  65047. + MarkupTextLiteral - [497..504)::7 - [<track>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65048. + OpenAngle;[<];
  65049. + Text;[track];
  65050. + CloseAngle;[>];
  65051. + MarkupTagBlock - [504..511)::7 - [<other>]
  65052. + MarkupTextLiteral - [504..511)::7 - [<other>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65053. + OpenAngle;[<];
  65054. + Text;[other];
  65055. + CloseAngle;[>];
  65056. + MarkupTextLiteral - [511..533)::22 - [ var x = true;LF}LF{LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65057. + Whitespace;[ ];
  65058. + Text;[var];
  65059. + Whitespace;[ ];
  65060. + Text;[x];
  65061. + Whitespace;[ ];
  65062. + Equals;[=];
  65063. + Whitespace;[ ];
  65064. + Text;[true;];
  65065. + NewLine;[LF];
  65066. + Text;[}];
  65067. + NewLine;[LF];
  65068. + Text;[{];
  65069. + NewLine;[LF];
  65070. + MarkupTagBlock - [533..538)::5 - [<wbr>]
  65071. + MarkupTextLiteral - [533..538)::5 - [<wbr>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65072. + OpenAngle;[<];
  65073. + Text;[wbr];
  65074. + CloseAngle;[>];
  65075. + MarkupTagBlock - [538..545)::7 - [<other>]
  65076. + MarkupTextLiteral - [538..545)::7 - [<other>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65077. + OpenAngle;[<];
  65078. + Text;[other];
  65079. + CloseAngle;[>];
  65080. + MarkupTextLiteral - [545..564)::19 - [ var x = true;LF}LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65081. + Whitespace;[ ];
  65082. + Text;[var];
  65083. + Whitespace;[ ];
  65084. + Text;[x];
  65085. + Whitespace;[ ];
  65086. + Equals;[=];
  65087. + Whitespace;[ ];
  65088. + Text;[true;];
  65089. + NewLine;[LF];
  65090. + Text;[}];
  65091. + NewLine;[LF];
  65092. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/CSharpCodeParserDoesNotAcceptLeadingOrTrailingWhitespaceInDesignMode.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/CSharpCodeParserDoesNotAcceptLeadingOrTrailingWhitespaceInDesignMode.stree.txt
  65093. index d4075c375ea..df63ae32374 100644
  65094. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/CSharpCodeParserDoesNotAcceptLeadingOrTrailingWhitespaceInDesignMode.stree.txt
  65095. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/CSharpCodeParserDoesNotAcceptLeadingOrTrailingWhitespaceInDesignMode.stree.txt
  65096. @@ -1,64 +1,67 @@
  65097. -Markup block - Gen<None> - 95 - (0:0,0)
  65098. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  65099. - SyntaxKind.Whitespace;[ ];
  65100. - Tag block - Gen<None> - 4 - (3:0,3)
  65101. - Markup span - Gen<Markup> - [<ul>] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:3
  65102. - SyntaxKind.OpenAngle;[<];
  65103. - SyntaxKind.Text;[ul];
  65104. - SyntaxKind.CloseAngle;[>];
  65105. - Markup span - Gen<Markup> - [LF ] - SpanEditHandler;Accepts:Any - (7:0,7) - Tokens:2
  65106. - SyntaxKind.NewLine;[LF];
  65107. - SyntaxKind.Whitespace;[ ];
  65108. - Statement block - Gen<None> - 71 - (13:1,4)
  65109. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (13:1,4) - Tokens:1
  65110. - SyntaxKind.Transition;[@];
  65111. - Code span - Gen<Stmt> - [foreach(var p in Products) {LF ] - SpanEditHandler;Accepts:Any - (14:1,5) - Tokens:14
  65112. - SyntaxKind.Keyword;[foreach];
  65113. - SyntaxKind.LeftParenthesis;[(];
  65114. - SyntaxKind.Identifier;[var];
  65115. - SyntaxKind.Whitespace;[ ];
  65116. - SyntaxKind.Identifier;[p];
  65117. - SyntaxKind.Whitespace;[ ];
  65118. - SyntaxKind.Keyword;[in];
  65119. - SyntaxKind.Whitespace;[ ];
  65120. - SyntaxKind.Identifier;[Products];
  65121. - SyntaxKind.RightParenthesis;[)];
  65122. - SyntaxKind.Whitespace;[ ];
  65123. - SyntaxKind.LeftBrace;[{];
  65124. - SyntaxKind.NewLine;[LF];
  65125. - SyntaxKind.Whitespace;[ ];
  65126. - Markup block - Gen<None> - 25 - (52:2,8)
  65127. - Tag block - Gen<None> - 4 - (52:2,8)
  65128. - Markup span - Gen<Markup> - [<li>] - SpanEditHandler;Accepts:None - (52:2,8) - Tokens:3
  65129. - SyntaxKind.OpenAngle;[<];
  65130. - SyntaxKind.Text;[li];
  65131. - SyntaxKind.CloseAngle;[>];
  65132. - Markup span - Gen<Markup> - [Product: ] - SpanEditHandler;Accepts:Any - (56:2,12) - Tokens:2
  65133. - SyntaxKind.Text;[Product:];
  65134. - SyntaxKind.Whitespace;[ ];
  65135. - Expression block - Gen<Expr> - 7 - (65:2,21)
  65136. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (65:2,21) - Tokens:1
  65137. - SyntaxKind.Transition;[@];
  65138. - Code span - Gen<Expr> - [p.Name] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (66:2,22) - Tokens:3
  65139. - SyntaxKind.Identifier;[p];
  65140. - SyntaxKind.Dot;[.];
  65141. - SyntaxKind.Identifier;[Name];
  65142. - Tag block - Gen<None> - 5 - (72:2,28)
  65143. - Markup span - Gen<Markup> - [</li>] - SpanEditHandler;Accepts:None - (72:2,28) - Tokens:4
  65144. - SyntaxKind.OpenAngle;[<];
  65145. - SyntaxKind.ForwardSlash;[/];
  65146. - SyntaxKind.Text;[li];
  65147. - SyntaxKind.CloseAngle;[>];
  65148. - Code span - Gen<Stmt> - [LF }] - SpanEditHandler;Accepts:None - (77:2,33) - Tokens:3
  65149. - SyntaxKind.NewLine;[LF];
  65150. - SyntaxKind.Whitespace;[ ];
  65151. - SyntaxKind.RightBrace;[}];
  65152. - Markup span - Gen<Markup> - [LF ] - SpanEditHandler;Accepts:Any - (84:3,5) - Tokens:2
  65153. - SyntaxKind.NewLine;[LF];
  65154. - SyntaxKind.Whitespace;[ ];
  65155. - Tag block - Gen<None> - 5 - (90:4,4)
  65156. - Markup span - Gen<Markup> - [</ul>] - SpanEditHandler;Accepts:None - (90:4,4) - Tokens:4
  65157. - SyntaxKind.OpenAngle;[<];
  65158. - SyntaxKind.ForwardSlash;[/];
  65159. - SyntaxKind.Text;[ul];
  65160. - SyntaxKind.CloseAngle;[>];
  65161. +MarkupBlock - [0..95)::95 - [ <ul>LF @foreach(var p in Products) {LF <li>Product: @p.Name</li>LF }LF </ul>]
  65162. + MarkupTextLiteral - [0..3)::3 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65163. + Whitespace;[ ];
  65164. + MarkupTagBlock - [3..7)::4 - [<ul>]
  65165. + MarkupTextLiteral - [3..7)::4 - [<ul>] - Gen<Markup> - SpanEditHandler;Accepts:None
  65166. + OpenAngle;[<];
  65167. + Text;[ul];
  65168. + CloseAngle;[>];
  65169. + MarkupTextLiteral - [7..13)::6 - [LF ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65170. + NewLine;[LF];
  65171. + Whitespace;[ ];
  65172. + CSharpCodeBlock - [13..84)::71
  65173. + CSharpTransition - [13..14)::1 - Gen<None> - SpanEditHandler;Accepts:None
  65174. + Transition;[@];
  65175. + CSharpStatementLiteral - [14..52)::38 - [foreach(var p in Products) {LF ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  65176. + Keyword;[foreach];
  65177. + LeftParenthesis;[(];
  65178. + Identifier;[var];
  65179. + Whitespace;[ ];
  65180. + Identifier;[p];
  65181. + Whitespace;[ ];
  65182. + Keyword;[in];
  65183. + Whitespace;[ ];
  65184. + Identifier;[Products];
  65185. + RightParenthesis;[)];
  65186. + Whitespace;[ ];
  65187. + LeftBrace;[{];
  65188. + NewLine;[LF];
  65189. + Whitespace;[ ];
  65190. + MarkupBlock - [52..77)::25
  65191. + MarkupTagBlock - [52..56)::4 - [<li>]
  65192. + MarkupTextLiteral - [52..56)::4 - [<li>] - Gen<Markup> - SpanEditHandler;Accepts:None
  65193. + OpenAngle;[<];
  65194. + Text;[li];
  65195. + CloseAngle;[>];
  65196. + MarkupTextLiteral - [56..65)::9 - [Product: ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65197. + Text;[Product:];
  65198. + Whitespace;[ ];
  65199. + CSharpCodeBlock - [65..72)::7
  65200. + CSharpImplicitExpression - [65..72)::7
  65201. + CSharpTransition - [65..66)::1 - Gen<None> - SpanEditHandler;Accepts:None
  65202. + Transition;[@];
  65203. + CSharpImplicitExpressionBody - [66..72)::6
  65204. + CSharpCodeBlock - [66..72)::6
  65205. + CSharpExpressionLiteral - [66..72)::6 - [p.Name] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  65206. + Identifier;[p];
  65207. + Dot;[.];
  65208. + Identifier;[Name];
  65209. + MarkupTagBlock - [72..77)::5 - [</li>]
  65210. + MarkupTextLiteral - [72..77)::5 - [</li>] - Gen<Markup> - SpanEditHandler;Accepts:None
  65211. + OpenAngle;[<];
  65212. + ForwardSlash;[/];
  65213. + Text;[li];
  65214. + CloseAngle;[>];
  65215. + CSharpStatementLiteral - [77..84)::7 - [LF }] - Gen<Stmt> - SpanEditHandler;Accepts:None
  65216. + NewLine;[LF];
  65217. + Whitespace;[ ];
  65218. + RightBrace;[}];
  65219. + MarkupTextLiteral - [84..90)::6 - [LF ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65220. + NewLine;[LF];
  65221. + Whitespace;[ ];
  65222. + MarkupTagBlock - [90..95)::5 - [</ul>]
  65223. + MarkupTextLiteral - [90..95)::5 - [</ul>] - Gen<Markup> - SpanEditHandler;Accepts:None
  65224. + OpenAngle;[<];
  65225. + ForwardSlash;[/];
  65226. + Text;[ul];
  65227. + CloseAngle;[>];
  65228. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/DoesNotSwitchToCodeOnEmailAddressInAttribute.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/DoesNotSwitchToCodeOnEmailAddressInAttribute.stree.txt
  65229. index 632e3b95a4e..c8867119209 100644
  65230. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/DoesNotSwitchToCodeOnEmailAddressInAttribute.stree.txt
  65231. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/DoesNotSwitchToCodeOnEmailAddressInAttribute.stree.txt
  65232. @@ -1,27 +1,31 @@
  65233. -Markup block - Gen<None> - 50 - (0:0,0)
  65234. - Tag block - Gen<None> - 38 - (0:0,0)
  65235. - Markup span - Gen<Markup> - [<a] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  65236. - SyntaxKind.OpenAngle;[<];
  65237. - SyntaxKind.Text;[a];
  65238. - Markup block - Gen<Attr:href, href="@(2:0,2),"@(36:0,36)> - 35 - (2:0,2)
  65239. - Markup span - Gen<None> - [ href="] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:4
  65240. - SyntaxKind.Whitespace;[ ];
  65241. - SyntaxKind.Text;[href];
  65242. - SyntaxKind.Equals;[=];
  65243. - SyntaxKind.DoubleQuote;["];
  65244. - Markup span - Gen<LitAttr:@(9:0,9)> - [mailto:[email protected]] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:1
  65245. - SyntaxKind.Text;[mailto:[email protected]];
  65246. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (36:0,36) - Tokens:1
  65247. - SyntaxKind.DoubleQuote;["];
  65248. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:None - (37:0,37) - Tokens:1
  65249. - SyntaxKind.CloseAngle;[>];
  65250. - Markup span - Gen<Markup> - [Email me] - SpanEditHandler;Accepts:Any - (38:0,38) - Tokens:3
  65251. - SyntaxKind.Text;[Email];
  65252. - SyntaxKind.Whitespace;[ ];
  65253. - SyntaxKind.Text;[me];
  65254. - Tag block - Gen<None> - 4 - (46:0,46)
  65255. - Markup span - Gen<Markup> - [</a>] - SpanEditHandler;Accepts:None - (46:0,46) - Tokens:4
  65256. - SyntaxKind.OpenAngle;[<];
  65257. - SyntaxKind.ForwardSlash;[/];
  65258. - SyntaxKind.Text;[a];
  65259. - SyntaxKind.CloseAngle;[>];
  65260. +MarkupBlock - [0..50)::50 - [<a href="mailto:[email protected]">Email me</a>]
  65261. + MarkupTagBlock - [0..38)::38 - [<a href="mailto:[email protected]">]
  65262. + MarkupTextLiteral - [0..2)::2 - [<a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65263. + OpenAngle;[<];
  65264. + Text;[a];
  65265. + MarkupAttributeBlock - [2..37)::35 - [ href="mailto:[email protected]"]
  65266. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65267. + Whitespace;[ ];
  65268. + MarkupTextLiteral - [3..7)::4 - [href] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65269. + Text;[href];
  65270. + Equals;[=];
  65271. + MarkupTextLiteral - [8..9)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  65272. + DoubleQuote;["];
  65273. + GenericBlock - [9..36)::27
  65274. + MarkupLiteralAttributeValue - [9..36)::27 - [mailto:[email protected]]
  65275. + MarkupTextLiteral - [9..36)::27 - [mailto:[email protected]] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65276. + Text;[mailto:[email protected]];
  65277. + MarkupTextLiteral - [36..37)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  65278. + DoubleQuote;["];
  65279. + MarkupTextLiteral - [37..38)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  65280. + CloseAngle;[>];
  65281. + MarkupTextLiteral - [38..46)::8 - [Email me] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65282. + Text;[Email];
  65283. + Whitespace;[ ];
  65284. + Text;[me];
  65285. + MarkupTagBlock - [46..50)::4 - [</a>]
  65286. + MarkupTextLiteral - [46..50)::4 - [</a>] - Gen<Markup> - SpanEditHandler;Accepts:None
  65287. + OpenAngle;[<];
  65288. + ForwardSlash;[/];
  65289. + Text;[a];
  65290. + CloseAngle;[>];
  65291. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/GivesWhitespacePreceedingAtToCodeIfThereIsNoMarkupOnThatLine.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/GivesWhitespacePreceedingAtToCodeIfThereIsNoMarkupOnThatLine.stree.txt
  65292. index d61235bf876..64d90e5693a 100644
  65293. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/GivesWhitespacePreceedingAtToCodeIfThereIsNoMarkupOnThatLine.stree.txt
  65294. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/GivesWhitespacePreceedingAtToCodeIfThereIsNoMarkupOnThatLine.stree.txt
  65295. @@ -1,67 +1,70 @@
  65296. -Markup block - Gen<None> - 95 - (0:0,0)
  65297. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  65298. - SyntaxKind.Whitespace;[ ];
  65299. - Tag block - Gen<None> - 4 - (3:0,3)
  65300. - Markup span - Gen<Markup> - [<ul>] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:3
  65301. - SyntaxKind.OpenAngle;[<];
  65302. - SyntaxKind.Text;[ul];
  65303. - SyntaxKind.CloseAngle;[>];
  65304. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:Any - (7:0,7) - Tokens:1
  65305. - SyntaxKind.NewLine;[LF];
  65306. - Statement block - Gen<None> - 77 - (9:1,0)
  65307. - Code span - Gen<Stmt> - [ ] - SpanEditHandler;Accepts:Any - (9:1,0) - Tokens:1
  65308. - SyntaxKind.Whitespace;[ ];
  65309. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (13:1,4) - Tokens:1
  65310. - SyntaxKind.Transition;[@];
  65311. - Code span - Gen<Stmt> - [foreach(var p in Products) {LF] - SpanEditHandler;Accepts:Any - (14:1,5) - Tokens:13
  65312. - SyntaxKind.Keyword;[foreach];
  65313. - SyntaxKind.LeftParenthesis;[(];
  65314. - SyntaxKind.Identifier;[var];
  65315. - SyntaxKind.Whitespace;[ ];
  65316. - SyntaxKind.Identifier;[p];
  65317. - SyntaxKind.Whitespace;[ ];
  65318. - SyntaxKind.Keyword;[in];
  65319. - SyntaxKind.Whitespace;[ ];
  65320. - SyntaxKind.Identifier;[Products];
  65321. - SyntaxKind.RightParenthesis;[)];
  65322. - SyntaxKind.Whitespace;[ ];
  65323. - SyntaxKind.LeftBrace;[{];
  65324. - SyntaxKind.NewLine;[LF];
  65325. - Markup block - Gen<None> - 35 - (44:2,0)
  65326. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (44:2,0) - Tokens:1
  65327. - SyntaxKind.Whitespace;[ ];
  65328. - Tag block - Gen<None> - 4 - (52:2,8)
  65329. - Markup span - Gen<Markup> - [<li>] - SpanEditHandler;Accepts:None - (52:2,8) - Tokens:3
  65330. - SyntaxKind.OpenAngle;[<];
  65331. - SyntaxKind.Text;[li];
  65332. - SyntaxKind.CloseAngle;[>];
  65333. - Markup span - Gen<Markup> - [Product: ] - SpanEditHandler;Accepts:Any - (56:2,12) - Tokens:2
  65334. - SyntaxKind.Text;[Product:];
  65335. - SyntaxKind.Whitespace;[ ];
  65336. - Expression block - Gen<Expr> - 7 - (65:2,21)
  65337. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (65:2,21) - Tokens:1
  65338. - SyntaxKind.Transition;[@];
  65339. - Code span - Gen<Expr> - [p.Name] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (66:2,22) - Tokens:3
  65340. - SyntaxKind.Identifier;[p];
  65341. - SyntaxKind.Dot;[.];
  65342. - SyntaxKind.Identifier;[Name];
  65343. - Tag block - Gen<None> - 5 - (72:2,28)
  65344. - Markup span - Gen<Markup> - [</li>] - SpanEditHandler;Accepts:None - (72:2,28) - Tokens:4
  65345. - SyntaxKind.OpenAngle;[<];
  65346. - SyntaxKind.ForwardSlash;[/];
  65347. - SyntaxKind.Text;[li];
  65348. - SyntaxKind.CloseAngle;[>];
  65349. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (77:2,33) - Tokens:1
  65350. - SyntaxKind.NewLine;[LF];
  65351. - Code span - Gen<Stmt> - [ }LF] - SpanEditHandler;Accepts:None - (79:3,0) - Tokens:3
  65352. - SyntaxKind.Whitespace;[ ];
  65353. - SyntaxKind.RightBrace;[}];
  65354. - SyntaxKind.NewLine;[LF];
  65355. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (86:4,0) - Tokens:1
  65356. - SyntaxKind.Whitespace;[ ];
  65357. - Tag block - Gen<None> - 5 - (90:4,4)
  65358. - Markup span - Gen<Markup> - [</ul>] - SpanEditHandler;Accepts:None - (90:4,4) - Tokens:4
  65359. - SyntaxKind.OpenAngle;[<];
  65360. - SyntaxKind.ForwardSlash;[/];
  65361. - SyntaxKind.Text;[ul];
  65362. - SyntaxKind.CloseAngle;[>];
  65363. +MarkupBlock - [0..95)::95 - [ <ul>LF @foreach(var p in Products) {LF <li>Product: @p.Name</li>LF }LF </ul>]
  65364. + MarkupTextLiteral - [0..3)::3 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65365. + Whitespace;[ ];
  65366. + MarkupTagBlock - [3..7)::4 - [<ul>]
  65367. + MarkupTextLiteral - [3..7)::4 - [<ul>] - Gen<Markup> - SpanEditHandler;Accepts:None
  65368. + OpenAngle;[<];
  65369. + Text;[ul];
  65370. + CloseAngle;[>];
  65371. + MarkupTextLiteral - [7..9)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65372. + NewLine;[LF];
  65373. + CSharpCodeBlock - [9..86)::77
  65374. + CSharpStatementLiteral - [9..13)::4 - [ ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  65375. + Whitespace;[ ];
  65376. + CSharpTransition - [13..14)::1 - Gen<None> - SpanEditHandler;Accepts:None
  65377. + Transition;[@];
  65378. + CSharpStatementLiteral - [14..44)::30 - [foreach(var p in Products) {LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  65379. + Keyword;[foreach];
  65380. + LeftParenthesis;[(];
  65381. + Identifier;[var];
  65382. + Whitespace;[ ];
  65383. + Identifier;[p];
  65384. + Whitespace;[ ];
  65385. + Keyword;[in];
  65386. + Whitespace;[ ];
  65387. + Identifier;[Products];
  65388. + RightParenthesis;[)];
  65389. + Whitespace;[ ];
  65390. + LeftBrace;[{];
  65391. + NewLine;[LF];
  65392. + MarkupBlock - [44..79)::35
  65393. + MarkupTextLiteral - [44..52)::8 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65394. + Whitespace;[ ];
  65395. + MarkupTagBlock - [52..56)::4 - [<li>]
  65396. + MarkupTextLiteral - [52..56)::4 - [<li>] - Gen<Markup> - SpanEditHandler;Accepts:None
  65397. + OpenAngle;[<];
  65398. + Text;[li];
  65399. + CloseAngle;[>];
  65400. + MarkupTextLiteral - [56..65)::9 - [Product: ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65401. + Text;[Product:];
  65402. + Whitespace;[ ];
  65403. + CSharpCodeBlock - [65..72)::7
  65404. + CSharpImplicitExpression - [65..72)::7
  65405. + CSharpTransition - [65..66)::1 - Gen<None> - SpanEditHandler;Accepts:None
  65406. + Transition;[@];
  65407. + CSharpImplicitExpressionBody - [66..72)::6
  65408. + CSharpCodeBlock - [66..72)::6
  65409. + CSharpExpressionLiteral - [66..72)::6 - [p.Name] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  65410. + Identifier;[p];
  65411. + Dot;[.];
  65412. + Identifier;[Name];
  65413. + MarkupTagBlock - [72..77)::5 - [</li>]
  65414. + MarkupTextLiteral - [72..77)::5 - [</li>] - Gen<Markup> - SpanEditHandler;Accepts:None
  65415. + OpenAngle;[<];
  65416. + ForwardSlash;[/];
  65417. + Text;[li];
  65418. + CloseAngle;[>];
  65419. + MarkupTextLiteral - [77..79)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  65420. + NewLine;[LF];
  65421. + CSharpStatementLiteral - [79..86)::7 - [ }LF] - Gen<Stmt> - SpanEditHandler;Accepts:None
  65422. + Whitespace;[ ];
  65423. + RightBrace;[}];
  65424. + NewLine;[LF];
  65425. + MarkupTextLiteral - [86..90)::4 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65426. + Whitespace;[ ];
  65427. + MarkupTagBlock - [90..95)::5 - [</ul>]
  65428. + MarkupTextLiteral - [90..95)::5 - [</ul>] - Gen<Markup> - SpanEditHandler;Accepts:None
  65429. + OpenAngle;[<];
  65430. + ForwardSlash;[/];
  65431. + Text;[ul];
  65432. + CloseAngle;[>];
  65433. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/ParseBlockDoesNotSwitchToCodeOnEmailAddressInText.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/ParseBlockDoesNotSwitchToCodeOnEmailAddressInText.stree.txt
  65434. index 5864dab53ce..8424ec0c62b 100644
  65435. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/ParseBlockDoesNotSwitchToCodeOnEmailAddressInText.stree.txt
  65436. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/ParseBlockDoesNotSwitchToCodeOnEmailAddressInText.stree.txt
  65437. @@ -1,14 +1,14 @@
  65438. -Markup block - Gen<None> - 31 - (0:0,0)
  65439. - Tag block - Gen<None> - 5 - (0:0,0)
  65440. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  65441. - SyntaxKind.OpenAngle;[<];
  65442. - SyntaxKind.Text;[foo];
  65443. - SyntaxKind.CloseAngle;[>];
  65444. - Markup span - Gen<Markup> - [[email protected]] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:1
  65445. - SyntaxKind.Text;[[email protected]];
  65446. - Tag block - Gen<None> - 6 - (25:0,25)
  65447. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:None - (25:0,25) - Tokens:4
  65448. - SyntaxKind.OpenAngle;[<];
  65449. - SyntaxKind.ForwardSlash;[/];
  65450. - SyntaxKind.Text;[foo];
  65451. - SyntaxKind.CloseAngle;[>];
  65452. +MarkupBlock - [0..31)::31 - [<foo>[email protected]</foo>]
  65453. + MarkupTagBlock - [0..5)::5 - [<foo>]
  65454. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  65455. + OpenAngle;[<];
  65456. + Text;[foo];
  65457. + CloseAngle;[>];
  65458. + MarkupTextLiteral - [5..25)::20 - [[email protected]] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65459. + Text;[[email protected]];
  65460. + MarkupTagBlock - [25..31)::6 - [</foo>]
  65461. + MarkupTextLiteral - [25..31)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  65462. + OpenAngle;[<];
  65463. + ForwardSlash;[/];
  65464. + Text;[foo];
  65465. + CloseAngle;[>];
  65466. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/ParseDocumentGivesWhitespacePreceedingAtToCodeIfThereIsNoMarkupOnThatLine.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/ParseDocumentGivesWhitespacePreceedingAtToCodeIfThereIsNoMarkupOnThatLine.stree.txt
  65467. index 1f66429575b..29d50e5a767 100644
  65468. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/ParseDocumentGivesWhitespacePreceedingAtToCodeIfThereIsNoMarkupOnThatLine.stree.txt
  65469. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/ParseDocumentGivesWhitespacePreceedingAtToCodeIfThereIsNoMarkupOnThatLine.stree.txt
  65470. @@ -1,67 +1,71 @@
  65471. -Markup block - Gen<None> - 95 - (0:0,0)
  65472. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  65473. - SyntaxKind.Whitespace;[ ];
  65474. - Tag block - Gen<None> - 4 - (3:0,3)
  65475. - Markup span - Gen<Markup> - [<ul>] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:3
  65476. - SyntaxKind.OpenAngle;[<];
  65477. - SyntaxKind.Text;[ul];
  65478. - SyntaxKind.CloseAngle;[>];
  65479. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:Any - (7:0,7) - Tokens:1
  65480. - SyntaxKind.NewLine;[LF];
  65481. - Statement block - Gen<None> - 77 - (9:1,0)
  65482. - Code span - Gen<Stmt> - [ ] - SpanEditHandler;Accepts:Any - (9:1,0) - Tokens:1
  65483. - SyntaxKind.Whitespace;[ ];
  65484. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (13:1,4) - Tokens:1
  65485. - SyntaxKind.Transition;[@];
  65486. - Code span - Gen<Stmt> - [foreach(var p in Products) {LF] - SpanEditHandler;Accepts:Any - (14:1,5) - Tokens:13
  65487. - SyntaxKind.Keyword;[foreach];
  65488. - SyntaxKind.LeftParenthesis;[(];
  65489. - SyntaxKind.Identifier;[var];
  65490. - SyntaxKind.Whitespace;[ ];
  65491. - SyntaxKind.Identifier;[p];
  65492. - SyntaxKind.Whitespace;[ ];
  65493. - SyntaxKind.Keyword;[in];
  65494. - SyntaxKind.Whitespace;[ ];
  65495. - SyntaxKind.Identifier;[Products];
  65496. - SyntaxKind.RightParenthesis;[)];
  65497. - SyntaxKind.Whitespace;[ ];
  65498. - SyntaxKind.LeftBrace;[{];
  65499. - SyntaxKind.NewLine;[LF];
  65500. - Markup block - Gen<None> - 35 - (44:2,0)
  65501. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (44:2,0) - Tokens:1
  65502. - SyntaxKind.Whitespace;[ ];
  65503. - Tag block - Gen<None> - 4 - (52:2,8)
  65504. - Markup span - Gen<Markup> - [<li>] - SpanEditHandler;Accepts:None - (52:2,8) - Tokens:3
  65505. - SyntaxKind.OpenAngle;[<];
  65506. - SyntaxKind.Text;[li];
  65507. - SyntaxKind.CloseAngle;[>];
  65508. - Markup span - Gen<Markup> - [Product: ] - SpanEditHandler;Accepts:Any - (56:2,12) - Tokens:2
  65509. - SyntaxKind.Text;[Product:];
  65510. - SyntaxKind.Whitespace;[ ];
  65511. - Expression block - Gen<Expr> - 7 - (65:2,21)
  65512. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (65:2,21) - Tokens:1
  65513. - SyntaxKind.Transition;[@];
  65514. - Code span - Gen<Expr> - [p.Name] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (66:2,22) - Tokens:3
  65515. - SyntaxKind.Identifier;[p];
  65516. - SyntaxKind.Dot;[.];
  65517. - SyntaxKind.Identifier;[Name];
  65518. - Tag block - Gen<None> - 5 - (72:2,28)
  65519. - Markup span - Gen<Markup> - [</li>] - SpanEditHandler;Accepts:None - (72:2,28) - Tokens:4
  65520. - SyntaxKind.OpenAngle;[<];
  65521. - SyntaxKind.ForwardSlash;[/];
  65522. - SyntaxKind.Text;[li];
  65523. - SyntaxKind.CloseAngle;[>];
  65524. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (77:2,33) - Tokens:1
  65525. - SyntaxKind.NewLine;[LF];
  65526. - Code span - Gen<Stmt> - [ }LF] - SpanEditHandler;Accepts:None - (79:3,0) - Tokens:3
  65527. - SyntaxKind.Whitespace;[ ];
  65528. - SyntaxKind.RightBrace;[}];
  65529. - SyntaxKind.NewLine;[LF];
  65530. - SyntaxKind.HtmlTextLiteral - [ ] - [86..90) - FullWidth: 4 - Slots: 1
  65531. - SyntaxKind.Whitespace;[ ];
  65532. - Tag block - Gen<None> - 5 - (90:4,4)
  65533. - Markup span - Gen<Markup> - [</ul>] - SpanEditHandler;Accepts:Any - (90:4,4) - Tokens:4
  65534. - SyntaxKind.OpenAngle;[<];
  65535. - SyntaxKind.ForwardSlash;[/];
  65536. - SyntaxKind.Text;[ul];
  65537. - SyntaxKind.CloseAngle;[>];
  65538. +RazorDocument - [0..95)::95 - [ <ul>LF @foreach(var p in Products) {LF <li>Product: @p.Name</li>LF }LF </ul>]
  65539. + MarkupBlock - [0..95)::95
  65540. + MarkupTextLiteral - [0..3)::3 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65541. + Whitespace;[ ];
  65542. + MarkupTagBlock - [3..7)::4 - [<ul>]
  65543. + MarkupTextLiteral - [3..7)::4 - [<ul>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65544. + OpenAngle;[<];
  65545. + Text;[ul];
  65546. + CloseAngle;[>];
  65547. + MarkupTextLiteral - [7..9)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65548. + NewLine;[LF];
  65549. + CSharpCodeBlock - [9..86)::77
  65550. + CSharpStatementLiteral - [9..13)::4 - [ ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  65551. + Whitespace;[ ];
  65552. + CSharpTransition - [13..14)::1 - Gen<None> - SpanEditHandler;Accepts:None
  65553. + Transition;[@];
  65554. + CSharpStatementLiteral - [14..44)::30 - [foreach(var p in Products) {LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  65555. + Keyword;[foreach];
  65556. + LeftParenthesis;[(];
  65557. + Identifier;[var];
  65558. + Whitespace;[ ];
  65559. + Identifier;[p];
  65560. + Whitespace;[ ];
  65561. + Keyword;[in];
  65562. + Whitespace;[ ];
  65563. + Identifier;[Products];
  65564. + RightParenthesis;[)];
  65565. + Whitespace;[ ];
  65566. + LeftBrace;[{];
  65567. + NewLine;[LF];
  65568. + MarkupBlock - [44..79)::35
  65569. + MarkupTextLiteral - [44..52)::8 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65570. + Whitespace;[ ];
  65571. + MarkupTagBlock - [52..56)::4 - [<li>]
  65572. + MarkupTextLiteral - [52..56)::4 - [<li>] - Gen<Markup> - SpanEditHandler;Accepts:None
  65573. + OpenAngle;[<];
  65574. + Text;[li];
  65575. + CloseAngle;[>];
  65576. + MarkupTextLiteral - [56..65)::9 - [Product: ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65577. + Text;[Product:];
  65578. + Whitespace;[ ];
  65579. + CSharpCodeBlock - [65..72)::7
  65580. + CSharpImplicitExpression - [65..72)::7
  65581. + CSharpTransition - [65..66)::1 - Gen<None> - SpanEditHandler;Accepts:None
  65582. + Transition;[@];
  65583. + CSharpImplicitExpressionBody - [66..72)::6
  65584. + CSharpCodeBlock - [66..72)::6
  65585. + CSharpExpressionLiteral - [66..72)::6 - [p.Name] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  65586. + Identifier;[p];
  65587. + Dot;[.];
  65588. + Identifier;[Name];
  65589. + MarkupTagBlock - [72..77)::5 - [</li>]
  65590. + MarkupTextLiteral - [72..77)::5 - [</li>] - Gen<Markup> - SpanEditHandler;Accepts:None
  65591. + OpenAngle;[<];
  65592. + ForwardSlash;[/];
  65593. + Text;[li];
  65594. + CloseAngle;[>];
  65595. + MarkupTextLiteral - [77..79)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  65596. + NewLine;[LF];
  65597. + CSharpStatementLiteral - [79..86)::7 - [ }LF] - Gen<Stmt> - SpanEditHandler;Accepts:None
  65598. + Whitespace;[ ];
  65599. + RightBrace;[}];
  65600. + NewLine;[LF];
  65601. + MarkupTextLiteral - [86..90)::4 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65602. + Whitespace;[ ];
  65603. + MarkupTagBlock - [90..95)::5 - [</ul>]
  65604. + MarkupTextLiteral - [90..95)::5 - [</ul>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65605. + OpenAngle;[<];
  65606. + ForwardSlash;[/];
  65607. + Text;[ul];
  65608. + CloseAngle;[>];
  65609. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/ParseDocumentTreatsPairsOfAtSignsAsEscapeSequence.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/ParseDocumentTreatsPairsOfAtSignsAsEscapeSequence.stree.txt
  65610. index 57f370a64db..028e340b2ee 100644
  65611. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/ParseDocumentTreatsPairsOfAtSignsAsEscapeSequence.stree.txt
  65612. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/ParseDocumentTreatsPairsOfAtSignsAsEscapeSequence.stree.txt
  65613. @@ -1,25 +1,29 @@
  65614. -Markup block - Gen<None> - 19 - (0:0,0)
  65615. - Tag block - Gen<None> - 5 - (0:0,0)
  65616. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  65617. - SyntaxKind.OpenAngle;[<];
  65618. - SyntaxKind.Text;[foo];
  65619. - SyntaxKind.CloseAngle;[>];
  65620. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:1
  65621. - SyntaxKind.Transition;[@];
  65622. - Markup span - Gen<Markup> - [@] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:1
  65623. - SyntaxKind.Transition;[@];
  65624. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:Any - (7:0,7) - Tokens:1
  65625. - SyntaxKind.Transition;[@];
  65626. - Markup span - Gen<Markup> - [@] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:1
  65627. - SyntaxKind.Transition;[@];
  65628. - Expression block - Gen<Expr> - 4 - (9:0,9)
  65629. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (9:0,9) - Tokens:1
  65630. - SyntaxKind.Transition;[@];
  65631. - Code span - Gen<Expr> - [bar] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (10:0,10) - Tokens:1
  65632. - SyntaxKind.Identifier;[bar];
  65633. - Tag block - Gen<None> - 6 - (13:0,13)
  65634. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:4
  65635. - SyntaxKind.OpenAngle;[<];
  65636. - SyntaxKind.ForwardSlash;[/];
  65637. - SyntaxKind.Text;[foo];
  65638. - SyntaxKind.CloseAngle;[>];
  65639. +RazorDocument - [0..19)::19 - [<foo>@@@@@bar</foo>]
  65640. + MarkupBlock - [0..19)::19
  65641. + MarkupTagBlock - [0..5)::5 - [<foo>]
  65642. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65643. + OpenAngle;[<];
  65644. + Text;[foo];
  65645. + CloseAngle;[>];
  65646. + MarkupEphemeralTextLiteral - [5..6)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:Any
  65647. + Transition;[@];
  65648. + MarkupTextLiteral - [6..7)::1 - [@] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65649. + Transition;[@];
  65650. + MarkupEphemeralTextLiteral - [7..8)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:Any
  65651. + Transition;[@];
  65652. + MarkupTextLiteral - [8..9)::1 - [@] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65653. + Transition;[@];
  65654. + CSharpCodeBlock - [9..13)::4
  65655. + CSharpImplicitExpression - [9..13)::4
  65656. + CSharpTransition - [9..10)::1 - Gen<None> - SpanEditHandler;Accepts:None
  65657. + Transition;[@];
  65658. + CSharpImplicitExpressionBody - [10..13)::3
  65659. + CSharpCodeBlock - [10..13)::3
  65660. + CSharpExpressionLiteral - [10..13)::3 - [bar] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  65661. + Identifier;[bar];
  65662. + MarkupTagBlock - [13..19)::6 - [</foo>]
  65663. + MarkupTextLiteral - [13..19)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65664. + OpenAngle;[<];
  65665. + ForwardSlash;[/];
  65666. + Text;[foo];
  65667. + CloseAngle;[>];
  65668. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/ParseDocumentTreatsTwoAtSignsAsEscapeSequence.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/ParseDocumentTreatsTwoAtSignsAsEscapeSequence.stree.txt
  65669. index cda907032df..3430fb6abce 100644
  65670. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/ParseDocumentTreatsTwoAtSignsAsEscapeSequence.stree.txt
  65671. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/ParseDocumentTreatsTwoAtSignsAsEscapeSequence.stree.txt
  65672. @@ -1,18 +1,18 @@
  65673. -Markup block - Gen<None> - 16 - (0:0,0)
  65674. - Tag block - Gen<None> - 5 - (0:0,0)
  65675. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  65676. - SyntaxKind.OpenAngle;[<];
  65677. - SyntaxKind.Text;[foo];
  65678. - SyntaxKind.CloseAngle;[>];
  65679. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:1
  65680. - SyntaxKind.Transition;[@];
  65681. - SyntaxKind.HtmlTextLiteral - [@bar] - [6..10) - FullWidth: 4 - Slots: 1
  65682. - SyntaxKind.List - [@bar] - [6..10) - FullWidth: 4 - Slots: 2
  65683. - SyntaxKind.Transition;[@];
  65684. - SyntaxKind.Text;[bar];
  65685. - Tag block - Gen<None> - 6 - (10:0,10)
  65686. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:4
  65687. - SyntaxKind.OpenAngle;[<];
  65688. - SyntaxKind.ForwardSlash;[/];
  65689. - SyntaxKind.Text;[foo];
  65690. - SyntaxKind.CloseAngle;[>];
  65691. +RazorDocument - [0..16)::16 - [<foo>@@bar</foo>]
  65692. + MarkupBlock - [0..16)::16
  65693. + MarkupTagBlock - [0..5)::5 - [<foo>]
  65694. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65695. + OpenAngle;[<];
  65696. + Text;[foo];
  65697. + CloseAngle;[>];
  65698. + MarkupEphemeralTextLiteral - [5..6)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:Any
  65699. + Transition;[@];
  65700. + MarkupTextLiteral - [6..10)::4 - [@bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65701. + Transition;[@];
  65702. + Text;[bar];
  65703. + MarkupTagBlock - [10..16)::6 - [</foo>]
  65704. + MarkupTextLiteral - [10..16)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65705. + OpenAngle;[<];
  65706. + ForwardSlash;[/];
  65707. + Text;[foo];
  65708. + CloseAngle;[>];
  65709. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/ParsesCodeWithinSingleLineMarkup.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/ParsesCodeWithinSingleLineMarkup.stree.txt
  65710. index 462339f20fd..bfffda471de 100644
  65711. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/ParsesCodeWithinSingleLineMarkup.stree.txt
  65712. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/ParsesCodeWithinSingleLineMarkup.stree.txt
  65713. @@ -1,20 +1,23 @@
  65714. -Markup block - Gen<None> - 20 - (0:0,0)
  65715. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  65716. - SyntaxKind.Transition;[@];
  65717. - MetaCode span - Gen<None> - [:] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:1
  65718. - SyntaxKind.Colon;[:];
  65719. - Markup span - Gen<Markup> - [<li>Foo ] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:5
  65720. - SyntaxKind.OpenAngle;[<];
  65721. - SyntaxKind.Text;[li];
  65722. - SyntaxKind.CloseAngle;[>];
  65723. - SyntaxKind.Text;[Foo];
  65724. - SyntaxKind.Whitespace;[ ];
  65725. - Expression block - Gen<Expr> - 4 - (10:0,10)
  65726. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  65727. - SyntaxKind.Transition;[@];
  65728. - Code span - Gen<Expr> - [Bar] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (11:0,11) - Tokens:1
  65729. - SyntaxKind.Identifier;[Bar];
  65730. - Markup span - Gen<Markup> - [ BazLF] - SpanEditHandler;Accepts:None - (14:0,14) - Tokens:3
  65731. - SyntaxKind.Whitespace;[ ];
  65732. - SyntaxKind.Text;[Baz];
  65733. - SyntaxKind.NewLine;[LF];
  65734. +MarkupBlock - [0..20)::20 - [@:<li>Foo @Bar BazLF]
  65735. + MarkupTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  65736. + Transition;[@];
  65737. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:Any
  65738. + Colon;[:];
  65739. + MarkupTextLiteral - [2..10)::8 - [<li>Foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65740. + OpenAngle;[<];
  65741. + Text;[li];
  65742. + CloseAngle;[>];
  65743. + Text;[Foo];
  65744. + Whitespace;[ ];
  65745. + CSharpCodeBlock - [10..14)::4
  65746. + CSharpImplicitExpression - [10..14)::4
  65747. + CSharpTransition - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  65748. + Transition;[@];
  65749. + CSharpImplicitExpressionBody - [11..14)::3
  65750. + CSharpCodeBlock - [11..14)::3
  65751. + CSharpExpressionLiteral - [11..14)::3 - [Bar] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  65752. + Identifier;[Bar];
  65753. + MarkupTextLiteral - [14..20)::6 - [ BazLF] - Gen<Markup> - SpanEditHandler;Accepts:None
  65754. + Whitespace;[ ];
  65755. + Text;[Baz];
  65756. + NewLine;[LF];
  65757. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SectionBodyTreatsPairsOfAtSignsAsEscapeSequence.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SectionBodyTreatsPairsOfAtSignsAsEscapeSequence.stree.txt
  65758. index 224296abc95..28b65505c74 100644
  65759. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SectionBodyTreatsPairsOfAtSignsAsEscapeSequence.stree.txt
  65760. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SectionBodyTreatsPairsOfAtSignsAsEscapeSequence.stree.txt
  65761. @@ -1,49 +1,56 @@
  65762. -Markup block - Gen<None> - 36 - (0:0,0)
  65763. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  65764. - SyntaxKind.Unknown;[];
  65765. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted}> - 36 - (0:0,0)
  65766. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  65767. - SyntaxKind.Transition;[@];
  65768. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  65769. - SyntaxKind.Identifier;[section];
  65770. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  65771. - SyntaxKind.Whitespace;[ ];
  65772. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [Foo] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  65773. - SyntaxKind.Identifier;[Foo];
  65774. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (12:0,12) - Tokens:1
  65775. - SyntaxKind.Whitespace;[ ];
  65776. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd - (13:0,13) - Tokens:1
  65777. - SyntaxKind.LeftBrace;[{];
  65778. - Markup block - Gen<None> - 21 - (14:0,14)
  65779. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  65780. - SyntaxKind.Whitespace;[ ];
  65781. - Tag block - Gen<None> - 5 - (15:0,15)
  65782. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:3
  65783. - SyntaxKind.OpenAngle;[<];
  65784. - SyntaxKind.Text;[foo];
  65785. - SyntaxKind.CloseAngle;[>];
  65786. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:1
  65787. - SyntaxKind.Transition;[@];
  65788. - Markup span - Gen<Markup> - [@] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:1
  65789. - SyntaxKind.Transition;[@];
  65790. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:1
  65791. - SyntaxKind.Transition;[@];
  65792. - Markup span - Gen<Markup> - [@] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:1
  65793. - SyntaxKind.Transition;[@];
  65794. - Expression block - Gen<Expr> - 4 - (24:0,24)
  65795. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (24:0,24) - Tokens:1
  65796. - SyntaxKind.Transition;[@];
  65797. - Code span - Gen<Expr> - [bar] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K15 - (25:0,25) - Tokens:1
  65798. - SyntaxKind.Identifier;[bar];
  65799. - Tag block - Gen<None> - 6 - (28:0,28)
  65800. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:Any - (28:0,28) - Tokens:4
  65801. - SyntaxKind.OpenAngle;[<];
  65802. - SyntaxKind.ForwardSlash;[/];
  65803. - SyntaxKind.Text;[foo];
  65804. - SyntaxKind.CloseAngle;[>];
  65805. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (34:0,34) - Tokens:1
  65806. - SyntaxKind.Whitespace;[ ];
  65807. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (35:0,35) - Tokens:1
  65808. - SyntaxKind.RightBrace;[}];
  65809. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (36:0,36) - Tokens:1
  65810. - SyntaxKind.Unknown;[];
  65811. +RazorDocument - [0..36)::36 - [@section Foo { <foo>@@@@@bar</foo> }]
  65812. + MarkupBlock - [0..36)::36
  65813. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65814. + Marker;[];
  65815. + CSharpCodeBlock - [0..36)::36
  65816. + RazorDirective - [0..36)::36 - Directive:{section;RazorBlock;Unrestricted}
  65817. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  65818. + Transition;[@];
  65819. + RazorDirectiveBody - [1..36)::35
  65820. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  65821. + Identifier;[section];
  65822. + CSharpCodeBlock - [8..36)::28
  65823. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  65824. + Whitespace;[ ];
  65825. + CSharpStatementLiteral - [9..12)::3 - [Foo] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  65826. + Identifier;[Foo];
  65827. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  65828. + Whitespace;[ ];
  65829. + RazorMetaCode - [13..14)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd
  65830. + LeftBrace;[{];
  65831. + MarkupBlock - [14..35)::21
  65832. + MarkupTextLiteral - [14..15)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65833. + Whitespace;[ ];
  65834. + MarkupTagBlock - [15..20)::5 - [<foo>]
  65835. + MarkupTextLiteral - [15..20)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65836. + OpenAngle;[<];
  65837. + Text;[foo];
  65838. + CloseAngle;[>];
  65839. + MarkupEphemeralTextLiteral - [20..21)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:Any
  65840. + Transition;[@];
  65841. + MarkupTextLiteral - [21..22)::1 - [@] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65842. + Transition;[@];
  65843. + MarkupEphemeralTextLiteral - [22..23)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:Any
  65844. + Transition;[@];
  65845. + MarkupTextLiteral - [23..24)::1 - [@] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65846. + Transition;[@];
  65847. + CSharpCodeBlock - [24..28)::4
  65848. + CSharpImplicitExpression - [24..28)::4
  65849. + CSharpTransition - [24..25)::1 - Gen<None> - SpanEditHandler;Accepts:None
  65850. + Transition;[@];
  65851. + CSharpImplicitExpressionBody - [25..28)::3
  65852. + CSharpCodeBlock - [25..28)::3
  65853. + CSharpExpressionLiteral - [25..28)::3 - [bar] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K15
  65854. + Identifier;[bar];
  65855. + MarkupTagBlock - [28..34)::6 - [</foo>]
  65856. + MarkupTextLiteral - [28..34)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65857. + OpenAngle;[<];
  65858. + ForwardSlash;[/];
  65859. + Text;[foo];
  65860. + CloseAngle;[>];
  65861. + MarkupTextLiteral - [34..35)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65862. + Whitespace;[ ];
  65863. + RazorMetaCode - [35..36)::1 - Gen<None> - SpanEditHandler;Accepts:None
  65864. + RightBrace;[}];
  65865. + MarkupTextLiteral - [36..36)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65866. + Marker;[];
  65867. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SectionBodyTreatsTwoAtSignsAsEscapeSequence.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SectionBodyTreatsTwoAtSignsAsEscapeSequence.stree.txt
  65868. index 170bbaa71b2..90669c6b287 100644
  65869. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SectionBodyTreatsTwoAtSignsAsEscapeSequence.stree.txt
  65870. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SectionBodyTreatsTwoAtSignsAsEscapeSequence.stree.txt
  65871. @@ -1,42 +1,45 @@
  65872. -Markup block - Gen<None> - 33 - (0:0,0)
  65873. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  65874. - SyntaxKind.Unknown;[];
  65875. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted}> - 33 - (0:0,0)
  65876. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  65877. - SyntaxKind.Transition;[@];
  65878. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  65879. - SyntaxKind.Identifier;[section];
  65880. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  65881. - SyntaxKind.Whitespace;[ ];
  65882. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [Foo] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  65883. - SyntaxKind.Identifier;[Foo];
  65884. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (12:0,12) - Tokens:1
  65885. - SyntaxKind.Whitespace;[ ];
  65886. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd - (13:0,13) - Tokens:1
  65887. - SyntaxKind.LeftBrace;[{];
  65888. - Markup block - Gen<None> - 18 - (14:0,14)
  65889. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  65890. - SyntaxKind.Whitespace;[ ];
  65891. - Tag block - Gen<None> - 5 - (15:0,15)
  65892. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:3
  65893. - SyntaxKind.OpenAngle;[<];
  65894. - SyntaxKind.Text;[foo];
  65895. - SyntaxKind.CloseAngle;[>];
  65896. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:1
  65897. - SyntaxKind.Transition;[@];
  65898. - SyntaxKind.HtmlTextLiteral - [@bar] - [21..25) - FullWidth: 4 - Slots: 1
  65899. - SyntaxKind.List - [@bar] - [21..25) - FullWidth: 4 - Slots: 2
  65900. - SyntaxKind.Transition;[@];
  65901. - SyntaxKind.Text;[bar];
  65902. - Tag block - Gen<None> - 6 - (25:0,25)
  65903. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:4
  65904. - SyntaxKind.OpenAngle;[<];
  65905. - SyntaxKind.ForwardSlash;[/];
  65906. - SyntaxKind.Text;[foo];
  65907. - SyntaxKind.CloseAngle;[>];
  65908. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (31:0,31) - Tokens:1
  65909. - SyntaxKind.Whitespace;[ ];
  65910. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (32:0,32) - Tokens:1
  65911. - SyntaxKind.RightBrace;[}];
  65912. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (33:0,33) - Tokens:1
  65913. - SyntaxKind.Unknown;[];
  65914. +RazorDocument - [0..33)::33 - [@section Foo { <foo>@@bar</foo> }]
  65915. + MarkupBlock - [0..33)::33
  65916. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65917. + Marker;[];
  65918. + CSharpCodeBlock - [0..33)::33
  65919. + RazorDirective - [0..33)::33 - Directive:{section;RazorBlock;Unrestricted}
  65920. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  65921. + Transition;[@];
  65922. + RazorDirectiveBody - [1..33)::32
  65923. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  65924. + Identifier;[section];
  65925. + CSharpCodeBlock - [8..33)::25
  65926. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  65927. + Whitespace;[ ];
  65928. + CSharpStatementLiteral - [9..12)::3 - [Foo] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  65929. + Identifier;[Foo];
  65930. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  65931. + Whitespace;[ ];
  65932. + RazorMetaCode - [13..14)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd
  65933. + LeftBrace;[{];
  65934. + MarkupBlock - [14..32)::18
  65935. + MarkupTextLiteral - [14..15)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65936. + Whitespace;[ ];
  65937. + MarkupTagBlock - [15..20)::5 - [<foo>]
  65938. + MarkupTextLiteral - [15..20)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65939. + OpenAngle;[<];
  65940. + Text;[foo];
  65941. + CloseAngle;[>];
  65942. + MarkupEphemeralTextLiteral - [20..21)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:Any
  65943. + Transition;[@];
  65944. + MarkupTextLiteral - [21..25)::4 - [@bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65945. + Transition;[@];
  65946. + Text;[bar];
  65947. + MarkupTagBlock - [25..31)::6 - [</foo>]
  65948. + MarkupTextLiteral - [25..31)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65949. + OpenAngle;[<];
  65950. + ForwardSlash;[/];
  65951. + Text;[foo];
  65952. + CloseAngle;[>];
  65953. + MarkupTextLiteral - [31..32)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65954. + Whitespace;[ ];
  65955. + RazorMetaCode - [32..33)::1 - Gen<None> - SpanEditHandler;Accepts:None
  65956. + RightBrace;[}];
  65957. + MarkupTextLiteral - [33..33)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  65958. + Marker;[];
  65959. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SectionContextGivesWhitespacePreceedingAtToCodeIfThereIsNoMarkupOnThatLine.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SectionContextGivesWhitespacePreceedingAtToCodeIfThereIsNoMarkupOnThatLine.stree.txt
  65960. index 29ce9e379f4..d777024566b 100644
  65961. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SectionContextGivesWhitespacePreceedingAtToCodeIfThereIsNoMarkupOnThatLine.stree.txt
  65962. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SectionContextGivesWhitespacePreceedingAtToCodeIfThereIsNoMarkupOnThatLine.stree.txt
  65963. @@ -1,90 +1,97 @@
  65964. -Markup block - Gen<None> - 127 - (0:0,0)
  65965. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  65966. - SyntaxKind.Unknown;[];
  65967. - Directive block - Gen<Directive:{section;RazorBlock;Unrestricted}> - 127 - (0:0,0)
  65968. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  65969. - SyntaxKind.Transition;[@];
  65970. - MetaCode span - Gen<None> - [section] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  65971. - SyntaxKind.Identifier;[section];
  65972. - Code span - Gen<None> - [ ] - SpanEditHandler;Accepts:Whitespace - (8:0,8) - Tokens:1
  65973. - SyntaxKind.Whitespace;[ ];
  65974. - Code span - Gen<DirectiveToken {SectionName;Member;Opt:False}> - [foo] - DirectiveTokenEditHandler;Accepts:NonWhitespace - (9:0,9) - Tokens:1
  65975. - SyntaxKind.Identifier;[foo];
  65976. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:AllWhitespace - (12:0,12) - Tokens:1
  65977. - SyntaxKind.Whitespace;[ ];
  65978. - MetaCode span - Gen<None> - [{] - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd - (13:0,13) - Tokens:1
  65979. - SyntaxKind.LeftBrace;[{];
  65980. - Markup block - Gen<None> - 112 - (14:0,14)
  65981. - Markup span - Gen<Markup> - [LF ] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:2
  65982. - SyntaxKind.NewLine;[LF];
  65983. - SyntaxKind.Whitespace;[ ];
  65984. - Tag block - Gen<None> - 4 - (20:1,4)
  65985. - Markup span - Gen<Markup> - [<ul>] - SpanEditHandler;Accepts:Any - (20:1,4) - Tokens:3
  65986. - SyntaxKind.OpenAngle;[<];
  65987. - SyntaxKind.Text;[ul];
  65988. - SyntaxKind.CloseAngle;[>];
  65989. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:Any - (24:1,8) - Tokens:1
  65990. - SyntaxKind.NewLine;[LF];
  65991. - Statement block - Gen<None> - 89 - (26:2,0)
  65992. - Code span - Gen<Stmt> - [ ] - SpanEditHandler;Accepts:Any - (26:2,0) - Tokens:1
  65993. - SyntaxKind.Whitespace;[ ];
  65994. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (34:2,8) - Tokens:1
  65995. - SyntaxKind.Transition;[@];
  65996. - Code span - Gen<Stmt> - [foreach(var p in Products) {LF] - SpanEditHandler;Accepts:Any - (35:2,9) - Tokens:13
  65997. - SyntaxKind.Keyword;[foreach];
  65998. - SyntaxKind.LeftParenthesis;[(];
  65999. - SyntaxKind.Identifier;[var];
  66000. - SyntaxKind.Whitespace;[ ];
  66001. - SyntaxKind.Identifier;[p];
  66002. - SyntaxKind.Whitespace;[ ];
  66003. - SyntaxKind.Keyword;[in];
  66004. - SyntaxKind.Whitespace;[ ];
  66005. - SyntaxKind.Identifier;[Products];
  66006. - SyntaxKind.RightParenthesis;[)];
  66007. - SyntaxKind.Whitespace;[ ];
  66008. - SyntaxKind.LeftBrace;[{];
  66009. - SyntaxKind.NewLine;[LF];
  66010. - Markup block - Gen<None> - 39 - (65:3,0)
  66011. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (65:3,0) - Tokens:1
  66012. - SyntaxKind.Whitespace;[ ];
  66013. - Tag block - Gen<None> - 4 - (77:3,12)
  66014. - Markup span - Gen<Markup> - [<li>] - SpanEditHandler;Accepts:None - (77:3,12) - Tokens:3
  66015. - SyntaxKind.OpenAngle;[<];
  66016. - SyntaxKind.Text;[li];
  66017. - SyntaxKind.CloseAngle;[>];
  66018. - Markup span - Gen<Markup> - [Product: ] - SpanEditHandler;Accepts:Any - (81:3,16) - Tokens:2
  66019. - SyntaxKind.Text;[Product:];
  66020. - SyntaxKind.Whitespace;[ ];
  66021. - Expression block - Gen<Expr> - 7 - (90:3,25)
  66022. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (90:3,25) - Tokens:1
  66023. - SyntaxKind.Transition;[@];
  66024. - Code span - Gen<Expr> - [p.Name] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K15 - (91:3,26) - Tokens:3
  66025. - SyntaxKind.Identifier;[p];
  66026. - SyntaxKind.Dot;[.];
  66027. - SyntaxKind.Identifier;[Name];
  66028. - Tag block - Gen<None> - 5 - (97:3,32)
  66029. - Markup span - Gen<Markup> - [</li>] - SpanEditHandler;Accepts:None - (97:3,32) - Tokens:4
  66030. - SyntaxKind.OpenAngle;[<];
  66031. - SyntaxKind.ForwardSlash;[/];
  66032. - SyntaxKind.Text;[li];
  66033. - SyntaxKind.CloseAngle;[>];
  66034. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:None - (102:3,37) - Tokens:1
  66035. - SyntaxKind.NewLine;[LF];
  66036. - Code span - Gen<Stmt> - [ }LF] - SpanEditHandler;Accepts:None - (104:4,0) - Tokens:3
  66037. - SyntaxKind.Whitespace;[ ];
  66038. - SyntaxKind.RightBrace;[}];
  66039. - SyntaxKind.NewLine;[LF];
  66040. - SyntaxKind.HtmlTextLiteral - [ ] - [115..119) - FullWidth: 4 - Slots: 1
  66041. - SyntaxKind.Whitespace;[ ];
  66042. - Tag block - Gen<None> - 5 - (119:5,4)
  66043. - Markup span - Gen<Markup> - [</ul>] - SpanEditHandler;Accepts:Any - (119:5,4) - Tokens:4
  66044. - SyntaxKind.OpenAngle;[<];
  66045. - SyntaxKind.ForwardSlash;[/];
  66046. - SyntaxKind.Text;[ul];
  66047. - SyntaxKind.CloseAngle;[>];
  66048. - Markup span - Gen<Markup> - [LF] - SpanEditHandler;Accepts:Any - (124:5,9) - Tokens:1
  66049. - SyntaxKind.NewLine;[LF];
  66050. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (126:6,0) - Tokens:1
  66051. - SyntaxKind.RightBrace;[}];
  66052. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (127:6,1) - Tokens:1
  66053. - SyntaxKind.Unknown;[];
  66054. +RazorDocument - [0..127)::127 - [@section foo {LF <ul>LF @foreach(var p in Products) {LF <li>Product: @p.Name</li>LF }LF </ul>LF}]
  66055. + MarkupBlock - [0..127)::127
  66056. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66057. + Marker;[];
  66058. + CSharpCodeBlock - [0..127)::127
  66059. + RazorDirective - [0..127)::127 - Directive:{section;RazorBlock;Unrestricted}
  66060. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  66061. + Transition;[@];
  66062. + RazorDirectiveBody - [1..127)::126
  66063. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  66064. + Identifier;[section];
  66065. + CSharpCodeBlock - [8..127)::119
  66066. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  66067. + Whitespace;[ ];
  66068. + CSharpStatementLiteral - [9..12)::3 - [foo] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  66069. + Identifier;[foo];
  66070. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  66071. + Whitespace;[ ];
  66072. + RazorMetaCode - [13..14)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd
  66073. + LeftBrace;[{];
  66074. + MarkupBlock - [14..126)::112
  66075. + MarkupTextLiteral - [14..20)::6 - [LF ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66076. + NewLine;[LF];
  66077. + Whitespace;[ ];
  66078. + MarkupTagBlock - [20..24)::4 - [<ul>]
  66079. + MarkupTextLiteral - [20..24)::4 - [<ul>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66080. + OpenAngle;[<];
  66081. + Text;[ul];
  66082. + CloseAngle;[>];
  66083. + MarkupTextLiteral - [24..26)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66084. + NewLine;[LF];
  66085. + CSharpCodeBlock - [26..115)::89
  66086. + CSharpStatementLiteral - [26..34)::8 - [ ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  66087. + Whitespace;[ ];
  66088. + CSharpTransition - [34..35)::1 - Gen<None> - SpanEditHandler;Accepts:None
  66089. + Transition;[@];
  66090. + CSharpStatementLiteral - [35..65)::30 - [foreach(var p in Products) {LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  66091. + Keyword;[foreach];
  66092. + LeftParenthesis;[(];
  66093. + Identifier;[var];
  66094. + Whitespace;[ ];
  66095. + Identifier;[p];
  66096. + Whitespace;[ ];
  66097. + Keyword;[in];
  66098. + Whitespace;[ ];
  66099. + Identifier;[Products];
  66100. + RightParenthesis;[)];
  66101. + Whitespace;[ ];
  66102. + LeftBrace;[{];
  66103. + NewLine;[LF];
  66104. + MarkupBlock - [65..104)::39
  66105. + MarkupTextLiteral - [65..77)::12 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66106. + Whitespace;[ ];
  66107. + MarkupTagBlock - [77..81)::4 - [<li>]
  66108. + MarkupTextLiteral - [77..81)::4 - [<li>] - Gen<Markup> - SpanEditHandler;Accepts:None
  66109. + OpenAngle;[<];
  66110. + Text;[li];
  66111. + CloseAngle;[>];
  66112. + MarkupTextLiteral - [81..90)::9 - [Product: ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66113. + Text;[Product:];
  66114. + Whitespace;[ ];
  66115. + CSharpCodeBlock - [90..97)::7
  66116. + CSharpImplicitExpression - [90..97)::7
  66117. + CSharpTransition - [90..91)::1 - Gen<None> - SpanEditHandler;Accepts:None
  66118. + Transition;[@];
  66119. + CSharpImplicitExpressionBody - [91..97)::6
  66120. + CSharpCodeBlock - [91..97)::6
  66121. + CSharpExpressionLiteral - [91..97)::6 - [p.Name] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K15
  66122. + Identifier;[p];
  66123. + Dot;[.];
  66124. + Identifier;[Name];
  66125. + MarkupTagBlock - [97..102)::5 - [</li>]
  66126. + MarkupTextLiteral - [97..102)::5 - [</li>] - Gen<Markup> - SpanEditHandler;Accepts:None
  66127. + OpenAngle;[<];
  66128. + ForwardSlash;[/];
  66129. + Text;[li];
  66130. + CloseAngle;[>];
  66131. + MarkupTextLiteral - [102..104)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:None
  66132. + NewLine;[LF];
  66133. + CSharpStatementLiteral - [104..115)::11 - [ }LF] - Gen<Stmt> - SpanEditHandler;Accepts:None
  66134. + Whitespace;[ ];
  66135. + RightBrace;[}];
  66136. + NewLine;[LF];
  66137. + MarkupTextLiteral - [115..119)::4 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66138. + Whitespace;[ ];
  66139. + MarkupTagBlock - [119..124)::5 - [</ul>]
  66140. + MarkupTextLiteral - [119..124)::5 - [</ul>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66141. + OpenAngle;[<];
  66142. + ForwardSlash;[/];
  66143. + Text;[ul];
  66144. + CloseAngle;[>];
  66145. + MarkupTextLiteral - [124..126)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66146. + NewLine;[LF];
  66147. + RazorMetaCode - [126..127)::1 - Gen<None> - SpanEditHandler;Accepts:None
  66148. + RightBrace;[}];
  66149. + MarkupTextLiteral - [127..127)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66150. + Marker;[];
  66151. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SupportsCodeWithinCDataDeclaration.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SupportsCodeWithinCDataDeclaration.stree.txt
  66152. index 7d6a1d0bed0..fc45c62cbdc 100644
  66153. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SupportsCodeWithinCDataDeclaration.stree.txt
  66154. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SupportsCodeWithinCDataDeclaration.stree.txt
  66155. @@ -1,32 +1,35 @@
  66156. -Markup block - Gen<None> - 36 - (0:0,0)
  66157. - Tag block - Gen<None> - 5 - (0:0,0)
  66158. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  66159. - SyntaxKind.OpenAngle;[<];
  66160. - SyntaxKind.Text;[foo];
  66161. - SyntaxKind.CloseAngle;[>];
  66162. - Markup span - Gen<Markup> - [<![CDATA[ foo ] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:8
  66163. - SyntaxKind.OpenAngle;[<];
  66164. - SyntaxKind.Bang;[!];
  66165. - SyntaxKind.LeftBracket;[[];
  66166. - SyntaxKind.Text;[CDATA];
  66167. - SyntaxKind.LeftBracket;[[];
  66168. - SyntaxKind.Whitespace;[ ];
  66169. - SyntaxKind.Text;[foo];
  66170. - SyntaxKind.Whitespace;[ ];
  66171. - Expression block - Gen<Expr> - 4 - (19:0,19)
  66172. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (19:0,19) - Tokens:1
  66173. - SyntaxKind.Transition;[@];
  66174. - Code span - Gen<Expr> - [bar] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (20:0,20) - Tokens:1
  66175. - SyntaxKind.Identifier;[bar];
  66176. - Markup span - Gen<Markup> - [ baz]]>] - SpanEditHandler;Accepts:None - (23:0,23) - Tokens:5
  66177. - SyntaxKind.Whitespace;[ ];
  66178. - SyntaxKind.Text;[baz];
  66179. - SyntaxKind.RightBracket;[]];
  66180. - SyntaxKind.RightBracket;[]];
  66181. - SyntaxKind.CloseAngle;[>];
  66182. - Tag block - Gen<None> - 6 - (30:0,30)
  66183. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:None - (30:0,30) - Tokens:4
  66184. - SyntaxKind.OpenAngle;[<];
  66185. - SyntaxKind.ForwardSlash;[/];
  66186. - SyntaxKind.Text;[foo];
  66187. - SyntaxKind.CloseAngle;[>];
  66188. +MarkupBlock - [0..36)::36 - [<foo><![CDATA[ foo @bar baz]]></foo>]
  66189. + MarkupTagBlock - [0..5)::5 - [<foo>]
  66190. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  66191. + OpenAngle;[<];
  66192. + Text;[foo];
  66193. + CloseAngle;[>];
  66194. + MarkupTextLiteral - [5..19)::14 - [<![CDATA[ foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66195. + OpenAngle;[<];
  66196. + Bang;[!];
  66197. + LeftBracket;[[];
  66198. + Text;[CDATA];
  66199. + LeftBracket;[[];
  66200. + Whitespace;[ ];
  66201. + Text;[foo];
  66202. + Whitespace;[ ];
  66203. + CSharpCodeBlock - [19..23)::4
  66204. + CSharpImplicitExpression - [19..23)::4
  66205. + CSharpTransition - [19..20)::1 - Gen<None> - SpanEditHandler;Accepts:None
  66206. + Transition;[@];
  66207. + CSharpImplicitExpressionBody - [20..23)::3
  66208. + CSharpCodeBlock - [20..23)::3
  66209. + CSharpExpressionLiteral - [20..23)::3 - [bar] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  66210. + Identifier;[bar];
  66211. + MarkupTextLiteral - [23..30)::7 - [ baz]]>] - Gen<Markup> - SpanEditHandler;Accepts:None
  66212. + Whitespace;[ ];
  66213. + Text;[baz];
  66214. + RightBracket;[]];
  66215. + RightBracket;[]];
  66216. + CloseAngle;[>];
  66217. + MarkupTagBlock - [30..36)::6 - [</foo>]
  66218. + MarkupTextLiteral - [30..36)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  66219. + OpenAngle;[<];
  66220. + ForwardSlash;[/];
  66221. + Text;[foo];
  66222. + CloseAngle;[>];
  66223. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SupportsCodeWithinComment.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SupportsCodeWithinComment.stree.txt
  66224. index 3d338b91ef0..df9f768f804 100644
  66225. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SupportsCodeWithinComment.stree.txt
  66226. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SupportsCodeWithinComment.stree.txt
  66227. @@ -1,29 +1,32 @@
  66228. -Markup block - Gen<None> - 24 - (0:0,0)
  66229. - Tag block - Gen<None> - 5 - (0:0,0)
  66230. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  66231. - SyntaxKind.OpenAngle;[<];
  66232. - SyntaxKind.Text;[foo];
  66233. - SyntaxKind.CloseAngle;[>];
  66234. - HtmlComment block - Gen<None> - 13 - (5:0,5)
  66235. - Markup span - Gen<Markup> - [<!--] - SpanEditHandler;Accepts:None - (5:0,5) - Tokens:3
  66236. - SyntaxKind.OpenAngle;[<];
  66237. - SyntaxKind.Bang;[!];
  66238. - SyntaxKind.DoubleHyphen;[--];
  66239. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Whitespace - (9:0,9) - Tokens:1
  66240. - SyntaxKind.Whitespace;[ ];
  66241. - Expression block - Gen<Expr> - 4 - (10:0,10)
  66242. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  66243. - SyntaxKind.Transition;[@];
  66244. - Code span - Gen<Expr> - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (11:0,11) - Tokens:1
  66245. - SyntaxKind.Identifier;[foo];
  66246. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Whitespace - (14:0,14) - Tokens:1
  66247. - SyntaxKind.Whitespace;[ ];
  66248. - Markup span - Gen<Markup> - [-->] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:2
  66249. - SyntaxKind.DoubleHyphen;[--];
  66250. - SyntaxKind.CloseAngle;[>];
  66251. - Tag block - Gen<None> - 6 - (18:0,18)
  66252. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:None - (18:0,18) - Tokens:4
  66253. - SyntaxKind.OpenAngle;[<];
  66254. - SyntaxKind.ForwardSlash;[/];
  66255. - SyntaxKind.Text;[foo];
  66256. - SyntaxKind.CloseAngle;[>];
  66257. +MarkupBlock - [0..24)::24 - [<foo><!-- @foo --></foo>]
  66258. + MarkupTagBlock - [0..5)::5 - [<foo>]
  66259. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  66260. + OpenAngle;[<];
  66261. + Text;[foo];
  66262. + CloseAngle;[>];
  66263. + MarkupCommentBlock - [5..18)::13
  66264. + MarkupTextLiteral - [5..9)::4 - [<!--] - Gen<Markup> - SpanEditHandler;Accepts:None
  66265. + OpenAngle;[<];
  66266. + Bang;[!];
  66267. + DoubleHyphen;[--];
  66268. + MarkupTextLiteral - [9..10)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Whitespace
  66269. + Whitespace;[ ];
  66270. + CSharpCodeBlock - [10..14)::4
  66271. + CSharpImplicitExpression - [10..14)::4
  66272. + CSharpTransition - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  66273. + Transition;[@];
  66274. + CSharpImplicitExpressionBody - [11..14)::3
  66275. + CSharpCodeBlock - [11..14)::3
  66276. + CSharpExpressionLiteral - [11..14)::3 - [foo] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  66277. + Identifier;[foo];
  66278. + MarkupTextLiteral - [14..15)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Whitespace
  66279. + Whitespace;[ ];
  66280. + MarkupTextLiteral - [15..18)::3 - [-->] - Gen<Markup> - SpanEditHandler;Accepts:None
  66281. + DoubleHyphen;[--];
  66282. + CloseAngle;[>];
  66283. + MarkupTagBlock - [18..24)::6 - [</foo>]
  66284. + MarkupTextLiteral - [18..24)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  66285. + OpenAngle;[<];
  66286. + ForwardSlash;[/];
  66287. + Text;[foo];
  66288. + CloseAngle;[>];
  66289. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SupportsCodeWithinSGMLDeclaration.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SupportsCodeWithinSGMLDeclaration.stree.txt
  66290. index db637d4d835..71abdc043bd 100644
  66291. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SupportsCodeWithinSGMLDeclaration.stree.txt
  66292. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SupportsCodeWithinSGMLDeclaration.stree.txt
  66293. @@ -1,28 +1,31 @@
  66294. -Markup block - Gen<None> - 34 - (0:0,0)
  66295. - Tag block - Gen<None> - 5 - (0:0,0)
  66296. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  66297. - SyntaxKind.OpenAngle;[<];
  66298. - SyntaxKind.Text;[foo];
  66299. - SyntaxKind.CloseAngle;[>];
  66300. - Markup span - Gen<Markup> - [<!DOCTYPE foo ] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:6
  66301. - SyntaxKind.OpenAngle;[<];
  66302. - SyntaxKind.Bang;[!];
  66303. - SyntaxKind.Text;[DOCTYPE];
  66304. - SyntaxKind.Whitespace;[ ];
  66305. - SyntaxKind.Text;[foo];
  66306. - SyntaxKind.Whitespace;[ ];
  66307. - Expression block - Gen<Expr> - 4 - (19:0,19)
  66308. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (19:0,19) - Tokens:1
  66309. - SyntaxKind.Transition;[@];
  66310. - Code span - Gen<Expr> - [bar] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (20:0,20) - Tokens:1
  66311. - SyntaxKind.Identifier;[bar];
  66312. - Markup span - Gen<Markup> - [ baz>] - SpanEditHandler;Accepts:None - (23:0,23) - Tokens:3
  66313. - SyntaxKind.Whitespace;[ ];
  66314. - SyntaxKind.Text;[baz];
  66315. - SyntaxKind.CloseAngle;[>];
  66316. - Tag block - Gen<None> - 6 - (28:0,28)
  66317. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:None - (28:0,28) - Tokens:4
  66318. - SyntaxKind.OpenAngle;[<];
  66319. - SyntaxKind.ForwardSlash;[/];
  66320. - SyntaxKind.Text;[foo];
  66321. - SyntaxKind.CloseAngle;[>];
  66322. +MarkupBlock - [0..34)::34 - [<foo><!DOCTYPE foo @bar baz></foo>]
  66323. + MarkupTagBlock - [0..5)::5 - [<foo>]
  66324. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  66325. + OpenAngle;[<];
  66326. + Text;[foo];
  66327. + CloseAngle;[>];
  66328. + MarkupTextLiteral - [5..19)::14 - [<!DOCTYPE foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66329. + OpenAngle;[<];
  66330. + Bang;[!];
  66331. + Text;[DOCTYPE];
  66332. + Whitespace;[ ];
  66333. + Text;[foo];
  66334. + Whitespace;[ ];
  66335. + CSharpCodeBlock - [19..23)::4
  66336. + CSharpImplicitExpression - [19..23)::4
  66337. + CSharpTransition - [19..20)::1 - Gen<None> - SpanEditHandler;Accepts:None
  66338. + Transition;[@];
  66339. + CSharpImplicitExpressionBody - [20..23)::3
  66340. + CSharpCodeBlock - [20..23)::3
  66341. + CSharpExpressionLiteral - [20..23)::3 - [bar] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  66342. + Identifier;[bar];
  66343. + MarkupTextLiteral - [23..28)::5 - [ baz>] - Gen<Markup> - SpanEditHandler;Accepts:None
  66344. + Whitespace;[ ];
  66345. + Text;[baz];
  66346. + CloseAngle;[>];
  66347. + MarkupTagBlock - [28..34)::6 - [</foo>]
  66348. + MarkupTextLiteral - [28..34)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  66349. + OpenAngle;[<];
  66350. + ForwardSlash;[/];
  66351. + Text;[foo];
  66352. + CloseAngle;[>];
  66353. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SupportsCodeWithinXMLProcessingInstruction.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SupportsCodeWithinXMLProcessingInstruction.stree.txt
  66354. index ad0ff2da878..7944430ce67 100644
  66355. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SupportsCodeWithinXMLProcessingInstruction.stree.txt
  66356. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SupportsCodeWithinXMLProcessingInstruction.stree.txt
  66357. @@ -1,29 +1,32 @@
  66358. -Markup block - Gen<None> - 31 - (0:0,0)
  66359. - Tag block - Gen<None> - 5 - (0:0,0)
  66360. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  66361. - SyntaxKind.OpenAngle;[<];
  66362. - SyntaxKind.Text;[foo];
  66363. - SyntaxKind.CloseAngle;[>];
  66364. - Markup span - Gen<Markup> - [<?xml foo ] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:6
  66365. - SyntaxKind.OpenAngle;[<];
  66366. - SyntaxKind.QuestionMark;[?];
  66367. - SyntaxKind.Text;[xml];
  66368. - SyntaxKind.Whitespace;[ ];
  66369. - SyntaxKind.Text;[foo];
  66370. - SyntaxKind.Whitespace;[ ];
  66371. - Expression block - Gen<Expr> - 4 - (15:0,15)
  66372. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:1
  66373. - SyntaxKind.Transition;[@];
  66374. - Code span - Gen<Expr> - [bar] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (16:0,16) - Tokens:1
  66375. - SyntaxKind.Identifier;[bar];
  66376. - Markup span - Gen<Markup> - [ baz?>] - SpanEditHandler;Accepts:None - (19:0,19) - Tokens:4
  66377. - SyntaxKind.Whitespace;[ ];
  66378. - SyntaxKind.Text;[baz];
  66379. - SyntaxKind.QuestionMark;[?];
  66380. - SyntaxKind.CloseAngle;[>];
  66381. - Tag block - Gen<None> - 6 - (25:0,25)
  66382. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:None - (25:0,25) - Tokens:4
  66383. - SyntaxKind.OpenAngle;[<];
  66384. - SyntaxKind.ForwardSlash;[/];
  66385. - SyntaxKind.Text;[foo];
  66386. - SyntaxKind.CloseAngle;[>];
  66387. +MarkupBlock - [0..31)::31 - [<foo><?xml foo @bar baz?></foo>]
  66388. + MarkupTagBlock - [0..5)::5 - [<foo>]
  66389. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  66390. + OpenAngle;[<];
  66391. + Text;[foo];
  66392. + CloseAngle;[>];
  66393. + MarkupTextLiteral - [5..15)::10 - [<?xml foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66394. + OpenAngle;[<];
  66395. + QuestionMark;[?];
  66396. + Text;[xml];
  66397. + Whitespace;[ ];
  66398. + Text;[foo];
  66399. + Whitespace;[ ];
  66400. + CSharpCodeBlock - [15..19)::4
  66401. + CSharpImplicitExpression - [15..19)::4
  66402. + CSharpTransition - [15..16)::1 - Gen<None> - SpanEditHandler;Accepts:None
  66403. + Transition;[@];
  66404. + CSharpImplicitExpressionBody - [16..19)::3
  66405. + CSharpCodeBlock - [16..19)::3
  66406. + CSharpExpressionLiteral - [16..19)::3 - [bar] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  66407. + Identifier;[bar];
  66408. + MarkupTextLiteral - [19..25)::6 - [ baz?>] - Gen<Markup> - SpanEditHandler;Accepts:None
  66409. + Whitespace;[ ];
  66410. + Text;[baz];
  66411. + QuestionMark;[?];
  66412. + CloseAngle;[>];
  66413. + MarkupTagBlock - [25..31)::6 - [</foo>]
  66414. + MarkupTextLiteral - [25..31)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  66415. + OpenAngle;[<];
  66416. + ForwardSlash;[/];
  66417. + Text;[foo];
  66418. + CloseAngle;[>];
  66419. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SwitchesToCodeWhenSwapCharacterEncounteredInAttributeValue.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SwitchesToCodeWhenSwapCharacterEncounteredInAttributeValue.stree.txt
  66420. index 1bdcbd4a090..d4fddc9dd00 100644
  66421. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SwitchesToCodeWhenSwapCharacterEncounteredInAttributeValue.stree.txt
  66422. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SwitchesToCodeWhenSwapCharacterEncounteredInAttributeValue.stree.txt
  66423. @@ -1,23 +1,30 @@
  66424. -Markup block - Gen<None> - 18 - (0:0,0)
  66425. - Tag block - Gen<None> - 18 - (0:0,0)
  66426. - Markup span - Gen<Markup> - [<foo] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  66427. - SyntaxKind.OpenAngle;[<];
  66428. - SyntaxKind.Text;[foo];
  66429. - Markup block - Gen<Attr:bar, bar="@(4:0,4),"@(14:0,14)> - 11 - (4:0,4)
  66430. - Markup span - Gen<None> - [ bar="] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:4
  66431. - SyntaxKind.Whitespace;[ ];
  66432. - SyntaxKind.Text;[bar];
  66433. - SyntaxKind.Equals;[=];
  66434. - SyntaxKind.DoubleQuote;["];
  66435. - Markup block - Gen<DynAttr:@(10:0,10)> - 4 - (10:0,10)
  66436. - Expression block - Gen<Expr> - 4 - (10:0,10)
  66437. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  66438. - SyntaxKind.Transition;[@];
  66439. - Code span - Gen<Expr> - [baz] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (11:0,11) - Tokens:1
  66440. - SyntaxKind.Identifier;[baz];
  66441. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  66442. - SyntaxKind.DoubleQuote;["];
  66443. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:3
  66444. - SyntaxKind.Whitespace;[ ];
  66445. - SyntaxKind.ForwardSlash;[/];
  66446. - SyntaxKind.CloseAngle;[>];
  66447. +MarkupBlock - [0..18)::18 - [<foo bar="@baz" />]
  66448. + MarkupTagBlock - [0..18)::18 - [<foo bar="@baz" />]
  66449. + MarkupTextLiteral - [0..4)::4 - [<foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66450. + OpenAngle;[<];
  66451. + Text;[foo];
  66452. + MarkupAttributeBlock - [4..15)::11 - [ bar="@baz"]
  66453. + MarkupTextLiteral - [4..5)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66454. + Whitespace;[ ];
  66455. + MarkupTextLiteral - [5..8)::3 - [bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66456. + Text;[bar];
  66457. + Equals;[=];
  66458. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  66459. + DoubleQuote;["];
  66460. + GenericBlock - [10..14)::4
  66461. + MarkupDynamicAttributeValue - [10..14)::4 - [@baz]
  66462. + GenericBlock - [10..14)::4
  66463. + CSharpCodeBlock - [10..14)::4
  66464. + CSharpImplicitExpression - [10..14)::4
  66465. + CSharpTransition - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  66466. + Transition;[@];
  66467. + CSharpImplicitExpressionBody - [11..14)::3
  66468. + CSharpCodeBlock - [11..14)::3
  66469. + CSharpExpressionLiteral - [11..14)::3 - [baz] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  66470. + Identifier;[baz];
  66471. + MarkupTextLiteral - [14..15)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  66472. + DoubleQuote;["];
  66473. + MarkupTextLiteral - [15..18)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  66474. + Whitespace;[ ];
  66475. + ForwardSlash;[/];
  66476. + CloseAngle;[>];
  66477. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SwitchesToCodeWhenSwapCharacterEncounteredInTagContent.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SwitchesToCodeWhenSwapCharacterEncounteredInTagContent.stree.txt
  66478. index 176427addfd..f690ae4f8a1 100644
  66479. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SwitchesToCodeWhenSwapCharacterEncounteredInTagContent.stree.txt
  66480. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SwitchesToCodeWhenSwapCharacterEncounteredInTagContent.stree.txt
  66481. @@ -1,37 +1,43 @@
  66482. -Markup block - Gen<None> - 30 - (0:0,0)
  66483. - Tag block - Gen<None> - 5 - (0:0,0)
  66484. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  66485. - SyntaxKind.OpenAngle;[<];
  66486. - SyntaxKind.Text;[foo];
  66487. - SyntaxKind.CloseAngle;[>];
  66488. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:1
  66489. - SyntaxKind.Unknown;[];
  66490. - Expression block - Gen<Expr> - 4 - (5:0,5)
  66491. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (5:0,5) - Tokens:1
  66492. - SyntaxKind.Transition;[@];
  66493. - Code span - Gen<Expr> - [bar] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (6:0,6) - Tokens:1
  66494. - SyntaxKind.Identifier;[bar];
  66495. - Tag block - Gen<None> - 5 - (9:0,9)
  66496. - Markup span - Gen<Markup> - [<baz>] - SpanEditHandler;Accepts:None - (9:0,9) - Tokens:3
  66497. - SyntaxKind.OpenAngle;[<];
  66498. - SyntaxKind.Text;[baz];
  66499. - SyntaxKind.CloseAngle;[>];
  66500. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  66501. - SyntaxKind.Unknown;[];
  66502. - Expression block - Gen<Expr> - 4 - (14:0,14)
  66503. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (14:0,14) - Tokens:1
  66504. - SyntaxKind.Transition;[@];
  66505. - Code span - Gen<Expr> - [boz] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (15:0,15) - Tokens:1
  66506. - SyntaxKind.Identifier;[boz];
  66507. - Tag block - Gen<None> - 6 - (18:0,18)
  66508. - Markup span - Gen<Markup> - [</baz>] - SpanEditHandler;Accepts:None - (18:0,18) - Tokens:4
  66509. - SyntaxKind.OpenAngle;[<];
  66510. - SyntaxKind.ForwardSlash;[/];
  66511. - SyntaxKind.Text;[baz];
  66512. - SyntaxKind.CloseAngle;[>];
  66513. - Tag block - Gen<None> - 6 - (24:0,24)
  66514. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:None - (24:0,24) - Tokens:4
  66515. - SyntaxKind.OpenAngle;[<];
  66516. - SyntaxKind.ForwardSlash;[/];
  66517. - SyntaxKind.Text;[foo];
  66518. - SyntaxKind.CloseAngle;[>];
  66519. +MarkupBlock - [0..30)::30 - [<foo>@bar<baz>@boz</baz></foo>]
  66520. + MarkupTagBlock - [0..5)::5 - [<foo>]
  66521. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  66522. + OpenAngle;[<];
  66523. + Text;[foo];
  66524. + CloseAngle;[>];
  66525. + MarkupTextLiteral - [5..5)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66526. + Marker;[];
  66527. + CSharpCodeBlock - [5..9)::4
  66528. + CSharpImplicitExpression - [5..9)::4
  66529. + CSharpTransition - [5..6)::1 - Gen<None> - SpanEditHandler;Accepts:None
  66530. + Transition;[@];
  66531. + CSharpImplicitExpressionBody - [6..9)::3
  66532. + CSharpCodeBlock - [6..9)::3
  66533. + CSharpExpressionLiteral - [6..9)::3 - [bar] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  66534. + Identifier;[bar];
  66535. + MarkupTagBlock - [9..14)::5 - [<baz>]
  66536. + MarkupTextLiteral - [9..14)::5 - [<baz>] - Gen<Markup> - SpanEditHandler;Accepts:None
  66537. + OpenAngle;[<];
  66538. + Text;[baz];
  66539. + CloseAngle;[>];
  66540. + MarkupTextLiteral - [14..14)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66541. + Marker;[];
  66542. + CSharpCodeBlock - [14..18)::4
  66543. + CSharpImplicitExpression - [14..18)::4
  66544. + CSharpTransition - [14..15)::1 - Gen<None> - SpanEditHandler;Accepts:None
  66545. + Transition;[@];
  66546. + CSharpImplicitExpressionBody - [15..18)::3
  66547. + CSharpCodeBlock - [15..18)::3
  66548. + CSharpExpressionLiteral - [15..18)::3 - [boz] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  66549. + Identifier;[boz];
  66550. + MarkupTagBlock - [18..24)::6 - [</baz>]
  66551. + MarkupTextLiteral - [18..24)::6 - [</baz>] - Gen<Markup> - SpanEditHandler;Accepts:None
  66552. + OpenAngle;[<];
  66553. + ForwardSlash;[/];
  66554. + Text;[baz];
  66555. + CloseAngle;[>];
  66556. + MarkupTagBlock - [24..30)::6 - [</foo>]
  66557. + MarkupTextLiteral - [24..30)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  66558. + OpenAngle;[<];
  66559. + ForwardSlash;[/];
  66560. + Text;[foo];
  66561. + CloseAngle;[>];
  66562. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SwitchesToCodeWhenSwapCharacterEncounteredMidTag.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SwitchesToCodeWhenSwapCharacterEncounteredMidTag.stree.txt
  66563. index 862c2bc3545..7b3fe6acc10 100644
  66564. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SwitchesToCodeWhenSwapCharacterEncounteredMidTag.stree.txt
  66565. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SwitchesToCodeWhenSwapCharacterEncounteredMidTag.stree.txt
  66566. @@ -1,15 +1,18 @@
  66567. -Markup block - Gen<None> - 12 - (0:0,0)
  66568. - Tag block - Gen<None> - 12 - (0:0,0)
  66569. - Markup span - Gen<Markup> - [<foo ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  66570. - SyntaxKind.OpenAngle;[<];
  66571. - SyntaxKind.Text;[foo];
  66572. - SyntaxKind.Whitespace;[ ];
  66573. - Expression block - Gen<Expr> - 4 - (5:0,5)
  66574. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (5:0,5) - Tokens:1
  66575. - SyntaxKind.Transition;[@];
  66576. - Code span - Gen<Expr> - [bar] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (6:0,6) - Tokens:1
  66577. - SyntaxKind.Identifier;[bar];
  66578. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:None - (9:0,9) - Tokens:3
  66579. - SyntaxKind.Whitespace;[ ];
  66580. - SyntaxKind.ForwardSlash;[/];
  66581. - SyntaxKind.CloseAngle;[>];
  66582. +MarkupBlock - [0..12)::12 - [<foo @bar />]
  66583. + MarkupTagBlock - [0..12)::12 - [<foo @bar />]
  66584. + MarkupTextLiteral - [0..5)::5 - [<foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66585. + OpenAngle;[<];
  66586. + Text;[foo];
  66587. + Whitespace;[ ];
  66588. + CSharpCodeBlock - [5..9)::4
  66589. + CSharpImplicitExpression - [5..9)::4
  66590. + CSharpTransition - [5..6)::1 - Gen<None> - SpanEditHandler;Accepts:None
  66591. + Transition;[@];
  66592. + CSharpImplicitExpressionBody - [6..9)::3
  66593. + CSharpCodeBlock - [6..9)::3
  66594. + CSharpExpressionLiteral - [6..9)::3 - [bar] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  66595. + Identifier;[bar];
  66596. + MarkupTextLiteral - [9..12)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  66597. + Whitespace;[ ];
  66598. + ForwardSlash;[/];
  66599. + CloseAngle;[>];
  66600. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SwitchesWhenCharacterBeforeSwapIsNonAlphanumeric.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SwitchesWhenCharacterBeforeSwapIsNonAlphanumeric.stree.txt
  66601. index 737ef38f09e..2e38b78492c 100644
  66602. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SwitchesWhenCharacterBeforeSwapIsNonAlphanumeric.stree.txt
  66603. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/SwitchesWhenCharacterBeforeSwapIsNonAlphanumeric.stree.txt
  66604. @@ -1,19 +1,22 @@
  66605. -Markup block - Gen<None> - 13 - (0:0,0)
  66606. - Tag block - Gen<None> - 3 - (0:0,0)
  66607. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  66608. - SyntaxKind.OpenAngle;[<];
  66609. - SyntaxKind.Text;[p];
  66610. - SyntaxKind.CloseAngle;[>];
  66611. - Markup span - Gen<Markup> - [foo#] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:1
  66612. - SyntaxKind.Text;[foo#];
  66613. - Expression block - Gen<Expr> - 2 - (7:0,7)
  66614. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (7:0,7) - Tokens:1
  66615. - SyntaxKind.Transition;[@];
  66616. - Code span - Gen<Expr> - [i] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (8:0,8) - Tokens:1
  66617. - SyntaxKind.Identifier;[i];
  66618. - Tag block - Gen<None> - 4 - (9:0,9)
  66619. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (9:0,9) - Tokens:4
  66620. - SyntaxKind.OpenAngle;[<];
  66621. - SyntaxKind.ForwardSlash;[/];
  66622. - SyntaxKind.Text;[p];
  66623. - SyntaxKind.CloseAngle;[>];
  66624. +MarkupBlock - [0..13)::13 - [<p>foo#@i</p>]
  66625. + MarkupTagBlock - [0..3)::3 - [<p>]
  66626. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  66627. + OpenAngle;[<];
  66628. + Text;[p];
  66629. + CloseAngle;[>];
  66630. + MarkupTextLiteral - [3..7)::4 - [foo#] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66631. + Text;[foo#];
  66632. + CSharpCodeBlock - [7..9)::2
  66633. + CSharpImplicitExpression - [7..9)::2
  66634. + CSharpTransition - [7..8)::1 - Gen<None> - SpanEditHandler;Accepts:None
  66635. + Transition;[@];
  66636. + CSharpImplicitExpressionBody - [8..9)::1
  66637. + CSharpCodeBlock - [8..9)::1
  66638. + CSharpExpressionLiteral - [8..9)::1 - [i] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  66639. + Identifier;[i];
  66640. + MarkupTagBlock - [9..13)::4 - [</p>]
  66641. + MarkupTextLiteral - [9..13)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  66642. + OpenAngle;[<];
  66643. + ForwardSlash;[/];
  66644. + Text;[p];
  66645. + CloseAngle;[>];
  66646. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/TreatsPairsOfAtSignsAsEscapeSequence.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/TreatsPairsOfAtSignsAsEscapeSequence.stree.txt
  66647. index 1aa4b37fa80..5d662de02b8 100644
  66648. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/TreatsPairsOfAtSignsAsEscapeSequence.stree.txt
  66649. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/TreatsPairsOfAtSignsAsEscapeSequence.stree.txt
  66650. @@ -1,25 +1,28 @@
  66651. -Markup block - Gen<None> - 19 - (0:0,0)
  66652. - Tag block - Gen<None> - 5 - (0:0,0)
  66653. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  66654. - SyntaxKind.OpenAngle;[<];
  66655. - SyntaxKind.Text;[foo];
  66656. - SyntaxKind.CloseAngle;[>];
  66657. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:1
  66658. - SyntaxKind.Transition;[@];
  66659. - Markup span - Gen<Markup> - [@] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:1
  66660. - SyntaxKind.Transition;[@];
  66661. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:Any - (7:0,7) - Tokens:1
  66662. - SyntaxKind.Transition;[@];
  66663. - Markup span - Gen<Markup> - [@] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:1
  66664. - SyntaxKind.Transition;[@];
  66665. - Expression block - Gen<Expr> - 4 - (9:0,9)
  66666. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (9:0,9) - Tokens:1
  66667. - SyntaxKind.Transition;[@];
  66668. - Code span - Gen<Expr> - [bar] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (10:0,10) - Tokens:1
  66669. - SyntaxKind.Identifier;[bar];
  66670. - Tag block - Gen<None> - 6 - (13:0,13)
  66671. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:4
  66672. - SyntaxKind.OpenAngle;[<];
  66673. - SyntaxKind.ForwardSlash;[/];
  66674. - SyntaxKind.Text;[foo];
  66675. - SyntaxKind.CloseAngle;[>];
  66676. +MarkupBlock - [0..19)::19 - [<foo>@@@@@bar</foo>]
  66677. + MarkupTagBlock - [0..5)::5 - [<foo>]
  66678. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  66679. + OpenAngle;[<];
  66680. + Text;[foo];
  66681. + CloseAngle;[>];
  66682. + MarkupEphemeralTextLiteral - [5..6)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:Any
  66683. + Transition;[@];
  66684. + MarkupTextLiteral - [6..7)::1 - [@] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66685. + Transition;[@];
  66686. + MarkupEphemeralTextLiteral - [7..8)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:Any
  66687. + Transition;[@];
  66688. + MarkupTextLiteral - [8..9)::1 - [@] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66689. + Transition;[@];
  66690. + CSharpCodeBlock - [9..13)::4
  66691. + CSharpImplicitExpression - [9..13)::4
  66692. + CSharpTransition - [9..10)::1 - Gen<None> - SpanEditHandler;Accepts:None
  66693. + Transition;[@];
  66694. + CSharpImplicitExpressionBody - [10..13)::3
  66695. + CSharpCodeBlock - [10..13)::3
  66696. + CSharpExpressionLiteral - [10..13)::3 - [bar] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  66697. + Identifier;[bar];
  66698. + MarkupTagBlock - [13..19)::6 - [</foo>]
  66699. + MarkupTextLiteral - [13..19)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  66700. + OpenAngle;[<];
  66701. + ForwardSlash;[/];
  66702. + Text;[foo];
  66703. + CloseAngle;[>];
  66704. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/TreatsTwoAtSignsAsEscapeSequence.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/TreatsTwoAtSignsAsEscapeSequence.stree.txt
  66705. index ddf76b2d110..0b73d78433f 100644
  66706. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/TreatsTwoAtSignsAsEscapeSequence.stree.txt
  66707. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/HtmlToCodeSwitchTest/TreatsTwoAtSignsAsEscapeSequence.stree.txt
  66708. @@ -1,17 +1,17 @@
  66709. -Markup block - Gen<None> - 16 - (0:0,0)
  66710. - Tag block - Gen<None> - 5 - (0:0,0)
  66711. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:3
  66712. - SyntaxKind.OpenAngle;[<];
  66713. - SyntaxKind.Text;[foo];
  66714. - SyntaxKind.CloseAngle;[>];
  66715. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:1
  66716. - SyntaxKind.Transition;[@];
  66717. - Markup span - Gen<Markup> - [@bar] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:2
  66718. - SyntaxKind.Transition;[@];
  66719. - SyntaxKind.Text;[bar];
  66720. - Tag block - Gen<None> - 6 - (10:0,10)
  66721. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:4
  66722. - SyntaxKind.OpenAngle;[<];
  66723. - SyntaxKind.ForwardSlash;[/];
  66724. - SyntaxKind.Text;[foo];
  66725. - SyntaxKind.CloseAngle;[>];
  66726. +MarkupBlock - [0..16)::16 - [<foo>@@bar</foo>]
  66727. + MarkupTagBlock - [0..5)::5 - [<foo>]
  66728. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  66729. + OpenAngle;[<];
  66730. + Text;[foo];
  66731. + CloseAngle;[>];
  66732. + MarkupEphemeralTextLiteral - [5..6)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:Any
  66733. + Transition;[@];
  66734. + MarkupTextLiteral - [6..10)::4 - [@bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66735. + Transition;[@];
  66736. + Text;[bar];
  66737. + MarkupTagBlock - [10..16)::6 - [</foo>]
  66738. + MarkupTextLiteral - [10..16)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:None
  66739. + OpenAngle;[<];
  66740. + ForwardSlash;[/];
  66741. + Text;[foo];
  66742. + CloseAngle;[>];
  66743. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_DoesNotSpecialCase_VoidTags.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_DoesNotSpecialCase_VoidTags.cspans.txt
  66744. new file mode 100644
  66745. index 00000000000..d9ab213c73c
  66746. --- /dev/null
  66747. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_DoesNotSpecialCase_VoidTags.cspans.txt
  66748. @@ -0,0 +1,5 @@
  66749. +Markup span at (0:0,0 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [22] )
  66750. +Markup span at (2:1,0 [7] ) (Accepts:Any) - Parent: Tag block at (2:1,0 [7] )
  66751. +Markup span at (9:1,7 [3] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [22] )
  66752. +Markup span at (12:1,10 [8] ) (Accepts:Any) - Parent: Tag block at (12:1,10 [8] )
  66753. +Markup span at (20:1,18 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [22] )
  66754. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_DoesNotSpecialCase_VoidTags.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_DoesNotSpecialCase_VoidTags.stree.txt
  66755. new file mode 100644
  66756. index 00000000000..ba5f6c0b547
  66757. --- /dev/null
  66758. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_DoesNotSpecialCase_VoidTags.stree.txt
  66759. @@ -0,0 +1,20 @@
  66760. +RazorDocument - [0..22)::22 - [LF<input>Foo</input>LF]
  66761. + MarkupBlock - [0..22)::22
  66762. + MarkupTextLiteral - [0..2)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66763. + NewLine;[LF];
  66764. + MarkupElement - [2..20)::18
  66765. + MarkupTagBlock - [2..9)::7 - [<input>]
  66766. + MarkupTextLiteral - [2..9)::7 - [<input>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66767. + OpenAngle;[<];
  66768. + Text;[input];
  66769. + CloseAngle;[>];
  66770. + MarkupTextLiteral - [9..12)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66771. + Text;[Foo];
  66772. + MarkupTagBlock - [12..20)::8 - [</input>]
  66773. + MarkupTextLiteral - [12..20)::8 - [</input>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66774. + OpenAngle;[<];
  66775. + ForwardSlash;[/];
  66776. + Text;[input];
  66777. + CloseAngle;[>];
  66778. + MarkupTextLiteral - [20..22)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66779. + NewLine;[LF];
  66780. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_EndTagsWithMissingStartTags.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_EndTagsWithMissingStartTags.cspans.txt
  66781. new file mode 100644
  66782. index 00000000000..017a6ad437c
  66783. --- /dev/null
  66784. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_EndTagsWithMissingStartTags.cspans.txt
  66785. @@ -0,0 +1,3 @@
  66786. +Markup span at (0:0,0 [5] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [13] )
  66787. +Markup span at (5:1,3 [6] ) (Accepts:Any) - Parent: Tag block at (5:1,3 [6] )
  66788. +Markup span at (11:1,9 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [13] )
  66789. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_EndTagsWithMissingStartTags.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_EndTagsWithMissingStartTags.stree.txt
  66790. new file mode 100644
  66791. index 00000000000..3fccc12bea6
  66792. --- /dev/null
  66793. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_EndTagsWithMissingStartTags.stree.txt
  66794. @@ -0,0 +1,14 @@
  66795. +RazorDocument - [0..13)::13 - [LFFoo</div>LF]
  66796. + MarkupBlock - [0..13)::13
  66797. + MarkupTextLiteral - [0..5)::5 - [LFFoo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66798. + NewLine;[LF];
  66799. + Text;[Foo];
  66800. + MarkupElement - [5..11)::6
  66801. + MarkupTagBlock - [5..11)::6 - [</div>]
  66802. + MarkupTextLiteral - [5..11)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66803. + OpenAngle;[<];
  66804. + ForwardSlash;[/];
  66805. + Text;[div];
  66806. + CloseAngle;[>];
  66807. + MarkupTextLiteral - [11..13)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66808. + NewLine;[LF];
  66809. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_IncompleteTags.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_IncompleteTags.cspans.txt
  66810. new file mode 100644
  66811. index 00000000000..245badb59b7
  66812. --- /dev/null
  66813. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_IncompleteTags.cspans.txt
  66814. @@ -0,0 +1,8 @@
  66815. +Markup span at (0:0,0 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [27] )
  66816. +Markup span at (2:1,0 [1] ) (Accepts:Any) - Parent: Tag block at (2:1,0 [1] )
  66817. +Markup span at (3:1,1 [5] ) (Accepts:Any) - Parent: Tag block at (3:1,1 [5] )
  66818. +Markup span at (8:1,6 [4] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [27] )
  66819. +Markup span at (12:1,10 [2] ) (Accepts:Any) - Parent: Tag block at (12:1,10 [2] )
  66820. +Markup span at (14:1,12 [6] ) (Accepts:Any) - Parent: Tag block at (14:1,12 [6] )
  66821. +Markup span at (20:1,18 [5] ) (Accepts:Any) - Parent: Tag block at (20:1,18 [5] )
  66822. +Markup span at (25:1,23 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [27] )
  66823. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_IncompleteTags.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_IncompleteTags.stree.txt
  66824. new file mode 100644
  66825. index 00000000000..31f5bd67041
  66826. --- /dev/null
  66827. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_IncompleteTags.stree.txt
  66828. @@ -0,0 +1,36 @@
  66829. +RazorDocument - [0..27)::27 - [LF<<div>>Foo</</div>< >LF]
  66830. + MarkupBlock - [0..27)::27
  66831. + MarkupTextLiteral - [0..2)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66832. + NewLine;[LF];
  66833. + MarkupElement - [2..3)::1
  66834. + MarkupTagBlock - [2..3)::1 - [<]
  66835. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66836. + OpenAngle;[<];
  66837. + MarkupElement - [3..20)::17
  66838. + MarkupTagBlock - [3..8)::5 - [<div>]
  66839. + MarkupTextLiteral - [3..8)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66840. + OpenAngle;[<];
  66841. + Text;[div];
  66842. + CloseAngle;[>];
  66843. + MarkupTextLiteral - [8..12)::4 - [>Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66844. + CloseAngle;[>];
  66845. + Text;[Foo];
  66846. + MarkupElement - [12..14)::2
  66847. + MarkupTagBlock - [12..14)::2 - [</]
  66848. + MarkupTextLiteral - [12..14)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66849. + OpenAngle;[<];
  66850. + ForwardSlash;[/];
  66851. + MarkupTagBlock - [14..20)::6 - [</div>]
  66852. + MarkupTextLiteral - [14..20)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66853. + OpenAngle;[<];
  66854. + ForwardSlash;[/];
  66855. + Text;[div];
  66856. + CloseAngle;[>];
  66857. + MarkupElement - [20..25)::5
  66858. + MarkupTagBlock - [20..25)::5 - [< >]
  66859. + MarkupTextLiteral - [20..25)::5 - [< >] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66860. + OpenAngle;[<];
  66861. + Whitespace;[ ];
  66862. + CloseAngle;[>];
  66863. + MarkupTextLiteral - [25..27)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66864. + NewLine;[LF];
  66865. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_MalformedTags_RecoversSuccessfully.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_MalformedTags_RecoversSuccessfully.cspans.txt
  66866. new file mode 100644
  66867. index 00000000000..616773a7c78
  66868. --- /dev/null
  66869. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_MalformedTags_RecoversSuccessfully.cspans.txt
  66870. @@ -0,0 +1,7 @@
  66871. +Markup span at (0:0,0 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [35] )
  66872. +Markup span at (2:1,0 [5] ) (Accepts:Any) - Parent: Tag block at (2:1,0 [5] )
  66873. +Markup span at (7:1,5 [7] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [35] )
  66874. +Markup span at (14:1,12 [7] ) (Accepts:Any) - Parent: Tag block at (14:1,12 [7] )
  66875. +Markup span at (21:1,19 [6] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [35] )
  66876. +Markup span at (27:1,25 [6] ) (Accepts:Any) - Parent: Tag block at (27:1,25 [6] )
  66877. +Markup span at (33:1,31 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [35] )
  66878. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_MalformedTags_RecoversSuccessfully.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_MalformedTags_RecoversSuccessfully.stree.txt
  66879. new file mode 100644
  66880. index 00000000000..9ea3d31fbc5
  66881. --- /dev/null
  66882. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_MalformedTags_RecoversSuccessfully.stree.txt
  66883. @@ -0,0 +1,29 @@
  66884. +RazorDocument - [0..35)::35 - [LF<div>content</span>footer</div>LF]
  66885. + MarkupBlock - [0..35)::35
  66886. + MarkupTextLiteral - [0..2)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66887. + NewLine;[LF];
  66888. + MarkupElement - [2..33)::31
  66889. + MarkupTagBlock - [2..7)::5 - [<div>]
  66890. + MarkupTextLiteral - [2..7)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66891. + OpenAngle;[<];
  66892. + Text;[div];
  66893. + CloseAngle;[>];
  66894. + MarkupTextLiteral - [7..14)::7 - [content] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66895. + Text;[content];
  66896. + MarkupElement - [14..21)::7
  66897. + MarkupTagBlock - [14..21)::7 - [</span>]
  66898. + MarkupTextLiteral - [14..21)::7 - [</span>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66899. + OpenAngle;[<];
  66900. + ForwardSlash;[/];
  66901. + Text;[span];
  66902. + CloseAngle;[>];
  66903. + MarkupTextLiteral - [21..27)::6 - [footer] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66904. + Text;[footer];
  66905. + MarkupTagBlock - [27..33)::6 - [</div>]
  66906. + MarkupTextLiteral - [27..33)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66907. + OpenAngle;[<];
  66908. + ForwardSlash;[/];
  66909. + Text;[div];
  66910. + CloseAngle;[>];
  66911. + MarkupTextLiteral - [33..35)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66912. + NewLine;[LF];
  66913. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_MisplacedEndTags_RecoversSuccessfully.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_MisplacedEndTags_RecoversSuccessfully.cspans.txt
  66914. new file mode 100644
  66915. index 00000000000..d19254baf9b
  66916. --- /dev/null
  66917. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_MisplacedEndTags_RecoversSuccessfully.cspans.txt
  66918. @@ -0,0 +1,8 @@
  66919. +Markup span at (0:0,0 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [41] )
  66920. +Markup span at (2:1,0 [5] ) (Accepts:Any) - Parent: Tag block at (2:1,0 [5] )
  66921. +Markup span at (7:1,5 [7] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [41] )
  66922. +Markup span at (14:1,12 [6] ) (Accepts:Any) - Parent: Tag block at (14:1,12 [6] )
  66923. +Markup span at (20:1,18 [6] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [41] )
  66924. +Markup span at (26:1,24 [6] ) (Accepts:Any) - Parent: Tag block at (26:1,24 [6] )
  66925. +Markup span at (32:1,30 [7] ) (Accepts:Any) - Parent: Tag block at (32:1,30 [7] )
  66926. +Markup span at (39:1,37 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [41] )
  66927. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_MisplacedEndTags_RecoversSuccessfully.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_MisplacedEndTags_RecoversSuccessfully.stree.txt
  66928. new file mode 100644
  66929. index 00000000000..459c938fbda
  66930. --- /dev/null
  66931. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_MisplacedEndTags_RecoversSuccessfully.stree.txt
  66932. @@ -0,0 +1,35 @@
  66933. +RazorDocument - [0..41)::41 - [LF<div>content<span>footer</div></span>LF]
  66934. + MarkupBlock - [0..41)::41
  66935. + MarkupTextLiteral - [0..2)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66936. + NewLine;[LF];
  66937. + MarkupElement - [2..32)::30
  66938. + MarkupTagBlock - [2..7)::5 - [<div>]
  66939. + MarkupTextLiteral - [2..7)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66940. + OpenAngle;[<];
  66941. + Text;[div];
  66942. + CloseAngle;[>];
  66943. + MarkupTextLiteral - [7..14)::7 - [content] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66944. + Text;[content];
  66945. + MarkupElement - [14..26)::12
  66946. + MarkupTagBlock - [14..20)::6 - [<span>]
  66947. + MarkupTextLiteral - [14..20)::6 - [<span>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66948. + OpenAngle;[<];
  66949. + Text;[span];
  66950. + CloseAngle;[>];
  66951. + MarkupTextLiteral - [20..26)::6 - [footer] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66952. + Text;[footer];
  66953. + MarkupTagBlock - [26..32)::6 - [</div>]
  66954. + MarkupTextLiteral - [26..32)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66955. + OpenAngle;[<];
  66956. + ForwardSlash;[/];
  66957. + Text;[div];
  66958. + CloseAngle;[>];
  66959. + MarkupElement - [32..39)::7
  66960. + MarkupTagBlock - [32..39)::7 - [</span>]
  66961. + MarkupTextLiteral - [32..39)::7 - [</span>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66962. + OpenAngle;[<];
  66963. + ForwardSlash;[/];
  66964. + Text;[span];
  66965. + CloseAngle;[>];
  66966. + MarkupTextLiteral - [39..41)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66967. + NewLine;[LF];
  66968. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_SelfClosingTags.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_SelfClosingTags.cspans.txt
  66969. new file mode 100644
  66970. index 00000000000..68917ae59c7
  66971. --- /dev/null
  66972. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_SelfClosingTags.cspans.txt
  66973. @@ -0,0 +1,5 @@
  66974. +Markup span at (0:0,0 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [22] )
  66975. +Markup span at (2:1,0 [5] ) (Accepts:Any) - Parent: Tag block at (2:1,0 [5] )
  66976. +Markup span at (7:1,5 [3] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [22] )
  66977. +Markup span at (10:1,8 [10] ) (Accepts:Any) - Parent: Tag block at (10:1,8 [10] )
  66978. +Markup span at (20:1,18 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [22] )
  66979. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_SelfClosingTags.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_SelfClosingTags.stree.txt
  66980. new file mode 100644
  66981. index 00000000000..d8fe2f2b560
  66982. --- /dev/null
  66983. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_SelfClosingTags.stree.txt
  66984. @@ -0,0 +1,23 @@
  66985. +RazorDocument - [0..22)::22 - [LF<br/>Foo<custom />LF]
  66986. + MarkupBlock - [0..22)::22
  66987. + MarkupTextLiteral - [0..2)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66988. + NewLine;[LF];
  66989. + MarkupElement - [2..7)::5
  66990. + MarkupTagBlock - [2..7)::5 - [<br/>]
  66991. + MarkupTextLiteral - [2..7)::5 - [<br/>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66992. + OpenAngle;[<];
  66993. + Text;[br];
  66994. + ForwardSlash;[/];
  66995. + CloseAngle;[>];
  66996. + MarkupTextLiteral - [7..10)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  66997. + Text;[Foo];
  66998. + MarkupElement - [10..20)::10
  66999. + MarkupTagBlock - [10..20)::10 - [<custom />]
  67000. + MarkupTextLiteral - [10..20)::10 - [<custom />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67001. + OpenAngle;[<];
  67002. + Text;[custom];
  67003. + Whitespace;[ ];
  67004. + ForwardSlash;[/];
  67005. + CloseAngle;[>];
  67006. + MarkupTextLiteral - [20..22)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67007. + NewLine;[LF];
  67008. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_StartTagsWithMissingEndTags.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_StartTagsWithMissingEndTags.cspans.txt
  67009. new file mode 100644
  67010. index 00000000000..23600f15fe1
  67011. --- /dev/null
  67012. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_StartTagsWithMissingEndTags.cspans.txt
  67013. @@ -0,0 +1,7 @@
  67014. +Markup span at (0:0,0 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [59] )
  67015. +Markup span at (2:1,0 [5] ) (Accepts:Any) - Parent: Tag block at (2:1,0 [5] )
  67016. +Markup span at (7:1,5 [15] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [59] )
  67017. +Markup span at (22:3,4 [3] ) (Accepts:Any) - Parent: Tag block at (22:3,4 [3] )
  67018. +Markup span at (25:3,7 [23] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [59] )
  67019. +Markup span at (48:5,8 [9] ) (Accepts:Any) - Parent: Tag block at (48:5,8 [9] )
  67020. +Markup span at (57:5,17 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [59] )
  67021. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_StartTagsWithMissingEndTags.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_StartTagsWithMissingEndTags.stree.txt
  67022. new file mode 100644
  67023. index 00000000000..6ded51cb3cc
  67024. --- /dev/null
  67025. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_StartTagsWithMissingEndTags.stree.txt
  67026. @@ -0,0 +1,37 @@
  67027. +RazorDocument - [0..59)::59 - [LF<div>LF FooLF <p>LF BarLF </strong>LF]
  67028. + MarkupBlock - [0..59)::59
  67029. + MarkupTextLiteral - [0..2)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67030. + NewLine;[LF];
  67031. + MarkupElement - [2..59)::57
  67032. + MarkupTagBlock - [2..7)::5 - [<div>]
  67033. + MarkupTextLiteral - [2..7)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67034. + OpenAngle;[<];
  67035. + Text;[div];
  67036. + CloseAngle;[>];
  67037. + MarkupTextLiteral - [7..22)::15 - [LF FooLF ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67038. + NewLine;[LF];
  67039. + Whitespace;[ ];
  67040. + Text;[Foo];
  67041. + NewLine;[LF];
  67042. + Whitespace;[ ];
  67043. + MarkupElement - [22..59)::37
  67044. + MarkupTagBlock - [22..25)::3 - [<p>]
  67045. + MarkupTextLiteral - [22..25)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67046. + OpenAngle;[<];
  67047. + Text;[p];
  67048. + CloseAngle;[>];
  67049. + MarkupTextLiteral - [25..48)::23 - [LF BarLF ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67050. + NewLine;[LF];
  67051. + Whitespace;[ ];
  67052. + Text;[Bar];
  67053. + NewLine;[LF];
  67054. + Whitespace;[ ];
  67055. + MarkupElement - [48..57)::9
  67056. + MarkupTagBlock - [48..57)::9 - [</strong>]
  67057. + MarkupTextLiteral - [48..57)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67058. + OpenAngle;[<];
  67059. + ForwardSlash;[/];
  67060. + Text;[strong];
  67061. + CloseAngle;[>];
  67062. + MarkupTextLiteral - [57..59)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67063. + NewLine;[LF];
  67064. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_ValidNestedTags.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_ValidNestedTags.cspans.txt
  67065. new file mode 100644
  67066. index 00000000000..63be5f5b102
  67067. --- /dev/null
  67068. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_ValidNestedTags.cspans.txt
  67069. @@ -0,0 +1,8 @@
  67070. +Markup span at (0:0,0 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [49] )
  67071. +Markup span at (2:1,0 [5] ) (Accepts:Any) - Parent: Tag block at (2:1,0 [5] )
  67072. +Markup span at (7:1,5 [15] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [49] )
  67073. +Markup span at (22:3,4 [3] ) (Accepts:Any) - Parent: Tag block at (22:3,4 [3] )
  67074. +Markup span at (25:3,7 [3] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [49] )
  67075. +Markup span at (28:3,10 [4] ) (Accepts:Any) - Parent: Tag block at (28:3,10 [4] )
  67076. +Markup span at (32:3,14 [11] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [49] )
  67077. +Markup span at (43:5,0 [6] ) (Accepts:Any) - Parent: Tag block at (43:5,0 [6] )
  67078. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_ValidNestedTags.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_ValidNestedTags.stree.txt
  67079. new file mode 100644
  67080. index 00000000000..2ed5c377ec0
  67081. --- /dev/null
  67082. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_ValidNestedTags.stree.txt
  67083. @@ -0,0 +1,41 @@
  67084. +RazorDocument - [0..49)::49 - [LF<div>LF FooLF <p>Bar</p>LF BazLF</div>]
  67085. + MarkupBlock - [0..49)::49
  67086. + MarkupTextLiteral - [0..2)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67087. + NewLine;[LF];
  67088. + MarkupElement - [2..49)::47
  67089. + MarkupTagBlock - [2..7)::5 - [<div>]
  67090. + MarkupTextLiteral - [2..7)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67091. + OpenAngle;[<];
  67092. + Text;[div];
  67093. + CloseAngle;[>];
  67094. + MarkupTextLiteral - [7..22)::15 - [LF FooLF ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67095. + NewLine;[LF];
  67096. + Whitespace;[ ];
  67097. + Text;[Foo];
  67098. + NewLine;[LF];
  67099. + Whitespace;[ ];
  67100. + MarkupElement - [22..32)::10
  67101. + MarkupTagBlock - [22..25)::3 - [<p>]
  67102. + MarkupTextLiteral - [22..25)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67103. + OpenAngle;[<];
  67104. + Text;[p];
  67105. + CloseAngle;[>];
  67106. + MarkupTextLiteral - [25..28)::3 - [Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67107. + Text;[Bar];
  67108. + MarkupTagBlock - [28..32)::4 - [</p>]
  67109. + MarkupTextLiteral - [28..32)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67110. + OpenAngle;[<];
  67111. + ForwardSlash;[/];
  67112. + Text;[p];
  67113. + CloseAngle;[>];
  67114. + MarkupTextLiteral - [32..43)::11 - [LF BazLF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67115. + NewLine;[LF];
  67116. + Whitespace;[ ];
  67117. + Text;[Baz];
  67118. + NewLine;[LF];
  67119. + MarkupTagBlock - [43..49)::6 - [</div>]
  67120. + MarkupTextLiteral - [43..49)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67121. + OpenAngle;[<];
  67122. + ForwardSlash;[/];
  67123. + Text;[div];
  67124. + CloseAngle;[>];
  67125. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_ValidNestedTagsMixedWithCode.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_ValidNestedTagsMixedWithCode.cspans.txt
  67126. new file mode 100644
  67127. index 00000000000..27e228bccfe
  67128. --- /dev/null
  67129. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_ValidNestedTagsMixedWithCode.cspans.txt
  67130. @@ -0,0 +1,16 @@
  67131. +Markup span at (0:0,0 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [66] )
  67132. +Markup span at (2:1,0 [5] ) (Accepts:Any) - Parent: Tag block at (2:1,0 [5] )
  67133. +Markup span at (7:1,5 [15] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [66] )
  67134. +Markup span at (22:3,4 [3] ) (Accepts:Any) - Parent: Tag block at (22:3,4 [3] )
  67135. +Transition span at (25:3,7 [1] ) (Accepts:None) - Parent: Expression block at (25:3,7 [4] )
  67136. +Code span at (26:3,8 [3] ) (Accepts:NonWhitespace) - Parent: Expression block at (25:3,7 [4] )
  67137. +Markup span at (29:3,11 [4] ) (Accepts:Any) - Parent: Tag block at (29:3,11 [4] )
  67138. +Markup span at (33:3,15 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [66] )
  67139. +Code span at (35:4,0 [4] ) (Accepts:Any) - Parent: Statement block at (35:4,0 [21] )
  67140. +Transition span at (39:4,4 [1] ) (Accepts:None) - Parent: Statement block at (39:4,4 [17] )
  67141. +MetaCode span at (40:4,5 [1] ) (Accepts:None) - Parent: Statement block at (39:4,4 [17] )
  67142. +Code span at (41:4,6 [14] ) (Accepts:Any) - Parent: Statement block at (39:4,4 [17] )
  67143. +MetaCode span at (55:4,20 [1] ) (Accepts:None) - Parent: Statement block at (39:4,4 [17] )
  67144. +Markup span at (56:4,21 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [66] )
  67145. +Markup span at (58:5,0 [6] ) (Accepts:Any) - Parent: Tag block at (58:5,0 [6] )
  67146. +Markup span at (64:5,6 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [66] )
  67147. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_ValidNestedTagsMixedWithCode.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_ValidNestedTagsMixedWithCode.stree.txt
  67148. new file mode 100644
  67149. index 00000000000..e02aadd04f9
  67150. --- /dev/null
  67151. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_ValidNestedTagsMixedWithCode.stree.txt
  67152. @@ -0,0 +1,71 @@
  67153. +RazorDocument - [0..66)::66 - [LF<div>LF FooLF <p>@Bar</p>LF @{ var x = Bar; }LF</div>LF]
  67154. + MarkupBlock - [0..66)::66
  67155. + MarkupTextLiteral - [0..2)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67156. + NewLine;[LF];
  67157. + MarkupElement - [2..64)::62
  67158. + MarkupTagBlock - [2..7)::5 - [<div>]
  67159. + MarkupTextLiteral - [2..7)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67160. + OpenAngle;[<];
  67161. + Text;[div];
  67162. + CloseAngle;[>];
  67163. + MarkupTextLiteral - [7..22)::15 - [LF FooLF ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67164. + NewLine;[LF];
  67165. + Whitespace;[ ];
  67166. + Text;[Foo];
  67167. + NewLine;[LF];
  67168. + Whitespace;[ ];
  67169. + MarkupElement - [22..33)::11
  67170. + MarkupTagBlock - [22..25)::3 - [<p>]
  67171. + MarkupTextLiteral - [22..25)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67172. + OpenAngle;[<];
  67173. + Text;[p];
  67174. + CloseAngle;[>];
  67175. + CSharpCodeBlock - [25..29)::4
  67176. + CSharpImplicitExpression - [25..29)::4
  67177. + CSharpTransition - [25..26)::1 - Gen<None> - SpanEditHandler;Accepts:None
  67178. + Transition;[@];
  67179. + CSharpImplicitExpressionBody - [26..29)::3
  67180. + CSharpCodeBlock - [26..29)::3
  67181. + CSharpExpressionLiteral - [26..29)::3 - [Bar] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  67182. + Identifier;[Bar];
  67183. + MarkupTagBlock - [29..33)::4 - [</p>]
  67184. + MarkupTextLiteral - [29..33)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67185. + OpenAngle;[<];
  67186. + ForwardSlash;[/];
  67187. + Text;[p];
  67188. + CloseAngle;[>];
  67189. + MarkupTextLiteral - [33..35)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67190. + NewLine;[LF];
  67191. + CSharpCodeBlock - [35..56)::21
  67192. + CSharpStatementLiteral - [35..39)::4 - [ ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  67193. + Whitespace;[ ];
  67194. + CSharpStatement - [39..56)::17
  67195. + CSharpTransition - [39..40)::1 - Gen<None> - SpanEditHandler;Accepts:None
  67196. + Transition;[@];
  67197. + CSharpStatementBody - [40..56)::16
  67198. + RazorMetaCode - [40..41)::1 - Gen<None> - SpanEditHandler;Accepts:None
  67199. + LeftBrace;[{];
  67200. + CSharpCodeBlock - [41..55)::14
  67201. + CSharpStatementLiteral - [41..55)::14 - [ var x = Bar; ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  67202. + Whitespace;[ ];
  67203. + Identifier;[var];
  67204. + Whitespace;[ ];
  67205. + Identifier;[x];
  67206. + Whitespace;[ ];
  67207. + Assign;[=];
  67208. + Whitespace;[ ];
  67209. + Identifier;[Bar];
  67210. + Semicolon;[;];
  67211. + Whitespace;[ ];
  67212. + RazorMetaCode - [55..56)::1 - Gen<None> - SpanEditHandler;Accepts:None
  67213. + RightBrace;[}];
  67214. + MarkupEphemeralTextLiteral - [56..58)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Any
  67215. + NewLine;[LF];
  67216. + MarkupTagBlock - [58..64)::6 - [</div>]
  67217. + MarkupTextLiteral - [58..64)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67218. + OpenAngle;[<];
  67219. + ForwardSlash;[/];
  67220. + Text;[div];
  67221. + CloseAngle;[>];
  67222. + MarkupTextLiteral - [64..66)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67223. + NewLine;[LF];
  67224. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_ValidTags.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_ValidTags.cspans.txt
  67225. new file mode 100644
  67226. index 00000000000..cbaaaf37724
  67227. --- /dev/null
  67228. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_ValidTags.cspans.txt
  67229. @@ -0,0 +1,9 @@
  67230. +Markup span at (0:0,0 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [30] )
  67231. +Markup span at (2:1,0 [5] ) (Accepts:Any) - Parent: Tag block at (2:1,0 [5] )
  67232. +Markup span at (7:1,5 [3] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [30] )
  67233. +Markup span at (10:1,8 [6] ) (Accepts:Any) - Parent: Tag block at (10:1,8 [6] )
  67234. +Markup span at (16:1,14 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [30] )
  67235. +Markup span at (18:2,0 [3] ) (Accepts:Any) - Parent: Tag block at (18:2,0 [3] )
  67236. +Markup span at (21:2,3 [3] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [30] )
  67237. +Markup span at (24:2,6 [4] ) (Accepts:Any) - Parent: Tag block at (24:2,6 [4] )
  67238. +Markup span at (28:2,10 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [30] )
  67239. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_ValidTags.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_ValidTags.stree.txt
  67240. new file mode 100644
  67241. index 00000000000..b728f69dfd5
  67242. --- /dev/null
  67243. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/MarkupElementRewriterTest/Rewrites_ValidTags.stree.txt
  67244. @@ -0,0 +1,36 @@
  67245. +RazorDocument - [0..30)::30 - [LF<div>Foo</div>LF<p>Bar</p>LF]
  67246. + MarkupBlock - [0..30)::30
  67247. + MarkupTextLiteral - [0..2)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67248. + NewLine;[LF];
  67249. + MarkupElement - [2..16)::14
  67250. + MarkupTagBlock - [2..7)::5 - [<div>]
  67251. + MarkupTextLiteral - [2..7)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67252. + OpenAngle;[<];
  67253. + Text;[div];
  67254. + CloseAngle;[>];
  67255. + MarkupTextLiteral - [7..10)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67256. + Text;[Foo];
  67257. + MarkupTagBlock - [10..16)::6 - [</div>]
  67258. + MarkupTextLiteral - [10..16)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67259. + OpenAngle;[<];
  67260. + ForwardSlash;[/];
  67261. + Text;[div];
  67262. + CloseAngle;[>];
  67263. + MarkupTextLiteral - [16..18)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67264. + NewLine;[LF];
  67265. + MarkupElement - [18..28)::10
  67266. + MarkupTagBlock - [18..21)::3 - [<p>]
  67267. + MarkupTextLiteral - [18..21)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67268. + OpenAngle;[<];
  67269. + Text;[p];
  67270. + CloseAngle;[>];
  67271. + MarkupTextLiteral - [21..24)::3 - [Bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67272. + Text;[Bar];
  67273. + MarkupTagBlock - [24..28)::4 - [</p>]
  67274. + MarkupTextLiteral - [24..28)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67275. + OpenAngle;[<];
  67276. + ForwardSlash;[/];
  67277. + Text;[p];
  67278. + CloseAngle;[>];
  67279. + MarkupTextLiteral - [28..30)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67280. + NewLine;[LF];
  67281. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_EndQuoteRequiresDoubleQuotesAroundValue.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_EndQuoteRequiresDoubleQuotesAroundValue.cspans.txt
  67282. similarity index 100%
  67283. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_EndQuoteRequiresDoubleQuotesAroundValue.cspans.txt
  67284. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_EndQuoteRequiresDoubleQuotesAroundValue.cspans.txt
  67285. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_EndQuoteRequiresDoubleQuotesAroundValue.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_EndQuoteRequiresDoubleQuotesAroundValue.stree.txt
  67286. new file mode 100644
  67287. index 00000000000..415af2bb316
  67288. --- /dev/null
  67289. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_EndQuoteRequiresDoubleQuotesAroundValue.stree.txt
  67290. @@ -0,0 +1,19 @@
  67291. +RazorDocument - [0..18)::18 - [@addTagHelper Foo"]
  67292. + MarkupBlock - [0..18)::18
  67293. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67294. + Marker;[];
  67295. + CSharpCodeBlock - [0..18)::18
  67296. + RazorDirective - [0..18)::18
  67297. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  67298. + Transition;[@];
  67299. + RazorDirectiveBody - [1..18)::17
  67300. + RazorMetaCode - [1..13)::12 - Gen<None> - SpanEditHandler;Accepts:None
  67301. + Identifier;[addTagHelper];
  67302. + CSharpCodeBlock - [13..18)::5
  67303. + MarkupTextLiteral - [13..14)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:None
  67304. + Whitespace;[ ];
  67305. + CSharpStatementLiteral - [14..18)::4 - [Foo"] - Gen<AddTagHelper:{Foo";Foo";;} [RZ1000(17:0,17 [1] ), RZ1019(14:0,14 [4] ), RZ1036(14:0,14 [4] )]> - SpanEditHandler;Accepts:AnyExceptNewline
  67306. + Identifier;[Foo];
  67307. + StringLiteral;["];RZ1000(17:0,17 [1] )
  67308. + MarkupTextLiteral - [18..18)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67309. + Marker;[];
  67310. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_InvalidLookupText_AddsError.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_InvalidLookupText_AddsError.cspans.txt
  67311. similarity index 100%
  67312. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_InvalidLookupText_AddsError.cspans.txt
  67313. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_InvalidLookupText_AddsError.cspans.txt
  67314. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_InvalidLookupText_AddsError.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_InvalidLookupText_AddsError.stree.txt
  67315. new file mode 100644
  67316. index 00000000000..32eaa73ae78
  67317. --- /dev/null
  67318. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_InvalidLookupText_AddsError.stree.txt
  67319. @@ -0,0 +1,18 @@
  67320. +RazorDocument - [0..17)::17 - [@addTagHelper Foo]
  67321. + MarkupBlock - [0..17)::17
  67322. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67323. + Marker;[];
  67324. + CSharpCodeBlock - [0..17)::17
  67325. + RazorDirective - [0..17)::17
  67326. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  67327. + Transition;[@];
  67328. + RazorDirectiveBody - [1..17)::16
  67329. + RazorMetaCode - [1..13)::12 - Gen<None> - SpanEditHandler;Accepts:None
  67330. + Identifier;[addTagHelper];
  67331. + CSharpCodeBlock - [13..17)::4
  67332. + MarkupTextLiteral - [13..14)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:None
  67333. + Whitespace;[ ];
  67334. + CSharpStatementLiteral - [14..17)::3 - [Foo] - Gen<AddTagHelper:{Foo;Foo;;} [RZ1036(14:0,14 [3] )]> - SpanEditHandler;Accepts:AnyExceptNewline
  67335. + Identifier;[Foo];
  67336. + MarkupTextLiteral - [17..17)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67337. + Marker;[];
  67338. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_NoValue_Invalid.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_NoValue_Invalid.cspans.txt
  67339. similarity index 100%
  67340. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_NoValue_Invalid.cspans.txt
  67341. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_NoValue_Invalid.cspans.txt
  67342. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_NoValue_Invalid.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_NoValue_Invalid.stree.txt
  67343. new file mode 100644
  67344. index 00000000000..95e2ab911cb
  67345. --- /dev/null
  67346. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_NoValue_Invalid.stree.txt
  67347. @@ -0,0 +1,18 @@
  67348. +RazorDocument - [0..16)::16 - [@addTagHelper ""]
  67349. + MarkupBlock - [0..16)::16
  67350. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67351. + Marker;[];
  67352. + CSharpCodeBlock - [0..16)::16
  67353. + RazorDirective - [0..16)::16
  67354. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  67355. + Transition;[@];
  67356. + RazorDirectiveBody - [1..16)::15
  67357. + RazorMetaCode - [1..13)::12 - Gen<None> - SpanEditHandler;Accepts:None
  67358. + Identifier;[addTagHelper];
  67359. + CSharpCodeBlock - [13..16)::3
  67360. + MarkupTextLiteral - [13..14)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:None
  67361. + Whitespace;[ ];
  67362. + CSharpStatementLiteral - [14..16)::2 - [""] - Gen<AddTagHelper:{"";;;} [RZ1036(15:0,15 [1] )]> - SpanEditHandler;Accepts:AnyExceptNewline
  67363. + StringLiteral;[""];
  67364. + MarkupTextLiteral - [16..16)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67365. + Marker;[];
  67366. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_RequiresValue.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_RequiresValue.cspans.txt
  67367. similarity index 100%
  67368. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_RequiresValue.cspans.txt
  67369. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_RequiresValue.cspans.txt
  67370. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_RequiresValue.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_RequiresValue.stree.txt
  67371. new file mode 100644
  67372. index 00000000000..660b83b424d
  67373. --- /dev/null
  67374. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_RequiresValue.stree.txt
  67375. @@ -0,0 +1,18 @@
  67376. +RazorDocument - [0..14)::14 - [@addTagHelper ]
  67377. + MarkupBlock - [0..14)::14
  67378. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67379. + Marker;[];
  67380. + CSharpCodeBlock - [0..14)::14
  67381. + RazorDirective - [0..14)::14
  67382. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  67383. + Transition;[@];
  67384. + RazorDirectiveBody - [1..14)::13
  67385. + RazorMetaCode - [1..13)::12 - Gen<None> - SpanEditHandler;Accepts:None
  67386. + Identifier;[addTagHelper];
  67387. + CSharpCodeBlock - [13..14)::1
  67388. + MarkupTextLiteral - [13..14)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:None
  67389. + Whitespace;[ ];
  67390. + CSharpStatementLiteral - [14..14)::0 - [] - Gen<AddTagHelper:{;;;} [RZ1018(1:0,1 [13] ), RZ1036(14:0,14 [1] )]> - SpanEditHandler;Accepts:AnyExceptNewline
  67391. + Marker;[];
  67392. + MarkupTextLiteral - [14..14)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67393. + Marker;[];
  67394. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_SingleQuotes_AddsError.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_SingleQuotes_AddsError.cspans.txt
  67395. similarity index 100%
  67396. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_SingleQuotes_AddsError.cspans.txt
  67397. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_SingleQuotes_AddsError.cspans.txt
  67398. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_SingleQuotes_AddsError.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_SingleQuotes_AddsError.stree.txt
  67399. new file mode 100644
  67400. index 00000000000..e5a43eb13a6
  67401. --- /dev/null
  67402. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_SingleQuotes_AddsError.stree.txt
  67403. @@ -0,0 +1,18 @@
  67404. +RazorDocument - [0..22)::22 - [@addTagHelper '*, Foo']
  67405. + MarkupBlock - [0..22)::22
  67406. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67407. + Marker;[];
  67408. + CSharpCodeBlock - [0..22)::22
  67409. + RazorDirective - [0..22)::22
  67410. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  67411. + Transition;[@];
  67412. + RazorDirectiveBody - [1..22)::21
  67413. + RazorMetaCode - [1..13)::12 - Gen<None> - SpanEditHandler;Accepts:None
  67414. + Identifier;[addTagHelper];
  67415. + CSharpCodeBlock - [13..22)::9
  67416. + MarkupTextLiteral - [13..14)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:None
  67417. + Whitespace;[ ];
  67418. + CSharpStatementLiteral - [14..22)::8 - ['*, Foo'] - Gen<AddTagHelper:{'*, Foo';'*, Foo';;} [RZ1036(14:0,14 [8] )]> - SpanEditHandler;Accepts:AnyExceptNewline
  67419. + CharacterLiteral;['*, Foo'];
  67420. + MarkupTextLiteral - [22..22)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67421. + Marker;[];
  67422. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_StartQuoteRequiresDoubleQuotesAroundValue.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_StartQuoteRequiresDoubleQuotesAroundValue.cspans.txt
  67423. similarity index 100%
  67424. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_StartQuoteRequiresDoubleQuotesAroundValue.cspans.txt
  67425. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_StartQuoteRequiresDoubleQuotesAroundValue.cspans.txt
  67426. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_StartQuoteRequiresDoubleQuotesAroundValue.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_StartQuoteRequiresDoubleQuotesAroundValue.stree.txt
  67427. new file mode 100644
  67428. index 00000000000..92b11e3ec34
  67429. --- /dev/null
  67430. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_StartQuoteRequiresDoubleQuotesAroundValue.stree.txt
  67431. @@ -0,0 +1,18 @@
  67432. +RazorDocument - [0..18)::18 - [@addTagHelper "Foo]
  67433. + MarkupBlock - [0..18)::18
  67434. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67435. + Marker;[];
  67436. + CSharpCodeBlock - [0..18)::18
  67437. + RazorDirective - [0..18)::18
  67438. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  67439. + Transition;[@];
  67440. + RazorDirectiveBody - [1..18)::17
  67441. + RazorMetaCode - [1..13)::12 - Gen<None> - SpanEditHandler;Accepts:None
  67442. + Identifier;[addTagHelper];
  67443. + CSharpCodeBlock - [13..18)::5
  67444. + MarkupTextLiteral - [13..14)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:None
  67445. + Whitespace;[ ];
  67446. + CSharpStatementLiteral - [14..18)::4 - ["Foo] - Gen<AddTagHelper:{"Foo;"Foo;;} [RZ1000(14:0,14 [1] ), RZ1019(14:0,14 [4] ), RZ1036(14:0,14 [4] )]> - SpanEditHandler;Accepts:AnyExceptNewline
  67447. + StringLiteral;["Foo];RZ1000(14:0,14 [1] )
  67448. + MarkupTextLiteral - [18..18)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67449. + Marker;[];
  67450. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_SupportsSpaces.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_SupportsSpaces.cspans.txt
  67451. similarity index 100%
  67452. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_SupportsSpaces.cspans.txt
  67453. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_SupportsSpaces.cspans.txt
  67454. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_SupportsSpaces.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_SupportsSpaces.stree.txt
  67455. new file mode 100644
  67456. index 00000000000..a1d2a4c4640
  67457. --- /dev/null
  67458. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_SupportsSpaces.stree.txt
  67459. @@ -0,0 +1,22 @@
  67460. +RazorDocument - [0..32)::32 - [@addTagHelper Foo, Bar ]
  67461. + MarkupBlock - [0..32)::32
  67462. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67463. + Marker;[];
  67464. + CSharpCodeBlock - [0..32)::32
  67465. + RazorDirective - [0..32)::32
  67466. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  67467. + Transition;[@];
  67468. + RazorDirectiveBody - [1..32)::31
  67469. + RazorMetaCode - [1..13)::12 - Gen<None> - SpanEditHandler;Accepts:None
  67470. + Identifier;[addTagHelper];
  67471. + CSharpCodeBlock - [13..32)::19
  67472. + MarkupTextLiteral - [13..18)::5 - [ ] - Gen<None> - SpanEditHandler;Accepts:None
  67473. + Whitespace;[ ];
  67474. + CSharpStatementLiteral - [18..32)::14 - [Foo, Bar ] - Gen<AddTagHelper:{Foo, Bar;Foo, Bar;Foo;Bar}> - SpanEditHandler;Accepts:AnyExceptNewline
  67475. + Identifier;[Foo];
  67476. + Comma;[,];
  67477. + Whitespace;[ ];
  67478. + Identifier;[Bar];
  67479. + Whitespace;[ ];
  67480. + MarkupTextLiteral - [32..32)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67481. + Marker;[];
  67482. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_WithQuotes_InvalidLookupText_AddsError.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_WithQuotes_InvalidLookupText_AddsError.cspans.txt
  67483. similarity index 100%
  67484. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/AddTagHelperDirective_WithQuotes_InvalidLookupText_AddsError.cspans.txt
  67485. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_WithQuotes_InvalidLookupText_AddsError.cspans.txt
  67486. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_WithQuotes_InvalidLookupText_AddsError.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_WithQuotes_InvalidLookupText_AddsError.stree.txt
  67487. new file mode 100644
  67488. index 00000000000..45498ce535c
  67489. --- /dev/null
  67490. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/AddTagHelperDirective_WithQuotes_InvalidLookupText_AddsError.stree.txt
  67491. @@ -0,0 +1,18 @@
  67492. +RazorDocument - [0..19)::19 - [@addTagHelper "Foo"]
  67493. + MarkupBlock - [0..19)::19
  67494. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67495. + Marker;[];
  67496. + CSharpCodeBlock - [0..19)::19
  67497. + RazorDirective - [0..19)::19
  67498. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  67499. + Transition;[@];
  67500. + RazorDirectiveBody - [1..19)::18
  67501. + RazorMetaCode - [1..13)::12 - Gen<None> - SpanEditHandler;Accepts:None
  67502. + Identifier;[addTagHelper];
  67503. + CSharpCodeBlock - [13..19)::6
  67504. + MarkupTextLiteral - [13..14)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:None
  67505. + Whitespace;[ ];
  67506. + CSharpStatementLiteral - [14..19)::5 - ["Foo"] - Gen<AddTagHelper:{"Foo";Foo;;} [RZ1036(15:0,15 [3] )]> - SpanEditHandler;Accepts:AnyExceptNewline
  67507. + StringLiteral;["Foo"];
  67508. + MarkupTextLiteral - [19..19)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67509. + Marker;[];
  67510. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/BuiltInDirectiveDoesNotErorrIfNotAtStartOfLineBecauseOfWhitespace.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/BuiltInDirectiveDoesNotErorrIfNotAtStartOfLineBecauseOfWhitespace.cspans.txt
  67511. similarity index 71%
  67512. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/BuiltInDirectiveDoesNotErorrIfNotAtStartOfLineBecauseOfWhitespace.cspans.txt
  67513. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/BuiltInDirectiveDoesNotErorrIfNotAtStartOfLineBecauseOfWhitespace.cspans.txt
  67514. index 597dd730206..c6fee76354b 100644
  67515. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/BuiltInDirectiveDoesNotErorrIfNotAtStartOfLineBecauseOfWhitespace.cspans.txt
  67516. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/BuiltInDirectiveDoesNotErorrIfNotAtStartOfLineBecauseOfWhitespace.cspans.txt
  67517. @@ -1,7 +1,7 @@
  67518. Markup span at (0:0,0 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [26] )
  67519. -Code span at (2:1,0 [2] ) (Accepts:Any) - Parent: Directive block at (2:1,0 [24] )
  67520. -Transition span at (4:1,2 [1] ) (Accepts:None) - Parent: Directive block at (2:1,0 [24] )
  67521. -MetaCode span at (5:1,3 [12] ) (Accepts:None) - Parent: Directive block at (2:1,0 [24] )
  67522. -Markup span at (17:1,15 [1] ) (Accepts:None) - Parent: Directive block at (2:1,0 [24] )
  67523. -Code span at (18:1,16 [8] ) (Accepts:AnyExceptNewline) - Parent: Directive block at (2:1,0 [24] )
  67524. +Code span at (2:1,0 [2] ) (Accepts:Any) - Parent: Statement block at (2:1,0 [24] )
  67525. +Transition span at (4:1,2 [1] ) (Accepts:None) - Parent: Directive block at (4:1,2 [22] )
  67526. +MetaCode span at (5:1,3 [12] ) (Accepts:None) - Parent: Directive block at (4:1,2 [22] )
  67527. +Markup span at (17:1,15 [1] ) (Accepts:None) - Parent: Directive block at (4:1,2 [22] )
  67528. +Code span at (18:1,16 [8] ) (Accepts:AnyExceptNewline) - Parent: Directive block at (4:1,2 [22] )
  67529. Markup span at (26:1,24 [0] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [26] )
  67530. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/BuiltInDirectiveDoesNotErorrIfNotAtStartOfLineBecauseOfWhitespace.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/BuiltInDirectiveDoesNotErorrIfNotAtStartOfLineBecauseOfWhitespace.stree.txt
  67531. new file mode 100644
  67532. index 00000000000..adbdb50b074
  67533. --- /dev/null
  67534. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/BuiltInDirectiveDoesNotErorrIfNotAtStartOfLineBecauseOfWhitespace.stree.txt
  67535. @@ -0,0 +1,20 @@
  67536. +RazorDocument - [0..26)::26 - [LF @addTagHelper "*, Foo"]
  67537. + MarkupBlock - [0..26)::26
  67538. + MarkupTextLiteral - [0..2)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67539. + NewLine;[LF];
  67540. + CSharpCodeBlock - [2..26)::24
  67541. + CSharpStatementLiteral - [2..4)::2 - [ ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  67542. + Whitespace;[ ];
  67543. + RazorDirective - [4..26)::22
  67544. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  67545. + Transition;[@];
  67546. + RazorDirectiveBody - [5..26)::21
  67547. + RazorMetaCode - [5..17)::12 - Gen<None> - SpanEditHandler;Accepts:None
  67548. + Identifier;[addTagHelper];
  67549. + CSharpCodeBlock - [17..26)::9
  67550. + MarkupTextLiteral - [17..18)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:None
  67551. + Whitespace;[ ];
  67552. + CSharpStatementLiteral - [18..26)::8 - ["*, Foo"] - Gen<AddTagHelper:{"*, Foo";*, Foo;*;Foo}> - SpanEditHandler;Accepts:AnyExceptNewline
  67553. + StringLiteral;["*, Foo"];
  67554. + MarkupTextLiteral - [26..26)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67555. + Marker;[];
  67556. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/BuiltInDirectiveErrorsIfNotAtStartOfLine.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/BuiltInDirectiveErrorsIfNotAtStartOfLine.cspans.txt
  67557. similarity index 100%
  67558. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/BuiltInDirectiveErrorsIfNotAtStartOfLine.cspans.txt
  67559. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/BuiltInDirectiveErrorsIfNotAtStartOfLine.cspans.txt
  67560. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/BuiltInDirectiveErrorsIfNotAtStartOfLine.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/BuiltInDirectiveErrorsIfNotAtStartOfLine.stree.txt
  67561. new file mode 100644
  67562. index 00000000000..1e622480ba3
  67563. --- /dev/null
  67564. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/BuiltInDirectiveErrorsIfNotAtStartOfLine.stree.txt
  67565. @@ -0,0 +1,20 @@
  67566. +RazorDocument - [0..28)::28 - [{ @addTagHelper "*, Foo"LF}]
  67567. + MarkupBlock - [0..28)::28
  67568. + MarkupTextLiteral - [0..3)::3 - [{ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67569. + Text;[{];
  67570. + Whitespace;[ ];
  67571. + CSharpCodeBlock - [3..27)::24
  67572. + RazorDirective - [3..27)::24
  67573. + CSharpTransition - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  67574. + Transition;[@];
  67575. + RazorDirectiveBody - [4..27)::23
  67576. + RazorMetaCode - [4..16)::12 - Gen<None> - SpanEditHandler;Accepts:None
  67577. + Identifier;[addTagHelper];
  67578. + CSharpCodeBlock - [16..27)::11
  67579. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:None
  67580. + Whitespace;[ ];
  67581. + CSharpStatementLiteral - [17..27)::10 - ["*, Foo"LF] - Gen<AddTagHelper:{"*, Foo";*, Foo;*;Foo} [RZ2005(4:0,4 [12] )]> - SpanEditHandler;Accepts:AnyExceptNewline
  67582. + StringLiteral;["*, Foo"];
  67583. + NewLine;[LF];
  67584. + MarkupTextLiteral - [27..28)::1 - [}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67585. + Text;[}];
  67586. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_AllowsNullableTypes.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_AllowsNullableTypes.cspans.txt
  67587. similarity index 100%
  67588. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_AllowsNullableTypes.cspans.txt
  67589. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_AllowsNullableTypes.cspans.txt
  67590. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_AllowsNullableTypes.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_AllowsNullableTypes.stree.txt
  67591. new file mode 100644
  67592. index 00000000000..cfa73cde1e0
  67593. --- /dev/null
  67594. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_AllowsNullableTypes.stree.txt
  67595. @@ -0,0 +1,80 @@
  67596. +RazorDocument - [0..176)::176 - [@custom string? string?[] global::System.Int32? KeyValuePair<string, string>? KeyValuePair<string, string>?[] global::System.Collections.Generic.KeyValuePair<string, string>?[]]
  67597. + MarkupBlock - [0..176)::176
  67598. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67599. + Marker;[];
  67600. + CSharpCodeBlock - [0..176)::176
  67601. + RazorDirective - [0..176)::176 - Directive:{custom;SingleLine;Unrestricted}
  67602. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  67603. + Transition;[@];
  67604. + RazorDirectiveBody - [1..176)::175
  67605. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  67606. + Identifier;[custom];
  67607. + CSharpCodeBlock - [7..176)::169
  67608. + CSharpStatementLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  67609. + Whitespace;[ ];
  67610. + CSharpStatementLiteral - [8..15)::7 - [string?] - Gen<DirectiveToken {;Type;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  67611. + Keyword;[string];
  67612. + QuestionMark;[?];
  67613. + CSharpStatementLiteral - [15..16)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  67614. + Whitespace;[ ];
  67615. + CSharpStatementLiteral - [16..25)::9 - [string?[]] - Gen<DirectiveToken {;Type;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  67616. + Keyword;[string];
  67617. + QuestionMark;[?];
  67618. + LeftBracket;[[];
  67619. + RightBracket;[]];
  67620. + CSharpStatementLiteral - [25..26)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  67621. + Whitespace;[ ];
  67622. + CSharpStatementLiteral - [26..47)::21 - [global::System.Int32?] - Gen<DirectiveToken {;Type;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  67623. + Identifier;[global];
  67624. + DoubleColon;[::];
  67625. + Identifier;[System];
  67626. + Dot;[.];
  67627. + Identifier;[Int32];
  67628. + QuestionMark;[?];
  67629. + CSharpStatementLiteral - [47..48)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  67630. + Whitespace;[ ];
  67631. + CSharpStatementLiteral - [48..77)::29 - [KeyValuePair<string, string>?] - Gen<DirectiveToken {;Type;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  67632. + Identifier;[KeyValuePair];
  67633. + LessThan;[<];
  67634. + Keyword;[string];
  67635. + Comma;[,];
  67636. + Whitespace;[ ];
  67637. + Keyword;[string];
  67638. + GreaterThan;[>];
  67639. + QuestionMark;[?];
  67640. + CSharpStatementLiteral - [77..78)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  67641. + Whitespace;[ ];
  67642. + CSharpStatementLiteral - [78..109)::31 - [KeyValuePair<string, string>?[]] - Gen<DirectiveToken {;Type;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  67643. + Identifier;[KeyValuePair];
  67644. + LessThan;[<];
  67645. + Keyword;[string];
  67646. + Comma;[,];
  67647. + Whitespace;[ ];
  67648. + Keyword;[string];
  67649. + GreaterThan;[>];
  67650. + QuestionMark;[?];
  67651. + LeftBracket;[[];
  67652. + RightBracket;[]];
  67653. + CSharpStatementLiteral - [109..110)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  67654. + Whitespace;[ ];
  67655. + CSharpStatementLiteral - [110..176)::66 - [global::System.Collections.Generic.KeyValuePair<string, string>?[]] - Gen<DirectiveToken {;Type;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  67656. + Identifier;[global];
  67657. + DoubleColon;[::];
  67658. + Identifier;[System];
  67659. + Dot;[.];
  67660. + Identifier;[Collections];
  67661. + Dot;[.];
  67662. + Identifier;[Generic];
  67663. + Dot;[.];
  67664. + Identifier;[KeyValuePair];
  67665. + LessThan;[<];
  67666. + Keyword;[string];
  67667. + Comma;[,];
  67668. + Whitespace;[ ];
  67669. + Keyword;[string];
  67670. + GreaterThan;[>];
  67671. + QuestionMark;[?];
  67672. + LeftBracket;[[];
  67673. + RightBracket;[]];
  67674. + MarkupTextLiteral - [176..176)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67675. + Marker;[];
  67676. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_AllowsTupleTypes.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_AllowsTupleTypes.cspans.txt
  67677. similarity index 100%
  67678. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_AllowsTupleTypes.cspans.txt
  67679. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_AllowsTupleTypes.cspans.txt
  67680. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_AllowsTupleTypes.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_AllowsTupleTypes.stree.txt
  67681. new file mode 100644
  67682. index 00000000000..bd5ce0d7fbe
  67683. --- /dev/null
  67684. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_AllowsTupleTypes.stree.txt
  67685. @@ -0,0 +1,164 @@
  67686. +RazorDocument - [0..246)::246 - [@custom (bool, int) (int aa, string bb)? ( int? q , bool w ) ( int ? q, bool ?w ,(long ? [])) ? (List<(int, string)?> aa, string bb) (string ss, (int u, List<(string, int)> k, (Char c, bool b, List<int> l)), global::System.Int32[] a)]
  67687. + MarkupBlock - [0..246)::246
  67688. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67689. + Marker;[];
  67690. + CSharpCodeBlock - [0..246)::246
  67691. + RazorDirective - [0..246)::246 - Directive:{custom;SingleLine;Unrestricted}
  67692. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  67693. + Transition;[@];
  67694. + RazorDirectiveBody - [1..246)::245
  67695. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  67696. + Identifier;[custom];
  67697. + CSharpCodeBlock - [7..246)::239
  67698. + CSharpStatementLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  67699. + Whitespace;[ ];
  67700. + CSharpStatementLiteral - [8..19)::11 - [(bool, int)] - Gen<DirectiveToken {;Type;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  67701. + LeftParenthesis;[(];
  67702. + Keyword;[bool];
  67703. + Comma;[,];
  67704. + Whitespace;[ ];
  67705. + Keyword;[int];
  67706. + RightParenthesis;[)];
  67707. + CSharpStatementLiteral - [19..20)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  67708. + Whitespace;[ ];
  67709. + CSharpStatementLiteral - [20..40)::20 - [(int aa, string bb)?] - Gen<DirectiveToken {;Type;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  67710. + LeftParenthesis;[(];
  67711. + Keyword;[int];
  67712. + Whitespace;[ ];
  67713. + Identifier;[aa];
  67714. + Comma;[,];
  67715. + Whitespace;[ ];
  67716. + Keyword;[string];
  67717. + Whitespace;[ ];
  67718. + Identifier;[bb];
  67719. + RightParenthesis;[)];
  67720. + QuestionMark;[?];
  67721. + CSharpStatementLiteral - [40..41)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  67722. + Whitespace;[ ];
  67723. + CSharpStatementLiteral - [41..70)::29 - [( int? q , bool w )] - Gen<DirectiveToken {;Type;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  67724. + LeftParenthesis;[(];
  67725. + Whitespace;[ ];
  67726. + Keyword;[int];
  67727. + QuestionMark;[?];
  67728. + Whitespace;[ ];
  67729. + Identifier;[q];
  67730. + Whitespace;[ ];
  67731. + Comma;[,];
  67732. + Whitespace;[ ];
  67733. + Keyword;[bool];
  67734. + Whitespace;[ ];
  67735. + Identifier;[w];
  67736. + Whitespace;[ ];
  67737. + RightParenthesis;[)];
  67738. + CSharpStatementLiteral - [70..71)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  67739. + Whitespace;[ ];
  67740. + CSharpStatementLiteral - [71..108)::37 - [( int ? q, bool ?w ,(long ? [])) ?] - Gen<DirectiveToken {;Type;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  67741. + LeftParenthesis;[(];
  67742. + Whitespace;[ ];
  67743. + Keyword;[int];
  67744. + Whitespace;[ ];
  67745. + QuestionMark;[?];
  67746. + Whitespace;[ ];
  67747. + Identifier;[q];
  67748. + Comma;[,];
  67749. + Whitespace;[ ];
  67750. + Keyword;[bool];
  67751. + Whitespace;[ ];
  67752. + QuestionMark;[?];
  67753. + Identifier;[w];
  67754. + Whitespace;[ ];
  67755. + Comma;[,];
  67756. + LeftParenthesis;[(];
  67757. + Keyword;[long];
  67758. + Whitespace;[ ];
  67759. + QuestionMark;[?];
  67760. + Whitespace;[ ];
  67761. + LeftBracket;[[];
  67762. + RightBracket;[]];
  67763. + RightParenthesis;[)];
  67764. + RightParenthesis;[)];
  67765. + Whitespace;[ ];
  67766. + QuestionMark;[?];
  67767. + CSharpStatementLiteral - [108..109)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  67768. + Whitespace;[ ];
  67769. + CSharpStatementLiteral - [109..145)::36 - [(List<(int, string)?> aa, string bb)] - Gen<DirectiveToken {;Type;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  67770. + LeftParenthesis;[(];
  67771. + Identifier;[List];
  67772. + LessThan;[<];
  67773. + LeftParenthesis;[(];
  67774. + Keyword;[int];
  67775. + Comma;[,];
  67776. + Whitespace;[ ];
  67777. + Keyword;[string];
  67778. + RightParenthesis;[)];
  67779. + QuestionMark;[?];
  67780. + GreaterThan;[>];
  67781. + Whitespace;[ ];
  67782. + Identifier;[aa];
  67783. + Comma;[,];
  67784. + Whitespace;[ ];
  67785. + Keyword;[string];
  67786. + Whitespace;[ ];
  67787. + Identifier;[bb];
  67788. + RightParenthesis;[)];
  67789. + CSharpStatementLiteral - [145..146)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  67790. + Whitespace;[ ];
  67791. + CSharpStatementLiteral - [146..246)::100 - [(string ss, (int u, List<(string, int)> k, (Char c, bool b, List<int> l)), global::System.Int32[] a)] - Gen<DirectiveToken {;Type;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  67792. + LeftParenthesis;[(];
  67793. + Keyword;[string];
  67794. + Whitespace;[ ];
  67795. + Identifier;[ss];
  67796. + Comma;[,];
  67797. + Whitespace;[ ];
  67798. + LeftParenthesis;[(];
  67799. + Keyword;[int];
  67800. + Whitespace;[ ];
  67801. + Identifier;[u];
  67802. + Comma;[,];
  67803. + Whitespace;[ ];
  67804. + Identifier;[List];
  67805. + LessThan;[<];
  67806. + LeftParenthesis;[(];
  67807. + Keyword;[string];
  67808. + Comma;[,];
  67809. + Whitespace;[ ];
  67810. + Keyword;[int];
  67811. + RightParenthesis;[)];
  67812. + GreaterThan;[>];
  67813. + Whitespace;[ ];
  67814. + Identifier;[k];
  67815. + Comma;[,];
  67816. + Whitespace;[ ];
  67817. + LeftParenthesis;[(];
  67818. + Identifier;[Char];
  67819. + Whitespace;[ ];
  67820. + Identifier;[c];
  67821. + Comma;[,];
  67822. + Whitespace;[ ];
  67823. + Keyword;[bool];
  67824. + Whitespace;[ ];
  67825. + Identifier;[b];
  67826. + Comma;[,];
  67827. + Whitespace;[ ];
  67828. + Identifier;[List];
  67829. + LessThan;[<];
  67830. + Keyword;[int];
  67831. + GreaterThan;[>];
  67832. + Whitespace;[ ];
  67833. + Identifier;[l];
  67834. + RightParenthesis;[)];
  67835. + RightParenthesis;[)];
  67836. + Comma;[,];
  67837. + Whitespace;[ ];
  67838. + Identifier;[global];
  67839. + DoubleColon;[::];
  67840. + Identifier;[System];
  67841. + Dot;[.];
  67842. + Identifier;[Int32];
  67843. + LeftBracket;[[];
  67844. + RightBracket;[]];
  67845. + Whitespace;[ ];
  67846. + Identifier;[a];
  67847. + RightParenthesis;[)];
  67848. + MarkupTextLiteral - [246..246)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67849. + Marker;[];
  67850. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_AllowsTupleTypes_IgnoresTrailingWhitespace.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_AllowsTupleTypes_IgnoresTrailingWhitespace.cspans.txt
  67851. similarity index 100%
  67852. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_AllowsTupleTypes_IgnoresTrailingWhitespace.cspans.txt
  67853. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_AllowsTupleTypes_IgnoresTrailingWhitespace.cspans.txt
  67854. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_AllowsTupleTypes_IgnoresTrailingWhitespace.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_AllowsTupleTypes_IgnoresTrailingWhitespace.stree.txt
  67855. new file mode 100644
  67856. index 00000000000..10efce7060e
  67857. --- /dev/null
  67858. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_AllowsTupleTypes_IgnoresTrailingWhitespace.stree.txt
  67859. @@ -0,0 +1,26 @@
  67860. +RazorDocument - [0..23)::23 - [@custom (bool, int?) ]
  67861. + MarkupBlock - [0..23)::23
  67862. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67863. + Marker;[];
  67864. + CSharpCodeBlock - [0..23)::23
  67865. + RazorDirective - [0..23)::23 - Directive:{custom;SingleLine;Unrestricted}
  67866. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  67867. + Transition;[@];
  67868. + RazorDirectiveBody - [1..23)::22
  67869. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  67870. + Identifier;[custom];
  67871. + CSharpCodeBlock - [7..23)::16
  67872. + CSharpStatementLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  67873. + Whitespace;[ ];
  67874. + CSharpStatementLiteral - [8..20)::12 - [(bool, int?)] - Gen<DirectiveToken {;Type;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  67875. + LeftParenthesis;[(];
  67876. + Keyword;[bool];
  67877. + Comma;[,];
  67878. + Whitespace;[ ];
  67879. + Keyword;[int];
  67880. + QuestionMark;[?];
  67881. + RightParenthesis;[)];
  67882. + UnclassifiedTextLiteral - [20..23)::3 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  67883. + Whitespace;[ ];
  67884. + MarkupTextLiteral - [23..23)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67885. + Marker;[];
  67886. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_AllowsWhiteSpaceAroundTokens.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_AllowsWhiteSpaceAroundTokens.cspans.txt
  67887. similarity index 100%
  67888. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_AllowsWhiteSpaceAroundTokens.cspans.txt
  67889. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_AllowsWhiteSpaceAroundTokens.cspans.txt
  67890. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_AllowsWhiteSpaceAroundTokens.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_AllowsWhiteSpaceAroundTokens.stree.txt
  67891. new file mode 100644
  67892. index 00000000000..1008dcab02a
  67893. --- /dev/null
  67894. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_AllowsWhiteSpaceAroundTokens.stree.txt
  67895. @@ -0,0 +1,30 @@
  67896. +RazorDocument - [0..67)::67 - [@custom System.Text.Encoding.ASCIIEncoding Some_Member ]
  67897. + MarkupBlock - [0..67)::67
  67898. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67899. + Marker;[];
  67900. + CSharpCodeBlock - [0..67)::67
  67901. + RazorDirective - [0..67)::67 - Directive:{custom;SingleLine;Unrestricted}
  67902. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  67903. + Transition;[@];
  67904. + RazorDirectiveBody - [1..67)::66
  67905. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  67906. + Identifier;[custom];
  67907. + CSharpCodeBlock - [7..67)::60
  67908. + CSharpStatementLiteral - [7..11)::4 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  67909. + Whitespace;[ ];
  67910. + CSharpStatementLiteral - [11..45)::34 - [System.Text.Encoding.ASCIIEncoding] - Gen<DirectiveToken {;Type;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  67911. + Identifier;[System];
  67912. + Dot;[.];
  67913. + Identifier;[Text];
  67914. + Dot;[.];
  67915. + Identifier;[Encoding];
  67916. + Dot;[.];
  67917. + Identifier;[ASCIIEncoding];
  67918. + CSharpStatementLiteral - [45..52)::7 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  67919. + Whitespace;[ ];
  67920. + CSharpStatementLiteral - [52..63)::11 - [Some_Member] - Gen<DirectiveToken {;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  67921. + Identifier;[Some_Member];
  67922. + UnclassifiedTextLiteral - [63..67)::4 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  67923. + Whitespace;[ ];
  67924. + MarkupTextLiteral - [67..67)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67925. + Marker;[];
  67926. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_CanHandleEOFIncompleteNamespaceTokens.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_CanHandleEOFIncompleteNamespaceTokens.cspans.txt
  67927. similarity index 100%
  67928. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_CanHandleEOFIncompleteNamespaceTokens.cspans.txt
  67929. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_CanHandleEOFIncompleteNamespaceTokens.cspans.txt
  67930. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_CanHandleEOFIncompleteNamespaceTokens.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_CanHandleEOFIncompleteNamespaceTokens.stree.txt
  67931. new file mode 100644
  67932. index 00000000000..2e41bb2bbda
  67933. --- /dev/null
  67934. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_CanHandleEOFIncompleteNamespaceTokens.stree.txt
  67935. @@ -0,0 +1,16 @@
  67936. +RazorDocument - [0..15)::15 - [@custom System.]
  67937. + MarkupBlock - [0..15)::15
  67938. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67939. + Marker;[];
  67940. + CSharpCodeBlock - [0..8)::8
  67941. + RazorDirective - [0..8)::8 - Directive:{custom;SingleLine;Unrestricted} [RZ1014(8:0,8 [7] )]
  67942. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  67943. + Transition;[@];
  67944. + RazorDirectiveBody - [1..8)::7
  67945. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  67946. + Identifier;[custom];
  67947. + CSharpCodeBlock - [7..8)::1
  67948. + CSharpStatementLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  67949. + Whitespace;[ ];
  67950. + MarkupTextLiteral - [8..15)::7 - [System.] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67951. + Text;[System.];
  67952. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_CanHandleEOFInvalidNamespaceTokens.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_CanHandleEOFInvalidNamespaceTokens.cspans.txt
  67953. similarity index 100%
  67954. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_CanHandleEOFInvalidNamespaceTokens.cspans.txt
  67955. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_CanHandleEOFInvalidNamespaceTokens.cspans.txt
  67956. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_CanHandleEOFInvalidNamespaceTokens.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_CanHandleEOFInvalidNamespaceTokens.stree.txt
  67957. new file mode 100644
  67958. index 00000000000..df328da469f
  67959. --- /dev/null
  67960. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_CanHandleEOFInvalidNamespaceTokens.stree.txt
  67961. @@ -0,0 +1,19 @@
  67962. +RazorDocument - [0..15)::15 - [@custom System<]
  67963. + MarkupBlock - [0..15)::15
  67964. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67965. + Marker;[];
  67966. + CSharpCodeBlock - [0..8)::8
  67967. + RazorDirective - [0..8)::8 - Directive:{custom;SingleLine;Unrestricted} [RZ1014(8:0,8 [7] )]
  67968. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  67969. + Transition;[@];
  67970. + RazorDirectiveBody - [1..8)::7
  67971. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  67972. + Identifier;[custom];
  67973. + CSharpCodeBlock - [7..8)::1
  67974. + CSharpStatementLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  67975. + Whitespace;[ ];
  67976. + MarkupTextLiteral - [8..14)::6 - [System] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67977. + Text;[System];
  67978. + MarkupTagBlock - [14..15)::1 - [<]
  67979. + MarkupTextLiteral - [14..15)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67980. + OpenAngle;[<];
  67981. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_CanHandleIncompleteNamespaceTokens.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_CanHandleIncompleteNamespaceTokens.cspans.txt
  67982. similarity index 100%
  67983. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_CanHandleIncompleteNamespaceTokens.cspans.txt
  67984. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_CanHandleIncompleteNamespaceTokens.cspans.txt
  67985. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_CanHandleIncompleteNamespaceTokens.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_CanHandleIncompleteNamespaceTokens.stree.txt
  67986. new file mode 100644
  67987. index 00000000000..9d6f4a44f45
  67988. --- /dev/null
  67989. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_CanHandleIncompleteNamespaceTokens.stree.txt
  67990. @@ -0,0 +1,17 @@
  67991. +RazorDocument - [0..17)::17 - [@custom System.LF]
  67992. + MarkupBlock - [0..17)::17
  67993. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  67994. + Marker;[];
  67995. + CSharpCodeBlock - [0..8)::8
  67996. + RazorDirective - [0..8)::8 - Directive:{custom;SingleLine;Unrestricted} [RZ1014(8:0,8 [7] )]
  67997. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  67998. + Transition;[@];
  67999. + RazorDirectiveBody - [1..8)::7
  68000. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  68001. + Identifier;[custom];
  68002. + CSharpCodeBlock - [7..8)::1
  68003. + CSharpStatementLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68004. + Whitespace;[ ];
  68005. + MarkupTextLiteral - [8..17)::9 - [System.LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68006. + Text;[System.];
  68007. + NewLine;[LF];
  68008. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_CanHandleInvalidNamespaceTokens.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_CanHandleInvalidNamespaceTokens.cspans.txt
  68009. similarity index 100%
  68010. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_CanHandleInvalidNamespaceTokens.cspans.txt
  68011. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_CanHandleInvalidNamespaceTokens.cspans.txt
  68012. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_CanHandleInvalidNamespaceTokens.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_CanHandleInvalidNamespaceTokens.stree.txt
  68013. new file mode 100644
  68014. index 00000000000..f80f449fab7
  68015. --- /dev/null
  68016. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_CanHandleInvalidNamespaceTokens.stree.txt
  68017. @@ -0,0 +1,20 @@
  68018. +RazorDocument - [0..17)::17 - [@custom System<LF]
  68019. + MarkupBlock - [0..17)::17
  68020. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68021. + Marker;[];
  68022. + CSharpCodeBlock - [0..8)::8
  68023. + RazorDirective - [0..8)::8 - Directive:{custom;SingleLine;Unrestricted} [RZ1014(8:0,8 [7] )]
  68024. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68025. + Transition;[@];
  68026. + RazorDirectiveBody - [1..8)::7
  68027. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  68028. + Identifier;[custom];
  68029. + CSharpCodeBlock - [7..8)::1
  68030. + CSharpStatementLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68031. + Whitespace;[ ];
  68032. + MarkupTextLiteral - [8..14)::6 - [System] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68033. + Text;[System];
  68034. + MarkupTagBlock - [14..17)::3 - [<LF]
  68035. + MarkupTextLiteral - [14..17)::3 - [<LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68036. + OpenAngle;[<];
  68037. + NewLine;[LF];
  68038. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_ErrorsExtraContentAfterDirective.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_ErrorsExtraContentAfterDirective.cspans.txt
  68039. similarity index 100%
  68040. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_ErrorsExtraContentAfterDirective.cspans.txt
  68041. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_ErrorsExtraContentAfterDirective.cspans.txt
  68042. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_ErrorsExtraContentAfterDirective.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_ErrorsExtraContentAfterDirective.stree.txt
  68043. new file mode 100644
  68044. index 00000000000..b06c7343c3c
  68045. --- /dev/null
  68046. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_ErrorsExtraContentAfterDirective.stree.txt
  68047. @@ -0,0 +1,22 @@
  68048. +RazorDocument - [0..23)::23 - [@custom "hello" "world"]
  68049. + MarkupBlock - [0..23)::23
  68050. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68051. + Marker;[];
  68052. + CSharpCodeBlock - [0..16)::16
  68053. + RazorDirective - [0..16)::16 - Directive:{custom;SingleLine;Unrestricted} [RZ1017(16:0,16 [7] )]
  68054. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68055. + Transition;[@];
  68056. + RazorDirectiveBody - [1..16)::15
  68057. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  68058. + Identifier;[custom];
  68059. + CSharpCodeBlock - [7..16)::9
  68060. + MarkupEphemeralTextLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68061. + Whitespace;[ ];
  68062. + CSharpStatementLiteral - [8..15)::7 - ["hello"] - Gen<DirectiveToken {;String;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  68063. + StringLiteral;["hello"];
  68064. + UnclassifiedTextLiteral - [15..16)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68065. + Whitespace;[ ];
  68066. + MarkupTextLiteral - [16..23)::7 - ["world"] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68067. + DoubleQuote;["];
  68068. + Text;[world];
  68069. + DoubleQuote;["];
  68070. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_ErrorsForInvalidMemberTokens.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_ErrorsForInvalidMemberTokens.cspans.txt
  68071. similarity index 100%
  68072. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_ErrorsForInvalidMemberTokens.cspans.txt
  68073. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_ErrorsForInvalidMemberTokens.cspans.txt
  68074. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_ErrorsForInvalidMemberTokens.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_ErrorsForInvalidMemberTokens.stree.txt
  68075. new file mode 100644
  68076. index 00000000000..ab35f9a32dc
  68077. --- /dev/null
  68078. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_ErrorsForInvalidMemberTokens.stree.txt
  68079. @@ -0,0 +1,16 @@
  68080. +RazorDocument - [0..20)::20 - [@custom -Some_Member]
  68081. + MarkupBlock - [0..20)::20
  68082. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68083. + Marker;[];
  68084. + CSharpCodeBlock - [0..8)::8
  68085. + RazorDirective - [0..8)::8 - Directive:{custom;SingleLine;Unrestricted} [RZ1015(8:0,8 [1] )]
  68086. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68087. + Transition;[@];
  68088. + RazorDirectiveBody - [1..8)::7
  68089. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  68090. + Identifier;[custom];
  68091. + CSharpCodeBlock - [7..8)::1
  68092. + CSharpStatementLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68093. + Whitespace;[ ];
  68094. + MarkupTextLiteral - [8..20)::12 - [-Some_Member] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68095. + Text;[-Some_Member];
  68096. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_ErrorsWhenEOFBeforeDirectiveBlockStart.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_ErrorsWhenEOFBeforeDirectiveBlockStart.cspans.txt
  68097. similarity index 100%
  68098. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_ErrorsWhenEOFBeforeDirectiveBlockStart.cspans.txt
  68099. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_ErrorsWhenEOFBeforeDirectiveBlockStart.cspans.txt
  68100. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_ErrorsWhenEOFBeforeDirectiveBlockStart.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_ErrorsWhenEOFBeforeDirectiveBlockStart.stree.txt
  68101. new file mode 100644
  68102. index 00000000000..5a514651129
  68103. --- /dev/null
  68104. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_ErrorsWhenEOFBeforeDirectiveBlockStart.stree.txt
  68105. @@ -0,0 +1,18 @@
  68106. +RazorDocument - [0..15)::15 - [@custom "Hello"]
  68107. + MarkupBlock - [0..15)::15
  68108. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68109. + Marker;[];
  68110. + CSharpCodeBlock - [0..15)::15
  68111. + RazorDirective - [0..15)::15 - Directive:{custom;CodeBlock;Unrestricted} [RZ1012(15:0,15 [1] )]
  68112. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68113. + Transition;[@];
  68114. + RazorDirectiveBody - [1..15)::14
  68115. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  68116. + Identifier;[custom];
  68117. + CSharpCodeBlock - [7..15)::8
  68118. + MarkupEphemeralTextLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68119. + Whitespace;[ ];
  68120. + CSharpStatementLiteral - [8..15)::7 - ["Hello"] - Gen<DirectiveToken {;String;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  68121. + StringLiteral;["Hello"];
  68122. + MarkupTextLiteral - [15..15)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68123. + Marker;[];
  68124. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_ErrorsWhenExtraContentBeforeBlockStart.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_ErrorsWhenExtraContentBeforeBlockStart.cspans.txt
  68125. similarity index 100%
  68126. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_ErrorsWhenExtraContentBeforeBlockStart.cspans.txt
  68127. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_ErrorsWhenExtraContentBeforeBlockStart.cspans.txt
  68128. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_ErrorsWhenExtraContentBeforeBlockStart.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_ErrorsWhenExtraContentBeforeBlockStart.stree.txt
  68129. new file mode 100644
  68130. index 00000000000..df8418becef
  68131. --- /dev/null
  68132. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_ErrorsWhenExtraContentBeforeBlockStart.stree.txt
  68133. @@ -0,0 +1,28 @@
  68134. +RazorDocument - [0..39)::39 - [@custom "Hello" World { foo(); bar(); }]
  68135. + MarkupBlock - [0..39)::39
  68136. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68137. + Marker;[];
  68138. + CSharpCodeBlock - [0..16)::16
  68139. + RazorDirective - [0..16)::16 - Directive:{custom;CodeBlock;Unrestricted} [RZ1017(16:0,16 [5] )]
  68140. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68141. + Transition;[@];
  68142. + RazorDirectiveBody - [1..16)::15
  68143. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  68144. + Identifier;[custom];
  68145. + CSharpCodeBlock - [7..16)::9
  68146. + MarkupEphemeralTextLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68147. + Whitespace;[ ];
  68148. + CSharpStatementLiteral - [8..15)::7 - ["Hello"] - Gen<DirectiveToken {;String;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  68149. + StringLiteral;["Hello"];
  68150. + MarkupTextLiteral - [15..16)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  68151. + Whitespace;[ ];
  68152. + MarkupTextLiteral - [16..39)::23 - [World { foo(); bar(); }] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68153. + Text;[World];
  68154. + Whitespace;[ ];
  68155. + Text;[{];
  68156. + Whitespace;[ ];
  68157. + Text;[foo();];
  68158. + Whitespace;[ ];
  68159. + Text;[bar();];
  68160. + Whitespace;[ ];
  68161. + Text;[}];
  68162. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_ErrorsWhenMissingEndBrace.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_ErrorsWhenMissingEndBrace.cspans.txt
  68163. similarity index 100%
  68164. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_ErrorsWhenMissingEndBrace.cspans.txt
  68165. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_ErrorsWhenMissingEndBrace.cspans.txt
  68166. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_ErrorsWhenMissingEndBrace.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_ErrorsWhenMissingEndBrace.stree.txt
  68167. new file mode 100644
  68168. index 00000000000..1b3104ce515
  68169. --- /dev/null
  68170. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_ErrorsWhenMissingEndBrace.stree.txt
  68171. @@ -0,0 +1,25 @@
  68172. +RazorDocument - [0..17)::17 - [@custom "Hello" {]
  68173. + MarkupBlock - [0..17)::17
  68174. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68175. + Marker;[];
  68176. + CSharpCodeBlock - [0..17)::17
  68177. + RazorDirective - [0..17)::17 - Directive:{custom;CodeBlock;Unrestricted} [RZ1006(16:0,16 [1] )]
  68178. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68179. + Transition;[@];
  68180. + RazorDirectiveBody - [1..17)::16
  68181. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  68182. + Identifier;[custom];
  68183. + CSharpCodeBlock - [7..17)::10
  68184. + MarkupEphemeralTextLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68185. + Whitespace;[ ];
  68186. + CSharpStatementLiteral - [8..15)::7 - ["Hello"] - Gen<DirectiveToken {;String;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  68187. + StringLiteral;["Hello"];
  68188. + MarkupTextLiteral - [15..16)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  68189. + Whitespace;[ ];
  68190. + RazorMetaCode - [16..17)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[}];AtEnd
  68191. + LeftBrace;[{];
  68192. + CSharpCodeBlock - [17..17)::0
  68193. + CSharpStatementLiteral - [17..17)::0 - [] - Gen<Stmt> - CodeBlockEditHandler;Accepts:Any;CodeBlock
  68194. + Marker;[];
  68195. + RazorMetaCode - [17..17)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  68196. + RightBrace;[<Missing>];
  68197. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_FileScopedMultipleOccurring_CanHaveDuplicates.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_FileScopedMultipleOccurring_CanHaveDuplicates.cspans.txt
  68198. similarity index 100%
  68199. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_FileScopedMultipleOccurring_CanHaveDuplicates.cspans.txt
  68200. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_FileScopedMultipleOccurring_CanHaveDuplicates.cspans.txt
  68201. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_FileScopedMultipleOccurring_CanHaveDuplicates.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_FileScopedMultipleOccurring_CanHaveDuplicates.stree.txt
  68202. new file mode 100644
  68203. index 00000000000..f9d3383434f
  68204. --- /dev/null
  68205. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_FileScopedMultipleOccurring_CanHaveDuplicates.stree.txt
  68206. @@ -0,0 +1,46 @@
  68207. +RazorDocument - [0..85)::85 - [@custom System.Text.Encoding.ASCIIEncodingLF@custom System.Text.Encoding.UTF8Encoding]
  68208. + MarkupBlock - [0..85)::85
  68209. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68210. + Marker;[];
  68211. + CSharpCodeBlock - [0..44)::44
  68212. + RazorDirective - [0..44)::44 - Directive:{custom;SingleLine;FileScopedMultipleOccurring}
  68213. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68214. + Transition;[@];
  68215. + RazorDirectiveBody - [1..44)::43
  68216. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  68217. + Identifier;[custom];
  68218. + CSharpCodeBlock - [7..44)::37
  68219. + CSharpStatementLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68220. + Whitespace;[ ];
  68221. + CSharpStatementLiteral - [8..42)::34 - [System.Text.Encoding.ASCIIEncoding] - Gen<DirectiveToken {;Type;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  68222. + Identifier;[System];
  68223. + Dot;[.];
  68224. + Identifier;[Text];
  68225. + Dot;[.];
  68226. + Identifier;[Encoding];
  68227. + Dot;[.];
  68228. + Identifier;[ASCIIEncoding];
  68229. + MarkupEphemeralTextLiteral - [42..44)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68230. + NewLine;[LF];
  68231. + MarkupTextLiteral - [44..44)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68232. + Marker;[];
  68233. + CSharpCodeBlock - [44..85)::41
  68234. + RazorDirective - [44..85)::41 - Directive:{custom;SingleLine;FileScopedMultipleOccurring}
  68235. + CSharpTransition - [44..45)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68236. + Transition;[@];
  68237. + RazorDirectiveBody - [45..85)::40
  68238. + RazorMetaCode - [45..51)::6 - Gen<None> - SpanEditHandler;Accepts:None
  68239. + Identifier;[custom];
  68240. + CSharpCodeBlock - [51..85)::34
  68241. + CSharpStatementLiteral - [51..52)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68242. + Whitespace;[ ];
  68243. + CSharpStatementLiteral - [52..85)::33 - [System.Text.Encoding.UTF8Encoding] - Gen<DirectiveToken {;Type;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  68244. + Identifier;[System];
  68245. + Dot;[.];
  68246. + Identifier;[Text];
  68247. + Dot;[.];
  68248. + Identifier;[Encoding];
  68249. + Dot;[.];
  68250. + Identifier;[UTF8Encoding];
  68251. + MarkupTextLiteral - [85..85)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68252. + Marker;[];
  68253. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_FileScopedSinglyOccurring_ErrorsIfDuplicate.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_FileScopedSinglyOccurring_ErrorsIfDuplicate.cspans.txt
  68254. similarity index 100%
  68255. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_FileScopedSinglyOccurring_ErrorsIfDuplicate.cspans.txt
  68256. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_FileScopedSinglyOccurring_ErrorsIfDuplicate.cspans.txt
  68257. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_FileScopedSinglyOccurring_ErrorsIfDuplicate.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_FileScopedSinglyOccurring_ErrorsIfDuplicate.stree.txt
  68258. new file mode 100644
  68259. index 00000000000..551e79b27c8
  68260. --- /dev/null
  68261. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_FileScopedSinglyOccurring_ErrorsIfDuplicate.stree.txt
  68262. @@ -0,0 +1,46 @@
  68263. +RazorDocument - [0..85)::85 - [@custom System.Text.Encoding.ASCIIEncodingLF@custom System.Text.Encoding.UTF8Encoding]
  68264. + MarkupBlock - [0..85)::85
  68265. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68266. + Marker;[];
  68267. + CSharpCodeBlock - [0..44)::44
  68268. + RazorDirective - [0..44)::44 - Directive:{custom;SingleLine;FileScopedSinglyOccurring}
  68269. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68270. + Transition;[@];
  68271. + RazorDirectiveBody - [1..44)::43
  68272. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  68273. + Identifier;[custom];
  68274. + CSharpCodeBlock - [7..44)::37
  68275. + CSharpStatementLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68276. + Whitespace;[ ];
  68277. + CSharpStatementLiteral - [8..42)::34 - [System.Text.Encoding.ASCIIEncoding] - Gen<DirectiveToken {;Type;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  68278. + Identifier;[System];
  68279. + Dot;[.];
  68280. + Identifier;[Text];
  68281. + Dot;[.];
  68282. + Identifier;[Encoding];
  68283. + Dot;[.];
  68284. + Identifier;[ASCIIEncoding];
  68285. + MarkupEphemeralTextLiteral - [42..44)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68286. + NewLine;[LF];
  68287. + MarkupTextLiteral - [44..44)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68288. + Marker;[];
  68289. + CSharpCodeBlock - [44..85)::41
  68290. + RazorDirective - [44..85)::41 - Directive:{custom;SingleLine;FileScopedSinglyOccurring} [RZ2001(44:1,0 [7] )]
  68291. + CSharpTransition - [44..45)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68292. + Transition;[@];
  68293. + RazorDirectiveBody - [45..85)::40
  68294. + RazorMetaCode - [45..51)::6 - Gen<None> - SpanEditHandler;Accepts:None
  68295. + Identifier;[custom];
  68296. + CSharpCodeBlock - [51..85)::34
  68297. + CSharpStatementLiteral - [51..52)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68298. + Whitespace;[ ];
  68299. + CSharpStatementLiteral - [52..85)::33 - [System.Text.Encoding.UTF8Encoding] - Gen<DirectiveToken {;Type;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  68300. + Identifier;[System];
  68301. + Dot;[.];
  68302. + Identifier;[Text];
  68303. + Dot;[.];
  68304. + Identifier;[Encoding];
  68305. + Dot;[.];
  68306. + Identifier;[UTF8Encoding];
  68307. + MarkupTextLiteral - [85..85)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68308. + Marker;[];
  68309. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_FileScoped_CanBeBeneathOtherDirectives.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_FileScoped_CanBeBeneathOtherDirectives.cspans.txt
  68310. similarity index 100%
  68311. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_FileScoped_CanBeBeneathOtherDirectives.cspans.txt
  68312. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_FileScoped_CanBeBeneathOtherDirectives.cspans.txt
  68313. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_FileScoped_CanBeBeneathOtherDirectives.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_FileScoped_CanBeBeneathOtherDirectives.stree.txt
  68314. new file mode 100644
  68315. index 00000000000..e0591c053d6
  68316. --- /dev/null
  68317. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_FileScoped_CanBeBeneathOtherDirectives.stree.txt
  68318. @@ -0,0 +1,40 @@
  68319. +RazorDocument - [0..59)::59 - [@custom System.Text.Encoding.ASCIIEncodingLF@something Else]
  68320. + MarkupBlock - [0..59)::59
  68321. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68322. + Marker;[];
  68323. + CSharpCodeBlock - [0..44)::44
  68324. + RazorDirective - [0..44)::44 - Directive:{custom;SingleLine;FileScopedSinglyOccurring}
  68325. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68326. + Transition;[@];
  68327. + RazorDirectiveBody - [1..44)::43
  68328. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  68329. + Identifier;[custom];
  68330. + CSharpCodeBlock - [7..44)::37
  68331. + CSharpStatementLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68332. + Whitespace;[ ];
  68333. + CSharpStatementLiteral - [8..42)::34 - [System.Text.Encoding.ASCIIEncoding] - Gen<DirectiveToken {;Type;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  68334. + Identifier;[System];
  68335. + Dot;[.];
  68336. + Identifier;[Text];
  68337. + Dot;[.];
  68338. + Identifier;[Encoding];
  68339. + Dot;[.];
  68340. + Identifier;[ASCIIEncoding];
  68341. + MarkupEphemeralTextLiteral - [42..44)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68342. + NewLine;[LF];
  68343. + MarkupTextLiteral - [44..44)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68344. + Marker;[];
  68345. + CSharpCodeBlock - [44..59)::15
  68346. + RazorDirective - [44..59)::15 - Directive:{something;SingleLine;FileScopedMultipleOccurring}
  68347. + CSharpTransition - [44..45)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68348. + Transition;[@];
  68349. + RazorDirectiveBody - [45..59)::14
  68350. + RazorMetaCode - [45..54)::9 - Gen<None> - SpanEditHandler;Accepts:None
  68351. + Identifier;[something];
  68352. + CSharpCodeBlock - [54..59)::5
  68353. + CSharpStatementLiteral - [54..55)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68354. + Whitespace;[ ];
  68355. + CSharpStatementLiteral - [55..59)::4 - [Else] - Gen<DirectiveToken {;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  68356. + Identifier;[Else];
  68357. + MarkupTextLiteral - [59..59)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68358. + Marker;[];
  68359. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_FileScoped_CanBeBeneathOtherWhiteSpaceCommentsAndDirectives.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_FileScoped_CanBeBeneathOtherWhiteSpaceCommentsAndDirectives.cspans.txt
  68360. similarity index 100%
  68361. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_FileScoped_CanBeBeneathOtherWhiteSpaceCommentsAndDirectives.cspans.txt
  68362. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_FileScoped_CanBeBeneathOtherWhiteSpaceCommentsAndDirectives.cspans.txt
  68363. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_FileScoped_CanBeBeneathOtherWhiteSpaceCommentsAndDirectives.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_FileScoped_CanBeBeneathOtherWhiteSpaceCommentsAndDirectives.stree.txt
  68364. new file mode 100644
  68365. index 00000000000..fda3f576907
  68366. --- /dev/null
  68367. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_FileScoped_CanBeBeneathOtherWhiteSpaceCommentsAndDirectives.stree.txt
  68368. @@ -0,0 +1,67 @@
  68369. +RazorDocument - [0..130)::130 - [@* There are two directives beneath this *@LF@custom System.Text.Encoding.ASCIIEncodingLFLF@something ElseLFLF<p>This is extra</p>]
  68370. + MarkupBlock - [0..130)::130
  68371. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68372. + Marker;[];
  68373. + RazorComment - [0..43)::43
  68374. + RazorCommentTransition;[@];
  68375. + RazorCommentStar;[*];
  68376. + RazorCommentLiteral;[ There are two directives beneath this ];
  68377. + RazorCommentStar;[*];
  68378. + RazorCommentTransition;[@];
  68379. + MarkupTextLiteral - [43..45)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68380. + NewLine;[LF];
  68381. + CSharpCodeBlock - [45..89)::44
  68382. + RazorDirective - [45..89)::44 - Directive:{custom;SingleLine;FileScopedSinglyOccurring}
  68383. + CSharpTransition - [45..46)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68384. + Transition;[@];
  68385. + RazorDirectiveBody - [46..89)::43
  68386. + RazorMetaCode - [46..52)::6 - Gen<None> - SpanEditHandler;Accepts:None
  68387. + Identifier;[custom];
  68388. + CSharpCodeBlock - [52..89)::37
  68389. + CSharpStatementLiteral - [52..53)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68390. + Whitespace;[ ];
  68391. + CSharpStatementLiteral - [53..87)::34 - [System.Text.Encoding.ASCIIEncoding] - Gen<DirectiveToken {;Type;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  68392. + Identifier;[System];
  68393. + Dot;[.];
  68394. + Identifier;[Text];
  68395. + Dot;[.];
  68396. + Identifier;[Encoding];
  68397. + Dot;[.];
  68398. + Identifier;[ASCIIEncoding];
  68399. + MarkupEphemeralTextLiteral - [87..89)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68400. + NewLine;[LF];
  68401. + MarkupTextLiteral - [89..91)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68402. + NewLine;[LF];
  68403. + CSharpCodeBlock - [91..108)::17
  68404. + RazorDirective - [91..108)::17 - Directive:{something;SingleLine;FileScopedMultipleOccurring}
  68405. + CSharpTransition - [91..92)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68406. + Transition;[@];
  68407. + RazorDirectiveBody - [92..108)::16
  68408. + RazorMetaCode - [92..101)::9 - Gen<None> - SpanEditHandler;Accepts:None
  68409. + Identifier;[something];
  68410. + CSharpCodeBlock - [101..108)::7
  68411. + CSharpStatementLiteral - [101..102)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68412. + Whitespace;[ ];
  68413. + CSharpStatementLiteral - [102..106)::4 - [Else] - Gen<DirectiveToken {;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  68414. + Identifier;[Else];
  68415. + MarkupEphemeralTextLiteral - [106..108)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68416. + NewLine;[LF];
  68417. + MarkupTextLiteral - [108..110)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68418. + NewLine;[LF];
  68419. + MarkupTagBlock - [110..113)::3 - [<p>]
  68420. + MarkupTextLiteral - [110..113)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68421. + OpenAngle;[<];
  68422. + Text;[p];
  68423. + CloseAngle;[>];
  68424. + MarkupTextLiteral - [113..126)::13 - [This is extra] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68425. + Text;[This];
  68426. + Whitespace;[ ];
  68427. + Text;[is];
  68428. + Whitespace;[ ];
  68429. + Text;[extra];
  68430. + MarkupTagBlock - [126..130)::4 - [</p>]
  68431. + MarkupTextLiteral - [126..130)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68432. + OpenAngle;[<];
  68433. + ForwardSlash;[/];
  68434. + Text;[p];
  68435. + CloseAngle;[>];
  68436. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_NoErrorsSemicolonAfterDirective.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_NoErrorsSemicolonAfterDirective.cspans.txt
  68437. similarity index 100%
  68438. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_NoErrorsSemicolonAfterDirective.cspans.txt
  68439. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_NoErrorsSemicolonAfterDirective.cspans.txt
  68440. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_NoErrorsSemicolonAfterDirective.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_NoErrorsSemicolonAfterDirective.stree.txt
  68441. new file mode 100644
  68442. index 00000000000..bd14b1f20cd
  68443. --- /dev/null
  68444. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_NoErrorsSemicolonAfterDirective.stree.txt
  68445. @@ -0,0 +1,24 @@
  68446. +RazorDocument - [0..19)::19 - [@custom "hello" ; ]
  68447. + MarkupBlock - [0..19)::19
  68448. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68449. + Marker;[];
  68450. + CSharpCodeBlock - [0..19)::19
  68451. + RazorDirective - [0..19)::19 - Directive:{custom;SingleLine;Unrestricted}
  68452. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68453. + Transition;[@];
  68454. + RazorDirectiveBody - [1..19)::18
  68455. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  68456. + Identifier;[custom];
  68457. + CSharpCodeBlock - [7..19)::12
  68458. + MarkupEphemeralTextLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68459. + Whitespace;[ ];
  68460. + CSharpStatementLiteral - [8..15)::7 - ["hello"] - Gen<DirectiveToken {;String;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  68461. + StringLiteral;["hello"];
  68462. + UnclassifiedTextLiteral - [15..16)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68463. + Whitespace;[ ];
  68464. + RazorMetaCode - [16..17)::1 - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68465. + Semicolon;[;];
  68466. + MarkupEphemeralTextLiteral - [17..19)::2 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68467. + Whitespace;[ ];
  68468. + MarkupTextLiteral - [19..19)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68469. + Marker;[];
  68470. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForNonStringValue.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForNonStringValue.cspans.txt
  68471. similarity index 100%
  68472. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForNonStringValue.cspans.txt
  68473. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForNonStringValue.cspans.txt
  68474. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForNonStringValue.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForNonStringValue.stree.txt
  68475. new file mode 100644
  68476. index 00000000000..ec8ed8b511a
  68477. --- /dev/null
  68478. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForNonStringValue.stree.txt
  68479. @@ -0,0 +1,18 @@
  68480. +RazorDocument - [0..14)::14 - [@custom {foo?}]
  68481. + MarkupBlock - [0..14)::14
  68482. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68483. + Marker;[];
  68484. + CSharpCodeBlock - [0..8)::8
  68485. + RazorDirective - [0..8)::8 - Directive:{custom;SingleLine;Unrestricted} [RZ1016(8:0,8 [1] )]
  68486. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68487. + Transition;[@];
  68488. + RazorDirectiveBody - [1..8)::7
  68489. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  68490. + Identifier;[custom];
  68491. + CSharpCodeBlock - [7..8)::1
  68492. + MarkupEphemeralTextLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68493. + Whitespace;[ ];
  68494. + MarkupTextLiteral - [8..14)::6 - [{foo?}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68495. + Text;[{foo];
  68496. + QuestionMark;[?];
  68497. + Text;[}];
  68498. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForPartialQuotedValue.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForPartialQuotedValue.cspans.txt
  68499. similarity index 100%
  68500. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForPartialQuotedValue.cspans.txt
  68501. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForPartialQuotedValue.cspans.txt
  68502. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForPartialQuotedValue.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForPartialQuotedValue.stree.txt
  68503. new file mode 100644
  68504. index 00000000000..6ad2990a4e5
  68505. --- /dev/null
  68506. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForPartialQuotedValue.stree.txt
  68507. @@ -0,0 +1,17 @@
  68508. +RazorDocument - [0..16)::16 - [@custom AString"]
  68509. + MarkupBlock - [0..16)::16
  68510. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68511. + Marker;[];
  68512. + CSharpCodeBlock - [0..8)::8
  68513. + RazorDirective - [0..8)::8 - Directive:{custom;SingleLine;Unrestricted} [RZ1016(8:0,8 [7] )]
  68514. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68515. + Transition;[@];
  68516. + RazorDirectiveBody - [1..8)::7
  68517. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  68518. + Identifier;[custom];
  68519. + CSharpCodeBlock - [7..8)::1
  68520. + MarkupEphemeralTextLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68521. + Whitespace;[ ];
  68522. + MarkupTextLiteral - [8..16)::8 - [AString"] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68523. + Text;[AString];
  68524. + DoubleQuote;["];
  68525. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForSingleQuotedValue.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForSingleQuotedValue.cspans.txt
  68526. similarity index 100%
  68527. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForSingleQuotedValue.cspans.txt
  68528. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForSingleQuotedValue.cspans.txt
  68529. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForSingleQuotedValue.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForSingleQuotedValue.stree.txt
  68530. new file mode 100644
  68531. index 00000000000..eef7233302b
  68532. --- /dev/null
  68533. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForSingleQuotedValue.stree.txt
  68534. @@ -0,0 +1,18 @@
  68535. +RazorDocument - [0..17)::17 - [@custom 'AString']
  68536. + MarkupBlock - [0..17)::17
  68537. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68538. + Marker;[];
  68539. + CSharpCodeBlock - [0..8)::8
  68540. + RazorDirective - [0..8)::8 - Directive:{custom;SingleLine;Unrestricted} [RZ1016(8:0,8 [9] )]
  68541. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68542. + Transition;[@];
  68543. + RazorDirectiveBody - [1..8)::7
  68544. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  68545. + Identifier;[custom];
  68546. + CSharpCodeBlock - [7..8)::1
  68547. + MarkupEphemeralTextLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68548. + Whitespace;[ ];
  68549. + MarkupTextLiteral - [8..17)::9 - ['AString'] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68550. + SingleQuote;['];
  68551. + Text;[AString];
  68552. + SingleQuote;['];
  68553. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForUnquotedValue.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForUnquotedValue.cspans.txt
  68554. similarity index 100%
  68555. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForUnquotedValue.cspans.txt
  68556. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForUnquotedValue.cspans.txt
  68557. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForUnquotedValue.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForUnquotedValue.stree.txt
  68558. new file mode 100644
  68559. index 00000000000..651feb6e9e6
  68560. --- /dev/null
  68561. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_StringToken_ParserErrorForUnquotedValue.stree.txt
  68562. @@ -0,0 +1,16 @@
  68563. +RazorDocument - [0..15)::15 - [@custom AString]
  68564. + MarkupBlock - [0..15)::15
  68565. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68566. + Marker;[];
  68567. + CSharpCodeBlock - [0..8)::8
  68568. + RazorDirective - [0..8)::8 - Directive:{custom;SingleLine;Unrestricted} [RZ1016(8:0,8 [7] )]
  68569. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68570. + Transition;[@];
  68571. + RazorDirectiveBody - [1..8)::7
  68572. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  68573. + Identifier;[custom];
  68574. + CSharpCodeBlock - [7..8)::1
  68575. + MarkupEphemeralTextLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68576. + Whitespace;[ ];
  68577. + MarkupTextLiteral - [8..15)::7 - [AString] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68578. + Text;[AString];
  68579. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_TokensMustBeSeparatedBySpace.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_TokensMustBeSeparatedBySpace.cspans.txt
  68580. similarity index 100%
  68581. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_TokensMustBeSeparatedBySpace.cspans.txt
  68582. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_TokensMustBeSeparatedBySpace.cspans.txt
  68583. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_TokensMustBeSeparatedBySpace.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_TokensMustBeSeparatedBySpace.stree.txt
  68584. new file mode 100644
  68585. index 00000000000..f3d06f68b9b
  68586. --- /dev/null
  68587. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_TokensMustBeSeparatedBySpace.stree.txt
  68588. @@ -0,0 +1,20 @@
  68589. +RazorDocument - [0..26)::26 - [@custom "string1""string2"]
  68590. + MarkupBlock - [0..26)::26
  68591. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68592. + Marker;[];
  68593. + CSharpCodeBlock - [0..17)::17
  68594. + RazorDirective - [0..17)::17 - Directive:{custom;SingleLine;Unrestricted} [RZ1011(17:0,17 [9] )]
  68595. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68596. + Transition;[@];
  68597. + RazorDirectiveBody - [1..17)::16
  68598. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  68599. + Identifier;[custom];
  68600. + CSharpCodeBlock - [7..17)::10
  68601. + MarkupEphemeralTextLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68602. + Whitespace;[ ];
  68603. + CSharpStatementLiteral - [8..17)::9 - ["string1"] - Gen<DirectiveToken {;String;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  68604. + StringLiteral;["string1"];
  68605. + MarkupTextLiteral - [17..26)::9 - ["string2"] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68606. + DoubleQuote;["];
  68607. + Text;[string2];
  68608. + DoubleQuote;["];
  68609. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsCodeBlocks.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsCodeBlocks.cspans.txt
  68610. similarity index 100%
  68611. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsCodeBlocks.cspans.txt
  68612. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsCodeBlocks.cspans.txt
  68613. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsCodeBlocks.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsCodeBlocks.stree.txt
  68614. new file mode 100644
  68615. index 00000000000..68899fb843a
  68616. --- /dev/null
  68617. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsCodeBlocks.stree.txt
  68618. @@ -0,0 +1,37 @@
  68619. +RazorDocument - [0..32)::32 - [@custom "Name" { foo(); bar(); }]
  68620. + MarkupBlock - [0..32)::32
  68621. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68622. + Marker;[];
  68623. + CSharpCodeBlock - [0..32)::32
  68624. + RazorDirective - [0..32)::32 - Directive:{custom;CodeBlock;Unrestricted}
  68625. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68626. + Transition;[@];
  68627. + RazorDirectiveBody - [1..32)::31
  68628. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  68629. + Identifier;[custom];
  68630. + CSharpCodeBlock - [7..32)::25
  68631. + MarkupEphemeralTextLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68632. + Whitespace;[ ];
  68633. + CSharpStatementLiteral - [8..14)::6 - ["Name"] - Gen<DirectiveToken {;String;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  68634. + StringLiteral;["Name"];
  68635. + MarkupTextLiteral - [14..15)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  68636. + Whitespace;[ ];
  68637. + RazorMetaCode - [15..16)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd
  68638. + LeftBrace;[{];
  68639. + CSharpCodeBlock - [16..31)::15
  68640. + CSharpStatementLiteral - [16..31)::15 - [ foo(); bar(); ] - Gen<Stmt> - CodeBlockEditHandler;Accepts:Any;CodeBlock
  68641. + Whitespace;[ ];
  68642. + Identifier;[foo];
  68643. + LeftParenthesis;[(];
  68644. + RightParenthesis;[)];
  68645. + Semicolon;[;];
  68646. + Whitespace;[ ];
  68647. + Identifier;[bar];
  68648. + LeftParenthesis;[(];
  68649. + RightParenthesis;[)];
  68650. + Semicolon;[;];
  68651. + Whitespace;[ ];
  68652. + RazorMetaCode - [31..32)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68653. + RightBrace;[}];
  68654. + MarkupTextLiteral - [32..32)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68655. + Marker;[];
  68656. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsMemberTokens.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsMemberTokens.cspans.txt
  68657. similarity index 100%
  68658. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsMemberTokens.cspans.txt
  68659. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsMemberTokens.cspans.txt
  68660. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsMemberTokens.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsMemberTokens.stree.txt
  68661. new file mode 100644
  68662. index 00000000000..d2d51198cb4
  68663. --- /dev/null
  68664. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsMemberTokens.stree.txt
  68665. @@ -0,0 +1,18 @@
  68666. +RazorDocument - [0..19)::19 - [@custom Some_Member]
  68667. + MarkupBlock - [0..19)::19
  68668. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68669. + Marker;[];
  68670. + CSharpCodeBlock - [0..19)::19
  68671. + RazorDirective - [0..19)::19 - Directive:{custom;SingleLine;Unrestricted}
  68672. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68673. + Transition;[@];
  68674. + RazorDirectiveBody - [1..19)::18
  68675. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  68676. + Identifier;[custom];
  68677. + CSharpCodeBlock - [7..19)::12
  68678. + CSharpStatementLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68679. + Whitespace;[ ];
  68680. + CSharpStatementLiteral - [8..19)::11 - [Some_Member] - Gen<DirectiveToken {;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  68681. + Identifier;[Some_Member];
  68682. + MarkupTextLiteral - [19..19)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68683. + Marker;[];
  68684. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsMultipleTokens.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsMultipleTokens.cspans.txt
  68685. similarity index 100%
  68686. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsMultipleTokens.cspans.txt
  68687. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsMultipleTokens.cspans.txt
  68688. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsMultipleTokens.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsMultipleTokens.stree.txt
  68689. new file mode 100644
  68690. index 00000000000..d2f7b39c4db
  68691. --- /dev/null
  68692. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsMultipleTokens.stree.txt
  68693. @@ -0,0 +1,32 @@
  68694. +RazorDocument - [0..64)::64 - [@custom System.Text.Encoding.ASCIIEncoding Some_Member "AString"]
  68695. + MarkupBlock - [0..64)::64
  68696. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68697. + Marker;[];
  68698. + CSharpCodeBlock - [0..64)::64
  68699. + RazorDirective - [0..64)::64 - Directive:{custom;SingleLine;Unrestricted}
  68700. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68701. + Transition;[@];
  68702. + RazorDirectiveBody - [1..64)::63
  68703. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  68704. + Identifier;[custom];
  68705. + CSharpCodeBlock - [7..64)::57
  68706. + CSharpStatementLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68707. + Whitespace;[ ];
  68708. + CSharpStatementLiteral - [8..42)::34 - [System.Text.Encoding.ASCIIEncoding] - Gen<DirectiveToken {;Type;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  68709. + Identifier;[System];
  68710. + Dot;[.];
  68711. + Identifier;[Text];
  68712. + Dot;[.];
  68713. + Identifier;[Encoding];
  68714. + Dot;[.];
  68715. + Identifier;[ASCIIEncoding];
  68716. + CSharpStatementLiteral - [42..43)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68717. + Whitespace;[ ];
  68718. + CSharpStatementLiteral - [43..54)::11 - [Some_Member] - Gen<DirectiveToken {;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  68719. + Identifier;[Some_Member];
  68720. + MarkupEphemeralTextLiteral - [54..55)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68721. + Whitespace;[ ];
  68722. + CSharpStatementLiteral - [55..64)::9 - ["AString"] - Gen<DirectiveToken {;String;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  68723. + StringLiteral;["AString"];
  68724. + MarkupTextLiteral - [64..64)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68725. + Marker;[];
  68726. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsRazorBlocks.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsRazorBlocks.cspans.txt
  68727. similarity index 100%
  68728. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsRazorBlocks.cspans.txt
  68729. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsRazorBlocks.cspans.txt
  68730. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsRazorBlocks.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsRazorBlocks.stree.txt
  68731. new file mode 100644
  68732. index 00000000000..c895c73d0c9
  68733. --- /dev/null
  68734. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsRazorBlocks.stree.txt
  68735. @@ -0,0 +1,46 @@
  68736. +RazorDocument - [0..33)::33 - [@custom "Header" { <p>F{o}o</p> }]
  68737. + MarkupBlock - [0..33)::33
  68738. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68739. + Marker;[];
  68740. + CSharpCodeBlock - [0..33)::33
  68741. + RazorDirective - [0..33)::33 - Directive:{custom;RazorBlock;Unrestricted}
  68742. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68743. + Transition;[@];
  68744. + RazorDirectiveBody - [1..33)::32
  68745. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  68746. + Identifier;[custom];
  68747. + CSharpCodeBlock - [7..33)::26
  68748. + MarkupEphemeralTextLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68749. + Whitespace;[ ];
  68750. + CSharpStatementLiteral - [8..16)::8 - ["Header"] - Gen<DirectiveToken {;String;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  68751. + StringLiteral;["Header"];
  68752. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  68753. + Whitespace;[ ];
  68754. + RazorMetaCode - [17..18)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd
  68755. + LeftBrace;[{];
  68756. + MarkupBlock - [18..32)::14
  68757. + MarkupTextLiteral - [18..19)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68758. + Whitespace;[ ];
  68759. + MarkupTagBlock - [19..22)::3 - [<p>]
  68760. + MarkupTextLiteral - [19..22)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68761. + OpenAngle;[<];
  68762. + Text;[p];
  68763. + CloseAngle;[>];
  68764. + MarkupTextLiteral - [22..27)::5 - [F{o}o] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68765. + Text;[F];
  68766. + Text;[{];
  68767. + Text;[o];
  68768. + Text;[}];
  68769. + Text;[o];
  68770. + MarkupTagBlock - [27..31)::4 - [</p>]
  68771. + MarkupTextLiteral - [27..31)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68772. + OpenAngle;[<];
  68773. + ForwardSlash;[/];
  68774. + Text;[p];
  68775. + CloseAngle;[>];
  68776. + MarkupTextLiteral - [31..32)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68777. + Whitespace;[ ];
  68778. + RazorMetaCode - [32..33)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68779. + RightBrace;[}];
  68780. + MarkupTextLiteral - [33..33)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68781. + Marker;[];
  68782. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsStringTokens.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsStringTokens.cspans.txt
  68783. similarity index 100%
  68784. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsStringTokens.cspans.txt
  68785. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsStringTokens.cspans.txt
  68786. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsStringTokens.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsStringTokens.stree.txt
  68787. new file mode 100644
  68788. index 00000000000..77987a903f9
  68789. --- /dev/null
  68790. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsStringTokens.stree.txt
  68791. @@ -0,0 +1,18 @@
  68792. +RazorDocument - [0..17)::17 - [@custom "AString"]
  68793. + MarkupBlock - [0..17)::17
  68794. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68795. + Marker;[];
  68796. + CSharpCodeBlock - [0..17)::17
  68797. + RazorDirective - [0..17)::17 - Directive:{custom;SingleLine;Unrestricted}
  68798. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68799. + Transition;[@];
  68800. + RazorDirectiveBody - [1..17)::16
  68801. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  68802. + Identifier;[custom];
  68803. + CSharpCodeBlock - [7..17)::10
  68804. + MarkupEphemeralTextLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68805. + Whitespace;[ ];
  68806. + CSharpStatementLiteral - [8..17)::9 - ["AString"] - Gen<DirectiveToken {;String;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  68807. + StringLiteral;["AString"];
  68808. + MarkupTextLiteral - [17..17)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68809. + Marker;[];
  68810. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsTypeTokens.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsTypeTokens.cspans.txt
  68811. similarity index 100%
  68812. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/DirectiveDescriptor_UnderstandsTypeTokens.cspans.txt
  68813. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsTypeTokens.cspans.txt
  68814. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsTypeTokens.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsTypeTokens.stree.txt
  68815. new file mode 100644
  68816. index 00000000000..ba28ef0a75d
  68817. --- /dev/null
  68818. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/DirectiveDescriptor_UnderstandsTypeTokens.stree.txt
  68819. @@ -0,0 +1,24 @@
  68820. +RazorDocument - [0..42)::42 - [@custom System.Text.Encoding.ASCIIEncoding]
  68821. + MarkupBlock - [0..42)::42
  68822. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68823. + Marker;[];
  68824. + CSharpCodeBlock - [0..42)::42
  68825. + RazorDirective - [0..42)::42 - Directive:{custom;SingleLine;Unrestricted}
  68826. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68827. + Transition;[@];
  68828. + RazorDirectiveBody - [1..42)::41
  68829. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  68830. + Identifier;[custom];
  68831. + CSharpCodeBlock - [7..42)::35
  68832. + CSharpStatementLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68833. + Whitespace;[ ];
  68834. + CSharpStatementLiteral - [8..42)::34 - [System.Text.Encoding.ASCIIEncoding] - Gen<DirectiveToken {;Type;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  68835. + Identifier;[System];
  68836. + Dot;[.];
  68837. + Identifier;[Text];
  68838. + Dot;[.];
  68839. + Identifier;[Encoding];
  68840. + Dot;[.];
  68841. + Identifier;[ASCIIEncoding];
  68842. + MarkupTextLiteral - [42..42)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68843. + Marker;[];
  68844. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Directives_CanUseReservedWord_Class.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Directives_CanUseReservedWord_Class.cspans.txt
  68845. similarity index 100%
  68846. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Directives_CanUseReservedWord_Class.cspans.txt
  68847. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Directives_CanUseReservedWord_Class.cspans.txt
  68848. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Directives_CanUseReservedWord_Class.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Directives_CanUseReservedWord_Class.stree.txt
  68849. new file mode 100644
  68850. index 00000000000..006f105357c
  68851. --- /dev/null
  68852. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Directives_CanUseReservedWord_Class.stree.txt
  68853. @@ -0,0 +1,14 @@
  68854. +RazorDocument - [0..6)::6 - [@class]
  68855. + MarkupBlock - [0..6)::6
  68856. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68857. + Marker;[];
  68858. + CSharpCodeBlock - [0..6)::6
  68859. + RazorDirective - [0..6)::6 - Directive:{class;SingleLine;Unrestricted}
  68860. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68861. + Transition;[@];
  68862. + RazorDirectiveBody - [1..6)::5
  68863. + RazorMetaCode - [1..6)::5 - Gen<None> - SpanEditHandler;Accepts:None
  68864. + Keyword;[class];
  68865. + CSharpCodeBlock - [6..6)::0
  68866. + MarkupTextLiteral - [6..6)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68867. + Marker;[];
  68868. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Directives_CanUseReservedWord_Namespace.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Directives_CanUseReservedWord_Namespace.cspans.txt
  68869. similarity index 100%
  68870. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Directives_CanUseReservedWord_Namespace.cspans.txt
  68871. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Directives_CanUseReservedWord_Namespace.cspans.txt
  68872. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Directives_CanUseReservedWord_Namespace.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Directives_CanUseReservedWord_Namespace.stree.txt
  68873. new file mode 100644
  68874. index 00000000000..9b940ce6e5b
  68875. --- /dev/null
  68876. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Directives_CanUseReservedWord_Namespace.stree.txt
  68877. @@ -0,0 +1,14 @@
  68878. +RazorDocument - [0..10)::10 - [@namespace]
  68879. + MarkupBlock - [0..10)::10
  68880. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68881. + Marker;[];
  68882. + CSharpCodeBlock - [0..10)::10
  68883. + RazorDirective - [0..10)::10 - Directive:{namespace;SingleLine;Unrestricted}
  68884. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68885. + Transition;[@];
  68886. + RazorDirectiveBody - [1..10)::9
  68887. + RazorMetaCode - [1..10)::9 - Gen<None> - SpanEditHandler;Accepts:None
  68888. + Keyword;[namespace];
  68889. + CSharpCodeBlock - [10..10)::0
  68890. + MarkupTextLiteral - [10..10)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68891. + Marker;[];
  68892. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/EmptyFunctionsDirective.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/EmptyFunctionsDirective.cspans.txt
  68893. similarity index 100%
  68894. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/EmptyFunctionsDirective.cspans.txt
  68895. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/EmptyFunctionsDirective.cspans.txt
  68896. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/EmptyFunctionsDirective.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/EmptyFunctionsDirective.stree.txt
  68897. new file mode 100644
  68898. index 00000000000..7dec6510ef2
  68899. --- /dev/null
  68900. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/EmptyFunctionsDirective.stree.txt
  68901. @@ -0,0 +1,23 @@
  68902. +RazorDocument - [0..14)::14 - [@functions { }]
  68903. + MarkupBlock - [0..14)::14
  68904. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68905. + Marker;[];
  68906. + CSharpCodeBlock - [0..14)::14
  68907. + RazorDirective - [0..14)::14 - Directive:{functions;CodeBlock;Unrestricted}
  68908. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68909. + Transition;[@];
  68910. + RazorDirectiveBody - [1..14)::13
  68911. + RazorMetaCode - [1..10)::9 - Gen<None> - SpanEditHandler;Accepts:None
  68912. + Identifier;[functions];
  68913. + CSharpCodeBlock - [10..14)::4
  68914. + MarkupTextLiteral - [10..11)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  68915. + Whitespace;[ ];
  68916. + RazorMetaCode - [11..12)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd
  68917. + LeftBrace;[{];
  68918. + CSharpCodeBlock - [12..13)::1
  68919. + CSharpStatementLiteral - [12..13)::1 - [ ] - Gen<Stmt> - CodeBlockEditHandler;Accepts:Any;CodeBlock
  68920. + Whitespace;[ ];
  68921. + RazorMetaCode - [13..14)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68922. + RightBrace;[}];
  68923. + MarkupTextLiteral - [14..14)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68924. + Marker;[];
  68925. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/ExtensibleDirectiveDoesNotErorrIfNotAtStartOfLineBecauseOfWhitespace.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/ExtensibleDirectiveDoesNotErorrIfNotAtStartOfLineBecauseOfWhitespace.cspans.txt
  68926. similarity index 71%
  68927. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/ExtensibleDirectiveDoesNotErorrIfNotAtStartOfLineBecauseOfWhitespace.cspans.txt
  68928. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/ExtensibleDirectiveDoesNotErorrIfNotAtStartOfLineBecauseOfWhitespace.cspans.txt
  68929. index 212cedc0700..80b5cd9e14b 100644
  68930. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/ExtensibleDirectiveDoesNotErorrIfNotAtStartOfLineBecauseOfWhitespace.cspans.txt
  68931. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/ExtensibleDirectiveDoesNotErorrIfNotAtStartOfLineBecauseOfWhitespace.cspans.txt
  68932. @@ -1,7 +1,7 @@
  68933. Markup span at (0:0,0 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [46] )
  68934. -Code span at (2:1,0 [2] ) (Accepts:Any) - Parent: Directive block at (2:1,0 [44] )
  68935. -Transition span at (4:1,2 [1] ) (Accepts:None) - Parent: Directive block at (2:1,0 [44] )
  68936. -MetaCode span at (5:1,3 [6] ) (Accepts:None) - Parent: Directive block at (2:1,0 [44] )
  68937. -Code span at (11:1,9 [1] ) (Accepts:Whitespace) - Parent: Directive block at (2:1,0 [44] )
  68938. -Code span at (12:1,10 [34] ) (Accepts:NonWhitespace) - Parent: Directive block at (2:1,0 [44] )
  68939. +Code span at (2:1,0 [2] ) (Accepts:Any) - Parent: Statement block at (2:1,0 [44] )
  68940. +Transition span at (4:1,2 [1] ) (Accepts:None) - Parent: Directive block at (4:1,2 [42] )
  68941. +MetaCode span at (5:1,3 [6] ) (Accepts:None) - Parent: Directive block at (4:1,2 [42] )
  68942. +Code span at (11:1,9 [1] ) (Accepts:Whitespace) - Parent: Directive block at (4:1,2 [42] )
  68943. +Code span at (12:1,10 [34] ) (Accepts:NonWhitespace) - Parent: Directive block at (4:1,2 [42] )
  68944. Markup span at (46:1,44 [0] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [46] )
  68945. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/ExtensibleDirectiveDoesNotErorrIfNotAtStartOfLineBecauseOfWhitespace.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/ExtensibleDirectiveDoesNotErorrIfNotAtStartOfLineBecauseOfWhitespace.stree.txt
  68946. new file mode 100644
  68947. index 00000000000..bd2d6d768d3
  68948. --- /dev/null
  68949. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/ExtensibleDirectiveDoesNotErorrIfNotAtStartOfLineBecauseOfWhitespace.stree.txt
  68950. @@ -0,0 +1,26 @@
  68951. +RazorDocument - [0..46)::46 - [LF @custom System.Text.Encoding.ASCIIEncoding]
  68952. + MarkupBlock - [0..46)::46
  68953. + MarkupTextLiteral - [0..2)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68954. + NewLine;[LF];
  68955. + CSharpCodeBlock - [2..46)::44
  68956. + CSharpStatementLiteral - [2..4)::2 - [ ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  68957. + Whitespace;[ ];
  68958. + RazorDirective - [4..46)::42 - Directive:{custom;SingleLine;Unrestricted}
  68959. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68960. + Transition;[@];
  68961. + RazorDirectiveBody - [5..46)::41
  68962. + RazorMetaCode - [5..11)::6 - Gen<None> - SpanEditHandler;Accepts:None
  68963. + Identifier;[custom];
  68964. + CSharpCodeBlock - [11..46)::35
  68965. + CSharpStatementLiteral - [11..12)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  68966. + Whitespace;[ ];
  68967. + CSharpStatementLiteral - [12..46)::34 - [System.Text.Encoding.ASCIIEncoding] - Gen<DirectiveToken {;Type;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  68968. + Identifier;[System];
  68969. + Dot;[.];
  68970. + Identifier;[Text];
  68971. + Dot;[.];
  68972. + Identifier;[Encoding];
  68973. + Dot;[.];
  68974. + Identifier;[ASCIIEncoding];
  68975. + MarkupTextLiteral - [46..46)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68976. + Marker;[];
  68977. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/ExtensibleDirectiveErrorsIfNotAtStartOfLine.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/ExtensibleDirectiveErrorsIfNotAtStartOfLine.cspans.txt
  68978. similarity index 100%
  68979. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/ExtensibleDirectiveErrorsIfNotAtStartOfLine.cspans.txt
  68980. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/ExtensibleDirectiveErrorsIfNotAtStartOfLine.cspans.txt
  68981. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/ExtensibleDirectiveErrorsIfNotAtStartOfLine.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/ExtensibleDirectiveErrorsIfNotAtStartOfLine.stree.txt
  68982. new file mode 100644
  68983. index 00000000000..de8aa133865
  68984. --- /dev/null
  68985. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/ExtensibleDirectiveErrorsIfNotAtStartOfLine.stree.txt
  68986. @@ -0,0 +1,27 @@
  68987. +RazorDocument - [0..48)::48 - [{ @custom System.Text.Encoding.ASCIIEncodingLF}]
  68988. + MarkupBlock - [0..48)::48
  68989. + MarkupTextLiteral - [0..3)::3 - [{ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  68990. + Text;[{];
  68991. + Whitespace;[ ];
  68992. + CSharpCodeBlock - [3..47)::44
  68993. + RazorDirective - [3..47)::44 - Directive:{custom;SingleLine;Unrestricted} [RZ2005(4:0,4 [6] )]
  68994. + CSharpTransition - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  68995. + Transition;[@];
  68996. + RazorDirectiveBody - [4..47)::43
  68997. + RazorMetaCode - [4..10)::6 - Gen<None> - SpanEditHandler;Accepts:None
  68998. + Identifier;[custom];
  68999. + CSharpCodeBlock - [10..47)::37
  69000. + CSharpStatementLiteral - [10..11)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  69001. + Whitespace;[ ];
  69002. + CSharpStatementLiteral - [11..45)::34 - [System.Text.Encoding.ASCIIEncoding] - Gen<DirectiveToken {;Type;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  69003. + Identifier;[System];
  69004. + Dot;[.];
  69005. + Identifier;[Text];
  69006. + Dot;[.];
  69007. + Identifier;[Encoding];
  69008. + Dot;[.];
  69009. + Identifier;[ASCIIEncoding];
  69010. + MarkupEphemeralTextLiteral - [45..47)::2 - [LF] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  69011. + NewLine;[LF];
  69012. + MarkupTextLiteral - [47..48)::1 - [}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69013. + Text;[}];
  69014. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/InheritsDirectiveSupportsArrays.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/InheritsDirectiveSupportsArrays.cspans.txt
  69015. similarity index 100%
  69016. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/InheritsDirectiveSupportsArrays.cspans.txt
  69017. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/InheritsDirectiveSupportsArrays.cspans.txt
  69018. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/InheritsDirectiveSupportsArrays.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/InheritsDirectiveSupportsArrays.stree.txt
  69019. new file mode 100644
  69020. index 00000000000..84882ce25e3
  69021. --- /dev/null
  69022. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/InheritsDirectiveSupportsArrays.stree.txt
  69023. @@ -0,0 +1,24 @@
  69024. +RazorDocument - [0..22)::22 - [@inherits string[[]][]]
  69025. + MarkupBlock - [0..22)::22
  69026. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69027. + Marker;[];
  69028. + CSharpCodeBlock - [0..22)::22
  69029. + RazorDirective - [0..22)::22 - Directive:{inherits;SingleLine;FileScopedSinglyOccurring}
  69030. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69031. + Transition;[@];
  69032. + RazorDirectiveBody - [1..22)::21
  69033. + RazorMetaCode - [1..9)::8 - Gen<None> - SpanEditHandler;Accepts:None
  69034. + Identifier;[inherits];
  69035. + CSharpCodeBlock - [9..22)::13
  69036. + CSharpStatementLiteral - [9..10)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  69037. + Whitespace;[ ];
  69038. + CSharpStatementLiteral - [10..22)::12 - [string[[]][]] - Gen<DirectiveToken {TypeName;Type;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  69039. + Keyword;[string];
  69040. + LeftBracket;[[];
  69041. + LeftBracket;[[];
  69042. + RightBracket;[]];
  69043. + RightBracket;[]];
  69044. + LeftBracket;[[];
  69045. + RightBracket;[]];
  69046. + MarkupTextLiteral - [22..22)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69047. + Marker;[];
  69048. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/InheritsDirectiveSupportsNestedGenerics.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/InheritsDirectiveSupportsNestedGenerics.cspans.txt
  69049. similarity index 100%
  69050. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/InheritsDirectiveSupportsNestedGenerics.cspans.txt
  69051. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/InheritsDirectiveSupportsNestedGenerics.cspans.txt
  69052. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/InheritsDirectiveSupportsNestedGenerics.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/InheritsDirectiveSupportsNestedGenerics.stree.txt
  69053. new file mode 100644
  69054. index 00000000000..b8cf6049cb5
  69055. --- /dev/null
  69056. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/InheritsDirectiveSupportsNestedGenerics.stree.txt
  69057. @@ -0,0 +1,34 @@
  69058. +RazorDocument - [0..87)::87 - [@inherits System.Web.Mvc.WebViewPage<IEnumerable<MvcApplication2.Models.RegisterModel>>]
  69059. + MarkupBlock - [0..87)::87
  69060. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69061. + Marker;[];
  69062. + CSharpCodeBlock - [0..87)::87
  69063. + RazorDirective - [0..87)::87 - Directive:{inherits;SingleLine;FileScopedSinglyOccurring}
  69064. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69065. + Transition;[@];
  69066. + RazorDirectiveBody - [1..87)::86
  69067. + RazorMetaCode - [1..9)::8 - Gen<None> - SpanEditHandler;Accepts:None
  69068. + Identifier;[inherits];
  69069. + CSharpCodeBlock - [9..87)::78
  69070. + CSharpStatementLiteral - [9..10)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  69071. + Whitespace;[ ];
  69072. + CSharpStatementLiteral - [10..87)::77 - [System.Web.Mvc.WebViewPage<IEnumerable<MvcApplication2.Models.RegisterModel>>] - Gen<DirectiveToken {TypeName;Type;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  69073. + Identifier;[System];
  69074. + Dot;[.];
  69075. + Identifier;[Web];
  69076. + Dot;[.];
  69077. + Identifier;[Mvc];
  69078. + Dot;[.];
  69079. + Identifier;[WebViewPage];
  69080. + LessThan;[<];
  69081. + Identifier;[IEnumerable];
  69082. + LessThan;[<];
  69083. + Identifier;[MvcApplication2];
  69084. + Dot;[.];
  69085. + Identifier;[Models];
  69086. + Dot;[.];
  69087. + Identifier;[RegisterModel];
  69088. + GreaterThan;[>];
  69089. + GreaterThan;[>];
  69090. + MarkupTextLiteral - [87..87)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69091. + Marker;[];
  69092. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/InheritsDirectiveSupportsTypeKeywords.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/InheritsDirectiveSupportsTypeKeywords.cspans.txt
  69093. similarity index 100%
  69094. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/InheritsDirectiveSupportsTypeKeywords.cspans.txt
  69095. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/InheritsDirectiveSupportsTypeKeywords.cspans.txt
  69096. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/InheritsDirectiveSupportsTypeKeywords.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/InheritsDirectiveSupportsTypeKeywords.stree.txt
  69097. new file mode 100644
  69098. index 00000000000..12fe4f3b8ba
  69099. --- /dev/null
  69100. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/InheritsDirectiveSupportsTypeKeywords.stree.txt
  69101. @@ -0,0 +1,18 @@
  69102. +RazorDocument - [0..16)::16 - [@inherits string]
  69103. + MarkupBlock - [0..16)::16
  69104. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69105. + Marker;[];
  69106. + CSharpCodeBlock - [0..16)::16
  69107. + RazorDirective - [0..16)::16 - Directive:{inherits;SingleLine;FileScopedSinglyOccurring}
  69108. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69109. + Transition;[@];
  69110. + RazorDirectiveBody - [1..16)::15
  69111. + RazorMetaCode - [1..9)::8 - Gen<None> - SpanEditHandler;Accepts:None
  69112. + Identifier;[inherits];
  69113. + CSharpCodeBlock - [9..16)::7
  69114. + CSharpStatementLiteral - [9..10)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  69115. + Whitespace;[ ];
  69116. + CSharpStatementLiteral - [10..16)::6 - [string] - Gen<DirectiveToken {TypeName;Type;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  69117. + Keyword;[string];
  69118. + MarkupTextLiteral - [16..16)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69119. + Marker;[];
  69120. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalDirectiveTokens_AreSkipped.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalDirectiveTokens_AreSkipped.cspans.txt
  69121. similarity index 100%
  69122. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalDirectiveTokens_AreSkipped.cspans.txt
  69123. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalDirectiveTokens_AreSkipped.cspans.txt
  69124. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalDirectiveTokens_AreSkipped.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalDirectiveTokens_AreSkipped.stree.txt
  69125. new file mode 100644
  69126. index 00000000000..592926662bf
  69127. --- /dev/null
  69128. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalDirectiveTokens_AreSkipped.stree.txt
  69129. @@ -0,0 +1,16 @@
  69130. +RazorDocument - [0..8)::8 - [@custom ]
  69131. + MarkupBlock - [0..8)::8
  69132. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69133. + Marker;[];
  69134. + CSharpCodeBlock - [0..8)::8
  69135. + RazorDirective - [0..8)::8 - Directive:{custom;SingleLine;Unrestricted}
  69136. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69137. + Transition;[@];
  69138. + RazorDirectiveBody - [1..8)::7
  69139. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  69140. + Identifier;[custom];
  69141. + CSharpCodeBlock - [7..8)::1
  69142. + MarkupEphemeralTextLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  69143. + Whitespace;[ ];
  69144. + MarkupTextLiteral - [8..8)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69145. + Marker;[];
  69146. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalDirectiveTokens_WithBraces_AreParsed.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalDirectiveTokens_WithBraces_AreParsed.cspans.txt
  69147. similarity index 100%
  69148. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalDirectiveTokens_WithBraces_AreParsed.cspans.txt
  69149. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalDirectiveTokens_WithBraces_AreParsed.cspans.txt
  69150. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalDirectiveTokens_WithBraces_AreParsed.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalDirectiveTokens_WithBraces_AreParsed.stree.txt
  69151. new file mode 100644
  69152. index 00000000000..455a063f9d5
  69153. --- /dev/null
  69154. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalDirectiveTokens_WithBraces_AreParsed.stree.txt
  69155. @@ -0,0 +1,18 @@
  69156. +RazorDocument - [0..29)::29 - [@custom "{formaction}?/{id}?"]
  69157. + MarkupBlock - [0..29)::29
  69158. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69159. + Marker;[];
  69160. + CSharpCodeBlock - [0..29)::29
  69161. + RazorDirective - [0..29)::29 - Directive:{custom;SingleLine;Unrestricted}
  69162. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69163. + Transition;[@];
  69164. + RazorDirectiveBody - [1..29)::28
  69165. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  69166. + Identifier;[custom];
  69167. + CSharpCodeBlock - [7..29)::22
  69168. + MarkupEphemeralTextLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  69169. + Whitespace;[ ];
  69170. + CSharpStatementLiteral - [8..29)::21 - ["{formaction}?/{id}?"] - Gen<DirectiveToken {;String;Opt:True}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  69171. + StringLiteral;["{formaction}?/{id}?"];
  69172. + MarkupTextLiteral - [29..29)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69173. + Marker;[];
  69174. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalDirectiveTokens_WithMultipleOptionalTokens_AreParsed.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalDirectiveTokens_WithMultipleOptionalTokens_AreParsed.cspans.txt
  69175. similarity index 100%
  69176. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalDirectiveTokens_WithMultipleOptionalTokens_AreParsed.cspans.txt
  69177. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalDirectiveTokens_WithMultipleOptionalTokens_AreParsed.cspans.txt
  69178. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalDirectiveTokens_WithMultipleOptionalTokens_AreParsed.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalDirectiveTokens_WithMultipleOptionalTokens_AreParsed.stree.txt
  69179. new file mode 100644
  69180. index 00000000000..de4cde9da7d
  69181. --- /dev/null
  69182. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalDirectiveTokens_WithMultipleOptionalTokens_AreParsed.stree.txt
  69183. @@ -0,0 +1,24 @@
  69184. +RazorDocument - [0..43)::43 - [@custom "{formaction}?/{id}?" System.String]
  69185. + MarkupBlock - [0..43)::43
  69186. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69187. + Marker;[];
  69188. + CSharpCodeBlock - [0..43)::43
  69189. + RazorDirective - [0..43)::43 - Directive:{custom;SingleLine;Unrestricted}
  69190. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69191. + Transition;[@];
  69192. + RazorDirectiveBody - [1..43)::42
  69193. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  69194. + Identifier;[custom];
  69195. + CSharpCodeBlock - [7..43)::36
  69196. + MarkupEphemeralTextLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  69197. + Whitespace;[ ];
  69198. + CSharpStatementLiteral - [8..29)::21 - ["{formaction}?/{id}?"] - Gen<DirectiveToken {;String;Opt:True}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  69199. + StringLiteral;["{formaction}?/{id}?"];
  69200. + CSharpStatementLiteral - [29..30)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  69201. + Whitespace;[ ];
  69202. + CSharpStatementLiteral - [30..43)::13 - [System.String] - Gen<DirectiveToken {;Type;Opt:True}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  69203. + Identifier;[System];
  69204. + Dot;[.];
  69205. + Identifier;[String];
  69206. + MarkupTextLiteral - [43..43)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69207. + Marker;[];
  69208. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalDirectiveTokens_WithSimpleTokens_AreParsed.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalDirectiveTokens_WithSimpleTokens_AreParsed.cspans.txt
  69209. similarity index 100%
  69210. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalDirectiveTokens_WithSimpleTokens_AreParsed.cspans.txt
  69211. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalDirectiveTokens_WithSimpleTokens_AreParsed.cspans.txt
  69212. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalDirectiveTokens_WithSimpleTokens_AreParsed.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalDirectiveTokens_WithSimpleTokens_AreParsed.stree.txt
  69213. new file mode 100644
  69214. index 00000000000..ccd26b5cbe2
  69215. --- /dev/null
  69216. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalDirectiveTokens_WithSimpleTokens_AreParsed.stree.txt
  69217. @@ -0,0 +1,18 @@
  69218. +RazorDocument - [0..22)::22 - [@custom "simple-value"]
  69219. + MarkupBlock - [0..22)::22
  69220. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69221. + Marker;[];
  69222. + CSharpCodeBlock - [0..22)::22
  69223. + RazorDirective - [0..22)::22 - Directive:{custom;SingleLine;Unrestricted}
  69224. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69225. + Transition;[@];
  69226. + RazorDirectiveBody - [1..22)::21
  69227. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  69228. + Identifier;[custom];
  69229. + CSharpCodeBlock - [7..22)::15
  69230. + MarkupEphemeralTextLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  69231. + Whitespace;[ ];
  69232. + CSharpStatementLiteral - [8..22)::14 - ["simple-value"] - Gen<DirectiveToken {;String;Opt:True}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  69233. + StringLiteral;["simple-value"];
  69234. + MarkupTextLiteral - [22..22)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69235. + Marker;[];
  69236. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalMemberTokens_WithMemberSpecified_IsParsed.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalMemberTokens_WithMemberSpecified_IsParsed.cspans.txt
  69237. similarity index 100%
  69238. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalMemberTokens_WithMemberSpecified_IsParsed.cspans.txt
  69239. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalMemberTokens_WithMemberSpecified_IsParsed.cspans.txt
  69240. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalMemberTokens_WithMemberSpecified_IsParsed.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalMemberTokens_WithMemberSpecified_IsParsed.stree.txt
  69241. new file mode 100644
  69242. index 00000000000..adf43bdc9d9
  69243. --- /dev/null
  69244. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalMemberTokens_WithMemberSpecified_IsParsed.stree.txt
  69245. @@ -0,0 +1,18 @@
  69246. +RazorDocument - [0..27)::27 - [@TestDirective PropertyName]
  69247. + MarkupBlock - [0..27)::27
  69248. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69249. + Marker;[];
  69250. + CSharpCodeBlock - [0..27)::27
  69251. + RazorDirective - [0..27)::27 - Directive:{TestDirective;SingleLine;Unrestricted}
  69252. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69253. + Transition;[@];
  69254. + RazorDirectiveBody - [1..27)::26
  69255. + RazorMetaCode - [1..14)::13 - Gen<None> - SpanEditHandler;Accepts:None
  69256. + Identifier;[TestDirective];
  69257. + CSharpCodeBlock - [14..27)::13
  69258. + CSharpStatementLiteral - [14..15)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  69259. + Whitespace;[ ];
  69260. + CSharpStatementLiteral - [15..27)::12 - [PropertyName] - Gen<DirectiveToken {;Member;Opt:True}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  69261. + Identifier;[PropertyName];
  69262. + MarkupTextLiteral - [27..27)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69263. + Marker;[];
  69264. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalMemberTokens_WithMissingMember_IsParsed.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalMemberTokens_WithMissingMember_IsParsed.cspans.txt
  69265. similarity index 100%
  69266. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/OptionalMemberTokens_WithMissingMember_IsParsed.cspans.txt
  69267. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalMemberTokens_WithMissingMember_IsParsed.cspans.txt
  69268. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalMemberTokens_WithMissingMember_IsParsed.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalMemberTokens_WithMissingMember_IsParsed.stree.txt
  69269. new file mode 100644
  69270. index 00000000000..7a6be62a85e
  69271. --- /dev/null
  69272. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/OptionalMemberTokens_WithMissingMember_IsParsed.stree.txt
  69273. @@ -0,0 +1,18 @@
  69274. +RazorDocument - [0..15)::15 - [@TestDirective ]
  69275. + MarkupBlock - [0..15)::15
  69276. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69277. + Marker;[];
  69278. + CSharpCodeBlock - [0..15)::15
  69279. + RazorDirective - [0..15)::15 - Directive:{TestDirective;SingleLine;Unrestricted}
  69280. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69281. + Transition;[@];
  69282. + RazorDirectiveBody - [1..15)::14
  69283. + RazorMetaCode - [1..14)::13 - Gen<None> - SpanEditHandler;Accepts:None
  69284. + Identifier;[TestDirective];
  69285. + CSharpCodeBlock - [14..15)::1
  69286. + CSharpStatementLiteral - [14..15)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  69287. + Whitespace;[ ];
  69288. + CSharpStatementLiteral - [15..15)::0 - [] - Gen<DirectiveToken {;Member;Opt:True}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  69289. + Marker;[];
  69290. + MarkupTextLiteral - [15..15)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69291. + Marker;[];
  69292. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Parse_FunctionsDirective.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Parse_FunctionsDirective.cspans.txt
  69293. similarity index 100%
  69294. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Parse_FunctionsDirective.cspans.txt
  69295. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Parse_FunctionsDirective.cspans.txt
  69296. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Parse_FunctionsDirective.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Parse_FunctionsDirective.stree.txt
  69297. new file mode 100644
  69298. index 00000000000..36812139f3e
  69299. --- /dev/null
  69300. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Parse_FunctionsDirective.stree.txt
  69301. @@ -0,0 +1,33 @@
  69302. +RazorDocument - [0..28)::28 - [@functions { foo(); bar(); }]
  69303. + MarkupBlock - [0..28)::28
  69304. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69305. + Marker;[];
  69306. + CSharpCodeBlock - [0..28)::28
  69307. + RazorDirective - [0..28)::28 - Directive:{functions;CodeBlock;Unrestricted}
  69308. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69309. + Transition;[@];
  69310. + RazorDirectiveBody - [1..28)::27
  69311. + RazorMetaCode - [1..10)::9 - Gen<None> - SpanEditHandler;Accepts:None
  69312. + Identifier;[functions];
  69313. + CSharpCodeBlock - [10..28)::18
  69314. + MarkupTextLiteral - [10..11)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  69315. + Whitespace;[ ];
  69316. + RazorMetaCode - [11..12)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd
  69317. + LeftBrace;[{];
  69318. + CSharpCodeBlock - [12..27)::15
  69319. + CSharpStatementLiteral - [12..27)::15 - [ foo(); bar(); ] - Gen<Stmt> - CodeBlockEditHandler;Accepts:Any;CodeBlock
  69320. + Whitespace;[ ];
  69321. + Identifier;[foo];
  69322. + LeftParenthesis;[(];
  69323. + RightParenthesis;[)];
  69324. + Semicolon;[;];
  69325. + Whitespace;[ ];
  69326. + Identifier;[bar];
  69327. + LeftParenthesis;[(];
  69328. + RightParenthesis;[)];
  69329. + Semicolon;[;];
  69330. + Whitespace;[ ];
  69331. + RazorMetaCode - [27..28)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69332. + RightBrace;[}];
  69333. + MarkupTextLiteral - [28..28)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69334. + Marker;[];
  69335. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Parse_SectionDirective.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Parse_SectionDirective.cspans.txt
  69336. similarity index 100%
  69337. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Parse_SectionDirective.cspans.txt
  69338. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Parse_SectionDirective.cspans.txt
  69339. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Parse_SectionDirective.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Parse_SectionDirective.stree.txt
  69340. new file mode 100644
  69341. index 00000000000..44d06ee3a6f
  69342. --- /dev/null
  69343. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Parse_SectionDirective.stree.txt
  69344. @@ -0,0 +1,46 @@
  69345. +RazorDocument - [0..32)::32 - [@section Header { <p>F{o}o</p> }]
  69346. + MarkupBlock - [0..32)::32
  69347. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69348. + Marker;[];
  69349. + CSharpCodeBlock - [0..32)::32
  69350. + RazorDirective - [0..32)::32 - Directive:{section;RazorBlock;Unrestricted}
  69351. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69352. + Transition;[@];
  69353. + RazorDirectiveBody - [1..32)::31
  69354. + RazorMetaCode - [1..8)::7 - Gen<None> - SpanEditHandler;Accepts:None
  69355. + Identifier;[section];
  69356. + CSharpCodeBlock - [8..32)::24
  69357. + CSharpStatementLiteral - [8..9)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  69358. + Whitespace;[ ];
  69359. + CSharpStatementLiteral - [9..15)::6 - [Header] - Gen<DirectiveToken {SectionName;Member;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  69360. + Identifier;[Header];
  69361. + MarkupTextLiteral - [15..16)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:AllWhitespace
  69362. + Whitespace;[ ];
  69363. + RazorMetaCode - [16..17)::1 - Gen<None> - AutoCompleteEditHandler;Accepts:None,AutoComplete:[<null>];AtEnd
  69364. + LeftBrace;[{];
  69365. + MarkupBlock - [17..31)::14
  69366. + MarkupTextLiteral - [17..18)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69367. + Whitespace;[ ];
  69368. + MarkupTagBlock - [18..21)::3 - [<p>]
  69369. + MarkupTextLiteral - [18..21)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69370. + OpenAngle;[<];
  69371. + Text;[p];
  69372. + CloseAngle;[>];
  69373. + MarkupTextLiteral - [21..26)::5 - [F{o}o] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69374. + Text;[F];
  69375. + Text;[{];
  69376. + Text;[o];
  69377. + Text;[}];
  69378. + Text;[o];
  69379. + MarkupTagBlock - [26..30)::4 - [</p>]
  69380. + MarkupTextLiteral - [26..30)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69381. + OpenAngle;[<];
  69382. + ForwardSlash;[/];
  69383. + Text;[p];
  69384. + CloseAngle;[>];
  69385. + MarkupTextLiteral - [30..31)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69386. + Whitespace;[ ];
  69387. + RazorMetaCode - [31..32)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69388. + RightBrace;[}];
  69389. + MarkupTextLiteral - [32..32)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69390. + Marker;[];
  69391. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Parser_ParsesNamespaceDirectiveToken_WithMultipleSegments.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Parser_ParsesNamespaceDirectiveToken_WithMultipleSegments.cspans.txt
  69392. similarity index 100%
  69393. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Parser_ParsesNamespaceDirectiveToken_WithMultipleSegments.cspans.txt
  69394. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Parser_ParsesNamespaceDirectiveToken_WithMultipleSegments.cspans.txt
  69395. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Parser_ParsesNamespaceDirectiveToken_WithMultipleSegments.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Parser_ParsesNamespaceDirectiveToken_WithMultipleSegments.stree.txt
  69396. new file mode 100644
  69397. index 00000000000..4e03f5befe0
  69398. --- /dev/null
  69399. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Parser_ParsesNamespaceDirectiveToken_WithMultipleSegments.stree.txt
  69400. @@ -0,0 +1,22 @@
  69401. +RazorDocument - [0..29)::29 - [@custom BaseNamespace.Foo.Bar]
  69402. + MarkupBlock - [0..29)::29
  69403. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69404. + Marker;[];
  69405. + CSharpCodeBlock - [0..29)::29
  69406. + RazorDirective - [0..29)::29 - Directive:{custom;SingleLine;Unrestricted}
  69407. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69408. + Transition;[@];
  69409. + RazorDirectiveBody - [1..29)::28
  69410. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  69411. + Identifier;[custom];
  69412. + CSharpCodeBlock - [7..29)::22
  69413. + CSharpStatementLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  69414. + Whitespace;[ ];
  69415. + CSharpStatementLiteral - [8..29)::21 - [BaseNamespace.Foo.Bar] - Gen<DirectiveToken {;Namespace;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  69416. + Identifier;[BaseNamespace];
  69417. + Dot;[.];
  69418. + Identifier;[Foo];
  69419. + Dot;[.];
  69420. + Identifier;[Bar];
  69421. + MarkupTextLiteral - [29..29)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69422. + Marker;[];
  69423. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Parser_ParsesNamespaceDirectiveToken_WithSingleSegment.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Parser_ParsesNamespaceDirectiveToken_WithSingleSegment.cspans.txt
  69424. similarity index 100%
  69425. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/Parser_ParsesNamespaceDirectiveToken_WithSingleSegment.cspans.txt
  69426. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Parser_ParsesNamespaceDirectiveToken_WithSingleSegment.cspans.txt
  69427. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Parser_ParsesNamespaceDirectiveToken_WithSingleSegment.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Parser_ParsesNamespaceDirectiveToken_WithSingleSegment.stree.txt
  69428. new file mode 100644
  69429. index 00000000000..1d64e3ae926
  69430. --- /dev/null
  69431. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/Parser_ParsesNamespaceDirectiveToken_WithSingleSegment.stree.txt
  69432. @@ -0,0 +1,18 @@
  69433. +RazorDocument - [0..21)::21 - [@custom BaseNamespace]
  69434. + MarkupBlock - [0..21)::21
  69435. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69436. + Marker;[];
  69437. + CSharpCodeBlock - [0..21)::21
  69438. + RazorDirective - [0..21)::21 - Directive:{custom;SingleLine;Unrestricted}
  69439. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69440. + Transition;[@];
  69441. + RazorDirectiveBody - [1..21)::20
  69442. + RazorMetaCode - [1..7)::6 - Gen<None> - SpanEditHandler;Accepts:None
  69443. + Identifier;[custom];
  69444. + CSharpCodeBlock - [7..21)::14
  69445. + CSharpStatementLiteral - [7..8)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Whitespace
  69446. + Whitespace;[ ];
  69447. + CSharpStatementLiteral - [8..21)::13 - [BaseNamespace] - Gen<DirectiveToken {;Namespace;Opt:False}> - DirectiveTokenEditHandler;Accepts:NonWhitespace
  69448. + Identifier;[BaseNamespace];
  69449. + MarkupTextLiteral - [21..21)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69450. + Marker;[];
  69451. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_EndQuoteRequiresDoubleQuotesAroundValue.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_EndQuoteRequiresDoubleQuotesAroundValue.cspans.txt
  69452. similarity index 100%
  69453. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_EndQuoteRequiresDoubleQuotesAroundValue.cspans.txt
  69454. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_EndQuoteRequiresDoubleQuotesAroundValue.cspans.txt
  69455. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_EndQuoteRequiresDoubleQuotesAroundValue.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_EndQuoteRequiresDoubleQuotesAroundValue.stree.txt
  69456. new file mode 100644
  69457. index 00000000000..9ea983ad50a
  69458. --- /dev/null
  69459. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_EndQuoteRequiresDoubleQuotesAroundValue.stree.txt
  69460. @@ -0,0 +1,19 @@
  69461. +RazorDocument - [0..21)::21 - [@removeTagHelper Foo"]
  69462. + MarkupBlock - [0..21)::21
  69463. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69464. + Marker;[];
  69465. + CSharpCodeBlock - [0..21)::21
  69466. + RazorDirective - [0..21)::21
  69467. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69468. + Transition;[@];
  69469. + RazorDirectiveBody - [1..21)::20
  69470. + RazorMetaCode - [1..16)::15 - Gen<None> - SpanEditHandler;Accepts:None
  69471. + Identifier;[removeTagHelper];
  69472. + CSharpCodeBlock - [16..21)::5
  69473. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:None
  69474. + Whitespace;[ ];
  69475. + CSharpStatementLiteral - [17..21)::4 - [Foo"] - Gen<RemoveTagHelper:{Foo";Foo";;} [RZ1000(20:0,20 [1] ), RZ1019(17:0,17 [4] ), RZ1036(17:0,17 [4] )]> - SpanEditHandler;Accepts:AnyExceptNewline
  69476. + Identifier;[Foo];
  69477. + StringLiteral;["];RZ1000(20:0,20 [1] )
  69478. + MarkupTextLiteral - [21..21)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69479. + Marker;[];
  69480. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_InvalidLookupText_AddsError.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_InvalidLookupText_AddsError.cspans.txt
  69481. similarity index 100%
  69482. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_InvalidLookupText_AddsError.cspans.txt
  69483. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_InvalidLookupText_AddsError.cspans.txt
  69484. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_InvalidLookupText_AddsError.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_InvalidLookupText_AddsError.stree.txt
  69485. new file mode 100644
  69486. index 00000000000..6ca3c0b4608
  69487. --- /dev/null
  69488. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_InvalidLookupText_AddsError.stree.txt
  69489. @@ -0,0 +1,18 @@
  69490. +RazorDocument - [0..20)::20 - [@removeTagHelper Foo]
  69491. + MarkupBlock - [0..20)::20
  69492. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69493. + Marker;[];
  69494. + CSharpCodeBlock - [0..20)::20
  69495. + RazorDirective - [0..20)::20
  69496. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69497. + Transition;[@];
  69498. + RazorDirectiveBody - [1..20)::19
  69499. + RazorMetaCode - [1..16)::15 - Gen<None> - SpanEditHandler;Accepts:None
  69500. + Identifier;[removeTagHelper];
  69501. + CSharpCodeBlock - [16..20)::4
  69502. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:None
  69503. + Whitespace;[ ];
  69504. + CSharpStatementLiteral - [17..20)::3 - [Foo] - Gen<RemoveTagHelper:{Foo;Foo;;} [RZ1036(17:0,17 [3] )]> - SpanEditHandler;Accepts:AnyExceptNewline
  69505. + Identifier;[Foo];
  69506. + MarkupTextLiteral - [20..20)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69507. + Marker;[];
  69508. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_NoValue_Invalid.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_NoValue_Invalid.cspans.txt
  69509. similarity index 100%
  69510. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_NoValue_Invalid.cspans.txt
  69511. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_NoValue_Invalid.cspans.txt
  69512. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_NoValue_Invalid.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_NoValue_Invalid.stree.txt
  69513. new file mode 100644
  69514. index 00000000000..1fcd5587a59
  69515. --- /dev/null
  69516. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_NoValue_Invalid.stree.txt
  69517. @@ -0,0 +1,18 @@
  69518. +RazorDocument - [0..19)::19 - [@removeTagHelper ""]
  69519. + MarkupBlock - [0..19)::19
  69520. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69521. + Marker;[];
  69522. + CSharpCodeBlock - [0..19)::19
  69523. + RazorDirective - [0..19)::19
  69524. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69525. + Transition;[@];
  69526. + RazorDirectiveBody - [1..19)::18
  69527. + RazorMetaCode - [1..16)::15 - Gen<None> - SpanEditHandler;Accepts:None
  69528. + Identifier;[removeTagHelper];
  69529. + CSharpCodeBlock - [16..19)::3
  69530. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:None
  69531. + Whitespace;[ ];
  69532. + CSharpStatementLiteral - [17..19)::2 - [""] - Gen<RemoveTagHelper:{"";;;} [RZ1036(18:0,18 [1] )]> - SpanEditHandler;Accepts:AnyExceptNewline
  69533. + StringLiteral;[""];
  69534. + MarkupTextLiteral - [19..19)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69535. + Marker;[];
  69536. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_RequiresValue.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_RequiresValue.cspans.txt
  69537. similarity index 100%
  69538. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_RequiresValue.cspans.txt
  69539. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_RequiresValue.cspans.txt
  69540. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_RequiresValue.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_RequiresValue.stree.txt
  69541. new file mode 100644
  69542. index 00000000000..20a0666a001
  69543. --- /dev/null
  69544. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_RequiresValue.stree.txt
  69545. @@ -0,0 +1,18 @@
  69546. +RazorDocument - [0..17)::17 - [@removeTagHelper ]
  69547. + MarkupBlock - [0..17)::17
  69548. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69549. + Marker;[];
  69550. + CSharpCodeBlock - [0..17)::17
  69551. + RazorDirective - [0..17)::17
  69552. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69553. + Transition;[@];
  69554. + RazorDirectiveBody - [1..17)::16
  69555. + RazorMetaCode - [1..16)::15 - Gen<None> - SpanEditHandler;Accepts:None
  69556. + Identifier;[removeTagHelper];
  69557. + CSharpCodeBlock - [16..17)::1
  69558. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:None
  69559. + Whitespace;[ ];
  69560. + CSharpStatementLiteral - [17..17)::0 - [] - Gen<RemoveTagHelper:{;;;} [RZ1018(1:0,1 [16] ), RZ1036(17:0,17 [1] )]> - SpanEditHandler;Accepts:AnyExceptNewline
  69561. + Marker;[];
  69562. + MarkupTextLiteral - [17..17)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69563. + Marker;[];
  69564. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_SingleQuotes_AddsError.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_SingleQuotes_AddsError.cspans.txt
  69565. similarity index 100%
  69566. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_SingleQuotes_AddsError.cspans.txt
  69567. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_SingleQuotes_AddsError.cspans.txt
  69568. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_SingleQuotes_AddsError.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_SingleQuotes_AddsError.stree.txt
  69569. new file mode 100644
  69570. index 00000000000..7584b6d08b0
  69571. --- /dev/null
  69572. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_SingleQuotes_AddsError.stree.txt
  69573. @@ -0,0 +1,18 @@
  69574. +RazorDocument - [0..25)::25 - [@removeTagHelper '*, Foo']
  69575. + MarkupBlock - [0..25)::25
  69576. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69577. + Marker;[];
  69578. + CSharpCodeBlock - [0..25)::25
  69579. + RazorDirective - [0..25)::25
  69580. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69581. + Transition;[@];
  69582. + RazorDirectiveBody - [1..25)::24
  69583. + RazorMetaCode - [1..16)::15 - Gen<None> - SpanEditHandler;Accepts:None
  69584. + Identifier;[removeTagHelper];
  69585. + CSharpCodeBlock - [16..25)::9
  69586. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:None
  69587. + Whitespace;[ ];
  69588. + CSharpStatementLiteral - [17..25)::8 - ['*, Foo'] - Gen<RemoveTagHelper:{'*, Foo';'*, Foo';;} [RZ1036(17:0,17 [8] )]> - SpanEditHandler;Accepts:AnyExceptNewline
  69589. + CharacterLiteral;['*, Foo'];
  69590. + MarkupTextLiteral - [25..25)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69591. + Marker;[];
  69592. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_StartQuoteRequiresDoubleQuotesAroundValue.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_StartQuoteRequiresDoubleQuotesAroundValue.cspans.txt
  69593. similarity index 100%
  69594. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_StartQuoteRequiresDoubleQuotesAroundValue.cspans.txt
  69595. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_StartQuoteRequiresDoubleQuotesAroundValue.cspans.txt
  69596. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_StartQuoteRequiresDoubleQuotesAroundValue.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_StartQuoteRequiresDoubleQuotesAroundValue.stree.txt
  69597. new file mode 100644
  69598. index 00000000000..41c54a8e5b8
  69599. --- /dev/null
  69600. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_StartQuoteRequiresDoubleQuotesAroundValue.stree.txt
  69601. @@ -0,0 +1,18 @@
  69602. +RazorDocument - [0..21)::21 - [@removeTagHelper "Foo]
  69603. + MarkupBlock - [0..21)::21
  69604. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69605. + Marker;[];
  69606. + CSharpCodeBlock - [0..21)::21
  69607. + RazorDirective - [0..21)::21
  69608. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69609. + Transition;[@];
  69610. + RazorDirectiveBody - [1..21)::20
  69611. + RazorMetaCode - [1..16)::15 - Gen<None> - SpanEditHandler;Accepts:None
  69612. + Identifier;[removeTagHelper];
  69613. + CSharpCodeBlock - [16..21)::5
  69614. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:None
  69615. + Whitespace;[ ];
  69616. + CSharpStatementLiteral - [17..21)::4 - ["Foo] - Gen<RemoveTagHelper:{"Foo;"Foo;;} [RZ1000(17:0,17 [1] ), RZ1019(17:0,17 [4] ), RZ1036(17:0,17 [4] )]> - SpanEditHandler;Accepts:AnyExceptNewline
  69617. + StringLiteral;["Foo];RZ1000(17:0,17 [1] )
  69618. + MarkupTextLiteral - [21..21)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69619. + Marker;[];
  69620. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_SupportsSpaces.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_SupportsSpaces.cspans.txt
  69621. similarity index 100%
  69622. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_SupportsSpaces.cspans.txt
  69623. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_SupportsSpaces.cspans.txt
  69624. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_SupportsSpaces.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_SupportsSpaces.stree.txt
  69625. new file mode 100644
  69626. index 00000000000..e3062d1894e
  69627. --- /dev/null
  69628. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_SupportsSpaces.stree.txt
  69629. @@ -0,0 +1,22 @@
  69630. +RazorDocument - [0..35)::35 - [@removeTagHelper Foo, Bar ]
  69631. + MarkupBlock - [0..35)::35
  69632. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69633. + Marker;[];
  69634. + CSharpCodeBlock - [0..35)::35
  69635. + RazorDirective - [0..35)::35
  69636. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69637. + Transition;[@];
  69638. + RazorDirectiveBody - [1..35)::34
  69639. + RazorMetaCode - [1..16)::15 - Gen<None> - SpanEditHandler;Accepts:None
  69640. + Identifier;[removeTagHelper];
  69641. + CSharpCodeBlock - [16..35)::19
  69642. + MarkupTextLiteral - [16..21)::5 - [ ] - Gen<None> - SpanEditHandler;Accepts:None
  69643. + Whitespace;[ ];
  69644. + CSharpStatementLiteral - [21..35)::14 - [Foo, Bar ] - Gen<RemoveTagHelper:{Foo, Bar;Foo, Bar;Foo;Bar}> - SpanEditHandler;Accepts:AnyExceptNewline
  69645. + Identifier;[Foo];
  69646. + Comma;[,];
  69647. + Whitespace;[ ];
  69648. + Identifier;[Bar];
  69649. + Whitespace;[ ];
  69650. + MarkupTextLiteral - [35..35)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69651. + Marker;[];
  69652. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_WithQuotes_InvalidLookupText_AddsError.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_WithQuotes_InvalidLookupText_AddsError.cspans.txt
  69653. similarity index 100%
  69654. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/RemoveTagHelperDirective_WithQuotes_InvalidLookupText_AddsError.cspans.txt
  69655. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_WithQuotes_InvalidLookupText_AddsError.cspans.txt
  69656. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_WithQuotes_InvalidLookupText_AddsError.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_WithQuotes_InvalidLookupText_AddsError.stree.txt
  69657. new file mode 100644
  69658. index 00000000000..92659f07696
  69659. --- /dev/null
  69660. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/RemoveTagHelperDirective_WithQuotes_InvalidLookupText_AddsError.stree.txt
  69661. @@ -0,0 +1,18 @@
  69662. +RazorDocument - [0..22)::22 - [@removeTagHelper "Foo"]
  69663. + MarkupBlock - [0..22)::22
  69664. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69665. + Marker;[];
  69666. + CSharpCodeBlock - [0..22)::22
  69667. + RazorDirective - [0..22)::22
  69668. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69669. + Transition;[@];
  69670. + RazorDirectiveBody - [1..22)::21
  69671. + RazorMetaCode - [1..16)::15 - Gen<None> - SpanEditHandler;Accepts:None
  69672. + Identifier;[removeTagHelper];
  69673. + CSharpCodeBlock - [16..22)::6
  69674. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:None
  69675. + Whitespace;[ ];
  69676. + CSharpStatementLiteral - [17..22)::5 - ["Foo"] - Gen<RemoveTagHelper:{"Foo";Foo;;} [RZ1036(18:0,18 [3] )]> - SpanEditHandler;Accepts:AnyExceptNewline
  69677. + StringLiteral;["Foo"];
  69678. + MarkupTextLiteral - [22..22)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69679. + Marker;[];
  69680. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_EndQuoteRequiresDoubleQuotesAroundValue.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_EndQuoteRequiresDoubleQuotesAroundValue.cspans.txt
  69681. similarity index 100%
  69682. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_EndQuoteRequiresDoubleQuotesAroundValue.cspans.txt
  69683. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_EndQuoteRequiresDoubleQuotesAroundValue.cspans.txt
  69684. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_EndQuoteRequiresDoubleQuotesAroundValue.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_EndQuoteRequiresDoubleQuotesAroundValue.stree.txt
  69685. new file mode 100644
  69686. index 00000000000..757c8c81f03
  69687. --- /dev/null
  69688. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_EndQuoteRequiresDoubleQuotesAroundValue.stree.txt
  69689. @@ -0,0 +1,20 @@
  69690. +RazorDocument - [0..24)::24 - [@tagHelperPrefix Foo "]
  69691. + MarkupBlock - [0..24)::24
  69692. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69693. + Marker;[];
  69694. + CSharpCodeBlock - [0..24)::24
  69695. + RazorDirective - [0..24)::24
  69696. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69697. + Transition;[@];
  69698. + RazorDirectiveBody - [1..24)::23
  69699. + RazorMetaCode - [1..16)::15 - Gen<None> - SpanEditHandler;Accepts:None
  69700. + Identifier;[tagHelperPrefix];
  69701. + CSharpCodeBlock - [16..24)::8
  69702. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:None
  69703. + Whitespace;[ ];
  69704. + CSharpStatementLiteral - [17..24)::7 - [Foo "] - Gen<TagHelperPrefix:{Foo ";Foo "} [RZ1000(23:0,23 [1] ), RZ1019(17:0,17 [7] ), RZ1020(17:0,17 [7] )]> - SpanEditHandler;Accepts:AnyExceptNewline
  69705. + Identifier;[Foo];
  69706. + Whitespace;[ ];
  69707. + StringLiteral;["];RZ1000(23:0,23 [1] )
  69708. + MarkupTextLiteral - [24..24)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69709. + Marker;[];
  69710. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_NoValueSucceeds.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_NoValueSucceeds.cspans.txt
  69711. similarity index 100%
  69712. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_NoValueSucceeds.cspans.txt
  69713. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_NoValueSucceeds.cspans.txt
  69714. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_NoValueSucceeds.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_NoValueSucceeds.stree.txt
  69715. new file mode 100644
  69716. index 00000000000..ee06179c7f7
  69717. --- /dev/null
  69718. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_NoValueSucceeds.stree.txt
  69719. @@ -0,0 +1,18 @@
  69720. +RazorDocument - [0..19)::19 - [@tagHelperPrefix ""]
  69721. + MarkupBlock - [0..19)::19
  69722. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69723. + Marker;[];
  69724. + CSharpCodeBlock - [0..19)::19
  69725. + RazorDirective - [0..19)::19
  69726. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69727. + Transition;[@];
  69728. + RazorDirectiveBody - [1..19)::18
  69729. + RazorMetaCode - [1..16)::15 - Gen<None> - SpanEditHandler;Accepts:None
  69730. + Identifier;[tagHelperPrefix];
  69731. + CSharpCodeBlock - [16..19)::3
  69732. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:None
  69733. + Whitespace;[ ];
  69734. + CSharpStatementLiteral - [17..19)::2 - [""] - Gen<TagHelperPrefix:{"";}> - SpanEditHandler;Accepts:AnyExceptNewline
  69735. + StringLiteral;[""];
  69736. + MarkupTextLiteral - [19..19)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69737. + Marker;[];
  69738. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_RequiresValue.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_RequiresValue.cspans.txt
  69739. similarity index 100%
  69740. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_RequiresValue.cspans.txt
  69741. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_RequiresValue.cspans.txt
  69742. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_RequiresValue.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_RequiresValue.stree.txt
  69743. new file mode 100644
  69744. index 00000000000..0e86bb2dc2c
  69745. --- /dev/null
  69746. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_RequiresValue.stree.txt
  69747. @@ -0,0 +1,18 @@
  69748. +RazorDocument - [0..17)::17 - [@tagHelperPrefix ]
  69749. + MarkupBlock - [0..17)::17
  69750. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69751. + Marker;[];
  69752. + CSharpCodeBlock - [0..17)::17
  69753. + RazorDirective - [0..17)::17
  69754. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69755. + Transition;[@];
  69756. + RazorDirectiveBody - [1..17)::16
  69757. + RazorMetaCode - [1..16)::15 - Gen<None> - SpanEditHandler;Accepts:None
  69758. + Identifier;[tagHelperPrefix];
  69759. + CSharpCodeBlock - [16..17)::1
  69760. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:None
  69761. + Whitespace;[ ];
  69762. + CSharpStatementLiteral - [17..17)::0 - [] - Gen<TagHelperPrefix:{;} [RZ1018(1:0,1 [16] )]> - SpanEditHandler;Accepts:AnyExceptNewline
  69763. + Marker;[];
  69764. + MarkupTextLiteral - [17..17)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69765. + Marker;[];
  69766. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_StartQuoteRequiresDoubleQuotesAroundValue.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_StartQuoteRequiresDoubleQuotesAroundValue.cspans.txt
  69767. similarity index 100%
  69768. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_StartQuoteRequiresDoubleQuotesAroundValue.cspans.txt
  69769. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_StartQuoteRequiresDoubleQuotesAroundValue.cspans.txt
  69770. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_StartQuoteRequiresDoubleQuotesAroundValue.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_StartQuoteRequiresDoubleQuotesAroundValue.stree.txt
  69771. new file mode 100644
  69772. index 00000000000..3e26d675c8b
  69773. --- /dev/null
  69774. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_StartQuoteRequiresDoubleQuotesAroundValue.stree.txt
  69775. @@ -0,0 +1,18 @@
  69776. +RazorDocument - [0..21)::21 - [@tagHelperPrefix "Foo]
  69777. + MarkupBlock - [0..21)::21
  69778. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69779. + Marker;[];
  69780. + CSharpCodeBlock - [0..21)::21
  69781. + RazorDirective - [0..21)::21
  69782. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69783. + Transition;[@];
  69784. + RazorDirectiveBody - [1..21)::20
  69785. + RazorMetaCode - [1..16)::15 - Gen<None> - SpanEditHandler;Accepts:None
  69786. + Identifier;[tagHelperPrefix];
  69787. + CSharpCodeBlock - [16..21)::5
  69788. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:None
  69789. + Whitespace;[ ];
  69790. + CSharpStatementLiteral - [17..21)::4 - ["Foo] - Gen<TagHelperPrefix:{"Foo;"Foo} [RZ1000(17:0,17 [1] ), RZ1019(17:0,17 [4] ), RZ1020(17:0,17 [4] )]> - SpanEditHandler;Accepts:AnyExceptNewline
  69791. + StringLiteral;["Foo];RZ1000(17:0,17 [1] )
  69792. + MarkupTextLiteral - [21..21)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69793. + Marker;[];
  69794. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_Succeeds.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_Succeeds.cspans.txt
  69795. similarity index 100%
  69796. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_Succeeds.cspans.txt
  69797. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_Succeeds.cspans.txt
  69798. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_Succeeds.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_Succeeds.stree.txt
  69799. new file mode 100644
  69800. index 00000000000..8b875e28514
  69801. --- /dev/null
  69802. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_Succeeds.stree.txt
  69803. @@ -0,0 +1,18 @@
  69804. +RazorDocument - [0..20)::20 - [@tagHelperPrefix Foo]
  69805. + MarkupBlock - [0..20)::20
  69806. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69807. + Marker;[];
  69808. + CSharpCodeBlock - [0..20)::20
  69809. + RazorDirective - [0..20)::20
  69810. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69811. + Transition;[@];
  69812. + RazorDirectiveBody - [1..20)::19
  69813. + RazorMetaCode - [1..16)::15 - Gen<None> - SpanEditHandler;Accepts:None
  69814. + Identifier;[tagHelperPrefix];
  69815. + CSharpCodeBlock - [16..20)::4
  69816. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:None
  69817. + Whitespace;[ ];
  69818. + CSharpStatementLiteral - [17..20)::3 - [Foo] - Gen<TagHelperPrefix:{Foo;Foo}> - SpanEditHandler;Accepts:AnyExceptNewline
  69819. + Identifier;[Foo];
  69820. + MarkupTextLiteral - [20..20)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69821. + Marker;[];
  69822. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_WithQuotes_Succeeds.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_WithQuotes_Succeeds.cspans.txt
  69823. similarity index 100%
  69824. rename from test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpDirectivesTest/TagHelperPrefixDirective_WithQuotes_Succeeds.cspans.txt
  69825. rename to test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_WithQuotes_Succeeds.cspans.txt
  69826. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_WithQuotes_Succeeds.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_WithQuotes_Succeeds.stree.txt
  69827. new file mode 100644
  69828. index 00000000000..1bbaa5ea099
  69829. --- /dev/null
  69830. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/RazorDirectivesTest/TagHelperPrefixDirective_WithQuotes_Succeeds.stree.txt
  69831. @@ -0,0 +1,18 @@
  69832. +RazorDocument - [0..22)::22 - [@tagHelperPrefix "Foo"]
  69833. + MarkupBlock - [0..22)::22
  69834. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69835. + Marker;[];
  69836. + CSharpCodeBlock - [0..22)::22
  69837. + RazorDirective - [0..22)::22
  69838. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  69839. + Transition;[@];
  69840. + RazorDirectiveBody - [1..22)::21
  69841. + RazorMetaCode - [1..16)::15 - Gen<None> - SpanEditHandler;Accepts:None
  69842. + Identifier;[tagHelperPrefix];
  69843. + CSharpCodeBlock - [16..22)::6
  69844. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:None
  69845. + Whitespace;[ ];
  69846. + CSharpStatementLiteral - [17..22)::5 - ["Foo"] - Gen<TagHelperPrefix:{"Foo";Foo}> - SpanEditHandler;Accepts:AnyExceptNewline
  69847. + StringLiteral;["Foo"];
  69848. + MarkupTextLiteral - [22..22)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69849. + Marker;[];
  69850. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures1.stree.txt
  69851. index 4dbeb051ae8..b808d1118a8 100644
  69852. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures1.stree.txt
  69853. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures1.stree.txt
  69854. @@ -1,3 +1,14 @@
  69855. -Markup block - Gen<None> - 15 - (0:0,0)
  69856. - Tag block - Gen<TagHelper> - 15 - (0:0,0) - input - InputTagHelper1 - InputTagHelper2
  69857. - StartTagAndEndTag - <input> ... </input>
  69858. +RazorDocument - [0..15)::15 - [<input></input>]
  69859. + MarkupBlock - [0..15)::15
  69860. + MarkupTagHelperElement - [0..15)::15 - input[StartTagAndEndTag] - InputTagHelper1 - InputTagHelper2
  69861. + MarkupTagHelperStartTag - [0..7)::7
  69862. + MarkupTextLiteral - [0..7)::7 - [<input>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69863. + OpenAngle;[<];
  69864. + Text;[input];
  69865. + CloseAngle;[>];
  69866. + MarkupTagHelperEndTag - [7..15)::8
  69867. + MarkupTextLiteral - [7..15)::8 - [</input>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69868. + OpenAngle;[<];
  69869. + ForwardSlash;[/];
  69870. + Text;[input];
  69871. + CloseAngle;[>];
  69872. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures2.stree.txt
  69873. index b44a4b21d31..db3dcb1403d 100644
  69874. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures2.stree.txt
  69875. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures2.stree.txt
  69876. @@ -1,3 +1,10 @@
  69877. -Markup block - Gen<None> - 9 - (0:0,0)
  69878. - Tag block - Gen<TagHelper> - 9 - (0:0,0) - input - InputTagHelper1 - InputTagHelper2
  69879. - SelfClosing - <input />
  69880. +RazorDocument - [0..9)::9 - [<input />]
  69881. + MarkupBlock - [0..9)::9
  69882. + MarkupTagHelperElement - [0..9)::9 - input[SelfClosing] - InputTagHelper1 - InputTagHelper2
  69883. + MarkupTagHelperStartTag - [0..9)::9
  69884. + MarkupTextLiteral - [0..9)::9 - [<input />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69885. + OpenAngle;[<];
  69886. + Text;[input];
  69887. + Whitespace;[ ];
  69888. + ForwardSlash;[/];
  69889. + CloseAngle;[>];
  69890. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures3.stree.txt
  69891. index 2102dbe697c..5ff3c5be231 100644
  69892. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures3.stree.txt
  69893. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures3.stree.txt
  69894. @@ -1,6 +1,23 @@
  69895. -Markup block - Gen<None> - 19 - (0:0,0)
  69896. - Tag block - Gen<TagHelper> - 19 - (0:0,0) - input - InputTagHelper1 - InputTagHelper2
  69897. - StartTagOnly - <input type='text'>
  69898. - type - SingleQuotes
  69899. - Markup span - Gen<Markup> - [text] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:1
  69900. - SyntaxKind.Text;[text];
  69901. +RazorDocument - [0..19)::19 - [<input type='text'>]
  69902. + MarkupBlock - [0..19)::19
  69903. + MarkupTagHelperElement - [0..19)::19 - input[StartTagOnly] - InputTagHelper1 - InputTagHelper2
  69904. + MarkupTagHelperStartTag - [0..19)::19
  69905. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69906. + OpenAngle;[<];
  69907. + Text;[input];
  69908. + MarkupTagHelperAttribute - [6..18)::12 - type - SingleQuotes - Unbound - [ type='text']
  69909. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69910. + Whitespace;[ ];
  69911. + MarkupTextLiteral - [7..11)::4 - [type] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69912. + Text;[type];
  69913. + Equals;[=];
  69914. + MarkupTextLiteral - [12..13)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  69915. + SingleQuote;['];
  69916. + MarkupTagHelperAttributeValue - [13..17)::4
  69917. + MarkupLiteralAttributeValue - [13..17)::4 - [text]
  69918. + MarkupTextLiteral - [13..17)::4 - [text] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69919. + Text;[text];
  69920. + MarkupTextLiteral - [17..18)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  69921. + SingleQuote;['];
  69922. + MarkupTextLiteral - [18..19)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69923. + CloseAngle;[>];
  69924. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures4.stree.txt
  69925. index ebca51245cb..f1523da71ea 100644
  69926. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures4.stree.txt
  69927. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures4.stree.txt
  69928. @@ -1,5 +1,14 @@
  69929. -Markup block - Gen<None> - 14 - (0:0,0)
  69930. - Tag block - Gen<TagHelper> - 7 - (0:0,0) - input - InputTagHelper1 - InputTagHelper2
  69931. - StartTagOnly - <input>
  69932. - Tag block - Gen<TagHelper> - 7 - (7:0,7) - input - InputTagHelper1 - InputTagHelper2
  69933. - StartTagOnly - <input>
  69934. +RazorDocument - [0..14)::14 - [<input><input>]
  69935. + MarkupBlock - [0..14)::14
  69936. + MarkupTagHelperElement - [0..7)::7 - input[StartTagOnly] - InputTagHelper1 - InputTagHelper2
  69937. + MarkupTagHelperStartTag - [0..7)::7
  69938. + MarkupTextLiteral - [0..7)::7 - [<input>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69939. + OpenAngle;[<];
  69940. + Text;[input];
  69941. + CloseAngle;[>];
  69942. + MarkupTagHelperElement - [7..14)::7 - input[StartTagOnly] - InputTagHelper1 - InputTagHelper2
  69943. + MarkupTagHelperStartTag - [7..14)::7
  69944. + MarkupTextLiteral - [7..14)::7 - [<input>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69945. + OpenAngle;[<];
  69946. + Text;[input];
  69947. + CloseAngle;[>];
  69948. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures5.stree.txt
  69949. index 98ba558c6e6..01d07394e96 100644
  69950. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures5.stree.txt
  69951. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures5.stree.txt
  69952. @@ -1,6 +1,29 @@
  69953. -Markup block - Gen<None> - 27 - (0:0,0)
  69954. - Tag block - Gen<TagHelper> - 27 - (0:0,0) - input - InputTagHelper1 - InputTagHelper2
  69955. - StartTagAndEndTag - <input type='text'> ... </input>
  69956. - type - SingleQuotes
  69957. - Markup span - Gen<Markup> - [text] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:1
  69958. - SyntaxKind.Text;[text];
  69959. +RazorDocument - [0..27)::27 - [<input type='text'></input>]
  69960. + MarkupBlock - [0..27)::27
  69961. + MarkupTagHelperElement - [0..27)::27 - input[StartTagAndEndTag] - InputTagHelper1 - InputTagHelper2
  69962. + MarkupTagHelperStartTag - [0..19)::19
  69963. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69964. + OpenAngle;[<];
  69965. + Text;[input];
  69966. + MarkupTagHelperAttribute - [6..18)::12 - type - SingleQuotes - Unbound - [ type='text']
  69967. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69968. + Whitespace;[ ];
  69969. + MarkupTextLiteral - [7..11)::4 - [type] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69970. + Text;[type];
  69971. + Equals;[=];
  69972. + MarkupTextLiteral - [12..13)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  69973. + SingleQuote;['];
  69974. + MarkupTagHelperAttributeValue - [13..17)::4
  69975. + MarkupLiteralAttributeValue - [13..17)::4 - [text]
  69976. + MarkupTextLiteral - [13..17)::4 - [text] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69977. + Text;[text];
  69978. + MarkupTextLiteral - [17..18)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  69979. + SingleQuote;['];
  69980. + MarkupTextLiteral - [18..19)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69981. + CloseAngle;[>];
  69982. + MarkupTagHelperEndTag - [19..27)::8
  69983. + MarkupTextLiteral - [19..27)::8 - [</input>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  69984. + OpenAngle;[<];
  69985. + ForwardSlash;[/];
  69986. + Text;[input];
  69987. + CloseAngle;[>];
  69988. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures6.stree.txt
  69989. index b44a4b21d31..db3dcb1403d 100644
  69990. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures6.stree.txt
  69991. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures6.stree.txt
  69992. @@ -1,3 +1,10 @@
  69993. -Markup block - Gen<None> - 9 - (0:0,0)
  69994. - Tag block - Gen<TagHelper> - 9 - (0:0,0) - input - InputTagHelper1 - InputTagHelper2
  69995. - SelfClosing - <input />
  69996. +RazorDocument - [0..9)::9 - [<input />]
  69997. + MarkupBlock - [0..9)::9
  69998. + MarkupTagHelperElement - [0..9)::9 - input[SelfClosing] - InputTagHelper1 - InputTagHelper2
  69999. + MarkupTagHelperStartTag - [0..9)::9
  70000. + MarkupTextLiteral - [0..9)::9 - [<input />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70001. + OpenAngle;[<];
  70002. + Text;[input];
  70003. + Whitespace;[ ];
  70004. + ForwardSlash;[/];
  70005. + CloseAngle;[>];
  70006. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures7.stree.txt
  70007. index b44a4b21d31..db3dcb1403d 100644
  70008. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures7.stree.txt
  70009. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/AllowsCompatibleTagStructures7.stree.txt
  70010. @@ -1,3 +1,10 @@
  70011. -Markup block - Gen<None> - 9 - (0:0,0)
  70012. - Tag block - Gen<TagHelper> - 9 - (0:0,0) - input - InputTagHelper1 - InputTagHelper2
  70013. - SelfClosing - <input />
  70014. +RazorDocument - [0..9)::9 - [<input />]
  70015. + MarkupBlock - [0..9)::9
  70016. + MarkupTagHelperElement - [0..9)::9 - input[SelfClosing] - InputTagHelper1 - InputTagHelper2
  70017. + MarkupTagHelperStartTag - [0..9)::9
  70018. + MarkupTextLiteral - [0..9)::9 - [<input />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70019. + OpenAngle;[<];
  70020. + Text;[input];
  70021. + Whitespace;[ ];
  70022. + ForwardSlash;[/];
  70023. + CloseAngle;[>];
  70024. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes1.diag.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes1.diag.txt
  70025. new file mode 100644
  70026. index 00000000000..7854af144b8
  70027. --- /dev/null
  70028. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes1.diag.txt
  70029. @@ -0,0 +1,5 @@
  70030. +(0,0): Error RZ3003: Invalid tag helper bound property '[item]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[item]' because the name contains a '[' character.
  70031. +(0,0): Error RZ3003: Invalid tag helper bound property '[item]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[item]' because the name contains a ']' character.
  70032. +(0,0): Error RZ3003: Invalid tag helper bound property '[(item)]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[(item)]' because the name contains a '[' character.
  70033. +(0,0): Error RZ3003: Invalid tag helper bound property '[(item)]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[(item)]' because the name contains a ']' character.
  70034. +(0,0): Error RZ3003: Invalid tag helper bound property '*something' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '*something' because the name contains a '*' character.
  70035. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes1.stree.txt
  70036. index ad29f8c58ce..a7cce27970a 100644
  70037. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes1.stree.txt
  70038. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes1.stree.txt
  70039. @@ -1,7 +1,35 @@
  70040. -Markup block - Gen<None> - 30 - (0:0,0)
  70041. - Tag block - Gen<TagHelper> - 30 - (0:0,0) - ul - CatchAllTagHelper
  70042. - StartTagAndEndTag - <ul bound [item]='items'> ... </ul>
  70043. - bound - Minimized
  70044. - [item] - SingleQuotes
  70045. - Code span - Gen<Expr> - [items] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (18:0,18) - Tokens:1
  70046. - SyntaxKind.Text;[items];
  70047. +RazorDocument - [0..30)::30 - [<ul bound [item]='items'></ul>]
  70048. + MarkupBlock - [0..30)::30
  70049. + MarkupTagHelperElement - [0..30)::30 - ul[StartTagAndEndTag] - CatchAllTagHelper
  70050. + MarkupTagHelperStartTag - [0..25)::25
  70051. + MarkupTextLiteral - [0..3)::3 - [<ul] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70052. + OpenAngle;[<];
  70053. + Text;[ul];
  70054. + MarkupMinimizedTagHelperAttribute - [3..9)::6 - bound - Minimized - Unbound - [ bound]
  70055. + MarkupTextLiteral - [3..4)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70056. + Whitespace;[ ];
  70057. + MarkupTextLiteral - [4..9)::5 - [bound] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70058. + Text;[bound];
  70059. + MarkupTagHelperAttribute - [9..24)::15 - [item] - SingleQuotes - Bound - [ [item]='items']
  70060. + MarkupTextLiteral - [9..10)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70061. + Whitespace;[ ];
  70062. + MarkupTextLiteral - [10..16)::6 - [[item]] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70063. + LeftBracket;[[];
  70064. + Text;[item];
  70065. + RightBracket;[]];
  70066. + Equals;[=];
  70067. + MarkupTextLiteral - [17..18)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70068. + SingleQuote;['];
  70069. + MarkupTagHelperAttributeValue - [18..23)::5
  70070. + CSharpExpressionLiteral - [18..23)::5 - [items] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  70071. + Text;[items];
  70072. + MarkupTextLiteral - [23..24)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70073. + SingleQuote;['];
  70074. + MarkupTextLiteral - [24..25)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70075. + CloseAngle;[>];
  70076. + MarkupTagHelperEndTag - [25..30)::5
  70077. + MarkupTextLiteral - [25..30)::5 - [</ul>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70078. + OpenAngle;[<];
  70079. + ForwardSlash;[/];
  70080. + Text;[ul];
  70081. + CloseAngle;[>];
  70082. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes2.diag.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes2.diag.txt
  70083. new file mode 100644
  70084. index 00000000000..7854af144b8
  70085. --- /dev/null
  70086. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes2.diag.txt
  70087. @@ -0,0 +1,5 @@
  70088. +(0,0): Error RZ3003: Invalid tag helper bound property '[item]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[item]' because the name contains a '[' character.
  70089. +(0,0): Error RZ3003: Invalid tag helper bound property '[item]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[item]' because the name contains a ']' character.
  70090. +(0,0): Error RZ3003: Invalid tag helper bound property '[(item)]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[(item)]' because the name contains a '[' character.
  70091. +(0,0): Error RZ3003: Invalid tag helper bound property '[(item)]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[(item)]' because the name contains a ']' character.
  70092. +(0,0): Error RZ3003: Invalid tag helper bound property '*something' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '*something' because the name contains a '*' character.
  70093. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes2.stree.txt
  70094. index 904af28c59d..d05b1ec9b13 100644
  70095. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes2.stree.txt
  70096. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes2.stree.txt
  70097. @@ -1,7 +1,35 @@
  70098. -Markup block - Gen<None> - 32 - (0:0,0)
  70099. - Tag block - Gen<TagHelper> - 32 - (0:0,0) - ul - CatchAllTagHelper
  70100. - StartTagAndEndTag - <ul bound [(item)]='items'> ... </ul>
  70101. - bound - Minimized
  70102. - [(item)] - SingleQuotes
  70103. - Code span - Gen<Expr> - [items] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (20:0,20) - Tokens:1
  70104. - SyntaxKind.Text;[items];
  70105. +RazorDocument - [0..32)::32 - [<ul bound [(item)]='items'></ul>]
  70106. + MarkupBlock - [0..32)::32
  70107. + MarkupTagHelperElement - [0..32)::32 - ul[StartTagAndEndTag] - CatchAllTagHelper
  70108. + MarkupTagHelperStartTag - [0..27)::27
  70109. + MarkupTextLiteral - [0..3)::3 - [<ul] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70110. + OpenAngle;[<];
  70111. + Text;[ul];
  70112. + MarkupMinimizedTagHelperAttribute - [3..9)::6 - bound - Minimized - Unbound - [ bound]
  70113. + MarkupTextLiteral - [3..4)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70114. + Whitespace;[ ];
  70115. + MarkupTextLiteral - [4..9)::5 - [bound] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70116. + Text;[bound];
  70117. + MarkupTagHelperAttribute - [9..26)::17 - [(item)] - SingleQuotes - Bound - [ [(item)]='items']
  70118. + MarkupTextLiteral - [9..10)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70119. + Whitespace;[ ];
  70120. + MarkupTextLiteral - [10..18)::8 - [[(item)]] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70121. + LeftBracket;[[];
  70122. + Text;[(item)];
  70123. + RightBracket;[]];
  70124. + Equals;[=];
  70125. + MarkupTextLiteral - [19..20)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70126. + SingleQuote;['];
  70127. + MarkupTagHelperAttributeValue - [20..25)::5
  70128. + CSharpExpressionLiteral - [20..25)::5 - [items] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  70129. + Text;[items];
  70130. + MarkupTextLiteral - [25..26)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70131. + SingleQuote;['];
  70132. + MarkupTextLiteral - [26..27)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70133. + CloseAngle;[>];
  70134. + MarkupTagHelperEndTag - [27..32)::5
  70135. + MarkupTextLiteral - [27..32)::5 - [</ul>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70136. + OpenAngle;[<];
  70137. + ForwardSlash;[/];
  70138. + Text;[ul];
  70139. + CloseAngle;[>];
  70140. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes3.diag.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes3.diag.txt
  70141. new file mode 100644
  70142. index 00000000000..7854af144b8
  70143. --- /dev/null
  70144. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes3.diag.txt
  70145. @@ -0,0 +1,5 @@
  70146. +(0,0): Error RZ3003: Invalid tag helper bound property '[item]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[item]' because the name contains a '[' character.
  70147. +(0,0): Error RZ3003: Invalid tag helper bound property '[item]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[item]' because the name contains a ']' character.
  70148. +(0,0): Error RZ3003: Invalid tag helper bound property '[(item)]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[(item)]' because the name contains a '[' character.
  70149. +(0,0): Error RZ3003: Invalid tag helper bound property '[(item)]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[(item)]' because the name contains a ']' character.
  70150. +(0,0): Error RZ3003: Invalid tag helper bound property '*something' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '*something' because the name contains a '*' character.
  70151. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes3.stree.txt
  70152. index ab79e046b15..a039e44dfa4 100644
  70153. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes3.stree.txt
  70154. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes3.stree.txt
  70155. @@ -1,12 +1,37 @@
  70156. -Markup block - Gen<None> - 55 - (0:0,0)
  70157. - Tag block - Gen<TagHelper> - 55 - (0:0,0) - button - CatchAllTagHelper
  70158. - StartTagAndEndTag - <button bound (click)='doSomething()'> ... </button>
  70159. - bound - Minimized
  70160. - (click) - SingleQuotes
  70161. - Code span - Gen<Expr> - [doSomething()] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (23:0,23) - Tokens:1
  70162. - SyntaxKind.Text;[doSomething()];
  70163. - SyntaxKind.HtmlTextLiteral - [Click Me] - [38..46) - FullWidth: 8 - Slots: 1
  70164. - SyntaxKind.List - [Click Me] - [38..46) - FullWidth: 8 - Slots: 3
  70165. - SyntaxKind.Text;[Click];
  70166. - SyntaxKind.Whitespace;[ ];
  70167. - SyntaxKind.Text;[Me];
  70168. +RazorDocument - [0..55)::55 - [<button bound (click)='doSomething()'>Click Me</button>]
  70169. + MarkupBlock - [0..55)::55
  70170. + MarkupTagHelperElement - [0..55)::55 - button[StartTagAndEndTag] - CatchAllTagHelper
  70171. + MarkupTagHelperStartTag - [0..38)::38
  70172. + MarkupTextLiteral - [0..7)::7 - [<button] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70173. + OpenAngle;[<];
  70174. + Text;[button];
  70175. + MarkupMinimizedTagHelperAttribute - [7..13)::6 - bound - Minimized - Unbound - [ bound]
  70176. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70177. + Whitespace;[ ];
  70178. + MarkupTextLiteral - [8..13)::5 - [bound] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70179. + Text;[bound];
  70180. + MarkupTagHelperAttribute - [13..37)::24 - (click) - SingleQuotes - Bound - [ (click)='doSomething()']
  70181. + MarkupTextLiteral - [13..14)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70182. + Whitespace;[ ];
  70183. + MarkupTextLiteral - [14..21)::7 - [(click)] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70184. + Text;[(click)];
  70185. + Equals;[=];
  70186. + MarkupTextLiteral - [22..23)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70187. + SingleQuote;['];
  70188. + MarkupTagHelperAttributeValue - [23..36)::13
  70189. + CSharpExpressionLiteral - [23..36)::13 - [doSomething()] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  70190. + Text;[doSomething()];
  70191. + MarkupTextLiteral - [36..37)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70192. + SingleQuote;['];
  70193. + MarkupTextLiteral - [37..38)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70194. + CloseAngle;[>];
  70195. + MarkupTextLiteral - [38..46)::8 - [Click Me] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70196. + Text;[Click];
  70197. + Whitespace;[ ];
  70198. + Text;[Me];
  70199. + MarkupTagHelperEndTag - [46..55)::9
  70200. + MarkupTextLiteral - [46..55)::9 - [</button>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70201. + OpenAngle;[<];
  70202. + ForwardSlash;[/];
  70203. + Text;[button];
  70204. + CloseAngle;[>];
  70205. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes4.diag.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes4.diag.txt
  70206. new file mode 100644
  70207. index 00000000000..7854af144b8
  70208. --- /dev/null
  70209. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes4.diag.txt
  70210. @@ -0,0 +1,5 @@
  70211. +(0,0): Error RZ3003: Invalid tag helper bound property '[item]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[item]' because the name contains a '[' character.
  70212. +(0,0): Error RZ3003: Invalid tag helper bound property '[item]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[item]' because the name contains a ']' character.
  70213. +(0,0): Error RZ3003: Invalid tag helper bound property '[(item)]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[(item)]' because the name contains a '[' character.
  70214. +(0,0): Error RZ3003: Invalid tag helper bound property '[(item)]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[(item)]' because the name contains a ']' character.
  70215. +(0,0): Error RZ3003: Invalid tag helper bound property '*something' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '*something' because the name contains a '*' character.
  70216. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes4.stree.txt
  70217. index 57140b16aca..70377c3b3e4 100644
  70218. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes4.stree.txt
  70219. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes4.stree.txt
  70220. @@ -1,12 +1,37 @@
  70221. -Markup block - Gen<None> - 56 - (0:0,0)
  70222. - Tag block - Gen<TagHelper> - 56 - (0:0,0) - button - CatchAllTagHelper
  70223. - StartTagAndEndTag - <button bound (^click)='doSomething()'> ... </button>
  70224. - bound - Minimized
  70225. - (^click) - SingleQuotes
  70226. - Code span - Gen<Expr> - [doSomething()] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (24:0,24) - Tokens:1
  70227. - SyntaxKind.Text;[doSomething()];
  70228. - SyntaxKind.HtmlTextLiteral - [Click Me] - [39..47) - FullWidth: 8 - Slots: 1
  70229. - SyntaxKind.List - [Click Me] - [39..47) - FullWidth: 8 - Slots: 3
  70230. - SyntaxKind.Text;[Click];
  70231. - SyntaxKind.Whitespace;[ ];
  70232. - SyntaxKind.Text;[Me];
  70233. +RazorDocument - [0..56)::56 - [<button bound (^click)='doSomething()'>Click Me</button>]
  70234. + MarkupBlock - [0..56)::56
  70235. + MarkupTagHelperElement - [0..56)::56 - button[StartTagAndEndTag] - CatchAllTagHelper
  70236. + MarkupTagHelperStartTag - [0..39)::39
  70237. + MarkupTextLiteral - [0..7)::7 - [<button] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70238. + OpenAngle;[<];
  70239. + Text;[button];
  70240. + MarkupMinimizedTagHelperAttribute - [7..13)::6 - bound - Minimized - Unbound - [ bound]
  70241. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70242. + Whitespace;[ ];
  70243. + MarkupTextLiteral - [8..13)::5 - [bound] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70244. + Text;[bound];
  70245. + MarkupTagHelperAttribute - [13..38)::25 - (^click) - SingleQuotes - Bound - [ (^click)='doSomething()']
  70246. + MarkupTextLiteral - [13..14)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70247. + Whitespace;[ ];
  70248. + MarkupTextLiteral - [14..22)::8 - [(^click)] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70249. + Text;[(^click)];
  70250. + Equals;[=];
  70251. + MarkupTextLiteral - [23..24)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70252. + SingleQuote;['];
  70253. + MarkupTagHelperAttributeValue - [24..37)::13
  70254. + CSharpExpressionLiteral - [24..37)::13 - [doSomething()] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  70255. + Text;[doSomething()];
  70256. + MarkupTextLiteral - [37..38)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70257. + SingleQuote;['];
  70258. + MarkupTextLiteral - [38..39)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70259. + CloseAngle;[>];
  70260. + MarkupTextLiteral - [39..47)::8 - [Click Me] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70261. + Text;[Click];
  70262. + Whitespace;[ ];
  70263. + Text;[Me];
  70264. + MarkupTagHelperEndTag - [47..56)::9
  70265. + MarkupTextLiteral - [47..56)::9 - [</button>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70266. + OpenAngle;[<];
  70267. + ForwardSlash;[/];
  70268. + Text;[button];
  70269. + CloseAngle;[>];
  70270. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes5.diag.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes5.diag.txt
  70271. new file mode 100644
  70272. index 00000000000..7854af144b8
  70273. --- /dev/null
  70274. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes5.diag.txt
  70275. @@ -0,0 +1,5 @@
  70276. +(0,0): Error RZ3003: Invalid tag helper bound property '[item]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[item]' because the name contains a '[' character.
  70277. +(0,0): Error RZ3003: Invalid tag helper bound property '[item]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[item]' because the name contains a ']' character.
  70278. +(0,0): Error RZ3003: Invalid tag helper bound property '[(item)]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[(item)]' because the name contains a '[' character.
  70279. +(0,0): Error RZ3003: Invalid tag helper bound property '[(item)]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[(item)]' because the name contains a ']' character.
  70280. +(0,0): Error RZ3003: Invalid tag helper bound property '*something' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '*something' because the name contains a '*' character.
  70281. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes5.stree.txt
  70282. index 920c9330423..030c5524e7e 100644
  70283. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes5.stree.txt
  70284. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes5.stree.txt
  70285. @@ -1,7 +1,33 @@
  70286. -Markup block - Gen<None> - 46 - (0:0,0)
  70287. - Tag block - Gen<TagHelper> - 46 - (0:0,0) - template - CatchAllTagHelper
  70288. - StartTagAndEndTag - <template bound *something='value'> ... </template>
  70289. - bound - Minimized
  70290. - *something - SingleQuotes
  70291. - Markup span - Gen<Markup> - [value] - SpanEditHandler;Accepts:Any - (28:0,28) - Tokens:1
  70292. - SyntaxKind.Text;[value];
  70293. +RazorDocument - [0..46)::46 - [<template bound *something='value'></template>]
  70294. + MarkupBlock - [0..46)::46
  70295. + MarkupTagHelperElement - [0..46)::46 - template[StartTagAndEndTag] - CatchAllTagHelper
  70296. + MarkupTagHelperStartTag - [0..35)::35
  70297. + MarkupTextLiteral - [0..9)::9 - [<template] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70298. + OpenAngle;[<];
  70299. + Text;[template];
  70300. + MarkupMinimizedTagHelperAttribute - [9..15)::6 - bound - Minimized - Unbound - [ bound]
  70301. + MarkupTextLiteral - [9..10)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70302. + Whitespace;[ ];
  70303. + MarkupTextLiteral - [10..15)::5 - [bound] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70304. + Text;[bound];
  70305. + MarkupTagHelperAttribute - [15..34)::19 - *something - SingleQuotes - Bound - [ *something='value']
  70306. + MarkupTextLiteral - [15..16)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70307. + Whitespace;[ ];
  70308. + MarkupTextLiteral - [16..26)::10 - [*something] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70309. + Text;[*something];
  70310. + Equals;[=];
  70311. + MarkupTextLiteral - [27..28)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70312. + SingleQuote;['];
  70313. + MarkupTagHelperAttributeValue - [28..33)::5
  70314. + MarkupTextLiteral - [28..33)::5 - [value] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70315. + Text;[value];
  70316. + MarkupTextLiteral - [33..34)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70317. + SingleQuote;['];
  70318. + MarkupTextLiteral - [34..35)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70319. + CloseAngle;[>];
  70320. + MarkupTagHelperEndTag - [35..46)::11
  70321. + MarkupTextLiteral - [35..46)::11 - [</template>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70322. + OpenAngle;[<];
  70323. + ForwardSlash;[/];
  70324. + Text;[template];
  70325. + CloseAngle;[>];
  70326. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes6.diag.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes6.diag.txt
  70327. new file mode 100644
  70328. index 00000000000..7854af144b8
  70329. --- /dev/null
  70330. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes6.diag.txt
  70331. @@ -0,0 +1,5 @@
  70332. +(0,0): Error RZ3003: Invalid tag helper bound property '[item]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[item]' because the name contains a '[' character.
  70333. +(0,0): Error RZ3003: Invalid tag helper bound property '[item]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[item]' because the name contains a ']' character.
  70334. +(0,0): Error RZ3003: Invalid tag helper bound property '[(item)]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[(item)]' because the name contains a '[' character.
  70335. +(0,0): Error RZ3003: Invalid tag helper bound property '[(item)]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[(item)]' because the name contains a ']' character.
  70336. +(0,0): Error RZ3003: Invalid tag helper bound property '*something' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '*something' because the name contains a '*' character.
  70337. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes6.stree.txt
  70338. index 011d30b1d9c..b50fadba477 100644
  70339. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes6.stree.txt
  70340. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes6.stree.txt
  70341. @@ -1,5 +1,25 @@
  70342. -Markup block - Gen<None> - 33 - (0:0,0)
  70343. - Tag block - Gen<TagHelper> - 33 - (0:0,0) - div - CatchAllTagHelper
  70344. - StartTagAndEndTag - <div bound #localminimized> ... </div>
  70345. - bound - Minimized
  70346. - #localminimized - Minimized
  70347. +RazorDocument - [0..33)::33 - [<div bound #localminimized></div>]
  70348. + MarkupBlock - [0..33)::33
  70349. + MarkupTagHelperElement - [0..33)::33 - div[StartTagAndEndTag] - CatchAllTagHelper
  70350. + MarkupTagHelperStartTag - [0..27)::27
  70351. + MarkupTextLiteral - [0..4)::4 - [<div] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70352. + OpenAngle;[<];
  70353. + Text;[div];
  70354. + MarkupMinimizedTagHelperAttribute - [4..10)::6 - bound - Minimized - Unbound - [ bound]
  70355. + MarkupTextLiteral - [4..5)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70356. + Whitespace;[ ];
  70357. + MarkupTextLiteral - [5..10)::5 - [bound] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70358. + Text;[bound];
  70359. + MarkupMinimizedTagHelperAttribute - [10..26)::16 - #localminimized - Minimized - Unbound - [ #localminimized]
  70360. + MarkupTextLiteral - [10..11)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70361. + Whitespace;[ ];
  70362. + MarkupTextLiteral - [11..26)::15 - [#localminimized] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70363. + Text;[#localminimized];
  70364. + MarkupTextLiteral - [26..27)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70365. + CloseAngle;[>];
  70366. + MarkupTagHelperEndTag - [27..33)::6
  70367. + MarkupTextLiteral - [27..33)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70368. + OpenAngle;[<];
  70369. + ForwardSlash;[/];
  70370. + Text;[div];
  70371. + CloseAngle;[>];
  70372. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes7.diag.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes7.diag.txt
  70373. new file mode 100644
  70374. index 00000000000..7854af144b8
  70375. --- /dev/null
  70376. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes7.diag.txt
  70377. @@ -0,0 +1,5 @@
  70378. +(0,0): Error RZ3003: Invalid tag helper bound property '[item]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[item]' because the name contains a '[' character.
  70379. +(0,0): Error RZ3003: Invalid tag helper bound property '[item]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[item]' because the name contains a ']' character.
  70380. +(0,0): Error RZ3003: Invalid tag helper bound property '[(item)]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[(item)]' because the name contains a '[' character.
  70381. +(0,0): Error RZ3003: Invalid tag helper bound property '[(item)]' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '[(item)]' because the name contains a ']' character.
  70382. +(0,0): Error RZ3003: Invalid tag helper bound property '*something' on tag helper 'CatchAllTagHelper'. Tag helpers cannot bind to HTML attributes with name '*something' because the name contains a '*' character.
  70383. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes7.stree.txt
  70384. index bf8ef9828e2..26f3690b15d 100644
  70385. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes7.stree.txt
  70386. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleSymbolBoundAttributes7.stree.txt
  70387. @@ -1,7 +1,33 @@
  70388. -Markup block - Gen<None> - 32 - (0:0,0)
  70389. - Tag block - Gen<TagHelper> - 32 - (0:0,0) - div - CatchAllTagHelper
  70390. - StartTagAndEndTag - <div bound #local='value'> ... </div>
  70391. - bound - Minimized
  70392. - #local - SingleQuotes
  70393. - Markup span - Gen<Markup> - [value] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:1
  70394. - SyntaxKind.Text;[value];
  70395. +RazorDocument - [0..32)::32 - [<div bound #local='value'></div>]
  70396. + MarkupBlock - [0..32)::32
  70397. + MarkupTagHelperElement - [0..32)::32 - div[StartTagAndEndTag] - CatchAllTagHelper
  70398. + MarkupTagHelperStartTag - [0..26)::26
  70399. + MarkupTextLiteral - [0..4)::4 - [<div] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70400. + OpenAngle;[<];
  70401. + Text;[div];
  70402. + MarkupMinimizedTagHelperAttribute - [4..10)::6 - bound - Minimized - Unbound - [ bound]
  70403. + MarkupTextLiteral - [4..5)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70404. + Whitespace;[ ];
  70405. + MarkupTextLiteral - [5..10)::5 - [bound] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70406. + Text;[bound];
  70407. + MarkupTagHelperAttribute - [10..25)::15 - #local - SingleQuotes - Bound - [ #local='value']
  70408. + MarkupTextLiteral - [10..11)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70409. + Whitespace;[ ];
  70410. + MarkupTextLiteral - [11..17)::6 - [#local] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70411. + Text;[#local];
  70412. + Equals;[=];
  70413. + MarkupTextLiteral - [18..19)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70414. + SingleQuote;['];
  70415. + MarkupTagHelperAttributeValue - [19..24)::5
  70416. + MarkupTextLiteral - [19..24)::5 - [value] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70417. + Text;[value];
  70418. + MarkupTextLiteral - [24..25)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70419. + SingleQuote;['];
  70420. + MarkupTextLiteral - [25..26)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70421. + CloseAngle;[>];
  70422. + MarkupTagHelperEndTag - [26..32)::6
  70423. + MarkupTextLiteral - [26..32)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70424. + OpenAngle;[<];
  70425. + ForwardSlash;[/];
  70426. + Text;[div];
  70427. + CloseAngle;[>];
  70428. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleWithoutEndTagTagStructure1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleWithoutEndTagTagStructure1.stree.txt
  70429. index 64f951bb831..764c76b22e2 100644
  70430. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleWithoutEndTagTagStructure1.stree.txt
  70431. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleWithoutEndTagTagStructure1.stree.txt
  70432. @@ -1,3 +1,8 @@
  70433. -Markup block - Gen<None> - 7 - (0:0,0)
  70434. - Tag block - Gen<TagHelper> - 7 - (0:0,0) - input - InputTagHelper
  70435. - StartTagOnly - <input>
  70436. +RazorDocument - [0..7)::7 - [<input>]
  70437. + MarkupBlock - [0..7)::7
  70438. + MarkupTagHelperElement - [0..7)::7 - input[StartTagOnly] - InputTagHelper
  70439. + MarkupTagHelperStartTag - [0..7)::7
  70440. + MarkupTextLiteral - [0..7)::7 - [<input>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70441. + OpenAngle;[<];
  70442. + Text;[input];
  70443. + CloseAngle;[>];
  70444. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleWithoutEndTagTagStructure2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleWithoutEndTagTagStructure2.stree.txt
  70445. index aca74df1f3a..ef3f989c7fe 100644
  70446. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleWithoutEndTagTagStructure2.stree.txt
  70447. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleWithoutEndTagTagStructure2.stree.txt
  70448. @@ -1,6 +1,23 @@
  70449. -Markup block - Gen<None> - 19 - (0:0,0)
  70450. - Tag block - Gen<TagHelper> - 19 - (0:0,0) - input - InputTagHelper
  70451. - StartTagOnly - <input type='text'>
  70452. - type - SingleQuotes
  70453. - Markup span - Gen<Markup> - [text] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:1
  70454. - SyntaxKind.Text;[text];
  70455. +RazorDocument - [0..19)::19 - [<input type='text'>]
  70456. + MarkupBlock - [0..19)::19
  70457. + MarkupTagHelperElement - [0..19)::19 - input[StartTagOnly] - InputTagHelper
  70458. + MarkupTagHelperStartTag - [0..19)::19
  70459. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70460. + OpenAngle;[<];
  70461. + Text;[input];
  70462. + MarkupTagHelperAttribute - [6..18)::12 - type - SingleQuotes - Unbound - [ type='text']
  70463. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70464. + Whitespace;[ ];
  70465. + MarkupTextLiteral - [7..11)::4 - [type] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70466. + Text;[type];
  70467. + Equals;[=];
  70468. + MarkupTextLiteral - [12..13)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70469. + SingleQuote;['];
  70470. + MarkupTagHelperAttributeValue - [13..17)::4
  70471. + MarkupLiteralAttributeValue - [13..17)::4 - [text]
  70472. + MarkupTextLiteral - [13..17)::4 - [text] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70473. + Text;[text];
  70474. + MarkupTextLiteral - [17..18)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70475. + SingleQuote;['];
  70476. + MarkupTextLiteral - [18..19)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70477. + CloseAngle;[>];
  70478. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleWithoutEndTagTagStructure3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleWithoutEndTagTagStructure3.stree.txt
  70479. index 5940efaad78..6ab1d8b0a5d 100644
  70480. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleWithoutEndTagTagStructure3.stree.txt
  70481. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleWithoutEndTagTagStructure3.stree.txt
  70482. @@ -1,5 +1,14 @@
  70483. -Markup block - Gen<None> - 14 - (0:0,0)
  70484. - Tag block - Gen<TagHelper> - 7 - (0:0,0) - input - InputTagHelper
  70485. - StartTagOnly - <input>
  70486. - Tag block - Gen<TagHelper> - 7 - (7:0,7) - input - InputTagHelper
  70487. - StartTagOnly - <input>
  70488. +RazorDocument - [0..14)::14 - [<input><input>]
  70489. + MarkupBlock - [0..14)::14
  70490. + MarkupTagHelperElement - [0..7)::7 - input[StartTagOnly] - InputTagHelper
  70491. + MarkupTagHelperStartTag - [0..7)::7
  70492. + MarkupTextLiteral - [0..7)::7 - [<input>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70493. + OpenAngle;[<];
  70494. + Text;[input];
  70495. + CloseAngle;[>];
  70496. + MarkupTagHelperElement - [7..14)::7 - input[StartTagOnly] - InputTagHelper
  70497. + MarkupTagHelperStartTag - [7..14)::7
  70498. + MarkupTextLiteral - [7..14)::7 - [<input>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70499. + OpenAngle;[<];
  70500. + Text;[input];
  70501. + CloseAngle;[>];
  70502. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleWithoutEndTagTagStructure4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleWithoutEndTagTagStructure4.stree.txt
  70503. index e79b6cc228b..a0ed923db29 100644
  70504. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleWithoutEndTagTagStructure4.stree.txt
  70505. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleWithoutEndTagTagStructure4.stree.txt
  70506. @@ -1,8 +1,29 @@
  70507. -Markup block - Gen<None> - 26 - (0:0,0)
  70508. - Tag block - Gen<TagHelper> - 19 - (0:0,0) - input - InputTagHelper
  70509. - StartTagOnly - <input type='text'>
  70510. - type - SingleQuotes
  70511. - Markup span - Gen<Markup> - [text] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:1
  70512. - SyntaxKind.Text;[text];
  70513. - Tag block - Gen<TagHelper> - 7 - (19:0,19) - input - InputTagHelper
  70514. - StartTagOnly - <input>
  70515. +RazorDocument - [0..26)::26 - [<input type='text'><input>]
  70516. + MarkupBlock - [0..26)::26
  70517. + MarkupTagHelperElement - [0..19)::19 - input[StartTagOnly] - InputTagHelper
  70518. + MarkupTagHelperStartTag - [0..19)::19
  70519. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70520. + OpenAngle;[<];
  70521. + Text;[input];
  70522. + MarkupTagHelperAttribute - [6..18)::12 - type - SingleQuotes - Unbound - [ type='text']
  70523. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70524. + Whitespace;[ ];
  70525. + MarkupTextLiteral - [7..11)::4 - [type] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70526. + Text;[type];
  70527. + Equals;[=];
  70528. + MarkupTextLiteral - [12..13)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70529. + SingleQuote;['];
  70530. + MarkupTagHelperAttributeValue - [13..17)::4
  70531. + MarkupLiteralAttributeValue - [13..17)::4 - [text]
  70532. + MarkupTextLiteral - [13..17)::4 - [text] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70533. + Text;[text];
  70534. + MarkupTextLiteral - [17..18)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70535. + SingleQuote;['];
  70536. + MarkupTextLiteral - [18..19)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70537. + CloseAngle;[>];
  70538. + MarkupTagHelperElement - [19..26)::7 - input[StartTagOnly] - InputTagHelper
  70539. + MarkupTagHelperStartTag - [19..26)::7
  70540. + MarkupTextLiteral - [19..26)::7 - [<input>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70541. + OpenAngle;[<];
  70542. + Text;[input];
  70543. + CloseAngle;[>];
  70544. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleWithoutEndTagTagStructure5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleWithoutEndTagTagStructure5.stree.txt
  70545. index f78886eb68c..39b59d94d60 100644
  70546. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleWithoutEndTagTagStructure5.stree.txt
  70547. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CanHandleWithoutEndTagTagStructure5.stree.txt
  70548. @@ -1,16 +1,25 @@
  70549. -Markup block - Gen<None> - 25 - (0:0,0)
  70550. - Tag block - Gen<None> - 5 - (0:0,0)
  70551. - Markup span - Gen<Markup> - [<div>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  70552. - SyntaxKind.OpenAngle;[<];
  70553. - SyntaxKind.Text;[div];
  70554. - SyntaxKind.CloseAngle;[>];
  70555. - Tag block - Gen<TagHelper> - 7 - (5:0,5) - input - InputTagHelper
  70556. - StartTagOnly - <input>
  70557. - Tag block - Gen<TagHelper> - 7 - (12:0,12) - input - InputTagHelper
  70558. - StartTagOnly - <input>
  70559. - Tag block - Gen<None> - 6 - (19:0,19)
  70560. - Markup span - Gen<Markup> - [</div>] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:4
  70561. - SyntaxKind.OpenAngle;[<];
  70562. - SyntaxKind.ForwardSlash;[/];
  70563. - SyntaxKind.Text;[div];
  70564. - SyntaxKind.CloseAngle;[>];
  70565. +RazorDocument - [0..25)::25 - [<div><input><input></div>]
  70566. + MarkupBlock - [0..25)::25
  70567. + MarkupTagBlock - [0..5)::5 - [<div>]
  70568. + MarkupTextLiteral - [0..5)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70569. + OpenAngle;[<];
  70570. + Text;[div];
  70571. + CloseAngle;[>];
  70572. + MarkupTagHelperElement - [5..12)::7 - input[StartTagOnly] - InputTagHelper
  70573. + MarkupTagHelperStartTag - [5..12)::7
  70574. + MarkupTextLiteral - [5..12)::7 - [<input>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70575. + OpenAngle;[<];
  70576. + Text;[input];
  70577. + CloseAngle;[>];
  70578. + MarkupTagHelperElement - [12..19)::7 - input[StartTagOnly] - InputTagHelper
  70579. + MarkupTagHelperStartTag - [12..19)::7
  70580. + MarkupTextLiteral - [12..19)::7 - [<input>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70581. + OpenAngle;[<];
  70582. + Text;[input];
  70583. + CloseAngle;[>];
  70584. + MarkupTagBlock - [19..25)::6 - [</div>]
  70585. + MarkupTextLiteral - [19..25)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70586. + OpenAngle;[<];
  70587. + ForwardSlash;[/];
  70588. + Text;[div];
  70589. + CloseAngle;[>];
  70590. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes1.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes1.cspans.txt
  70591. index e69de29bb2d..aa429ff6cb4 100644
  70592. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes1.cspans.txt
  70593. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes1.cspans.txt
  70594. @@ -0,0 +1 @@
  70595. +Code span at (13:0,13 [0] ) (Accepts:AnyExceptNewline) - Parent: Tag block at (0:0,0 [17] )
  70596. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes1.stree.txt
  70597. index 94077ed99f4..a68ddb1c114 100644
  70598. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes1.stree.txt
  70599. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes1.stree.txt
  70600. @@ -1,5 +1,23 @@
  70601. -Markup block - Gen<None> - 17 - (0:0,0)
  70602. - Tag block - Gen<TagHelper> - 17 - (0:0,0) - myth - mythTagHelper
  70603. - SelfClosing - <myth bound='' />
  70604. - bound - SingleQuotes
  70605. - Markup block - Gen<None> - 0 - (0:0,0)
  70606. +RazorDocument - [0..17)::17 - [<myth bound='' />]
  70607. + MarkupBlock - [0..17)::17
  70608. + MarkupTagHelperElement - [0..17)::17 - myth[SelfClosing] - mythTagHelper
  70609. + MarkupTagHelperStartTag - [0..17)::17
  70610. + MarkupTextLiteral - [0..5)::5 - [<myth] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70611. + OpenAngle;[<];
  70612. + Text;[myth];
  70613. + MarkupTagHelperAttribute - [5..14)::9 - bound - SingleQuotes - Bound - [ bound='']
  70614. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70615. + Whitespace;[ ];
  70616. + MarkupTextLiteral - [6..11)::5 - [bound] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70617. + Text;[bound];
  70618. + Equals;[=];
  70619. + MarkupTextLiteral - [12..13)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70620. + SingleQuote;['];
  70621. + MarkupTagHelperAttributeValue - [13..13)::0
  70622. + CSharpExpressionLiteral - [13..13)::0 - [] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  70623. + MarkupTextLiteral - [13..14)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70624. + SingleQuote;['];
  70625. + MarkupTextLiteral - [14..17)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70626. + Whitespace;[ ];
  70627. + ForwardSlash;[/];
  70628. + CloseAngle;[>];
  70629. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes10.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes10.cspans.txt
  70630. index e69de29bb2d..aa429ff6cb4 100644
  70631. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes10.cspans.txt
  70632. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes10.cspans.txt
  70633. @@ -0,0 +1 @@
  70634. +Code span at (13:0,13 [0] ) (Accepts:AnyExceptNewline) - Parent: Tag block at (0:0,0 [17] )
  70635. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes10.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes10.stree.txt
  70636. index 1e5707cb20b..5b506a3479e 100644
  70637. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes10.stree.txt
  70638. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes10.stree.txt
  70639. @@ -1,5 +1,23 @@
  70640. -Markup block - Gen<None> - 17 - (0:0,0)
  70641. - Tag block - Gen<TagHelper> - 17 - (0:0,0) - myth - mythTagHelper
  70642. - SelfClosing - <myth BouND='' />
  70643. - BouND - SingleQuotes
  70644. - Markup block - Gen<None> - 0 - (0:0,0)
  70645. +RazorDocument - [0..17)::17 - [<myth BouND='' />]
  70646. + MarkupBlock - [0..17)::17
  70647. + MarkupTagHelperElement - [0..17)::17 - myth[SelfClosing] - mythTagHelper
  70648. + MarkupTagHelperStartTag - [0..17)::17
  70649. + MarkupTextLiteral - [0..5)::5 - [<myth] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70650. + OpenAngle;[<];
  70651. + Text;[myth];
  70652. + MarkupTagHelperAttribute - [5..14)::9 - BouND - SingleQuotes - Bound - [ BouND='']
  70653. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70654. + Whitespace;[ ];
  70655. + MarkupTextLiteral - [6..11)::5 - [BouND] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70656. + Text;[BouND];
  70657. + Equals;[=];
  70658. + MarkupTextLiteral - [12..13)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70659. + SingleQuote;['];
  70660. + MarkupTagHelperAttributeValue - [13..13)::0
  70661. + CSharpExpressionLiteral - [13..13)::0 - [] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  70662. + MarkupTextLiteral - [13..14)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70663. + SingleQuote;['];
  70664. + MarkupTextLiteral - [14..17)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70665. + Whitespace;[ ];
  70666. + ForwardSlash;[/];
  70667. + CloseAngle;[>];
  70668. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes11.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes11.cspans.txt
  70669. index e69de29bb2d..92552dfb4e6 100644
  70670. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes11.cspans.txt
  70671. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes11.cspans.txt
  70672. @@ -0,0 +1,2 @@
  70673. +Code span at (13:0,13 [0] ) (Accepts:AnyExceptNewline) - Parent: Tag block at (0:0,0 [29] )
  70674. +Code span at (25:0,25 [0] ) (Accepts:AnyExceptNewline) - Parent: Tag block at (0:0,0 [29] )
  70675. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes11.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes11.stree.txt
  70676. index 895d34342c1..01b040e26e7 100644
  70677. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes11.stree.txt
  70678. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes11.stree.txt
  70679. @@ -1,7 +1,35 @@
  70680. -Markup block - Gen<None> - 29 - (0:0,0)
  70681. - Tag block - Gen<TagHelper> - 29 - (0:0,0) - myth - mythTagHelper
  70682. - SelfClosing - <myth BOUND='' bOUnd="" />
  70683. - BOUND - SingleQuotes
  70684. - Markup block - Gen<None> - 0 - (0:0,0)
  70685. - bOUnd - DoubleQuotes
  70686. - Markup block - Gen<None> - 0 - (0:0,0)
  70687. +RazorDocument - [0..29)::29 - [<myth BOUND='' bOUnd="" />]
  70688. + MarkupBlock - [0..29)::29
  70689. + MarkupTagHelperElement - [0..29)::29 - myth[SelfClosing] - mythTagHelper
  70690. + MarkupTagHelperStartTag - [0..29)::29
  70691. + MarkupTextLiteral - [0..5)::5 - [<myth] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70692. + OpenAngle;[<];
  70693. + Text;[myth];
  70694. + MarkupTagHelperAttribute - [5..14)::9 - BOUND - SingleQuotes - Bound - [ BOUND='']
  70695. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70696. + Whitespace;[ ];
  70697. + MarkupTextLiteral - [6..11)::5 - [BOUND] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70698. + Text;[BOUND];
  70699. + Equals;[=];
  70700. + MarkupTextLiteral - [12..13)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70701. + SingleQuote;['];
  70702. + MarkupTagHelperAttributeValue - [13..13)::0
  70703. + CSharpExpressionLiteral - [13..13)::0 - [] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  70704. + MarkupTextLiteral - [13..14)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70705. + SingleQuote;['];
  70706. + MarkupTagHelperAttribute - [14..26)::12 - bOUnd - DoubleQuotes - Bound - [ bOUnd=""]
  70707. + MarkupTextLiteral - [14..18)::4 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70708. + Whitespace;[ ];
  70709. + MarkupTextLiteral - [18..23)::5 - [bOUnd] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70710. + Text;[bOUnd];
  70711. + Equals;[=];
  70712. + MarkupTextLiteral - [24..25)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  70713. + DoubleQuote;["];
  70714. + MarkupTagHelperAttributeValue - [25..25)::0
  70715. + CSharpExpressionLiteral - [25..25)::0 - [] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  70716. + MarkupTextLiteral - [25..26)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  70717. + DoubleQuote;["];
  70718. + MarkupTextLiteral - [26..29)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70719. + Whitespace;[ ];
  70720. + ForwardSlash;[/];
  70721. + CloseAngle;[>];
  70722. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes12.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes12.stree.txt
  70723. index 3f7219cfd77..bfe9ad83596 100644
  70724. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes12.stree.txt
  70725. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes12.stree.txt
  70726. @@ -1,8 +1,36 @@
  70727. -Markup block - Gen<None> - 32 - (0:0,0)
  70728. - Tag block - Gen<TagHelper> - 32 - (0:0,0) - myth - mythTagHelper
  70729. - StartTagAndEndTag - <myth BOUND= nAMe='john'> ... </myth>
  70730. - BOUND - DoubleQuotes
  70731. - Code span - Gen<None> - [] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (12:0,12) - Tokens:0
  70732. - nAMe - SingleQuotes
  70733. - Markup span - Gen<Markup> - [john] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:1
  70734. - SyntaxKind.Text;[john];
  70735. +RazorDocument - [0..32)::32 - [<myth BOUND= nAMe='john'></myth>]
  70736. + MarkupBlock - [0..32)::32
  70737. + MarkupTagHelperElement - [0..32)::32 - myth[StartTagAndEndTag] - mythTagHelper
  70738. + MarkupTagHelperStartTag - [0..25)::25
  70739. + MarkupTextLiteral - [0..5)::5 - [<myth] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70740. + OpenAngle;[<];
  70741. + Text;[myth];
  70742. + MarkupTagHelperAttribute - [5..12)::7 - BOUND - DoubleQuotes - Bound - [ BOUND=]
  70743. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70744. + Whitespace;[ ];
  70745. + MarkupTextLiteral - [6..11)::5 - [BOUND] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70746. + Text;[BOUND];
  70747. + Equals;[=];
  70748. + MarkupTagHelperAttributeValue - [12..12)::0
  70749. + CSharpExpressionLiteral - [12..12)::0 - [] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  70750. + MarkupTagHelperAttribute - [12..24)::12 - nAMe - SingleQuotes - Bound - [ nAMe='john']
  70751. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Any
  70752. + Whitespace;[ ];
  70753. + MarkupTextLiteral - [13..17)::4 - [nAMe] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70754. + Text;[nAMe];
  70755. + Equals;[=];
  70756. + MarkupTextLiteral - [18..19)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70757. + SingleQuote;['];
  70758. + MarkupTagHelperAttributeValue - [19..23)::4
  70759. + MarkupTextLiteral - [19..23)::4 - [john] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70760. + Text;[john];
  70761. + MarkupTextLiteral - [23..24)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70762. + SingleQuote;['];
  70763. + MarkupTextLiteral - [24..25)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70764. + CloseAngle;[>];
  70765. + MarkupTagHelperEndTag - [25..32)::7
  70766. + MarkupTextLiteral - [25..32)::7 - [</myth>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70767. + OpenAngle;[<];
  70768. + ForwardSlash;[/];
  70769. + Text;[myth];
  70770. + CloseAngle;[>];
  70771. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes13.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes13.stree.txt
  70772. index b845c365b53..e2464797305 100644
  70773. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes13.stree.txt
  70774. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes13.stree.txt
  70775. @@ -1,15 +1,37 @@
  70776. -Markup block - Gen<None> - 28 - (0:0,0)
  70777. - Tag block - Gen<TagHelper> - 28 - (0:0,0) - myth - mythTagHelper
  70778. - SelfClosing - <myth bound=' @true ' />
  70779. - bound - SingleQuotes
  70780. - Markup block - Gen<None> - 11 - (13:0,13)
  70781. - Markup block - Gen<None> - 9 - (13:0,13)
  70782. - Code span - Gen<Expr> - [ ] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (13:0,13) - Tokens:1
  70783. - SyntaxKind.Whitespace;[ ];
  70784. - Expression block - Gen<Expr> - 5 - (17:0,17)
  70785. - Code span - Gen<Expr> - [@] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (17:0,17) - Tokens:1
  70786. - SyntaxKind.Transition;[@];
  70787. - Code span - Gen<Expr> - [true] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (18:0,18) - Tokens:1
  70788. - SyntaxKind.Keyword;[true];
  70789. - Code span - Gen<Expr> - [ ] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (22:0,22) - Tokens:1
  70790. - SyntaxKind.Whitespace;[ ];
  70791. +RazorDocument - [0..28)::28 - [<myth bound=' @true ' />]
  70792. + MarkupBlock - [0..28)::28
  70793. + MarkupTagHelperElement - [0..28)::28 - myth[SelfClosing] - mythTagHelper
  70794. + MarkupTagHelperStartTag - [0..28)::28
  70795. + MarkupTextLiteral - [0..5)::5 - [<myth] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70796. + OpenAngle;[<];
  70797. + Text;[myth];
  70798. + MarkupTagHelperAttribute - [5..25)::20 - bound - SingleQuotes - Bound - [ bound=' @true ']
  70799. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70800. + Whitespace;[ ];
  70801. + MarkupTextLiteral - [6..11)::5 - [bound] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70802. + Text;[bound];
  70803. + Equals;[=];
  70804. + MarkupTextLiteral - [12..13)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70805. + SingleQuote;['];
  70806. + MarkupTagHelperAttributeValue - [13..24)::11
  70807. + MarkupBlock - [13..22)::9
  70808. + CSharpExpressionLiteral - [13..17)::4 - [ ] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  70809. + Whitespace;[ ];
  70810. + CSharpCodeBlock - [17..22)::5
  70811. + CSharpImplicitExpression - [17..22)::5
  70812. + CSharpTransition - [17..17)::0
  70813. + Transition;[<Missing>];
  70814. + CSharpImplicitExpressionBody - [17..22)::5
  70815. + CSharpCodeBlock - [17..22)::5
  70816. + CSharpExpressionLiteral - [17..18)::1 - [@] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  70817. + Transition;[@];
  70818. + CSharpExpressionLiteral - [18..22)::4 - [true] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  70819. + Keyword;[true];
  70820. + CSharpExpressionLiteral - [22..24)::2 - [ ] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  70821. + Whitespace;[ ];
  70822. + MarkupTextLiteral - [24..25)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70823. + SingleQuote;['];
  70824. + MarkupTextLiteral - [25..28)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70825. + Whitespace;[ ];
  70826. + ForwardSlash;[/];
  70827. + CloseAngle;[>];
  70828. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes14.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes14.stree.txt
  70829. index c9d3cd8f444..eba1d7ab626 100644
  70830. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes14.stree.txt
  70831. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes14.stree.txt
  70832. @@ -1,19 +1,41 @@
  70833. -Markup block - Gen<None> - 30 - (0:0,0)
  70834. - Tag block - Gen<TagHelper> - 30 - (0:0,0) - myth - mythTagHelper
  70835. - SelfClosing - <myth bound=' @(true) ' />
  70836. - bound - SingleQuotes
  70837. - Markup block - Gen<None> - 13 - (13:0,13)
  70838. - Markup block - Gen<None> - 11 - (13:0,13)
  70839. - Code span - Gen<Expr> - [ ] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (13:0,13) - Tokens:1
  70840. - SyntaxKind.Whitespace;[ ];
  70841. - Expression block - Gen<Expr> - 7 - (17:0,17)
  70842. - Code span - Gen<Expr> - [@] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (17:0,17) - Tokens:1
  70843. - SyntaxKind.Transition;[@];
  70844. - Code span - Gen<Expr> - [(] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (18:0,18) - Tokens:1
  70845. - SyntaxKind.LeftParenthesis;[(];
  70846. - Code span - Gen<Expr> - [true] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (19:0,19) - Tokens:1
  70847. - SyntaxKind.Keyword;[true];
  70848. - Code span - Gen<Expr> - [)] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (23:0,23) - Tokens:1
  70849. - SyntaxKind.RightParenthesis;[)];
  70850. - Code span - Gen<Expr> - [ ] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (24:0,24) - Tokens:1
  70851. - SyntaxKind.Whitespace;[ ];
  70852. +RazorDocument - [0..30)::30 - [<myth bound=' @(true) ' />]
  70853. + MarkupBlock - [0..30)::30
  70854. + MarkupTagHelperElement - [0..30)::30 - myth[SelfClosing] - mythTagHelper
  70855. + MarkupTagHelperStartTag - [0..30)::30
  70856. + MarkupTextLiteral - [0..5)::5 - [<myth] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70857. + OpenAngle;[<];
  70858. + Text;[myth];
  70859. + MarkupTagHelperAttribute - [5..27)::22 - bound - SingleQuotes - Bound - [ bound=' @(true) ']
  70860. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70861. + Whitespace;[ ];
  70862. + MarkupTextLiteral - [6..11)::5 - [bound] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70863. + Text;[bound];
  70864. + Equals;[=];
  70865. + MarkupTextLiteral - [12..13)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70866. + SingleQuote;['];
  70867. + MarkupTagHelperAttributeValue - [13..26)::13
  70868. + MarkupBlock - [13..24)::11
  70869. + CSharpExpressionLiteral - [13..17)::4 - [ ] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  70870. + Whitespace;[ ];
  70871. + CSharpCodeBlock - [17..24)::7
  70872. + CSharpImplicitExpression - [17..24)::7
  70873. + CSharpTransition - [17..17)::0
  70874. + Transition;[<Missing>];
  70875. + CSharpImplicitExpressionBody - [17..24)::7
  70876. + CSharpCodeBlock - [17..24)::7
  70877. + CSharpExpressionLiteral - [17..18)::1 - [@] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  70878. + Transition;[@];
  70879. + CSharpExpressionLiteral - [18..19)::1 - [(] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  70880. + LeftParenthesis;[(];
  70881. + CSharpExpressionLiteral - [19..23)::4 - [true] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  70882. + Keyword;[true];
  70883. + CSharpExpressionLiteral - [23..24)::1 - [)] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  70884. + RightParenthesis;[)];
  70885. + CSharpExpressionLiteral - [24..26)::2 - [ ] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  70886. + Whitespace;[ ];
  70887. + MarkupTextLiteral - [26..27)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70888. + SingleQuote;['];
  70889. + MarkupTextLiteral - [27..30)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70890. + Whitespace;[ ];
  70891. + ForwardSlash;[/];
  70892. + CloseAngle;[>];
  70893. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes2.stree.txt
  70894. index 5e1b11242eb..57eb5f5e214 100644
  70895. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes2.stree.txt
  70896. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes2.stree.txt
  70897. @@ -1,7 +1,25 @@
  70898. -Markup block - Gen<None> - 25 - (0:0,0)
  70899. - Tag block - Gen<TagHelper> - 25 - (0:0,0) - myth - mythTagHelper
  70900. - SelfClosing - <myth bound=' true' />
  70901. - bound - SingleQuotes
  70902. - Code span - Gen<Expr> - [ true] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (13:0,13) - Tokens:2
  70903. - SyntaxKind.Whitespace;[ ];
  70904. - SyntaxKind.Text;[true];
  70905. +RazorDocument - [0..25)::25 - [<myth bound=' true' />]
  70906. + MarkupBlock - [0..25)::25
  70907. + MarkupTagHelperElement - [0..25)::25 - myth[SelfClosing] - mythTagHelper
  70908. + MarkupTagHelperStartTag - [0..25)::25
  70909. + MarkupTextLiteral - [0..5)::5 - [<myth] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70910. + OpenAngle;[<];
  70911. + Text;[myth];
  70912. + MarkupTagHelperAttribute - [5..22)::17 - bound - SingleQuotes - Bound - [ bound=' true']
  70913. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70914. + Whitespace;[ ];
  70915. + MarkupTextLiteral - [6..11)::5 - [bound] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70916. + Text;[bound];
  70917. + Equals;[=];
  70918. + MarkupTextLiteral - [12..13)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70919. + SingleQuote;['];
  70920. + MarkupTagHelperAttributeValue - [13..21)::8
  70921. + CSharpExpressionLiteral - [13..21)::8 - [ true] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  70922. + Whitespace;[ ];
  70923. + Text;[true];
  70924. + MarkupTextLiteral - [21..22)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70925. + SingleQuote;['];
  70926. + MarkupTextLiteral - [22..25)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70927. + Whitespace;[ ];
  70928. + ForwardSlash;[/];
  70929. + CloseAngle;[>];
  70930. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes3.stree.txt
  70931. index 4bb87440b16..f231f9a735a 100644
  70932. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes3.stree.txt
  70933. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes3.stree.txt
  70934. @@ -1,6 +1,24 @@
  70935. -Markup block - Gen<None> - 21 - (0:0,0)
  70936. - Tag block - Gen<TagHelper> - 21 - (0:0,0) - myth - mythTagHelper
  70937. - SelfClosing - <myth bound=' ' />
  70938. - bound - SingleQuotes
  70939. - Code span - Gen<Expr> - [ ] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (13:0,13) - Tokens:1
  70940. - SyntaxKind.Whitespace;[ ];
  70941. +RazorDocument - [0..21)::21 - [<myth bound=' ' />]
  70942. + MarkupBlock - [0..21)::21
  70943. + MarkupTagHelperElement - [0..21)::21 - myth[SelfClosing] - mythTagHelper
  70944. + MarkupTagHelperStartTag - [0..21)::21
  70945. + MarkupTextLiteral - [0..5)::5 - [<myth] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70946. + OpenAngle;[<];
  70947. + Text;[myth];
  70948. + MarkupTagHelperAttribute - [5..18)::13 - bound - SingleQuotes - Bound - [ bound=' ']
  70949. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70950. + Whitespace;[ ];
  70951. + MarkupTextLiteral - [6..11)::5 - [bound] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70952. + Text;[bound];
  70953. + Equals;[=];
  70954. + MarkupTextLiteral - [12..13)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70955. + SingleQuote;['];
  70956. + MarkupTagHelperAttributeValue - [13..17)::4
  70957. + CSharpExpressionLiteral - [13..17)::4 - [ ] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  70958. + Whitespace;[ ];
  70959. + MarkupTextLiteral - [17..18)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70960. + SingleQuote;['];
  70961. + MarkupTextLiteral - [18..21)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70962. + Whitespace;[ ];
  70963. + ForwardSlash;[/];
  70964. + CloseAngle;[>];
  70965. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes4.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes4.cspans.txt
  70966. index e69de29bb2d..dddc839de02 100644
  70967. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes4.cspans.txt
  70968. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes4.cspans.txt
  70969. @@ -0,0 +1,2 @@
  70970. +Code span at (13:0,13 [0] ) (Accepts:AnyExceptNewline) - Parent: Tag block at (0:0,0 [27] )
  70971. +Code span at (23:0,23 [0] ) (Accepts:AnyExceptNewline) - Parent: Tag block at (0:0,0 [27] )
  70972. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes4.stree.txt
  70973. index 969f962e573..847c8f4e8cb 100644
  70974. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes4.stree.txt
  70975. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes4.stree.txt
  70976. @@ -1,7 +1,35 @@
  70977. -Markup block - Gen<None> - 27 - (0:0,0)
  70978. - Tag block - Gen<TagHelper> - 27 - (0:0,0) - myth - mythTagHelper
  70979. - SelfClosing - <myth bound='' bound="" />
  70980. - bound - SingleQuotes
  70981. - Markup block - Gen<None> - 0 - (0:0,0)
  70982. - bound - DoubleQuotes
  70983. - Markup block - Gen<None> - 0 - (0:0,0)
  70984. +RazorDocument - [0..27)::27 - [<myth bound='' bound="" />]
  70985. + MarkupBlock - [0..27)::27
  70986. + MarkupTagHelperElement - [0..27)::27 - myth[SelfClosing] - mythTagHelper
  70987. + MarkupTagHelperStartTag - [0..27)::27
  70988. + MarkupTextLiteral - [0..5)::5 - [<myth] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70989. + OpenAngle;[<];
  70990. + Text;[myth];
  70991. + MarkupTagHelperAttribute - [5..14)::9 - bound - SingleQuotes - Bound - [ bound='']
  70992. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70993. + Whitespace;[ ];
  70994. + MarkupTextLiteral - [6..11)::5 - [bound] - Gen<Markup> - SpanEditHandler;Accepts:Any
  70995. + Text;[bound];
  70996. + Equals;[=];
  70997. + MarkupTextLiteral - [12..13)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  70998. + SingleQuote;['];
  70999. + MarkupTagHelperAttributeValue - [13..13)::0
  71000. + CSharpExpressionLiteral - [13..13)::0 - [] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  71001. + MarkupTextLiteral - [13..14)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  71002. + SingleQuote;['];
  71003. + MarkupTagHelperAttribute - [14..24)::10 - bound - DoubleQuotes - Bound - [ bound=""]
  71004. + MarkupTextLiteral - [14..16)::2 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71005. + Whitespace;[ ];
  71006. + MarkupTextLiteral - [16..21)::5 - [bound] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71007. + Text;[bound];
  71008. + Equals;[=];
  71009. + MarkupTextLiteral - [22..23)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  71010. + DoubleQuote;["];
  71011. + MarkupTagHelperAttributeValue - [23..23)::0
  71012. + CSharpExpressionLiteral - [23..23)::0 - [] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  71013. + MarkupTextLiteral - [23..24)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  71014. + DoubleQuote;["];
  71015. + MarkupTextLiteral - [24..27)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71016. + Whitespace;[ ];
  71017. + ForwardSlash;[/];
  71018. + CloseAngle;[>];
  71019. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes5.stree.txt
  71020. index 9fe79d88675..6a180b1e55a 100644
  71021. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes5.stree.txt
  71022. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes5.stree.txt
  71023. @@ -1,9 +1,37 @@
  71024. -Markup block - Gen<None> - 30 - (0:0,0)
  71025. - Tag block - Gen<TagHelper> - 30 - (0:0,0) - myth - mythTagHelper
  71026. - SelfClosing - <myth bound=' ' bound=" " />
  71027. - bound - SingleQuotes
  71028. - Code span - Gen<Expr> - [ ] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (13:0,13) - Tokens:1
  71029. - SyntaxKind.Whitespace;[ ];
  71030. - bound - DoubleQuotes
  71031. - Code span - Gen<Markup> - [ ] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (24:0,24) - Tokens:1
  71032. - SyntaxKind.Whitespace;[ ];
  71033. +RazorDocument - [0..30)::30 - [<myth bound=' ' bound=" " />]
  71034. + MarkupBlock - [0..30)::30
  71035. + MarkupTagHelperElement - [0..30)::30 - myth[SelfClosing] - mythTagHelper
  71036. + MarkupTagHelperStartTag - [0..30)::30
  71037. + MarkupTextLiteral - [0..5)::5 - [<myth] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71038. + OpenAngle;[<];
  71039. + Text;[myth];
  71040. + MarkupTagHelperAttribute - [5..15)::10 - bound - SingleQuotes - Bound - [ bound=' ']
  71041. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71042. + Whitespace;[ ];
  71043. + MarkupTextLiteral - [6..11)::5 - [bound] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71044. + Text;[bound];
  71045. + Equals;[=];
  71046. + MarkupTextLiteral - [12..13)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  71047. + SingleQuote;['];
  71048. + MarkupTagHelperAttributeValue - [13..14)::1
  71049. + CSharpExpressionLiteral - [13..14)::1 - [ ] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  71050. + Whitespace;[ ];
  71051. + MarkupTextLiteral - [14..15)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  71052. + SingleQuote;['];
  71053. + MarkupTagHelperAttribute - [15..27)::12 - bound - DoubleQuotes - Bound - [ bound=" "]
  71054. + MarkupTextLiteral - [15..17)::2 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71055. + Whitespace;[ ];
  71056. + MarkupTextLiteral - [17..22)::5 - [bound] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71057. + Text;[bound];
  71058. + Equals;[=];
  71059. + MarkupTextLiteral - [23..24)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  71060. + DoubleQuote;["];
  71061. + MarkupTagHelperAttributeValue - [24..26)::2
  71062. + CSharpExpressionLiteral - [24..26)::2 - [ ] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  71063. + Whitespace;[ ];
  71064. + MarkupTextLiteral - [26..27)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  71065. + DoubleQuote;["];
  71066. + MarkupTextLiteral - [27..30)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71067. + Whitespace;[ ];
  71068. + ForwardSlash;[/];
  71069. + CloseAngle;[>];
  71070. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes6.stree.txt
  71071. index 74bc8eaad0b..6d2664ae0e0 100644
  71072. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes6.stree.txt
  71073. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes6.stree.txt
  71074. @@ -1,8 +1,32 @@
  71075. -Markup block - Gen<None> - 29 - (0:0,0)
  71076. - Tag block - Gen<TagHelper> - 29 - (0:0,0) - myth - mythTagHelper
  71077. - SelfClosing - <myth bound='true' bound= />
  71078. - bound - SingleQuotes
  71079. - Code span - Gen<Expr> - [true] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (13:0,13) - Tokens:1
  71080. - SyntaxKind.Text;[true];
  71081. - bound - DoubleQuotes
  71082. - Code span - Gen<None> - [] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (25:0,25) - Tokens:0
  71083. +RazorDocument - [0..29)::29 - [<myth bound='true' bound= />]
  71084. + MarkupBlock - [0..29)::29
  71085. + MarkupTagHelperElement - [0..29)::29 - myth[SelfClosing] - mythTagHelper
  71086. + MarkupTagHelperStartTag - [0..29)::29
  71087. + MarkupTextLiteral - [0..5)::5 - [<myth] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71088. + OpenAngle;[<];
  71089. + Text;[myth];
  71090. + MarkupTagHelperAttribute - [5..18)::13 - bound - SingleQuotes - Bound - [ bound='true']
  71091. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71092. + Whitespace;[ ];
  71093. + MarkupTextLiteral - [6..11)::5 - [bound] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71094. + Text;[bound];
  71095. + Equals;[=];
  71096. + MarkupTextLiteral - [12..13)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  71097. + SingleQuote;['];
  71098. + MarkupTagHelperAttributeValue - [13..17)::4
  71099. + CSharpExpressionLiteral - [13..17)::4 - [true] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  71100. + Text;[true];
  71101. + MarkupTextLiteral - [17..18)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  71102. + SingleQuote;['];
  71103. + MarkupTagHelperAttribute - [18..25)::7 - bound - DoubleQuotes - Bound - [ bound=]
  71104. + MarkupTextLiteral - [18..19)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71105. + Whitespace;[ ];
  71106. + MarkupTextLiteral - [19..24)::5 - [bound] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71107. + Text;[bound];
  71108. + Equals;[=];
  71109. + MarkupTagHelperAttributeValue - [25..25)::0
  71110. + CSharpExpressionLiteral - [25..25)::0 - [] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  71111. + MarkupTextLiteral - [25..29)::4 - [ />] - Gen<None> - SpanEditHandler;Accepts:Any
  71112. + Whitespace;[ ];
  71113. + ForwardSlash;[/];
  71114. + CloseAngle;[>];
  71115. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes7.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes7.cspans.txt
  71116. index 247b797cee4..ebd5438288f 100644
  71117. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes7.cspans.txt
  71118. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes7.cspans.txt
  71119. @@ -1 +1,2 @@
  71120. Code span at (12:0,12 [0] ) (Accepts:AnyExceptNewline) - Parent: Tag block at (0:0,0 [23] )
  71121. +Markup span at (19:0,19 [0] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [23] )
  71122. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes7.stree.txt
  71123. index a8883ba8949..2a5a6dce269 100644
  71124. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes7.stree.txt
  71125. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes7.stree.txt
  71126. @@ -1,7 +1,31 @@
  71127. -Markup block - Gen<None> - 23 - (0:0,0)
  71128. - Tag block - Gen<TagHelper> - 23 - (0:0,0) - myth - mythTagHelper
  71129. - SelfClosing - <myth bound= name='' />
  71130. - bound - DoubleQuotes
  71131. - Code span - Gen<None> - [] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (12:0,12) - Tokens:0
  71132. - name - SingleQuotes
  71133. - Markup block - Gen<None> - 0 - (0:0,0)
  71134. +RazorDocument - [0..23)::23 - [<myth bound= name='' />]
  71135. + MarkupBlock - [0..23)::23
  71136. + MarkupTagHelperElement - [0..23)::23 - myth[SelfClosing] - mythTagHelper
  71137. + MarkupTagHelperStartTag - [0..23)::23
  71138. + MarkupTextLiteral - [0..5)::5 - [<myth] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71139. + OpenAngle;[<];
  71140. + Text;[myth];
  71141. + MarkupTagHelperAttribute - [5..12)::7 - bound - DoubleQuotes - Bound - [ bound=]
  71142. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71143. + Whitespace;[ ];
  71144. + MarkupTextLiteral - [6..11)::5 - [bound] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71145. + Text;[bound];
  71146. + Equals;[=];
  71147. + MarkupTagHelperAttributeValue - [12..12)::0
  71148. + CSharpExpressionLiteral - [12..12)::0 - [] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  71149. + MarkupTagHelperAttribute - [12..20)::8 - name - SingleQuotes - Bound - [ name='']
  71150. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Any
  71151. + Whitespace;[ ];
  71152. + MarkupTextLiteral - [13..17)::4 - [name] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71153. + Text;[name];
  71154. + Equals;[=];
  71155. + MarkupTextLiteral - [18..19)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  71156. + SingleQuote;['];
  71157. + MarkupTagHelperAttributeValue - [19..19)::0
  71158. + MarkupTextLiteral - [19..19)::0 - []
  71159. + MarkupTextLiteral - [19..20)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  71160. + SingleQuote;['];
  71161. + MarkupTextLiteral - [20..23)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71162. + Whitespace;[ ];
  71163. + ForwardSlash;[/];
  71164. + CloseAngle;[>];
  71165. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes8.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes8.stree.txt
  71166. index 055da346b30..e42c4f27cf1 100644
  71167. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes8.stree.txt
  71168. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes8.stree.txt
  71169. @@ -1,8 +1,32 @@
  71170. -Markup block - Gen<None> - 25 - (0:0,0)
  71171. - Tag block - Gen<TagHelper> - 25 - (0:0,0) - myth - mythTagHelper
  71172. - SelfClosing - <myth bound= name=' ' />
  71173. - bound - DoubleQuotes
  71174. - Code span - Gen<None> - [] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (12:0,12) - Tokens:0
  71175. - name - SingleQuotes
  71176. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:1
  71177. - SyntaxKind.Whitespace;[ ];
  71178. +RazorDocument - [0..25)::25 - [<myth bound= name=' ' />]
  71179. + MarkupBlock - [0..25)::25
  71180. + MarkupTagHelperElement - [0..25)::25 - myth[SelfClosing] - mythTagHelper
  71181. + MarkupTagHelperStartTag - [0..25)::25
  71182. + MarkupTextLiteral - [0..5)::5 - [<myth] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71183. + OpenAngle;[<];
  71184. + Text;[myth];
  71185. + MarkupTagHelperAttribute - [5..12)::7 - bound - DoubleQuotes - Bound - [ bound=]
  71186. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71187. + Whitespace;[ ];
  71188. + MarkupTextLiteral - [6..11)::5 - [bound] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71189. + Text;[bound];
  71190. + Equals;[=];
  71191. + MarkupTagHelperAttributeValue - [12..12)::0
  71192. + CSharpExpressionLiteral - [12..12)::0 - [] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  71193. + MarkupTagHelperAttribute - [12..22)::10 - name - SingleQuotes - Bound - [ name=' ']
  71194. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Any
  71195. + Whitespace;[ ];
  71196. + MarkupTextLiteral - [13..17)::4 - [name] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71197. + Text;[name];
  71198. + Equals;[=];
  71199. + MarkupTextLiteral - [18..19)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  71200. + SingleQuote;['];
  71201. + MarkupTagHelperAttributeValue - [19..21)::2
  71202. + MarkupTextLiteral - [19..21)::2 - [ ]
  71203. + Whitespace;[ ];
  71204. + MarkupTextLiteral - [21..22)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  71205. + SingleQuote;['];
  71206. + MarkupTextLiteral - [22..25)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71207. + Whitespace;[ ];
  71208. + ForwardSlash;[/];
  71209. + CloseAngle;[>];
  71210. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes9.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes9.stree.txt
  71211. index 35e2d2f7122..005e8ca3f50 100644
  71212. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes9.stree.txt
  71213. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForEmptyTagHelperBoundAttributes9.stree.txt
  71214. @@ -1,13 +1,53 @@
  71215. -Markup block - Gen<None> - 46 - (0:0,0)
  71216. - Tag block - Gen<TagHelper> - 46 - (0:0,0) - myth - mythTagHelper
  71217. - SelfClosing - <myth bound='true' name='john' bound= name= />
  71218. - bound - SingleQuotes
  71219. - Code span - Gen<Expr> - [true] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (13:0,13) - Tokens:1
  71220. - SyntaxKind.Text;[true];
  71221. - name - SingleQuotes
  71222. - Markup span - Gen<Markup> - [john] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:1
  71223. - SyntaxKind.Text;[john];
  71224. - bound - DoubleQuotes
  71225. - Code span - Gen<None> - [] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (37:0,37) - Tokens:0
  71226. - name - DoubleQuotes
  71227. - Markup span - Gen<None> - [] - SpanEditHandler;Accepts:Any - (43:0,43) - Tokens:0
  71228. +RazorDocument - [0..46)::46 - [<myth bound='true' name='john' bound= name= />]
  71229. + MarkupBlock - [0..46)::46
  71230. + MarkupTagHelperElement - [0..46)::46 - myth[SelfClosing] - mythTagHelper
  71231. + MarkupTagHelperStartTag - [0..46)::46
  71232. + MarkupTextLiteral - [0..5)::5 - [<myth] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71233. + OpenAngle;[<];
  71234. + Text;[myth];
  71235. + MarkupTagHelperAttribute - [5..18)::13 - bound - SingleQuotes - Bound - [ bound='true']
  71236. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71237. + Whitespace;[ ];
  71238. + MarkupTextLiteral - [6..11)::5 - [bound] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71239. + Text;[bound];
  71240. + Equals;[=];
  71241. + MarkupTextLiteral - [12..13)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  71242. + SingleQuote;['];
  71243. + MarkupTagHelperAttributeValue - [13..17)::4
  71244. + CSharpExpressionLiteral - [13..17)::4 - [true] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  71245. + Text;[true];
  71246. + MarkupTextLiteral - [17..18)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  71247. + SingleQuote;['];
  71248. + MarkupTagHelperAttribute - [18..30)::12 - name - SingleQuotes - Bound - [ name='john']
  71249. + MarkupTextLiteral - [18..19)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71250. + Whitespace;[ ];
  71251. + MarkupTextLiteral - [19..23)::4 - [name] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71252. + Text;[name];
  71253. + Equals;[=];
  71254. + MarkupTextLiteral - [24..25)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  71255. + SingleQuote;['];
  71256. + MarkupTagHelperAttributeValue - [25..29)::4
  71257. + MarkupTextLiteral - [25..29)::4 - [john] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71258. + Text;[john];
  71259. + MarkupTextLiteral - [29..30)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  71260. + SingleQuote;['];
  71261. + MarkupTagHelperAttribute - [30..37)::7 - bound - DoubleQuotes - Bound - [ bound=]
  71262. + MarkupTextLiteral - [30..31)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71263. + Whitespace;[ ];
  71264. + MarkupTextLiteral - [31..36)::5 - [bound] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71265. + Text;[bound];
  71266. + Equals;[=];
  71267. + MarkupTagHelperAttributeValue - [37..37)::0
  71268. + CSharpExpressionLiteral - [37..37)::0 - [] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  71269. + MarkupTagHelperAttribute - [37..43)::6 - name - DoubleQuotes - Bound - [ name=]
  71270. + MarkupTextLiteral - [37..38)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Any
  71271. + Whitespace;[ ];
  71272. + MarkupTextLiteral - [38..42)::4 - [name] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71273. + Text;[name];
  71274. + Equals;[=];
  71275. + MarkupTagHelperAttributeValue - [43..43)::0
  71276. + MarkupTextLiteral - [43..43)::0 - []
  71277. + MarkupTextLiteral - [43..46)::3 - [ />] - Gen<None> - SpanEditHandler;Accepts:Any
  71278. + Whitespace;[ ];
  71279. + ForwardSlash;[/];
  71280. + CloseAngle;[>];
  71281. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper1.stree.txt
  71282. index a6461887d31..2ecc0466861 100644
  71283. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper1.stree.txt
  71284. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper1.stree.txt
  71285. @@ -1,3 +1,7 @@
  71286. -Markup block - Gen<None> - 2 - (0:0,0)
  71287. - Tag block - Gen<TagHelper> - 2 - (0:0,0) - p - ptaghelper
  71288. - StartTagAndEndTag - <p
  71289. +RazorDocument - [0..2)::2 - [<p]
  71290. + MarkupBlock - [0..2)::2
  71291. + MarkupTagHelperElement - [0..2)::2 - p[StartTagAndEndTag] - ptaghelper
  71292. + MarkupTagHelperStartTag - [0..2)::2
  71293. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71294. + OpenAngle;[<];
  71295. + Text;[p];
  71296. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper2.stree.txt
  71297. index fde439812af..186cf6f22ae 100644
  71298. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper2.stree.txt
  71299. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper2.stree.txt
  71300. @@ -1,3 +1,13 @@
  71301. -Markup block - Gen<None> - 6 - (0:0,0)
  71302. - Tag block - Gen<TagHelper> - 6 - (0:0,0) - p - ptaghelper
  71303. - StartTagAndEndTag - <p> ... </p
  71304. +RazorDocument - [0..6)::6 - [<p></p]
  71305. + MarkupBlock - [0..6)::6
  71306. + MarkupTagHelperElement - [0..6)::6 - p[StartTagAndEndTag] - ptaghelper
  71307. + MarkupTagHelperStartTag - [0..3)::3
  71308. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71309. + OpenAngle;[<];
  71310. + Text;[p];
  71311. + CloseAngle;[>];
  71312. + MarkupTagHelperEndTag - [3..6)::3
  71313. + MarkupTextLiteral - [3..6)::3 - [</p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71314. + OpenAngle;[<];
  71315. + ForwardSlash;[/];
  71316. + Text;[p];
  71317. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper3.stree.txt
  71318. index ca5b20b10ae..03d64a0250e 100644
  71319. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper3.stree.txt
  71320. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper3.stree.txt
  71321. @@ -1,5 +1,13 @@
  71322. -Markup block - Gen<None> - 10 - (0:0,0)
  71323. - Tag block - Gen<TagHelper> - 10 - (0:0,0) - p - ptaghelper
  71324. - StartTagAndEndTag - <p>
  71325. - Tag block - Gen<TagHelper> - 7 - (3:0,3) - strong - strongtaghelper
  71326. - StartTagAndEndTag - <strong
  71327. +RazorDocument - [0..10)::10 - [<p><strong]
  71328. + MarkupBlock - [0..10)::10
  71329. + MarkupTagHelperElement - [0..10)::10 - p[StartTagAndEndTag] - ptaghelper
  71330. + MarkupTagHelperStartTag - [0..3)::3
  71331. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71332. + OpenAngle;[<];
  71333. + Text;[p];
  71334. + CloseAngle;[>];
  71335. + MarkupTagHelperElement - [3..10)::7 - strong[StartTagAndEndTag] - strongtaghelper
  71336. + MarkupTagHelperStartTag - [3..10)::7
  71337. + MarkupTextLiteral - [3..10)::7 - [<strong] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71338. + OpenAngle;[<];
  71339. + Text;[strong];
  71340. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper4.stree.txt
  71341. index e3c28c4d4a7..a2c7689c078 100644
  71342. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper4.stree.txt
  71343. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper4.stree.txt
  71344. @@ -1,5 +1,14 @@
  71345. -Markup block - Gen<None> - 11 - (0:0,0)
  71346. - Tag block - Gen<TagHelper> - 11 - (0:0,0) - strong - strongtaghelper
  71347. - StartTagAndEndTag - <strong
  71348. - Tag block - Gen<TagHelper> - 3 - (8:0,8) - p - ptaghelper
  71349. - StartTagAndEndTag - <p>
  71350. +RazorDocument - [0..11)::11 - [<strong <p>]
  71351. + MarkupBlock - [0..11)::11
  71352. + MarkupTagHelperElement - [0..11)::11 - strong[StartTagAndEndTag] - strongtaghelper
  71353. + MarkupTagHelperStartTag - [0..8)::8
  71354. + MarkupTextLiteral - [0..8)::8 - [<strong ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71355. + OpenAngle;[<];
  71356. + Text;[strong];
  71357. + Whitespace;[ ];
  71358. + MarkupTagHelperElement - [8..11)::3 - p[StartTagAndEndTag] - ptaghelper
  71359. + MarkupTagHelperStartTag - [8..11)::3
  71360. + MarkupTextLiteral - [8..11)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71361. + OpenAngle;[<];
  71362. + Text;[p];
  71363. + CloseAngle;[>];
  71364. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper5.stree.txt
  71365. index 605e599c384..257185be8cc 100644
  71366. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper5.stree.txt
  71367. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper5.stree.txt
  71368. @@ -1,3 +1,13 @@
  71369. -Markup block - Gen<None> - 16 - (0:0,0)
  71370. - Tag block - Gen<TagHelper> - 16 - (0:0,0) - strong - strongtaghelper
  71371. - StartTagAndEndTag - <strong ... </strong
  71372. +RazorDocument - [0..16)::16 - [<strong </strong]
  71373. + MarkupBlock - [0..16)::16
  71374. + MarkupTagHelperElement - [0..16)::16 - strong[StartTagAndEndTag] - strongtaghelper
  71375. + MarkupTagHelperStartTag - [0..8)::8
  71376. + MarkupTextLiteral - [0..8)::8 - [<strong ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71377. + OpenAngle;[<];
  71378. + Text;[strong];
  71379. + Whitespace;[ ];
  71380. + MarkupTagHelperEndTag - [8..16)::8
  71381. + MarkupTextLiteral - [8..16)::8 - [</strong] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71382. + OpenAngle;[<];
  71383. + ForwardSlash;[/];
  71384. + Text;[strong];
  71385. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper6.stree.txt
  71386. index 509e7603760..eb31c824016 100644
  71387. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper6.stree.txt
  71388. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper6.stree.txt
  71389. @@ -1,20 +1,25 @@
  71390. -Markup block - Gen<None> - 16 - (0:0,0)
  71391. - Tag block - Gen<None> - 1 - (0:0,0)
  71392. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  71393. - SyntaxKind.OpenAngle;[<];
  71394. - Tag block - Gen<None> - 1 - (1:0,1)
  71395. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:1
  71396. - SyntaxKind.OpenAngle;[<];
  71397. - Tag block - Gen<None> - 9 - (2:0,2)
  71398. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:4
  71399. - SyntaxKind.OpenAngle;[<];
  71400. - SyntaxKind.ForwardSlash;[/];
  71401. - SyntaxKind.Text;[strong];
  71402. - SyntaxKind.CloseAngle;[>];
  71403. - SyntaxKind.HtmlTextLiteral - [ ] - [11..12) - FullWidth: 1 - Slots: 1
  71404. - SyntaxKind.Whitespace;[ ];
  71405. - Tag block - Gen<None> - 1 - (12:0,12)
  71406. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:1
  71407. - SyntaxKind.OpenAngle;[<];
  71408. - Tag block - Gen<TagHelper> - 3 - (13:0,13) - p - ptaghelper
  71409. - StartTagAndEndTag - <p>
  71410. +RazorDocument - [0..16)::16 - [<<</strong> <<p>]
  71411. + MarkupBlock - [0..16)::16
  71412. + MarkupTagBlock - [0..1)::1 - [<]
  71413. + MarkupTextLiteral - [0..1)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71414. + OpenAngle;[<];
  71415. + MarkupTagBlock - [1..2)::1 - [<]
  71416. + MarkupTextLiteral - [1..2)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71417. + OpenAngle;[<];
  71418. + MarkupTagBlock - [2..11)::9 - [</strong>]
  71419. + MarkupTextLiteral - [2..11)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71420. + OpenAngle;[<];
  71421. + ForwardSlash;[/];
  71422. + Text;[strong];
  71423. + CloseAngle;[>];
  71424. + MarkupTextLiteral - [11..12)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71425. + Whitespace;[ ];
  71426. + MarkupTagBlock - [12..13)::1 - [<]
  71427. + MarkupTextLiteral - [12..13)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71428. + OpenAngle;[<];
  71429. + MarkupTagHelperElement - [13..16)::3 - p[StartTagAndEndTag] - ptaghelper
  71430. + MarkupTagHelperStartTag - [13..16)::3
  71431. + MarkupTextLiteral - [13..16)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71432. + OpenAngle;[<];
  71433. + Text;[p];
  71434. + CloseAngle;[>];
  71435. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper7.stree.txt
  71436. index 336b1dea63e..978081f9bee 100644
  71437. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper7.stree.txt
  71438. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper7.stree.txt
  71439. @@ -1,22 +1,26 @@
  71440. -Markup block - Gen<None> - 16 - (0:0,0)
  71441. - Tag block - Gen<None> - 1 - (0:0,0)
  71442. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  71443. - SyntaxKind.OpenAngle;[<];
  71444. - Tag block - Gen<None> - 1 - (1:0,1)
  71445. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:1
  71446. - SyntaxKind.OpenAngle;[<];
  71447. - Tag block - Gen<TagHelper> - 14 - (2:0,2) - strong - strongtaghelper
  71448. - StartTagAndEndTag - <strong>
  71449. - SyntaxKind.HtmlTextLiteral - [> ] - [10..12) - FullWidth: 2 - Slots: 1
  71450. - SyntaxKind.List - [> ] - [10..12) - FullWidth: 2 - Slots: 2
  71451. - SyntaxKind.CloseAngle;[>];
  71452. - SyntaxKind.Whitespace;[ ];
  71453. - Tag block - Gen<None> - 1 - (12:0,12)
  71454. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:1
  71455. - SyntaxKind.OpenAngle;[<];
  71456. - Tag block - Gen<None> - 2 - (13:0,13)
  71457. - Markup span - Gen<Markup> - [<>] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:2
  71458. - SyntaxKind.OpenAngle;[<];
  71459. - SyntaxKind.CloseAngle;[>];
  71460. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:1
  71461. - SyntaxKind.CloseAngle;[>];
  71462. +RazorDocument - [0..16)::16 - [<<<strong>> <<>>]
  71463. + MarkupBlock - [0..16)::16
  71464. + MarkupTagBlock - [0..1)::1 - [<]
  71465. + MarkupTextLiteral - [0..1)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71466. + OpenAngle;[<];
  71467. + MarkupTagBlock - [1..2)::1 - [<]
  71468. + MarkupTextLiteral - [1..2)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71469. + OpenAngle;[<];
  71470. + MarkupTagHelperElement - [2..16)::14 - strong[StartTagAndEndTag] - strongtaghelper
  71471. + MarkupTagHelperStartTag - [2..10)::8
  71472. + MarkupTextLiteral - [2..10)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71473. + OpenAngle;[<];
  71474. + Text;[strong];
  71475. + CloseAngle;[>];
  71476. + MarkupTextLiteral - [10..12)::2 - [> ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71477. + CloseAngle;[>];
  71478. + Whitespace;[ ];
  71479. + MarkupTagBlock - [12..13)::1 - [<]
  71480. + MarkupTextLiteral - [12..13)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71481. + OpenAngle;[<];
  71482. + MarkupTagBlock - [13..15)::2 - [<>]
  71483. + MarkupTextLiteral - [13..15)::2 - [<>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71484. + OpenAngle;[<];
  71485. + CloseAngle;[>];
  71486. + MarkupTextLiteral - [15..16)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71487. + CloseAngle;[>];
  71488. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper8.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper8.stree.txt
  71489. index d82821826aa..3cf0bb56b1c 100644
  71490. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper8.stree.txt
  71491. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelper8.stree.txt
  71492. @@ -1,13 +1,24 @@
  71493. -Markup block - Gen<None> - 25 - (0:0,0)
  71494. - Tag block - Gen<None> - 4 - (0:0,0)
  71495. - Markup span - Gen<Markup> - [<str] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  71496. - SyntaxKind.OpenAngle;[<];
  71497. - SyntaxKind.Text;[str];
  71498. - Tag block - Gen<TagHelper> - 21 - (4:0,4) - strong - strongtaghelper
  71499. - StartTagAndEndTag - <strong> ... </strong>
  71500. - Tag block - Gen<None> - 4 - (12:0,12)
  71501. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:4
  71502. - SyntaxKind.OpenAngle;[<];
  71503. - SyntaxKind.ForwardSlash;[/];
  71504. - SyntaxKind.Text;[p];
  71505. - SyntaxKind.CloseAngle;[>];
  71506. +RazorDocument - [0..25)::25 - [<str<strong></p></strong>]
  71507. + MarkupBlock - [0..25)::25
  71508. + MarkupTagBlock - [0..4)::4 - [<str]
  71509. + MarkupTextLiteral - [0..4)::4 - [<str] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71510. + OpenAngle;[<];
  71511. + Text;[str];
  71512. + MarkupTagHelperElement - [4..25)::21 - strong[StartTagAndEndTag] - strongtaghelper
  71513. + MarkupTagHelperStartTag - [4..12)::8
  71514. + MarkupTextLiteral - [4..12)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71515. + OpenAngle;[<];
  71516. + Text;[strong];
  71517. + CloseAngle;[>];
  71518. + MarkupTagBlock - [12..16)::4 - [</p>]
  71519. + MarkupTextLiteral - [12..16)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71520. + OpenAngle;[<];
  71521. + ForwardSlash;[/];
  71522. + Text;[p];
  71523. + CloseAngle;[>];
  71524. + MarkupTagHelperEndTag - [16..25)::9
  71525. + MarkupTextLiteral - [16..25)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71526. + OpenAngle;[<];
  71527. + ForwardSlash;[/];
  71528. + Text;[strong];
  71529. + CloseAngle;[>];
  71530. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes1.stree.txt
  71531. index 22d283205f3..8d96abb6a48 100644
  71532. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes1.stree.txt
  71533. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes1.stree.txt
  71534. @@ -1,5 +1,17 @@
  71535. -Markup block - Gen<None> - 10 - (0:0,0)
  71536. - Tag block - Gen<TagHelper> - 10 - (0:0,0) - p - ptaghelper
  71537. - StartTagAndEndTag - <p class='
  71538. - class - SingleQuotes
  71539. - Markup span - Gen<None> - [] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:0
  71540. +RazorDocument - [0..10)::10 - [<p class=']
  71541. + MarkupBlock - [0..10)::10
  71542. + MarkupTagHelperElement - [0..10)::10 - p[StartTagAndEndTag] - ptaghelper
  71543. + MarkupTagHelperStartTag - [0..10)::10
  71544. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71545. + OpenAngle;[<];
  71546. + Text;[p];
  71547. + MarkupTagHelperAttribute - [2..10)::8 - class - SingleQuotes - Unbound - [ class=']
  71548. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71549. + Whitespace;[ ];
  71550. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71551. + Text;[class];
  71552. + Equals;[=];
  71553. + MarkupTextLiteral - [9..10)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  71554. + SingleQuote;['];
  71555. + MarkupTagHelperAttributeValue - [10..10)::0
  71556. + MarkupTextLiteral - [10..10)::0 - []
  71557. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes10.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes10.stree.txt
  71558. index 1c6dcfdb78f..a51c32805b1 100644
  71559. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes10.stree.txt
  71560. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes10.stree.txt
  71561. @@ -1,6 +1,28 @@
  71562. -Markup block - Gen<None> - 31 - (0:0,0)
  71563. - Tag block - Gen<TagHelper> - 31 - (0:0,0) - p - ptaghelper
  71564. - StartTagAndEndTag - <p class=btn" bar="foo"<strong>
  71565. - class - NoQuotes
  71566. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:1
  71567. - SyntaxKind.Text;[btn];
  71568. +RazorDocument - [0..31)::31 - [<p class=btn" bar="foo"<strong>]
  71569. + MarkupBlock - [0..31)::31
  71570. + MarkupTagHelperElement - [0..31)::31 - p[StartTagAndEndTag] - ptaghelper
  71571. + MarkupTagHelperStartTag - [0..31)::31
  71572. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71573. + OpenAngle;[<];
  71574. + Text;[p];
  71575. + MarkupTagHelperAttribute - [2..12)::10 - class - DoubleQuotes - Unbound - [ class=btn]
  71576. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71577. + Whitespace;[ ];
  71578. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71579. + Text;[class];
  71580. + Equals;[=];
  71581. + MarkupTagHelperAttributeValue - [9..12)::3
  71582. + MarkupLiteralAttributeValue - [9..12)::3 - [btn]
  71583. + MarkupTextLiteral - [9..12)::3 - [btn] - Gen<None> - SpanEditHandler;Accepts:Any
  71584. + Text;[btn];
  71585. + MarkupTextLiteral - [12..31)::19 - [" bar="foo"<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71586. + DoubleQuote;["];
  71587. + Whitespace;[ ];
  71588. + Text;[bar];
  71589. + Equals;[=];
  71590. + DoubleQuote;["];
  71591. + Text;[foo];
  71592. + DoubleQuote;["];
  71593. + OpenAngle;[<];
  71594. + Text;[strong];
  71595. + CloseAngle;[>];
  71596. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes11.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes11.stree.txt
  71597. index aee82e9ead2..b557217f0f6 100644
  71598. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes11.stree.txt
  71599. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes11.stree.txt
  71600. @@ -1,14 +1,37 @@
  71601. -Markup block - Gen<None> - 31 - (0:0,0)
  71602. - Tag block - Gen<TagHelper> - 31 - (0:0,0) - p - ptaghelper
  71603. - StartTagAndEndTag - <p class="btn bar="foo"
  71604. - class - DoubleQuotes
  71605. - Markup block - Gen<None> - 8 - (10:0,10)
  71606. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  71607. - SyntaxKind.Text;[btn];
  71608. - Markup span - Gen<Markup> - [ bar=] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:3
  71609. - SyntaxKind.Whitespace;[ ];
  71610. - SyntaxKind.Text;[bar];
  71611. - SyntaxKind.Equals;[=];
  71612. - foo - Minimized
  71613. - Tag block - Gen<TagHelper> - 8 - (23:0,23) - strong - strongtaghelper
  71614. - StartTagAndEndTag - <strong>
  71615. +RazorDocument - [0..31)::31 - [<p class="btn bar="foo"<strong>]
  71616. + MarkupBlock - [0..31)::31
  71617. + MarkupTagHelperElement - [0..31)::31 - p[StartTagAndEndTag] - ptaghelper
  71618. + MarkupTagHelperStartTag - [0..23)::23
  71619. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71620. + OpenAngle;[<];
  71621. + Text;[p];
  71622. + MarkupTagHelperAttribute - [2..19)::17 - class - DoubleQuotes - Unbound - [ class="btn bar="]
  71623. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71624. + Whitespace;[ ];
  71625. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71626. + Text;[class];
  71627. + Equals;[=];
  71628. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  71629. + DoubleQuote;["];
  71630. + MarkupTagHelperAttributeValue - [10..18)::8
  71631. + MarkupLiteralAttributeValue - [10..13)::3 - [btn]
  71632. + MarkupTextLiteral - [10..13)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71633. + Text;[btn];
  71634. + MarkupLiteralAttributeValue - [13..18)::5 - [ bar=]
  71635. + MarkupTextLiteral - [13..14)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71636. + Whitespace;[ ];
  71637. + MarkupTextLiteral - [14..18)::4 - [bar=] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71638. + Text;[bar];
  71639. + Equals;[=];
  71640. + MarkupTextLiteral - [18..19)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  71641. + DoubleQuote;["];
  71642. + MarkupMinimizedTagHelperAttribute - [19..23)::4 - foo" - Minimized - Unbound - [foo"]
  71643. + MarkupTextLiteral - [19..23)::4 - [foo"] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71644. + Text;[foo];
  71645. + DoubleQuote;["];
  71646. + MarkupTagHelperElement - [23..31)::8 - strong[StartTagAndEndTag] - strongtaghelper
  71647. + MarkupTagHelperStartTag - [23..31)::8
  71648. + MarkupTextLiteral - [23..31)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71649. + OpenAngle;[<];
  71650. + Text;[strong];
  71651. + CloseAngle;[>];
  71652. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes12.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes12.stree.txt
  71653. index 622e414b0ff..a1e7d384bc9 100644
  71654. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes12.stree.txt
  71655. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes12.stree.txt
  71656. @@ -1,12 +1,39 @@
  71657. -Markup block - Gen<None> - 28 - (0:0,0)
  71658. - Tag block - Gen<TagHelper> - 28 - (0:0,0) - p - ptaghelper
  71659. - StartTagAndEndTag - <p class="btn bar="foo"> ... </p>
  71660. - class - DoubleQuotes
  71661. - Markup block - Gen<None> - 8 - (10:0,10)
  71662. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  71663. - SyntaxKind.Text;[btn];
  71664. - Markup span - Gen<Markup> - [ bar=] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:3
  71665. - SyntaxKind.Whitespace;[ ];
  71666. - SyntaxKind.Text;[bar];
  71667. - SyntaxKind.Equals;[=];
  71668. - foo - Minimized
  71669. +RazorDocument - [0..28)::28 - [<p class="btn bar="foo"></p>]
  71670. + MarkupBlock - [0..28)::28
  71671. + MarkupTagHelperElement - [0..28)::28 - p[StartTagAndEndTag] - ptaghelper
  71672. + MarkupTagHelperStartTag - [0..24)::24
  71673. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71674. + OpenAngle;[<];
  71675. + Text;[p];
  71676. + MarkupTagHelperAttribute - [2..19)::17 - class - DoubleQuotes - Unbound - [ class="btn bar="]
  71677. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71678. + Whitespace;[ ];
  71679. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71680. + Text;[class];
  71681. + Equals;[=];
  71682. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  71683. + DoubleQuote;["];
  71684. + MarkupTagHelperAttributeValue - [10..18)::8
  71685. + MarkupLiteralAttributeValue - [10..13)::3 - [btn]
  71686. + MarkupTextLiteral - [10..13)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71687. + Text;[btn];
  71688. + MarkupLiteralAttributeValue - [13..18)::5 - [ bar=]
  71689. + MarkupTextLiteral - [13..14)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71690. + Whitespace;[ ];
  71691. + MarkupTextLiteral - [14..18)::4 - [bar=] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71692. + Text;[bar];
  71693. + Equals;[=];
  71694. + MarkupTextLiteral - [18..19)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  71695. + DoubleQuote;["];
  71696. + MarkupMinimizedTagHelperAttribute - [19..23)::4 - foo" - Minimized - Unbound - [foo"]
  71697. + MarkupTextLiteral - [19..23)::4 - [foo"] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71698. + Text;[foo];
  71699. + DoubleQuote;["];
  71700. + MarkupTextLiteral - [23..24)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71701. + CloseAngle;[>];
  71702. + MarkupTagHelperEndTag - [24..28)::4
  71703. + MarkupTextLiteral - [24..28)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71704. + OpenAngle;[<];
  71705. + ForwardSlash;[/];
  71706. + Text;[p];
  71707. + CloseAngle;[>];
  71708. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes13.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes13.stree.txt
  71709. index d1b413266d3..9fddb8a454e 100644
  71710. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes13.stree.txt
  71711. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes13.stree.txt
  71712. @@ -1,3 +1,32 @@
  71713. -Markup block - Gen<None> - 33 - (0:0,0)
  71714. - Tag block - Gen<TagHelper> - 33 - (0:0,0) - p - ptaghelper
  71715. - StartTagAndEndTag - <p @DateTime.Now class="btn"> ... </p>
  71716. +RazorDocument - [0..33)::33 - [<p @DateTime.Now class="btn"></p>]
  71717. + MarkupBlock - [0..33)::33
  71718. + MarkupTagHelperElement - [0..33)::33 - p[StartTagAndEndTag] - ptaghelper
  71719. + MarkupTagHelperStartTag - [0..29)::29
  71720. + MarkupTextLiteral - [0..3)::3 - [<p ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71721. + OpenAngle;[<];
  71722. + Text;[p];
  71723. + Whitespace;[ ];
  71724. + CSharpCodeBlock - [3..16)::13
  71725. + CSharpImplicitExpression - [3..16)::13
  71726. + CSharpTransition - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  71727. + Transition;[@];
  71728. + CSharpImplicitExpressionBody - [4..16)::12
  71729. + CSharpCodeBlock - [4..16)::12
  71730. + CSharpExpressionLiteral - [4..16)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  71731. + Identifier;[DateTime];
  71732. + Dot;[.];
  71733. + Identifier;[Now];
  71734. + MarkupTextLiteral - [16..29)::13 - [ class="btn">] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71735. + Whitespace;[ ];
  71736. + Text;[class];
  71737. + Equals;[=];
  71738. + DoubleQuote;["];
  71739. + Text;[btn];
  71740. + DoubleQuote;["];
  71741. + CloseAngle;[>];
  71742. + MarkupTagHelperEndTag - [29..33)::4
  71743. + MarkupTextLiteral - [29..33)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71744. + OpenAngle;[<];
  71745. + ForwardSlash;[/];
  71746. + Text;[p];
  71747. + CloseAngle;[>];
  71748. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes14.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes14.stree.txt
  71749. index 1f20b3328e3..8fd1e19d165 100644
  71750. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes14.stree.txt
  71751. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes14.stree.txt
  71752. @@ -1,3 +1,30 @@
  71753. -Markup block - Gen<None> - 27 - (0:0,0)
  71754. - Tag block - Gen<TagHelper> - 27 - (0:0,0) - p - ptaghelper
  71755. - StartTagAndEndTag - <p @DateTime.Now="btn"> ... </p>
  71756. +RazorDocument - [0..27)::27 - [<p @DateTime.Now="btn"></p>]
  71757. + MarkupBlock - [0..27)::27
  71758. + MarkupTagHelperElement - [0..27)::27 - p[StartTagAndEndTag] - ptaghelper
  71759. + MarkupTagHelperStartTag - [0..23)::23
  71760. + MarkupTextLiteral - [0..3)::3 - [<p ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71761. + OpenAngle;[<];
  71762. + Text;[p];
  71763. + Whitespace;[ ];
  71764. + CSharpCodeBlock - [3..16)::13
  71765. + CSharpImplicitExpression - [3..16)::13
  71766. + CSharpTransition - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  71767. + Transition;[@];
  71768. + CSharpImplicitExpressionBody - [4..16)::12
  71769. + CSharpCodeBlock - [4..16)::12
  71770. + CSharpExpressionLiteral - [4..16)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  71771. + Identifier;[DateTime];
  71772. + Dot;[.];
  71773. + Identifier;[Now];
  71774. + MarkupTextLiteral - [16..23)::7 - [="btn">] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71775. + Equals;[=];
  71776. + DoubleQuote;["];
  71777. + Text;[btn];
  71778. + DoubleQuote;["];
  71779. + CloseAngle;[>];
  71780. + MarkupTagHelperEndTag - [23..27)::4
  71781. + MarkupTextLiteral - [23..27)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71782. + OpenAngle;[<];
  71783. + ForwardSlash;[/];
  71784. + Text;[p];
  71785. + CloseAngle;[>];
  71786. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes15.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes15.stree.txt
  71787. index cc5b56ea85a..c5701d7cafe 100644
  71788. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes15.stree.txt
  71789. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes15.stree.txt
  71790. @@ -1,13 +1,33 @@
  71791. -Markup block - Gen<None> - 28 - (0:0,0)
  71792. - Tag block - Gen<TagHelper> - 28 - (0:0,0) - p - ptaghelper
  71793. - StartTagAndEndTag - <p [email protected]"></p>
  71794. - class - DoubleQuotes
  71795. - Markup block - Gen<None> - 13 - (9:0,9)
  71796. - Markup block - Gen<DynAttr:@(9:0,9)> - 13 - (9:0,9)
  71797. - Expression block - Gen<Expr> - 13 - (9:0,9)
  71798. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (9:0,9) - Tokens:1
  71799. - SyntaxKind.Transition;[@];
  71800. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (10:0,10) - Tokens:3
  71801. - SyntaxKind.Identifier;[DateTime];
  71802. - SyntaxKind.Dot;[.];
  71803. - SyntaxKind.Identifier;[Now];
  71804. +RazorDocument - [0..28)::28 - [<p [email protected]"></p>]
  71805. + MarkupBlock - [0..28)::28
  71806. + MarkupTagHelperElement - [0..28)::28 - p[StartTagAndEndTag] - ptaghelper
  71807. + MarkupTagHelperStartTag - [0..28)::28
  71808. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71809. + OpenAngle;[<];
  71810. + Text;[p];
  71811. + MarkupTagHelperAttribute - [2..22)::20 - class - DoubleQuotes - Unbound - [ [email protected]]
  71812. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71813. + Whitespace;[ ];
  71814. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71815. + Text;[class];
  71816. + Equals;[=];
  71817. + MarkupTagHelperAttributeValue - [9..22)::13
  71818. + MarkupDynamicAttributeValue - [9..22)::13 - [@DateTime.Now]
  71819. + GenericBlock - [9..22)::13
  71820. + CSharpCodeBlock - [9..22)::13
  71821. + CSharpImplicitExpression - [9..22)::13
  71822. + CSharpTransition - [9..10)::1 - Gen<None> - SpanEditHandler;Accepts:None
  71823. + Transition;[@];
  71824. + CSharpImplicitExpressionBody - [10..22)::12
  71825. + CSharpCodeBlock - [10..22)::12
  71826. + CSharpExpressionLiteral - [10..22)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  71827. + Identifier;[DateTime];
  71828. + Dot;[.];
  71829. + Identifier;[Now];
  71830. + MarkupTextLiteral - [22..28)::6 - ["></p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71831. + DoubleQuote;["];
  71832. + CloseAngle;[>];
  71833. + OpenAngle;[<];
  71834. + ForwardSlash;[/];
  71835. + Text;[p];
  71836. + CloseAngle;[>];
  71837. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes16.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes16.stree.txt
  71838. index 95fd33dca6c..14dbf9afaf5 100644
  71839. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes16.stree.txt
  71840. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes16.stree.txt
  71841. @@ -1,13 +1,25 @@
  71842. -Markup block - Gen<None> - 15 - (0:0,0)
  71843. - Tag block - Gen<TagHelper> - 15 - (0:0,0) - p - ptaghelper
  71844. - StartTagAndEndTag - <p class="@do {
  71845. - class - DoubleQuotes
  71846. - Markup block - Gen<None> - 5 - (10:0,10)
  71847. - Markup block - Gen<DynAttr:@(10:0,10)> - 5 - (10:0,10)
  71848. - Statement block - Gen<None> - 5 - (10:0,10)
  71849. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  71850. - SyntaxKind.Transition;[@];
  71851. - Code span - Gen<Stmt> - [do {] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:3
  71852. - SyntaxKind.Keyword;[do];
  71853. - SyntaxKind.Whitespace;[ ];
  71854. - SyntaxKind.LeftBrace;[{];
  71855. +RazorDocument - [0..15)::15 - [<p class="@do {]
  71856. + MarkupBlock - [0..15)::15
  71857. + MarkupTagHelperElement - [0..15)::15 - p[StartTagAndEndTag] - ptaghelper
  71858. + MarkupTagHelperStartTag - [0..15)::15
  71859. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71860. + OpenAngle;[<];
  71861. + Text;[p];
  71862. + MarkupTagHelperAttribute - [2..15)::13 - class - DoubleQuotes - Unbound - [ class="@do {]
  71863. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71864. + Whitespace;[ ];
  71865. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71866. + Text;[class];
  71867. + Equals;[=];
  71868. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  71869. + DoubleQuote;["];
  71870. + MarkupTagHelperAttributeValue - [10..15)::5
  71871. + MarkupDynamicAttributeValue - [10..15)::5 - [@do {]
  71872. + GenericBlock - [10..15)::5
  71873. + CSharpCodeBlock - [10..15)::5
  71874. + CSharpTransition - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  71875. + Transition;[@];
  71876. + CSharpStatementLiteral - [11..15)::4 - [do {] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  71877. + Keyword;[do];
  71878. + Whitespace;[ ];
  71879. + LeftBrace;[{];
  71880. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes17.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes17.stree.txt
  71881. index a5d10c0900b..6647fcda09f 100644
  71882. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes17.stree.txt
  71883. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes17.stree.txt
  71884. @@ -1,14 +1,26 @@
  71885. -Markup block - Gen<None> - 21 - (0:0,0)
  71886. - Tag block - Gen<TagHelper> - 21 - (0:0,0) - p - ptaghelper
  71887. - StartTagAndEndTag - <p class="@do {"></p>
  71888. - class - DoubleQuotes
  71889. - Markup block - Gen<None> - 11 - (10:0,10)
  71890. - Markup block - Gen<DynAttr:@(10:0,10)> - 11 - (10:0,10)
  71891. - Statement block - Gen<None> - 11 - (10:0,10)
  71892. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  71893. - SyntaxKind.Transition;[@];
  71894. - Code span - Gen<Stmt> - [do {"></p>] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:4
  71895. - SyntaxKind.Keyword;[do];
  71896. - SyntaxKind.Whitespace;[ ];
  71897. - SyntaxKind.LeftBrace;[{];
  71898. - SyntaxKind.StringLiteral;["></p>];RZ1000(15:0,15 [1] )
  71899. +RazorDocument - [0..21)::21 - [<p class="@do {"></p>]
  71900. + MarkupBlock - [0..21)::21
  71901. + MarkupTagHelperElement - [0..21)::21 - p[StartTagAndEndTag] - ptaghelper
  71902. + MarkupTagHelperStartTag - [0..21)::21
  71903. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71904. + OpenAngle;[<];
  71905. + Text;[p];
  71906. + MarkupTagHelperAttribute - [2..21)::19 - class - DoubleQuotes - Unbound - [ class="@do {"></p>]
  71907. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71908. + Whitespace;[ ];
  71909. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71910. + Text;[class];
  71911. + Equals;[=];
  71912. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  71913. + DoubleQuote;["];
  71914. + MarkupTagHelperAttributeValue - [10..21)::11
  71915. + MarkupDynamicAttributeValue - [10..21)::11 - [@do {"></p>]
  71916. + GenericBlock - [10..21)::11
  71917. + CSharpCodeBlock - [10..21)::11
  71918. + CSharpTransition - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  71919. + Transition;[@];
  71920. + CSharpStatementLiteral - [11..21)::10 - [do {"></p>] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  71921. + Keyword;[do];
  71922. + Whitespace;[ ];
  71923. + LeftBrace;[{];
  71924. + StringLiteral;["></p>];RZ1000(15:0,15 [1] )
  71925. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes18.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes18.stree.txt
  71926. index 1903f8d6b73..fee2f382b3f 100644
  71927. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes18.stree.txt
  71928. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes18.stree.txt
  71929. @@ -1,3 +1,29 @@
  71930. -Markup block - Gen<None> - 33 - (0:0,0)
  71931. - Tag block - Gen<TagHelper> - 33 - (0:0,0) - p - ptaghelper
  71932. - StartTagAndEndTag - <p @do { someattribute="btn"></p>
  71933. +RazorDocument - [0..33)::33 - [<p @do { someattribute="btn"></p>]
  71934. + MarkupBlock - [0..33)::33
  71935. + MarkupTagHelperElement - [0..33)::33 - p[StartTagAndEndTag] - ptaghelper
  71936. + MarkupTagHelperStartTag - [0..33)::33
  71937. + MarkupTextLiteral - [0..3)::3 - [<p ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71938. + OpenAngle;[<];
  71939. + Text;[p];
  71940. + Whitespace;[ ];
  71941. + CSharpCodeBlock - [3..33)::30
  71942. + CSharpTransition - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  71943. + Transition;[@];
  71944. + CSharpStatementLiteral - [4..29)::25 - [do { someattribute="btn">] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  71945. + Keyword;[do];
  71946. + Whitespace;[ ];
  71947. + LeftBrace;[{];
  71948. + Whitespace;[ ];
  71949. + Identifier;[someattribute];
  71950. + Assign;[=];
  71951. + StringLiteral;["btn"];
  71952. + GreaterThan;[>];
  71953. + MarkupBlock - [29..33)::4
  71954. + MarkupTagBlock - [29..33)::4 - [</p>]
  71955. + MarkupTextLiteral - [29..33)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  71956. + OpenAngle;[<];
  71957. + ForwardSlash;[/];
  71958. + Text;[p];
  71959. + CloseAngle;[>];
  71960. + CSharpStatementLiteral - [33..33)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  71961. + Marker;[];
  71962. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes19.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes19.stree.txt
  71963. index aeef6d802a3..a06593475ed 100644
  71964. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes19.stree.txt
  71965. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes19.stree.txt
  71966. @@ -1,6 +1,41 @@
  71967. -Markup block - Gen<None> - 38 - (0:0,0)
  71968. - Tag block - Gen<TagHelper> - 38 - (0:0,0) - p - ptaghelper
  71969. - StartTagAndEndTag - <p class=some=thing attr="@value"> ... </p>
  71970. - class - NoQuotes
  71971. - Markup span - Gen<Markup> - [some] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:1
  71972. - SyntaxKind.Text;[some];
  71973. +RazorDocument - [0..38)::38 - [<p class=some=thing attr="@value"></p>]
  71974. + MarkupBlock - [0..38)::38
  71975. + MarkupTagHelperElement - [0..38)::38 - p[StartTagAndEndTag] - ptaghelper
  71976. + MarkupTagHelperStartTag - [0..34)::34
  71977. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71978. + OpenAngle;[<];
  71979. + Text;[p];
  71980. + MarkupTagHelperAttribute - [2..13)::11 - class - DoubleQuotes - Unbound - [ class=some]
  71981. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71982. + Whitespace;[ ];
  71983. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71984. + Text;[class];
  71985. + Equals;[=];
  71986. + MarkupTagHelperAttributeValue - [9..13)::4
  71987. + MarkupLiteralAttributeValue - [9..13)::4 - [some]
  71988. + MarkupTextLiteral - [9..13)::4 - [some] - Gen<None> - SpanEditHandler;Accepts:Any
  71989. + Text;[some];
  71990. + MarkupTextLiteral - [13..26)::13 - [=thing attr="] - Gen<Markup> - SpanEditHandler;Accepts:Any
  71991. + Equals;[=];
  71992. + Text;[thing];
  71993. + Whitespace;[ ];
  71994. + Text;[attr];
  71995. + Equals;[=];
  71996. + DoubleQuote;["];
  71997. + CSharpCodeBlock - [26..32)::6
  71998. + CSharpImplicitExpression - [26..32)::6
  71999. + CSharpTransition - [26..27)::1 - Gen<None> - SpanEditHandler;Accepts:None
  72000. + Transition;[@];
  72001. + CSharpImplicitExpressionBody - [27..32)::5
  72002. + CSharpCodeBlock - [27..32)::5
  72003. + CSharpExpressionLiteral - [27..32)::5 - [value] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  72004. + Identifier;[value];
  72005. + MarkupTextLiteral - [32..34)::2 - [">] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72006. + DoubleQuote;["];
  72007. + CloseAngle;[>];
  72008. + MarkupTagHelperEndTag - [34..38)::4
  72009. + MarkupTextLiteral - [34..38)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72010. + OpenAngle;[<];
  72011. + ForwardSlash;[/];
  72012. + Text;[p];
  72013. + CloseAngle;[>];
  72014. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes2.stree.txt
  72015. index 6dea6ef53cd..74ca653cefe 100644
  72016. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes2.stree.txt
  72017. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes2.stree.txt
  72018. @@ -1,6 +1,27 @@
  72019. -Markup block - Gen<None> - 24 - (0:0,0)
  72020. - Tag block - Gen<TagHelper> - 24 - (0:0,0) - p - ptaghelper
  72021. - StartTagAndEndTag - <p bar="false"" <strong>
  72022. - bar - DoubleQuotes
  72023. - Markup span - Gen<Markup> - [false] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:1
  72024. - SyntaxKind.Text;[false];
  72025. +RazorDocument - [0..24)::24 - [<p bar="false"" <strong>]
  72026. + MarkupBlock - [0..24)::24
  72027. + MarkupTagHelperElement - [0..24)::24 - p[StartTagAndEndTag] - ptaghelper
  72028. + MarkupTagHelperStartTag - [0..24)::24
  72029. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72030. + OpenAngle;[<];
  72031. + Text;[p];
  72032. + MarkupTagHelperAttribute - [2..14)::12 - bar - DoubleQuotes - Unbound - [ bar="false"]
  72033. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72034. + Whitespace;[ ];
  72035. + MarkupTextLiteral - [3..6)::3 - [bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72036. + Text;[bar];
  72037. + Equals;[=];
  72038. + MarkupTextLiteral - [7..8)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72039. + DoubleQuote;["];
  72040. + MarkupTagHelperAttributeValue - [8..13)::5
  72041. + MarkupLiteralAttributeValue - [8..13)::5 - [false]
  72042. + MarkupTextLiteral - [8..13)::5 - [false] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72043. + Text;[false];
  72044. + MarkupTextLiteral - [13..14)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72045. + DoubleQuote;["];
  72046. + MarkupTextLiteral - [14..24)::10 - [" <strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72047. + DoubleQuote;["];
  72048. + Whitespace;[ ];
  72049. + OpenAngle;[<];
  72050. + Text;[strong];
  72051. + CloseAngle;[>];
  72052. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes3.stree.txt
  72053. index 79a06f3d1c2..dc36bfdead2 100644
  72054. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes3.stree.txt
  72055. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes3.stree.txt
  72056. @@ -1,12 +1,26 @@
  72057. -Markup block - Gen<None> - 23 - (0:0,0)
  72058. - Tag block - Gen<TagHelper> - 23 - (0:0,0) - p - ptaghelper
  72059. - StartTagAndEndTag - <p bar='false <strong>
  72060. - bar - SingleQuotes
  72061. - Markup block - Gen<None> - 15 - (8:0,8)
  72062. - Markup span - Gen<Markup> - [false] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:1
  72063. - SyntaxKind.Text;[false];
  72064. - Markup span - Gen<Markup> - [ <strong>] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:4
  72065. - SyntaxKind.Whitespace;[ ];
  72066. - SyntaxKind.OpenAngle;[<];
  72067. - SyntaxKind.Text;[strong];
  72068. - SyntaxKind.CloseAngle;[>];
  72069. +RazorDocument - [0..23)::23 - [<p bar='false <strong>]
  72070. + MarkupBlock - [0..23)::23
  72071. + MarkupTagHelperElement - [0..23)::23 - p[StartTagAndEndTag] - ptaghelper
  72072. + MarkupTagHelperStartTag - [0..23)::23
  72073. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72074. + OpenAngle;[<];
  72075. + Text;[p];
  72076. + MarkupTagHelperAttribute - [2..23)::21 - bar - SingleQuotes - Unbound - [ bar='false <strong>]
  72077. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72078. + Whitespace;[ ];
  72079. + MarkupTextLiteral - [3..6)::3 - [bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72080. + Text;[bar];
  72081. + Equals;[=];
  72082. + MarkupTextLiteral - [7..8)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  72083. + SingleQuote;['];
  72084. + MarkupTagHelperAttributeValue - [8..23)::15
  72085. + MarkupLiteralAttributeValue - [8..13)::5 - [false]
  72086. + MarkupTextLiteral - [8..13)::5 - [false] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72087. + Text;[false];
  72088. + MarkupLiteralAttributeValue - [13..23)::10 - [ <strong>]
  72089. + MarkupTextLiteral - [13..15)::2 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72090. + Whitespace;[ ];
  72091. + MarkupTextLiteral - [15..23)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72092. + OpenAngle;[<];
  72093. + Text;[strong];
  72094. + CloseAngle;[>];
  72095. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes4.stree.txt
  72096. index ef7059ecef6..61bff8f7afa 100644
  72097. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes4.stree.txt
  72098. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes4.stree.txt
  72099. @@ -1,11 +1,27 @@
  72100. -Markup block - Gen<None> - 23 - (0:0,0)
  72101. - Tag block - Gen<TagHelper> - 23 - (0:0,0) - p - ptaghelper
  72102. - StartTagAndEndTag - <p bar='false <strong'
  72103. - bar - SingleQuotes
  72104. - Markup block - Gen<None> - 14 - (8:0,8)
  72105. - Markup span - Gen<Markup> - [false] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:1
  72106. - SyntaxKind.Text;[false];
  72107. - Markup span - Gen<Markup> - [ <strong] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:3
  72108. - SyntaxKind.Whitespace;[ ];
  72109. - SyntaxKind.OpenAngle;[<];
  72110. - SyntaxKind.Text;[strong];
  72111. +RazorDocument - [0..23)::23 - [<p bar='false <strong']
  72112. + MarkupBlock - [0..23)::23
  72113. + MarkupTagHelperElement - [0..23)::23 - p[StartTagAndEndTag] - ptaghelper
  72114. + MarkupTagHelperStartTag - [0..23)::23
  72115. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72116. + OpenAngle;[<];
  72117. + Text;[p];
  72118. + MarkupTagHelperAttribute - [2..23)::21 - bar - SingleQuotes - Unbound - [ bar='false <strong']
  72119. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72120. + Whitespace;[ ];
  72121. + MarkupTextLiteral - [3..6)::3 - [bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72122. + Text;[bar];
  72123. + Equals;[=];
  72124. + MarkupTextLiteral - [7..8)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  72125. + SingleQuote;['];
  72126. + MarkupTagHelperAttributeValue - [8..22)::14
  72127. + MarkupLiteralAttributeValue - [8..13)::5 - [false]
  72128. + MarkupTextLiteral - [8..13)::5 - [false] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72129. + Text;[false];
  72130. + MarkupLiteralAttributeValue - [13..22)::9 - [ <strong]
  72131. + MarkupTextLiteral - [13..15)::2 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72132. + Whitespace;[ ];
  72133. + MarkupTextLiteral - [15..22)::7 - [<strong] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72134. + OpenAngle;[<];
  72135. + Text;[strong];
  72136. + MarkupTextLiteral - [22..23)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  72137. + SingleQuote;['];
  72138. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes5.stree.txt
  72139. index ed4e73b8b7d..47350779b43 100644
  72140. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes5.stree.txt
  72141. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes5.stree.txt
  72142. @@ -1,6 +1,19 @@
  72143. -Markup block - Gen<None> - 13 - (0:0,0)
  72144. - Tag block - Gen<TagHelper> - 13 - (0:0,0) - p - ptaghelper
  72145. - StartTagAndEndTag - <p bar=false'
  72146. - bar - NoQuotes
  72147. - Markup span - Gen<Markup> - [false] - SpanEditHandler;Accepts:Any - (7:0,7) - Tokens:1
  72148. - SyntaxKind.Text;[false];
  72149. +RazorDocument - [0..13)::13 - [<p bar=false']
  72150. + MarkupBlock - [0..13)::13
  72151. + MarkupTagHelperElement - [0..13)::13 - p[StartTagAndEndTag] - ptaghelper
  72152. + MarkupTagHelperStartTag - [0..13)::13
  72153. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72154. + OpenAngle;[<];
  72155. + Text;[p];
  72156. + MarkupTagHelperAttribute - [2..12)::10 - bar - DoubleQuotes - Unbound - [ bar=false]
  72157. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72158. + Whitespace;[ ];
  72159. + MarkupTextLiteral - [3..6)::3 - [bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72160. + Text;[bar];
  72161. + Equals;[=];
  72162. + MarkupTagHelperAttributeValue - [7..12)::5
  72163. + MarkupLiteralAttributeValue - [7..12)::5 - [false]
  72164. + MarkupTextLiteral - [7..12)::5 - [false] - Gen<None> - SpanEditHandler;Accepts:Any
  72165. + Text;[false];
  72166. + MarkupTextLiteral - [12..13)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72167. + SingleQuote;['];
  72168. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes6.stree.txt
  72169. index 5e5ad9ed991..3faff3a989c 100644
  72170. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes6.stree.txt
  72171. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes6.stree.txt
  72172. @@ -1,7 +1,20 @@
  72173. -Markup block - Gen<None> - 14 - (0:0,0)
  72174. - Tag block - Gen<TagHelper> - 14 - (0:0,0) - p - ptaghelper
  72175. - StartTagAndEndTag - <p bar="false'
  72176. - bar - DoubleQuotes
  72177. - Markup span - Gen<Markup> - [false'] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:2
  72178. - SyntaxKind.Text;[false];
  72179. - SyntaxKind.SingleQuote;['];
  72180. +RazorDocument - [0..14)::14 - [<p bar="false']
  72181. + MarkupBlock - [0..14)::14
  72182. + MarkupTagHelperElement - [0..14)::14 - p[StartTagAndEndTag] - ptaghelper
  72183. + MarkupTagHelperStartTag - [0..14)::14
  72184. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72185. + OpenAngle;[<];
  72186. + Text;[p];
  72187. + MarkupTagHelperAttribute - [2..14)::12 - bar - DoubleQuotes - Unbound - [ bar="false']
  72188. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72189. + Whitespace;[ ];
  72190. + MarkupTextLiteral - [3..6)::3 - [bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72191. + Text;[bar];
  72192. + Equals;[=];
  72193. + MarkupTextLiteral - [7..8)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72194. + DoubleQuote;["];
  72195. + MarkupTagHelperAttributeValue - [8..14)::6
  72196. + MarkupLiteralAttributeValue - [8..14)::6 - [false']
  72197. + MarkupTextLiteral - [8..14)::6 - [false'] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72198. + Text;[false];
  72199. + SingleQuote;['];
  72200. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes7.stree.txt
  72201. index 2ea91287698..6b63b10230c 100644
  72202. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes7.stree.txt
  72203. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes7.stree.txt
  72204. @@ -1,15 +1,29 @@
  72205. -Markup block - Gen<None> - 20 - (0:0,0)
  72206. - Tag block - Gen<TagHelper> - 20 - (0:0,0) - p - ptaghelper
  72207. - StartTagAndEndTag - <p bar="false' ></p>
  72208. - bar - DoubleQuotes
  72209. - Markup block - Gen<None> - 12 - (8:0,8)
  72210. - Markup span - Gen<Markup> - [false'] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:2
  72211. - SyntaxKind.Text;[false];
  72212. - SyntaxKind.SingleQuote;['];
  72213. - Markup span - Gen<Markup> - [ ></p>] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:6
  72214. - SyntaxKind.Whitespace;[ ];
  72215. - SyntaxKind.CloseAngle;[>];
  72216. - SyntaxKind.OpenAngle;[<];
  72217. - SyntaxKind.ForwardSlash;[/];
  72218. - SyntaxKind.Text;[p];
  72219. - SyntaxKind.CloseAngle;[>];
  72220. +RazorDocument - [0..20)::20 - [<p bar="false' ></p>]
  72221. + MarkupBlock - [0..20)::20
  72222. + MarkupTagHelperElement - [0..20)::20 - p[StartTagAndEndTag] - ptaghelper
  72223. + MarkupTagHelperStartTag - [0..20)::20
  72224. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72225. + OpenAngle;[<];
  72226. + Text;[p];
  72227. + MarkupTagHelperAttribute - [2..20)::18 - bar - DoubleQuotes - Unbound - [ bar="false' ></p>]
  72228. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72229. + Whitespace;[ ];
  72230. + MarkupTextLiteral - [3..6)::3 - [bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72231. + Text;[bar];
  72232. + Equals;[=];
  72233. + MarkupTextLiteral - [7..8)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72234. + DoubleQuote;["];
  72235. + MarkupTagHelperAttributeValue - [8..20)::12
  72236. + MarkupLiteralAttributeValue - [8..14)::6 - [false']
  72237. + MarkupTextLiteral - [8..14)::6 - [false'] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72238. + Text;[false];
  72239. + SingleQuote;['];
  72240. + MarkupLiteralAttributeValue - [14..20)::6 - [ ></p>]
  72241. + MarkupTextLiteral - [14..15)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72242. + Whitespace;[ ];
  72243. + MarkupTextLiteral - [15..20)::5 - [></p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72244. + CloseAngle;[>];
  72245. + OpenAngle;[<];
  72246. + ForwardSlash;[/];
  72247. + Text;[p];
  72248. + CloseAngle;[>];
  72249. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes8.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes8.stree.txt
  72250. index 7fea4843e0c..6fcfe9a1192 100644
  72251. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes8.stree.txt
  72252. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes8.stree.txt
  72253. @@ -1,7 +1,23 @@
  72254. -Markup block - Gen<None> - 18 - (0:0,0)
  72255. - Tag block - Gen<TagHelper> - 18 - (0:0,0) - p - ptaghelper
  72256. - StartTagAndEndTag - <p foo bar
  72257. - foo - Minimized
  72258. - bar - Minimized
  72259. - Tag block - Gen<TagHelper> - 8 - (10:0,10) - strong - strongtaghelper
  72260. - StartTagAndEndTag - <strong>
  72261. +RazorDocument - [0..18)::18 - [<p foo bar<strong>]
  72262. + MarkupBlock - [0..18)::18
  72263. + MarkupTagHelperElement - [0..18)::18 - p[StartTagAndEndTag] - ptaghelper
  72264. + MarkupTagHelperStartTag - [0..10)::10
  72265. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72266. + OpenAngle;[<];
  72267. + Text;[p];
  72268. + MarkupMinimizedTagHelperAttribute - [2..6)::4 - foo - Minimized - Unbound - [ foo]
  72269. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72270. + Whitespace;[ ];
  72271. + MarkupTextLiteral - [3..6)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72272. + Text;[foo];
  72273. + MarkupMinimizedTagHelperAttribute - [6..10)::4 - bar - Minimized - Unbound - [ bar]
  72274. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72275. + Whitespace;[ ];
  72276. + MarkupTextLiteral - [7..10)::3 - [bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72277. + Text;[bar];
  72278. + MarkupTagHelperElement - [10..18)::8 - strong[StartTagAndEndTag] - strongtaghelper
  72279. + MarkupTagHelperStartTag - [10..18)::8
  72280. + MarkupTextLiteral - [10..18)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72281. + OpenAngle;[<];
  72282. + Text;[strong];
  72283. + CloseAngle;[>];
  72284. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes9.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes9.stree.txt
  72285. index da978e235b4..7f50d841b6f 100644
  72286. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes9.stree.txt
  72287. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesErrorForMalformedTagHelpersWithAttributes9.stree.txt
  72288. @@ -1,6 +1,24 @@
  72289. -Markup block - Gen<None> - 25 - (0:0,0)
  72290. - Tag block - Gen<TagHelper> - 25 - (0:0,0) - p - ptaghelper
  72291. - StartTagAndEndTag - <p class=btn" bar<strong>
  72292. - class - NoQuotes
  72293. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:1
  72294. - SyntaxKind.Text;[btn];
  72295. +RazorDocument - [0..25)::25 - [<p class=btn" bar<strong>]
  72296. + MarkupBlock - [0..25)::25
  72297. + MarkupTagHelperElement - [0..25)::25 - p[StartTagAndEndTag] - ptaghelper
  72298. + MarkupTagHelperStartTag - [0..25)::25
  72299. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72300. + OpenAngle;[<];
  72301. + Text;[p];
  72302. + MarkupTagHelperAttribute - [2..12)::10 - class - DoubleQuotes - Unbound - [ class=btn]
  72303. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72304. + Whitespace;[ ];
  72305. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72306. + Text;[class];
  72307. + Equals;[=];
  72308. + MarkupTagHelperAttributeValue - [9..12)::3
  72309. + MarkupLiteralAttributeValue - [9..12)::3 - [btn]
  72310. + MarkupTextLiteral - [9..12)::3 - [btn] - Gen<None> - SpanEditHandler;Accepts:Any
  72311. + Text;[btn];
  72312. + MarkupTextLiteral - [12..25)::13 - [" bar<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72313. + DoubleQuote;["];
  72314. + Whitespace;[ ];
  72315. + Text;[bar];
  72316. + OpenAngle;[<];
  72317. + Text;[strong];
  72318. + CloseAngle;[>];
  72319. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes1.stree.txt
  72320. index 2d888961f5b..515061b10ad 100644
  72321. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes1.stree.txt
  72322. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes1.stree.txt
  72323. @@ -1,6 +1,24 @@
  72324. -Markup block - Gen<None> - 19 - (0:0,0)
  72325. - Tag block - Gen<TagHelper> - 19 - (0:0,0) - person - PersonTagHelper
  72326. - SelfClosing - <person age="12" />
  72327. - age - DoubleQuotes
  72328. - Code span - Gen<Expr> - [12] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (13:0,13) - Tokens:1
  72329. - SyntaxKind.Text;[12];
  72330. +RazorDocument - [0..19)::19 - [<person age="12" />]
  72331. + MarkupBlock - [0..19)::19
  72332. + MarkupTagHelperElement - [0..19)::19 - person[SelfClosing] - PersonTagHelper
  72333. + MarkupTagHelperStartTag - [0..19)::19
  72334. + MarkupTextLiteral - [0..7)::7 - [<person] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72335. + OpenAngle;[<];
  72336. + Text;[person];
  72337. + MarkupTagHelperAttribute - [7..16)::9 - age - DoubleQuotes - Bound - [ age="12"]
  72338. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72339. + Whitespace;[ ];
  72340. + MarkupTextLiteral - [8..11)::3 - [age] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72341. + Text;[age];
  72342. + Equals;[=];
  72343. + MarkupTextLiteral - [12..13)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72344. + DoubleQuote;["];
  72345. + MarkupTagHelperAttributeValue - [13..15)::2
  72346. + CSharpExpressionLiteral - [13..15)::2 - [12] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72347. + Text;[12];
  72348. + MarkupTextLiteral - [15..16)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72349. + DoubleQuote;["];
  72350. + MarkupTextLiteral - [16..19)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72351. + Whitespace;[ ];
  72352. + ForwardSlash;[/];
  72353. + CloseAngle;[>];
  72354. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes10.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes10.stree.txt
  72355. index 2e6b0917fb3..08d34db896e 100644
  72356. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes10.stree.txt
  72357. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes10.stree.txt
  72358. @@ -1,18 +1,55 @@
  72359. -Markup block - Gen<None> - 73 - (0:0,0)
  72360. - Tag block - Gen<TagHelper> - 73 - (0:0,0) - person - PersonTagHelper
  72361. - SelfClosing - <person age="12" birthday="DateTime.Now" name="@@BoundStringAttribute" />
  72362. - age - DoubleQuotes
  72363. - Code span - Gen<Expr> - [12] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (13:0,13) - Tokens:1
  72364. - SyntaxKind.Text;[12];
  72365. - birthday - DoubleQuotes
  72366. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (27:0,27) - Tokens:1
  72367. - SyntaxKind.Text;[DateTime.Now];
  72368. - name - DoubleQuotes
  72369. - Markup block - Gen<None> - 22 - (47:0,47)
  72370. - Markup block - Gen<None> - 2 - (47:0,47)
  72371. - Markup span - Gen<Markup> - [@] - SpanEditHandler;Accepts:None - (47:0,47) - Tokens:1
  72372. - SyntaxKind.Transition;[@];
  72373. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (48:0,48) - Tokens:1
  72374. - SyntaxKind.Transition;[@];
  72375. - Markup span - Gen<Markup> - [BoundStringAttribute] - SpanEditHandler;Accepts:Any - (49:0,49) - Tokens:1
  72376. - SyntaxKind.Text;[BoundStringAttribute];
  72377. +RazorDocument - [0..73)::73 - [<person age="12" birthday="DateTime.Now" name="@@BoundStringAttribute" />]
  72378. + MarkupBlock - [0..73)::73
  72379. + MarkupTagHelperElement - [0..73)::73 - person[SelfClosing] - PersonTagHelper
  72380. + MarkupTagHelperStartTag - [0..73)::73
  72381. + MarkupTextLiteral - [0..7)::7 - [<person] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72382. + OpenAngle;[<];
  72383. + Text;[person];
  72384. + MarkupTagHelperAttribute - [7..16)::9 - age - DoubleQuotes - Bound - [ age="12"]
  72385. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72386. + Whitespace;[ ];
  72387. + MarkupTextLiteral - [8..11)::3 - [age] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72388. + Text;[age];
  72389. + Equals;[=];
  72390. + MarkupTextLiteral - [12..13)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72391. + DoubleQuote;["];
  72392. + MarkupTagHelperAttributeValue - [13..15)::2
  72393. + CSharpExpressionLiteral - [13..15)::2 - [12] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72394. + Text;[12];
  72395. + MarkupTextLiteral - [15..16)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72396. + DoubleQuote;["];
  72397. + MarkupTagHelperAttribute - [16..40)::24 - birthday - DoubleQuotes - Bound - [ birthday="DateTime.Now"]
  72398. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72399. + Whitespace;[ ];
  72400. + MarkupTextLiteral - [17..25)::8 - [birthday] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72401. + Text;[birthday];
  72402. + Equals;[=];
  72403. + MarkupTextLiteral - [26..27)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72404. + DoubleQuote;["];
  72405. + MarkupTagHelperAttributeValue - [27..39)::12
  72406. + CSharpExpressionLiteral - [27..39)::12 - [DateTime.Now] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72407. + Text;[DateTime.Now];
  72408. + MarkupTextLiteral - [39..40)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72409. + DoubleQuote;["];
  72410. + MarkupTagHelperAttribute - [40..70)::30 - name - DoubleQuotes - Bound - [ name="@@BoundStringAttribute"]
  72411. + MarkupTextLiteral - [40..41)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72412. + Whitespace;[ ];
  72413. + MarkupTextLiteral - [41..45)::4 - [name] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72414. + Text;[name];
  72415. + Equals;[=];
  72416. + MarkupTextLiteral - [46..47)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72417. + DoubleQuote;["];
  72418. + MarkupTagHelperAttributeValue - [47..69)::22
  72419. + MarkupBlock - [47..49)::2
  72420. + MarkupTextLiteral - [47..48)::1 - [@] - Gen<LitAttr:@(47:0,47)> - SpanEditHandler;Accepts:None
  72421. + Transition;[@];
  72422. + MarkupEphemeralTextLiteral - [48..49)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  72423. + Transition;[@];
  72424. + MarkupTextLiteral - [49..69)::20 - [BoundStringAttribute] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72425. + Text;[BoundStringAttribute];
  72426. + MarkupTextLiteral - [69..70)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72427. + DoubleQuote;["];
  72428. + MarkupTextLiteral - [70..73)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72429. + Whitespace;[ ];
  72430. + ForwardSlash;[/];
  72431. + CloseAngle;[>];
  72432. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes11.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes11.stree.txt
  72433. index b1d8258a7b4..704d84f6d5c 100644
  72434. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes11.stree.txt
  72435. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes11.stree.txt
  72436. @@ -1,41 +1,85 @@
  72437. -Markup block - Gen<None> - 77 - (0:0,0)
  72438. - Tag block - Gen<TagHelper> - 77 - (0:0,0) - person - PersonTagHelper
  72439. - SelfClosing - <person age="@@@(11+1)" birthday="DateTime.Now" name="Time: @DateTime.Now" />
  72440. - age - DoubleQuotes
  72441. - Markup block - Gen<None> - 9 - (13:0,13)
  72442. - Markup block - Gen<None> - 2 - (13:0,13)
  72443. - Code span - Gen<Expr> - [@] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (13:0,13) - Tokens:1
  72444. - SyntaxKind.Transition;[@];
  72445. - Code span - Gen<None> - [@] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (14:0,14) - Tokens:1
  72446. - SyntaxKind.Transition;[@];
  72447. - Markup block - Gen<None> - 7 - (15:0,15)
  72448. - Code span - Gen<Expr> - [] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (15:0,15) - Tokens:1
  72449. - SyntaxKind.Unknown;[];
  72450. - Expression block - Gen<Expr> - 7 - (15:0,15)
  72451. - Code span - Gen<Expr> - [@] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (15:0,15) - Tokens:1
  72452. - SyntaxKind.Transition;[@];
  72453. - Code span - Gen<Expr> - [(] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (16:0,16) - Tokens:1
  72454. - SyntaxKind.LeftParenthesis;[(];
  72455. - Code span - Gen<Expr> - [11+1] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (17:0,17) - Tokens:3
  72456. - SyntaxKind.IntegerLiteral;[11];
  72457. - SyntaxKind.Plus;[+];
  72458. - SyntaxKind.IntegerLiteral;[1];
  72459. - Code span - Gen<Expr> - [)] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (21:0,21) - Tokens:1
  72460. - SyntaxKind.RightParenthesis;[)];
  72461. - birthday - DoubleQuotes
  72462. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (34:0,34) - Tokens:1
  72463. - SyntaxKind.Text;[DateTime.Now];
  72464. - name - DoubleQuotes
  72465. - Markup block - Gen<None> - 19 - (54:0,54)
  72466. - Markup span - Gen<Markup> - [Time:] - SpanEditHandler;Accepts:Any - (54:0,54) - Tokens:1
  72467. - SyntaxKind.Text;[Time:];
  72468. - Markup block - Gen<None> - 14 - (59:0,59)
  72469. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (59:0,59) - Tokens:1
  72470. - SyntaxKind.Whitespace;[ ];
  72471. - Expression block - Gen<Expr> - 13 - (60:0,60)
  72472. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (60:0,60) - Tokens:1
  72473. - SyntaxKind.Transition;[@];
  72474. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (61:0,61) - Tokens:3
  72475. - SyntaxKind.Identifier;[DateTime];
  72476. - SyntaxKind.Dot;[.];
  72477. - SyntaxKind.Identifier;[Now];
  72478. +RazorDocument - [0..77)::77 - [<person age="@@@(11+1)" birthday="DateTime.Now" name="Time: @DateTime.Now" />]
  72479. + MarkupBlock - [0..77)::77
  72480. + MarkupTagHelperElement - [0..77)::77 - person[SelfClosing] - PersonTagHelper
  72481. + MarkupTagHelperStartTag - [0..77)::77
  72482. + MarkupTextLiteral - [0..7)::7 - [<person] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72483. + OpenAngle;[<];
  72484. + Text;[person];
  72485. + MarkupTagHelperAttribute - [7..23)::16 - age - DoubleQuotes - Bound - [ age="@@@(11+1)"]
  72486. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72487. + Whitespace;[ ];
  72488. + MarkupTextLiteral - [8..11)::3 - [age] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72489. + Text;[age];
  72490. + Equals;[=];
  72491. + MarkupTextLiteral - [12..13)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72492. + DoubleQuote;["];
  72493. + MarkupTagHelperAttributeValue - [13..22)::9
  72494. + MarkupBlock - [13..15)::2
  72495. + CSharpExpressionLiteral - [13..14)::1 - [@] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72496. + Transition;[@];
  72497. + CSharpEphemeralTextLiteral - [14..15)::1 - [@] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72498. + Transition;[@];
  72499. + MarkupBlock - [15..22)::7
  72500. + CSharpExpressionLiteral - [15..15)::0 - [] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72501. + Marker;[];
  72502. + CSharpCodeBlock - [15..22)::7
  72503. + CSharpImplicitExpression - [15..22)::7
  72504. + CSharpTransition - [15..15)::0
  72505. + Transition;[<Missing>];
  72506. + CSharpImplicitExpressionBody - [15..22)::7
  72507. + CSharpCodeBlock - [15..22)::7
  72508. + CSharpExpressionLiteral - [15..16)::1 - [@] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72509. + Transition;[@];
  72510. + CSharpExpressionLiteral - [16..17)::1 - [(] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72511. + LeftParenthesis;[(];
  72512. + CSharpExpressionLiteral - [17..21)::4 - [11+1] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72513. + IntegerLiteral;[11];
  72514. + Plus;[+];
  72515. + IntegerLiteral;[1];
  72516. + CSharpExpressionLiteral - [21..22)::1 - [)] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72517. + RightParenthesis;[)];
  72518. + MarkupTextLiteral - [22..23)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72519. + DoubleQuote;["];
  72520. + MarkupTagHelperAttribute - [23..47)::24 - birthday - DoubleQuotes - Bound - [ birthday="DateTime.Now"]
  72521. + MarkupTextLiteral - [23..24)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72522. + Whitespace;[ ];
  72523. + MarkupTextLiteral - [24..32)::8 - [birthday] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72524. + Text;[birthday];
  72525. + Equals;[=];
  72526. + MarkupTextLiteral - [33..34)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72527. + DoubleQuote;["];
  72528. + MarkupTagHelperAttributeValue - [34..46)::12
  72529. + CSharpExpressionLiteral - [34..46)::12 - [DateTime.Now] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72530. + Text;[DateTime.Now];
  72531. + MarkupTextLiteral - [46..47)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72532. + DoubleQuote;["];
  72533. + MarkupTagHelperAttribute - [47..74)::27 - name - DoubleQuotes - Bound - [ name="Time: @DateTime.Now"]
  72534. + MarkupTextLiteral - [47..48)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72535. + Whitespace;[ ];
  72536. + MarkupTextLiteral - [48..52)::4 - [name] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72537. + Text;[name];
  72538. + Equals;[=];
  72539. + MarkupTextLiteral - [53..54)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72540. + DoubleQuote;["];
  72541. + MarkupTagHelperAttributeValue - [54..73)::19
  72542. + MarkupTextLiteral - [54..59)::5 - [Time:] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72543. + Text;[Time:];
  72544. + MarkupBlock - [59..73)::14
  72545. + MarkupTextLiteral - [59..60)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72546. + Whitespace;[ ];
  72547. + CSharpCodeBlock - [60..73)::13
  72548. + CSharpImplicitExpression - [60..73)::13
  72549. + CSharpTransition - [60..61)::1 - Gen<None> - SpanEditHandler;Accepts:None
  72550. + Transition;[@];
  72551. + CSharpImplicitExpressionBody - [61..73)::12
  72552. + CSharpCodeBlock - [61..73)::12
  72553. + CSharpExpressionLiteral - [61..73)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  72554. + Identifier;[DateTime];
  72555. + Dot;[.];
  72556. + Identifier;[Now];
  72557. + MarkupTextLiteral - [73..74)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72558. + DoubleQuote;["];
  72559. + MarkupTextLiteral - [74..77)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72560. + Whitespace;[ ];
  72561. + ForwardSlash;[/];
  72562. + CloseAngle;[>];
  72563. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes2.stree.txt
  72564. index ce666d0c19c..6e8c7c180de 100644
  72565. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes2.stree.txt
  72566. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes2.stree.txt
  72567. @@ -1,6 +1,24 @@
  72568. -Markup block - Gen<None> - 34 - (0:0,0)
  72569. - Tag block - Gen<TagHelper> - 34 - (0:0,0) - person - PersonTagHelper
  72570. - SelfClosing - <person birthday="DateTime.Now" />
  72571. - birthday - DoubleQuotes
  72572. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (18:0,18) - Tokens:1
  72573. - SyntaxKind.Text;[DateTime.Now];
  72574. +RazorDocument - [0..34)::34 - [<person birthday="DateTime.Now" />]
  72575. + MarkupBlock - [0..34)::34
  72576. + MarkupTagHelperElement - [0..34)::34 - person[SelfClosing] - PersonTagHelper
  72577. + MarkupTagHelperStartTag - [0..34)::34
  72578. + MarkupTextLiteral - [0..7)::7 - [<person] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72579. + OpenAngle;[<];
  72580. + Text;[person];
  72581. + MarkupTagHelperAttribute - [7..31)::24 - birthday - DoubleQuotes - Bound - [ birthday="DateTime.Now"]
  72582. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72583. + Whitespace;[ ];
  72584. + MarkupTextLiteral - [8..16)::8 - [birthday] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72585. + Text;[birthday];
  72586. + Equals;[=];
  72587. + MarkupTextLiteral - [17..18)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72588. + DoubleQuote;["];
  72589. + MarkupTagHelperAttributeValue - [18..30)::12
  72590. + CSharpExpressionLiteral - [18..30)::12 - [DateTime.Now] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72591. + Text;[DateTime.Now];
  72592. + MarkupTextLiteral - [30..31)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72593. + DoubleQuote;["];
  72594. + MarkupTextLiteral - [31..34)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72595. + Whitespace;[ ];
  72596. + ForwardSlash;[/];
  72597. + CloseAngle;[>];
  72598. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes3.stree.txt
  72599. index e7f5f940e3c..e113316a46d 100644
  72600. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes3.stree.txt
  72601. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes3.stree.txt
  72602. @@ -1,15 +1,35 @@
  72603. -Markup block - Gen<None> - 35 - (0:0,0)
  72604. - Tag block - Gen<TagHelper> - 35 - (0:0,0) - person - PersonTagHelper
  72605. - SelfClosing - <person age="@DateTime.Now.Year" />
  72606. - age - DoubleQuotes
  72607. - Markup block - Gen<None> - 18 - (13:0,13)
  72608. - Markup block - Gen<None> - 18 - (13:0,13)
  72609. - Expression block - Gen<Expr> - 18 - (13:0,13)
  72610. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:1
  72611. - SyntaxKind.Transition;[@];
  72612. - Code span - Gen<Expr> - [DateTime.Now.Year] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (14:0,14) - Tokens:5
  72613. - SyntaxKind.Identifier;[DateTime];
  72614. - SyntaxKind.Dot;[.];
  72615. - SyntaxKind.Identifier;[Now];
  72616. - SyntaxKind.Dot;[.];
  72617. - SyntaxKind.Identifier;[Year];
  72618. +RazorDocument - [0..35)::35 - [<person age="@DateTime.Now.Year" />]
  72619. + MarkupBlock - [0..35)::35
  72620. + MarkupTagHelperElement - [0..35)::35 - person[SelfClosing] - PersonTagHelper
  72621. + MarkupTagHelperStartTag - [0..35)::35
  72622. + MarkupTextLiteral - [0..7)::7 - [<person] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72623. + OpenAngle;[<];
  72624. + Text;[person];
  72625. + MarkupTagHelperAttribute - [7..32)::25 - age - DoubleQuotes - Bound - [ age="@DateTime.Now.Year"]
  72626. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72627. + Whitespace;[ ];
  72628. + MarkupTextLiteral - [8..11)::3 - [age] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72629. + Text;[age];
  72630. + Equals;[=];
  72631. + MarkupTextLiteral - [12..13)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72632. + DoubleQuote;["];
  72633. + MarkupTagHelperAttributeValue - [13..31)::18
  72634. + MarkupBlock - [13..31)::18
  72635. + CSharpCodeBlock - [13..31)::18
  72636. + CSharpImplicitExpression - [13..31)::18
  72637. + CSharpTransition - [13..14)::1 - Gen<None> - SpanEditHandler;Accepts:None
  72638. + Transition;[@];
  72639. + CSharpImplicitExpressionBody - [14..31)::17
  72640. + CSharpCodeBlock - [14..31)::17
  72641. + CSharpExpressionLiteral - [14..31)::17 - [DateTime.Now.Year] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72642. + Identifier;[DateTime];
  72643. + Dot;[.];
  72644. + Identifier;[Now];
  72645. + Dot;[.];
  72646. + Identifier;[Year];
  72647. + MarkupTextLiteral - [31..32)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72648. + DoubleQuote;["];
  72649. + MarkupTextLiteral - [32..35)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72650. + Whitespace;[ ];
  72651. + ForwardSlash;[/];
  72652. + CloseAngle;[>];
  72653. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes4.stree.txt
  72654. index a72136e204a..b961b93a680 100644
  72655. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes4.stree.txt
  72656. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes4.stree.txt
  72657. @@ -1,17 +1,39 @@
  72658. -Markup block - Gen<None> - 36 - (0:0,0)
  72659. - Tag block - Gen<TagHelper> - 36 - (0:0,0) - person - PersonTagHelper
  72660. - SelfClosing - <person age=" @DateTime.Now.Year" />
  72661. - age - DoubleQuotes
  72662. - Markup block - Gen<None> - 19 - (13:0,13)
  72663. - Markup block - Gen<None> - 19 - (13:0,13)
  72664. - Code span - Gen<Expr> - [ ] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (13:0,13) - Tokens:1
  72665. - SyntaxKind.Whitespace;[ ];
  72666. - Expression block - Gen<Expr> - 18 - (14:0,14)
  72667. - Code span - Gen<Expr> - [@] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (14:0,14) - Tokens:1
  72668. - SyntaxKind.Transition;[@];
  72669. - Code span - Gen<Expr> - [DateTime.Now.Year] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (15:0,15) - Tokens:5
  72670. - SyntaxKind.Identifier;[DateTime];
  72671. - SyntaxKind.Dot;[.];
  72672. - SyntaxKind.Identifier;[Now];
  72673. - SyntaxKind.Dot;[.];
  72674. - SyntaxKind.Identifier;[Year];
  72675. +RazorDocument - [0..36)::36 - [<person age=" @DateTime.Now.Year" />]
  72676. + MarkupBlock - [0..36)::36
  72677. + MarkupTagHelperElement - [0..36)::36 - person[SelfClosing] - PersonTagHelper
  72678. + MarkupTagHelperStartTag - [0..36)::36
  72679. + MarkupTextLiteral - [0..7)::7 - [<person] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72680. + OpenAngle;[<];
  72681. + Text;[person];
  72682. + MarkupTagHelperAttribute - [7..33)::26 - age - DoubleQuotes - Bound - [ age=" @DateTime.Now.Year"]
  72683. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72684. + Whitespace;[ ];
  72685. + MarkupTextLiteral - [8..11)::3 - [age] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72686. + Text;[age];
  72687. + Equals;[=];
  72688. + MarkupTextLiteral - [12..13)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72689. + DoubleQuote;["];
  72690. + MarkupTagHelperAttributeValue - [13..32)::19
  72691. + MarkupBlock - [13..32)::19
  72692. + CSharpExpressionLiteral - [13..14)::1 - [ ] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72693. + Whitespace;[ ];
  72694. + CSharpCodeBlock - [14..32)::18
  72695. + CSharpImplicitExpression - [14..32)::18
  72696. + CSharpTransition - [14..14)::0
  72697. + Transition;[<Missing>];
  72698. + CSharpImplicitExpressionBody - [14..32)::18
  72699. + CSharpCodeBlock - [14..32)::18
  72700. + CSharpExpressionLiteral - [14..15)::1 - [@] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72701. + Transition;[@];
  72702. + CSharpExpressionLiteral - [15..32)::17 - [DateTime.Now.Year] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72703. + Identifier;[DateTime];
  72704. + Dot;[.];
  72705. + Identifier;[Now];
  72706. + Dot;[.];
  72707. + Identifier;[Year];
  72708. + MarkupTextLiteral - [32..33)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72709. + DoubleQuote;["];
  72710. + MarkupTextLiteral - [33..36)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72711. + Whitespace;[ ];
  72712. + ForwardSlash;[/];
  72713. + CloseAngle;[>];
  72714. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes5.stree.txt
  72715. index a6d5348040d..b117ddf3b15 100644
  72716. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes5.stree.txt
  72717. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes5.stree.txt
  72718. @@ -1,6 +1,24 @@
  72719. -Markup block - Gen<None> - 22 - (0:0,0)
  72720. - Tag block - Gen<TagHelper> - 22 - (0:0,0) - person - PersonTagHelper
  72721. - SelfClosing - <person name="John" />
  72722. - name - DoubleQuotes
  72723. - Markup span - Gen<Markup> - [John] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  72724. - SyntaxKind.Text;[John];
  72725. +RazorDocument - [0..22)::22 - [<person name="John" />]
  72726. + MarkupBlock - [0..22)::22
  72727. + MarkupTagHelperElement - [0..22)::22 - person[SelfClosing] - PersonTagHelper
  72728. + MarkupTagHelperStartTag - [0..22)::22
  72729. + MarkupTextLiteral - [0..7)::7 - [<person] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72730. + OpenAngle;[<];
  72731. + Text;[person];
  72732. + MarkupTagHelperAttribute - [7..19)::12 - name - DoubleQuotes - Bound - [ name="John"]
  72733. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72734. + Whitespace;[ ];
  72735. + MarkupTextLiteral - [8..12)::4 - [name] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72736. + Text;[name];
  72737. + Equals;[=];
  72738. + MarkupTextLiteral - [13..14)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72739. + DoubleQuote;["];
  72740. + MarkupTagHelperAttributeValue - [14..18)::4
  72741. + MarkupTextLiteral - [14..18)::4 - [John] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72742. + Text;[John];
  72743. + MarkupTextLiteral - [18..19)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72744. + DoubleQuote;["];
  72745. + MarkupTextLiteral - [19..22)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72746. + Whitespace;[ ];
  72747. + ForwardSlash;[/];
  72748. + CloseAngle;[>];
  72749. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes6.stree.txt
  72750. index 87383c9bf47..de5aec15548 100644
  72751. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes6.stree.txt
  72752. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes6.stree.txt
  72753. @@ -1,17 +1,37 @@
  72754. -Markup block - Gen<None> - 37 - (0:0,0)
  72755. - Tag block - Gen<TagHelper> - 37 - (0:0,0) - person - PersonTagHelper
  72756. - SelfClosing - <person name="Time: @DateTime.Now" />
  72757. - name - DoubleQuotes
  72758. - Markup block - Gen<None> - 19 - (14:0,14)
  72759. - Markup span - Gen<Markup> - [Time:] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  72760. - SyntaxKind.Text;[Time:];
  72761. - Markup block - Gen<None> - 14 - (19:0,19)
  72762. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:1
  72763. - SyntaxKind.Whitespace;[ ];
  72764. - Expression block - Gen<Expr> - 13 - (20:0,20)
  72765. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (20:0,20) - Tokens:1
  72766. - SyntaxKind.Transition;[@];
  72767. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (21:0,21) - Tokens:3
  72768. - SyntaxKind.Identifier;[DateTime];
  72769. - SyntaxKind.Dot;[.];
  72770. - SyntaxKind.Identifier;[Now];
  72771. +RazorDocument - [0..37)::37 - [<person name="Time: @DateTime.Now" />]
  72772. + MarkupBlock - [0..37)::37
  72773. + MarkupTagHelperElement - [0..37)::37 - person[SelfClosing] - PersonTagHelper
  72774. + MarkupTagHelperStartTag - [0..37)::37
  72775. + MarkupTextLiteral - [0..7)::7 - [<person] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72776. + OpenAngle;[<];
  72777. + Text;[person];
  72778. + MarkupTagHelperAttribute - [7..34)::27 - name - DoubleQuotes - Bound - [ name="Time: @DateTime.Now"]
  72779. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72780. + Whitespace;[ ];
  72781. + MarkupTextLiteral - [8..12)::4 - [name] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72782. + Text;[name];
  72783. + Equals;[=];
  72784. + MarkupTextLiteral - [13..14)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72785. + DoubleQuote;["];
  72786. + MarkupTagHelperAttributeValue - [14..33)::19
  72787. + MarkupTextLiteral - [14..19)::5 - [Time:] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72788. + Text;[Time:];
  72789. + MarkupBlock - [19..33)::14
  72790. + MarkupTextLiteral - [19..20)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72791. + Whitespace;[ ];
  72792. + CSharpCodeBlock - [20..33)::13
  72793. + CSharpImplicitExpression - [20..33)::13
  72794. + CSharpTransition - [20..21)::1 - Gen<None> - SpanEditHandler;Accepts:None
  72795. + Transition;[@];
  72796. + CSharpImplicitExpressionBody - [21..33)::12
  72797. + CSharpCodeBlock - [21..33)::12
  72798. + CSharpExpressionLiteral - [21..33)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  72799. + Identifier;[DateTime];
  72800. + Dot;[.];
  72801. + Identifier;[Now];
  72802. + MarkupTextLiteral - [33..34)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72803. + DoubleQuote;["];
  72804. + MarkupTextLiteral - [34..37)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72805. + Whitespace;[ ];
  72806. + ForwardSlash;[/];
  72807. + CloseAngle;[>];
  72808. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes7.stree.txt
  72809. index b33108b1862..da33e60293a 100644
  72810. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes7.stree.txt
  72811. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes7.stree.txt
  72812. @@ -1,61 +1,101 @@
  72813. -Markup block - Gen<None> - 88 - (0:0,0)
  72814. - Tag block - Gen<TagHelper> - 88 - (0:0,0) - person - PersonTagHelper
  72815. - SelfClosing - <person age="1 + @value + 2" birthday='(bool)@Bag["val"] ? @@DateTime : @DateTime.Now'/>
  72816. - age - DoubleQuotes
  72817. - Markup block - Gen<None> - 14 - (13:0,13)
  72818. - Code span - Gen<Expr> - [1] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (13:0,13) - Tokens:1
  72819. - SyntaxKind.Text;[1];
  72820. - Code span - Gen<Expr> - [ +] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (14:0,14) - Tokens:2
  72821. - SyntaxKind.Whitespace;[ ];
  72822. - SyntaxKind.Text;[+];
  72823. - Markup block - Gen<None> - 7 - (16:0,16)
  72824. - Code span - Gen<Expr> - [ ] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (16:0,16) - Tokens:1
  72825. - SyntaxKind.Whitespace;[ ];
  72826. - Expression block - Gen<Expr> - 6 - (17:0,17)
  72827. - Code span - Gen<Expr> - [@] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (17:0,17) - Tokens:1
  72828. - SyntaxKind.Transition;[@];
  72829. - Code span - Gen<Expr> - [value] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (18:0,18) - Tokens:1
  72830. - SyntaxKind.Identifier;[value];
  72831. - Code span - Gen<Expr> - [ +] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (23:0,23) - Tokens:2
  72832. - SyntaxKind.Whitespace;[ ];
  72833. - SyntaxKind.Text;[+];
  72834. - Code span - Gen<Expr> - [ 2] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (25:0,25) - Tokens:2
  72835. - SyntaxKind.Whitespace;[ ];
  72836. - SyntaxKind.Text;[2];
  72837. - birthday - SingleQuotes
  72838. - Markup block - Gen<None> - 46 - (39:0,39)
  72839. - Code span - Gen<Expr> - [(bool)] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (39:0,39) - Tokens:1
  72840. - SyntaxKind.Text;[(bool)];
  72841. - Markup block - Gen<None> - 11 - (45:0,45)
  72842. - Expression block - Gen<Expr> - 11 - (45:0,45)
  72843. - Code span - Gen<Expr> - [@] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (45:0,45) - Tokens:1
  72844. - SyntaxKind.Transition;[@];
  72845. - Code span - Gen<Expr> - [Bag["val"]] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (46:0,46) - Tokens:4
  72846. - SyntaxKind.Identifier;[Bag];
  72847. - SyntaxKind.LeftBracket;[[];
  72848. - SyntaxKind.StringLiteral;["val"];
  72849. - SyntaxKind.RightBracket;[]];
  72850. - Code span - Gen<Expr> - [ ?] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (56:0,56) - Tokens:2
  72851. - SyntaxKind.Whitespace;[ ];
  72852. - SyntaxKind.QuestionMark;[?];
  72853. - Markup block - Gen<None> - 3 - (58:0,58)
  72854. - Code span - Gen<Expr> - [ @] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (58:0,58) - Tokens:2
  72855. - SyntaxKind.Whitespace;[ ];
  72856. - SyntaxKind.Transition;[@];
  72857. - Code span - Gen<None> - [@] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (60:0,60) - Tokens:1
  72858. - SyntaxKind.Transition;[@];
  72859. - Code span - Gen<Expr> - [DateTime] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (61:0,61) - Tokens:1
  72860. - SyntaxKind.Text;[DateTime];
  72861. - Code span - Gen<Expr> - [ :] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (69:0,69) - Tokens:2
  72862. - SyntaxKind.Whitespace;[ ];
  72863. - SyntaxKind.Text;[:];
  72864. - Markup block - Gen<None> - 14 - (71:0,71)
  72865. - Code span - Gen<Expr> - [ ] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (71:0,71) - Tokens:1
  72866. - SyntaxKind.Whitespace;[ ];
  72867. - Expression block - Gen<Expr> - 13 - (72:0,72)
  72868. - Code span - Gen<Expr> - [@] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (72:0,72) - Tokens:1
  72869. - SyntaxKind.Transition;[@];
  72870. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (73:0,73) - Tokens:3
  72871. - SyntaxKind.Identifier;[DateTime];
  72872. - SyntaxKind.Dot;[.];
  72873. - SyntaxKind.Identifier;[Now];
  72874. +RazorDocument - [0..88)::88 - [<person age="1 + @value + 2" birthday='(bool)@Bag["val"] ? @@DateTime : @DateTime.Now'/>]
  72875. + MarkupBlock - [0..88)::88
  72876. + MarkupTagHelperElement - [0..88)::88 - person[SelfClosing] - PersonTagHelper
  72877. + MarkupTagHelperStartTag - [0..88)::88
  72878. + MarkupTextLiteral - [0..7)::7 - [<person] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72879. + OpenAngle;[<];
  72880. + Text;[person];
  72881. + MarkupTagHelperAttribute - [7..28)::21 - age - DoubleQuotes - Bound - [ age="1 + @value + 2"]
  72882. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72883. + Whitespace;[ ];
  72884. + MarkupTextLiteral - [8..11)::3 - [age] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72885. + Text;[age];
  72886. + Equals;[=];
  72887. + MarkupTextLiteral - [12..13)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72888. + DoubleQuote;["];
  72889. + MarkupTagHelperAttributeValue - [13..27)::14
  72890. + CSharpExpressionLiteral - [13..14)::1 - [1] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72891. + Text;[1];
  72892. + CSharpExpressionLiteral - [14..16)::2 - [ +] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72893. + Whitespace;[ ];
  72894. + Text;[+];
  72895. + MarkupBlock - [16..23)::7
  72896. + CSharpExpressionLiteral - [16..17)::1 - [ ] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72897. + Whitespace;[ ];
  72898. + CSharpCodeBlock - [17..23)::6
  72899. + CSharpImplicitExpression - [17..23)::6
  72900. + CSharpTransition - [17..17)::0
  72901. + Transition;[<Missing>];
  72902. + CSharpImplicitExpressionBody - [17..23)::6
  72903. + CSharpCodeBlock - [17..23)::6
  72904. + CSharpExpressionLiteral - [17..18)::1 - [@] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72905. + Transition;[@];
  72906. + CSharpExpressionLiteral - [18..23)::5 - [value] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72907. + Identifier;[value];
  72908. + CSharpExpressionLiteral - [23..25)::2 - [ +] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72909. + Whitespace;[ ];
  72910. + Text;[+];
  72911. + CSharpExpressionLiteral - [25..27)::2 - [ 2] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72912. + Whitespace;[ ];
  72913. + Text;[2];
  72914. + MarkupTextLiteral - [27..28)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  72915. + DoubleQuote;["];
  72916. + MarkupTagHelperAttribute - [28..86)::58 - birthday - SingleQuotes - Bound - [ birthday='(bool)@Bag["val"] ? @@DateTime : @DateTime.Now']
  72917. + MarkupTextLiteral - [28..29)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72918. + Whitespace;[ ];
  72919. + MarkupTextLiteral - [29..37)::8 - [birthday] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72920. + Text;[birthday];
  72921. + Equals;[=];
  72922. + MarkupTextLiteral - [38..39)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  72923. + SingleQuote;['];
  72924. + MarkupTagHelperAttributeValue - [39..85)::46
  72925. + CSharpExpressionLiteral - [39..45)::6 - [(bool)] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72926. + Text;[(bool)];
  72927. + MarkupBlock - [45..56)::11
  72928. + CSharpCodeBlock - [45..56)::11
  72929. + CSharpImplicitExpression - [45..56)::11
  72930. + CSharpTransition - [45..45)::0
  72931. + Transition;[<Missing>];
  72932. + CSharpImplicitExpressionBody - [45..56)::11
  72933. + CSharpCodeBlock - [45..56)::11
  72934. + CSharpExpressionLiteral - [45..46)::1 - [@] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72935. + Transition;[@];
  72936. + CSharpExpressionLiteral - [46..56)::10 - [Bag["val"]] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72937. + Identifier;[Bag];
  72938. + LeftBracket;[[];
  72939. + StringLiteral;["val"];
  72940. + RightBracket;[]];
  72941. + CSharpExpressionLiteral - [56..58)::2 - [ ?] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72942. + Whitespace;[ ];
  72943. + QuestionMark;[?];
  72944. + MarkupBlock - [58..61)::3
  72945. + CSharpExpressionLiteral - [58..60)::2 - [ @] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72946. + Whitespace;[ ];
  72947. + Transition;[@];
  72948. + CSharpEphemeralTextLiteral - [60..61)::1 - [@] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72949. + Transition;[@];
  72950. + CSharpExpressionLiteral - [61..69)::8 - [DateTime] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72951. + Text;[DateTime];
  72952. + CSharpExpressionLiteral - [69..71)::2 - [ :] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72953. + Whitespace;[ ];
  72954. + Text;[:];
  72955. + MarkupBlock - [71..85)::14
  72956. + CSharpExpressionLiteral - [71..72)::1 - [ ] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72957. + Whitespace;[ ];
  72958. + CSharpCodeBlock - [72..85)::13
  72959. + CSharpImplicitExpression - [72..85)::13
  72960. + CSharpTransition - [72..72)::0
  72961. + Transition;[<Missing>];
  72962. + CSharpImplicitExpressionBody - [72..85)::13
  72963. + CSharpCodeBlock - [72..85)::13
  72964. + CSharpExpressionLiteral - [72..73)::1 - [@] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72965. + Transition;[@];
  72966. + CSharpExpressionLiteral - [73..85)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  72967. + Identifier;[DateTime];
  72968. + Dot;[.];
  72969. + Identifier;[Now];
  72970. + MarkupTextLiteral - [85..86)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  72971. + SingleQuote;['];
  72972. + MarkupTextLiteral - [86..88)::2 - [/>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  72973. + ForwardSlash;[/];
  72974. + CloseAngle;[>];
  72975. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes8.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes8.stree.txt
  72976. index 4407dd61c71..62779fb1dca 100644
  72977. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes8.stree.txt
  72978. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes8.stree.txt
  72979. @@ -1,23 +1,63 @@
  72980. -Markup block - Gen<None> - 70 - (0:0,0)
  72981. - Tag block - Gen<TagHelper> - 70 - (0:0,0) - person - PersonTagHelper
  72982. - SelfClosing - <person age="12" birthday="DateTime.Now" name="Time: @DateTime.Now" />
  72983. - age - DoubleQuotes
  72984. - Code span - Gen<Expr> - [12] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (13:0,13) - Tokens:1
  72985. - SyntaxKind.Text;[12];
  72986. - birthday - DoubleQuotes
  72987. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (27:0,27) - Tokens:1
  72988. - SyntaxKind.Text;[DateTime.Now];
  72989. - name - DoubleQuotes
  72990. - Markup block - Gen<None> - 19 - (47:0,47)
  72991. - Markup span - Gen<Markup> - [Time:] - SpanEditHandler;Accepts:Any - (47:0,47) - Tokens:1
  72992. - SyntaxKind.Text;[Time:];
  72993. - Markup block - Gen<None> - 14 - (52:0,52)
  72994. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (52:0,52) - Tokens:1
  72995. - SyntaxKind.Whitespace;[ ];
  72996. - Expression block - Gen<Expr> - 13 - (53:0,53)
  72997. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (53:0,53) - Tokens:1
  72998. - SyntaxKind.Transition;[@];
  72999. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (54:0,54) - Tokens:3
  73000. - SyntaxKind.Identifier;[DateTime];
  73001. - SyntaxKind.Dot;[.];
  73002. - SyntaxKind.Identifier;[Now];
  73003. +RazorDocument - [0..70)::70 - [<person age="12" birthday="DateTime.Now" name="Time: @DateTime.Now" />]
  73004. + MarkupBlock - [0..70)::70
  73005. + MarkupTagHelperElement - [0..70)::70 - person[SelfClosing] - PersonTagHelper
  73006. + MarkupTagHelperStartTag - [0..70)::70
  73007. + MarkupTextLiteral - [0..7)::7 - [<person] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73008. + OpenAngle;[<];
  73009. + Text;[person];
  73010. + MarkupTagHelperAttribute - [7..16)::9 - age - DoubleQuotes - Bound - [ age="12"]
  73011. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73012. + Whitespace;[ ];
  73013. + MarkupTextLiteral - [8..11)::3 - [age] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73014. + Text;[age];
  73015. + Equals;[=];
  73016. + MarkupTextLiteral - [12..13)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  73017. + DoubleQuote;["];
  73018. + MarkupTagHelperAttributeValue - [13..15)::2
  73019. + CSharpExpressionLiteral - [13..15)::2 - [12] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  73020. + Text;[12];
  73021. + MarkupTextLiteral - [15..16)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  73022. + DoubleQuote;["];
  73023. + MarkupTagHelperAttribute - [16..40)::24 - birthday - DoubleQuotes - Bound - [ birthday="DateTime.Now"]
  73024. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73025. + Whitespace;[ ];
  73026. + MarkupTextLiteral - [17..25)::8 - [birthday] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73027. + Text;[birthday];
  73028. + Equals;[=];
  73029. + MarkupTextLiteral - [26..27)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  73030. + DoubleQuote;["];
  73031. + MarkupTagHelperAttributeValue - [27..39)::12
  73032. + CSharpExpressionLiteral - [27..39)::12 - [DateTime.Now] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  73033. + Text;[DateTime.Now];
  73034. + MarkupTextLiteral - [39..40)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  73035. + DoubleQuote;["];
  73036. + MarkupTagHelperAttribute - [40..67)::27 - name - DoubleQuotes - Bound - [ name="Time: @DateTime.Now"]
  73037. + MarkupTextLiteral - [40..41)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73038. + Whitespace;[ ];
  73039. + MarkupTextLiteral - [41..45)::4 - [name] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73040. + Text;[name];
  73041. + Equals;[=];
  73042. + MarkupTextLiteral - [46..47)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  73043. + DoubleQuote;["];
  73044. + MarkupTagHelperAttributeValue - [47..66)::19
  73045. + MarkupTextLiteral - [47..52)::5 - [Time:] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73046. + Text;[Time:];
  73047. + MarkupBlock - [52..66)::14
  73048. + MarkupTextLiteral - [52..53)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73049. + Whitespace;[ ];
  73050. + CSharpCodeBlock - [53..66)::13
  73051. + CSharpImplicitExpression - [53..66)::13
  73052. + CSharpTransition - [53..54)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73053. + Transition;[@];
  73054. + CSharpImplicitExpressionBody - [54..66)::12
  73055. + CSharpCodeBlock - [54..66)::12
  73056. + CSharpExpressionLiteral - [54..66)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  73057. + Identifier;[DateTime];
  73058. + Dot;[.];
  73059. + Identifier;[Now];
  73060. + MarkupTextLiteral - [66..67)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  73061. + DoubleQuote;["];
  73062. + MarkupTextLiteral - [67..70)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73063. + Whitespace;[ ];
  73064. + ForwardSlash;[/];
  73065. + CloseAngle;[>];
  73066. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes9.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes9.stree.txt
  73067. index 3157f815f63..1c2449a0b5e 100644
  73068. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes9.stree.txt
  73069. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/CreatesMarkupCodeSpansForNonStringTagHelperAttributes9.stree.txt
  73070. @@ -1,29 +1,69 @@
  73071. -Markup block - Gen<None> - 73 - (0:0,0)
  73072. - Tag block - Gen<TagHelper> - 73 - (0:0,0) - person - PersonTagHelper
  73073. - SelfClosing - <person age="12" birthday="DateTime.Now" name="Time: @@ @DateTime.Now" />
  73074. - age - DoubleQuotes
  73075. - Code span - Gen<Expr> - [12] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (13:0,13) - Tokens:1
  73076. - SyntaxKind.Text;[12];
  73077. - birthday - DoubleQuotes
  73078. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (27:0,27) - Tokens:1
  73079. - SyntaxKind.Text;[DateTime.Now];
  73080. - name - DoubleQuotes
  73081. - Markup block - Gen<None> - 22 - (47:0,47)
  73082. - Markup span - Gen<Markup> - [Time:] - SpanEditHandler;Accepts:Any - (47:0,47) - Tokens:1
  73083. - SyntaxKind.Text;[Time:];
  73084. - Markup block - Gen<None> - 3 - (52:0,52)
  73085. - Markup span - Gen<Markup> - [ @] - SpanEditHandler;Accepts:None - (52:0,52) - Tokens:2
  73086. - SyntaxKind.Whitespace;[ ];
  73087. - SyntaxKind.Transition;[@];
  73088. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (54:0,54) - Tokens:1
  73089. - SyntaxKind.Transition;[@];
  73090. - Markup block - Gen<None> - 14 - (55:0,55)
  73091. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (55:0,55) - Tokens:1
  73092. - SyntaxKind.Whitespace;[ ];
  73093. - Expression block - Gen<Expr> - 13 - (56:0,56)
  73094. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (56:0,56) - Tokens:1
  73095. - SyntaxKind.Transition;[@];
  73096. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (57:0,57) - Tokens:3
  73097. - SyntaxKind.Identifier;[DateTime];
  73098. - SyntaxKind.Dot;[.];
  73099. - SyntaxKind.Identifier;[Now];
  73100. +RazorDocument - [0..73)::73 - [<person age="12" birthday="DateTime.Now" name="Time: @@ @DateTime.Now" />]
  73101. + MarkupBlock - [0..73)::73
  73102. + MarkupTagHelperElement - [0..73)::73 - person[SelfClosing] - PersonTagHelper
  73103. + MarkupTagHelperStartTag - [0..73)::73
  73104. + MarkupTextLiteral - [0..7)::7 - [<person] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73105. + OpenAngle;[<];
  73106. + Text;[person];
  73107. + MarkupTagHelperAttribute - [7..16)::9 - age - DoubleQuotes - Bound - [ age="12"]
  73108. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73109. + Whitespace;[ ];
  73110. + MarkupTextLiteral - [8..11)::3 - [age] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73111. + Text;[age];
  73112. + Equals;[=];
  73113. + MarkupTextLiteral - [12..13)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  73114. + DoubleQuote;["];
  73115. + MarkupTagHelperAttributeValue - [13..15)::2
  73116. + CSharpExpressionLiteral - [13..15)::2 - [12] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  73117. + Text;[12];
  73118. + MarkupTextLiteral - [15..16)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  73119. + DoubleQuote;["];
  73120. + MarkupTagHelperAttribute - [16..40)::24 - birthday - DoubleQuotes - Bound - [ birthday="DateTime.Now"]
  73121. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73122. + Whitespace;[ ];
  73123. + MarkupTextLiteral - [17..25)::8 - [birthday] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73124. + Text;[birthday];
  73125. + Equals;[=];
  73126. + MarkupTextLiteral - [26..27)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  73127. + DoubleQuote;["];
  73128. + MarkupTagHelperAttributeValue - [27..39)::12
  73129. + CSharpExpressionLiteral - [27..39)::12 - [DateTime.Now] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  73130. + Text;[DateTime.Now];
  73131. + MarkupTextLiteral - [39..40)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  73132. + DoubleQuote;["];
  73133. + MarkupTagHelperAttribute - [40..70)::30 - name - DoubleQuotes - Bound - [ name="Time: @@ @DateTime.Now"]
  73134. + MarkupTextLiteral - [40..41)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73135. + Whitespace;[ ];
  73136. + MarkupTextLiteral - [41..45)::4 - [name] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73137. + Text;[name];
  73138. + Equals;[=];
  73139. + MarkupTextLiteral - [46..47)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  73140. + DoubleQuote;["];
  73141. + MarkupTagHelperAttributeValue - [47..69)::22
  73142. + MarkupTextLiteral - [47..52)::5 - [Time:] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73143. + Text;[Time:];
  73144. + MarkupBlock - [52..55)::3
  73145. + MarkupTextLiteral - [52..54)::2 - [ @] - Gen<LitAttr: @(52:0,52)> - SpanEditHandler;Accepts:None
  73146. + Whitespace;[ ];
  73147. + Transition;[@];
  73148. + MarkupEphemeralTextLiteral - [54..55)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  73149. + Transition;[@];
  73150. + MarkupBlock - [55..69)::14
  73151. + MarkupTextLiteral - [55..56)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73152. + Whitespace;[ ];
  73153. + CSharpCodeBlock - [56..69)::13
  73154. + CSharpImplicitExpression - [56..69)::13
  73155. + CSharpTransition - [56..57)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73156. + Transition;[@];
  73157. + CSharpImplicitExpressionBody - [57..69)::12
  73158. + CSharpCodeBlock - [57..69)::12
  73159. + CSharpExpressionLiteral - [57..69)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  73160. + Identifier;[DateTime];
  73161. + Dot;[.];
  73162. + Identifier;[Now];
  73163. + MarkupTextLiteral - [69..70)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  73164. + DoubleQuote;["];
  73165. + MarkupTextLiteral - [70..73)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73166. + Whitespace;[ ];
  73167. + ForwardSlash;[/];
  73168. + CloseAngle;[>];
  73169. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/FeatureDisabled_AddsErrorForMinimizedBooleanBoundAttributes.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/FeatureDisabled_AddsErrorForMinimizedBooleanBoundAttributes.stree.txt
  73170. index 8ff170117e9..1d5ebc5e259 100644
  73171. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/FeatureDisabled_AddsErrorForMinimizedBooleanBoundAttributes.stree.txt
  73172. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/FeatureDisabled_AddsErrorForMinimizedBooleanBoundAttributes.stree.txt
  73173. @@ -1,5 +1,21 @@
  73174. -Markup block - Gen<None> - 37 - (0:0,0)
  73175. - Tag block - Gen<TagHelper> - 37 - (0:0,0) - input - InputTagHelper
  73176. - SelfClosing - <input boundbool boundbooldict-key />
  73177. - boundbool - Minimized
  73178. - boundbooldict-key - Minimized
  73179. +RazorDocument - [0..37)::37 - [<input boundbool boundbooldict-key />]
  73180. + MarkupBlock - [0..37)::37
  73181. + MarkupTagHelperElement - [0..37)::37 - input[SelfClosing] - InputTagHelper
  73182. + MarkupTagHelperStartTag - [0..37)::37
  73183. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73184. + OpenAngle;[<];
  73185. + Text;[input];
  73186. + MarkupMinimizedTagHelperAttribute - [6..16)::10 - boundbool - Minimized - Bound - [ boundbool]
  73187. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73188. + Whitespace;[ ];
  73189. + MarkupTextLiteral - [7..16)::9 - [boundbool] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73190. + Text;[boundbool];
  73191. + MarkupMinimizedTagHelperAttribute - [16..34)::18 - boundbooldict-key - Minimized - Bound - [ boundbooldict-key]
  73192. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73193. + Whitespace;[ ];
  73194. + MarkupTextLiteral - [17..34)::17 - [boundbooldict-key] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73195. + Text;[boundbooldict-key];
  73196. + MarkupTextLiteral - [34..37)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73197. + Whitespace;[ ];
  73198. + ForwardSlash;[/];
  73199. + CloseAngle;[>];
  73200. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block1.stree.txt
  73201. index f5f2c4c4c80..cc1abe49f15 100644
  73202. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block1.stree.txt
  73203. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block1.stree.txt
  73204. @@ -1,26 +1,49 @@
  73205. -Markup block - Gen<None> - 42 - (0:0,0)
  73206. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  73207. - SyntaxKind.Unknown;[];
  73208. - Statement block - Gen<None> - 42 - (0:0,0)
  73209. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  73210. - SyntaxKind.Transition;[@];
  73211. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  73212. - SyntaxKind.LeftBrace;[{];
  73213. - Markup block - Gen<None> - 39 - (2:0,2)
  73214. - Tag block - Gen<TagHelper> - 39 - (2:0,2) - input - inputtaghelper
  73215. - SelfClosing - <input data-required='@DateTime.Now' />
  73216. - data-required - SingleQuotes
  73217. - Markup block - Gen<None> - 13 - (24:0,24)
  73218. - Expression block - Gen<Expr> - 13 - (24:0,24)
  73219. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (24:0,24) - Tokens:1
  73220. - SyntaxKind.Transition;[@];
  73221. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (25:0,25) - Tokens:3
  73222. - SyntaxKind.Identifier;[DateTime];
  73223. - SyntaxKind.Dot;[.];
  73224. - SyntaxKind.Identifier;[Now];
  73225. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (41:0,41) - Tokens:1
  73226. - SyntaxKind.Unknown;[];
  73227. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (41:0,41) - Tokens:1
  73228. - SyntaxKind.RightBrace;[}];
  73229. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (42:0,42) - Tokens:1
  73230. - SyntaxKind.Unknown;[];
  73231. +RazorDocument - [0..42)::42 - [@{<input data-required='@DateTime.Now' />}]
  73232. + MarkupBlock - [0..42)::42
  73233. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73234. + Marker;[];
  73235. + CSharpCodeBlock - [0..42)::42
  73236. + CSharpStatement - [0..42)::42
  73237. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73238. + Transition;[@];
  73239. + CSharpStatementBody - [1..42)::41
  73240. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73241. + LeftBrace;[{];
  73242. + CSharpCodeBlock - [2..41)::39
  73243. + MarkupBlock - [2..41)::39
  73244. + MarkupTagHelperElement - [2..41)::39 - input[SelfClosing] - inputtaghelper
  73245. + MarkupTagHelperStartTag - [2..41)::39
  73246. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73247. + OpenAngle;[<];
  73248. + Text;[input];
  73249. + MarkupTagHelperAttribute - [8..38)::30 - data-required - SingleQuotes - Unbound - [ data-required='@DateTime.Now']
  73250. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73251. + Whitespace;[ ];
  73252. + MarkupTextLiteral - [9..22)::13 - [data-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73253. + Text;[data-required];
  73254. + Equals;[=];
  73255. + MarkupTextLiteral - [23..24)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73256. + SingleQuote;['];
  73257. + MarkupTagHelperAttributeValue - [24..37)::13
  73258. + CSharpCodeBlock - [24..37)::13
  73259. + CSharpImplicitExpression - [24..37)::13
  73260. + CSharpTransition - [24..25)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73261. + Transition;[@];
  73262. + CSharpImplicitExpressionBody - [25..37)::12
  73263. + CSharpCodeBlock - [25..37)::12
  73264. + CSharpExpressionLiteral - [25..37)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  73265. + Identifier;[DateTime];
  73266. + Dot;[.];
  73267. + Identifier;[Now];
  73268. + MarkupTextLiteral - [37..38)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73269. + SingleQuote;['];
  73270. + MarkupTextLiteral - [38..41)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  73271. + Whitespace;[ ];
  73272. + ForwardSlash;[/];
  73273. + CloseAngle;[>];
  73274. + CSharpStatementLiteral - [41..41)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  73275. + Marker;[];
  73276. + RazorMetaCode - [41..42)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73277. + RightBrace;[}];
  73278. + MarkupTextLiteral - [42..42)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73279. + Marker;[];
  73280. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block2.stree.txt
  73281. index a72b290f4e7..6544486590a 100644
  73282. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block2.stree.txt
  73283. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block2.stree.txt
  73284. @@ -1,20 +1,41 @@
  73285. -Markup block - Gen<None> - 34 - (0:0,0)
  73286. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  73287. - SyntaxKind.Unknown;[];
  73288. - Statement block - Gen<None> - 34 - (0:0,0)
  73289. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  73290. - SyntaxKind.Transition;[@];
  73291. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  73292. - SyntaxKind.LeftBrace;[{];
  73293. - Markup block - Gen<None> - 31 - (2:0,2)
  73294. - Tag block - Gen<TagHelper> - 31 - (2:0,2) - input - inputtaghelper
  73295. - SelfClosing - <input data-required='value' />
  73296. - data-required - SingleQuotes
  73297. - Markup span - Gen<Markup> - [value] - SpanEditHandler;Accepts:Any - (24:0,24) - Tokens:1
  73298. - SyntaxKind.Text;[value];
  73299. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (33:0,33) - Tokens:1
  73300. - SyntaxKind.Unknown;[];
  73301. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (33:0,33) - Tokens:1
  73302. - SyntaxKind.RightBrace;[}];
  73303. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (34:0,34) - Tokens:1
  73304. - SyntaxKind.Unknown;[];
  73305. +RazorDocument - [0..34)::34 - [@{<input data-required='value' />}]
  73306. + MarkupBlock - [0..34)::34
  73307. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73308. + Marker;[];
  73309. + CSharpCodeBlock - [0..34)::34
  73310. + CSharpStatement - [0..34)::34
  73311. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73312. + Transition;[@];
  73313. + CSharpStatementBody - [1..34)::33
  73314. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73315. + LeftBrace;[{];
  73316. + CSharpCodeBlock - [2..33)::31
  73317. + MarkupBlock - [2..33)::31
  73318. + MarkupTagHelperElement - [2..33)::31 - input[SelfClosing] - inputtaghelper
  73319. + MarkupTagHelperStartTag - [2..33)::31
  73320. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73321. + OpenAngle;[<];
  73322. + Text;[input];
  73323. + MarkupTagHelperAttribute - [8..30)::22 - data-required - SingleQuotes - Unbound - [ data-required='value']
  73324. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73325. + Whitespace;[ ];
  73326. + MarkupTextLiteral - [9..22)::13 - [data-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73327. + Text;[data-required];
  73328. + Equals;[=];
  73329. + MarkupTextLiteral - [23..24)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73330. + SingleQuote;['];
  73331. + MarkupTagHelperAttributeValue - [24..29)::5
  73332. + MarkupTextLiteral - [24..29)::5 - [value] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73333. + Text;[value];
  73334. + MarkupTextLiteral - [29..30)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73335. + SingleQuote;['];
  73336. + MarkupTextLiteral - [30..33)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  73337. + Whitespace;[ ];
  73338. + ForwardSlash;[/];
  73339. + CloseAngle;[>];
  73340. + CSharpStatementLiteral - [33..33)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  73341. + Marker;[];
  73342. + RazorMetaCode - [33..34)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73343. + RightBrace;[}];
  73344. + MarkupTextLiteral - [34..34)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73345. + Marker;[];
  73346. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block3.stree.txt
  73347. index 3da09335280..3875da99042 100644
  73348. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block3.stree.txt
  73349. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block3.stree.txt
  73350. @@ -1,29 +1,52 @@
  73351. -Markup block - Gen<None> - 49 - (0:0,0)
  73352. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  73353. - SyntaxKind.Unknown;[];
  73354. - Statement block - Gen<None> - 49 - (0:0,0)
  73355. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  73356. - SyntaxKind.Transition;[@];
  73357. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  73358. - SyntaxKind.LeftBrace;[{];
  73359. - Markup block - Gen<None> - 46 - (2:0,2)
  73360. - Tag block - Gen<TagHelper> - 46 - (2:0,2) - input - inputtaghelper
  73361. - SelfClosing - <input data-required='prefix @DateTime.Now' />
  73362. - data-required - SingleQuotes
  73363. - Markup block - Gen<None> - 20 - (24:0,24)
  73364. - Markup span - Gen<Markup> - [prefix ] - SpanEditHandler;Accepts:Any - (24:0,24) - Tokens:2
  73365. - SyntaxKind.Text;[prefix];
  73366. - SyntaxKind.Whitespace;[ ];
  73367. - Expression block - Gen<Expr> - 13 - (31:0,31)
  73368. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (31:0,31) - Tokens:1
  73369. - SyntaxKind.Transition;[@];
  73370. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (32:0,32) - Tokens:3
  73371. - SyntaxKind.Identifier;[DateTime];
  73372. - SyntaxKind.Dot;[.];
  73373. - SyntaxKind.Identifier;[Now];
  73374. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (48:0,48) - Tokens:1
  73375. - SyntaxKind.Unknown;[];
  73376. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (48:0,48) - Tokens:1
  73377. - SyntaxKind.RightBrace;[}];
  73378. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (49:0,49) - Tokens:1
  73379. - SyntaxKind.Unknown;[];
  73380. +RazorDocument - [0..49)::49 - [@{<input data-required='prefix @DateTime.Now' />}]
  73381. + MarkupBlock - [0..49)::49
  73382. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73383. + Marker;[];
  73384. + CSharpCodeBlock - [0..49)::49
  73385. + CSharpStatement - [0..49)::49
  73386. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73387. + Transition;[@];
  73388. + CSharpStatementBody - [1..49)::48
  73389. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73390. + LeftBrace;[{];
  73391. + CSharpCodeBlock - [2..48)::46
  73392. + MarkupBlock - [2..48)::46
  73393. + MarkupTagHelperElement - [2..48)::46 - input[SelfClosing] - inputtaghelper
  73394. + MarkupTagHelperStartTag - [2..48)::46
  73395. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73396. + OpenAngle;[<];
  73397. + Text;[input];
  73398. + MarkupTagHelperAttribute - [8..45)::37 - data-required - SingleQuotes - Unbound - [ data-required='prefix @DateTime.Now']
  73399. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73400. + Whitespace;[ ];
  73401. + MarkupTextLiteral - [9..22)::13 - [data-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73402. + Text;[data-required];
  73403. + Equals;[=];
  73404. + MarkupTextLiteral - [23..24)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73405. + SingleQuote;['];
  73406. + MarkupTagHelperAttributeValue - [24..44)::20
  73407. + MarkupTextLiteral - [24..31)::7 - [prefix ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73408. + Text;[prefix];
  73409. + Whitespace;[ ];
  73410. + CSharpCodeBlock - [31..44)::13
  73411. + CSharpImplicitExpression - [31..44)::13
  73412. + CSharpTransition - [31..32)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73413. + Transition;[@];
  73414. + CSharpImplicitExpressionBody - [32..44)::12
  73415. + CSharpCodeBlock - [32..44)::12
  73416. + CSharpExpressionLiteral - [32..44)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  73417. + Identifier;[DateTime];
  73418. + Dot;[.];
  73419. + Identifier;[Now];
  73420. + MarkupTextLiteral - [44..45)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73421. + SingleQuote;['];
  73422. + MarkupTextLiteral - [45..48)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  73423. + Whitespace;[ ];
  73424. + ForwardSlash;[/];
  73425. + CloseAngle;[>];
  73426. + CSharpStatementLiteral - [48..48)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  73427. + Marker;[];
  73428. + RazorMetaCode - [48..49)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73429. + RightBrace;[}];
  73430. + MarkupTextLiteral - [49..49)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73431. + Marker;[];
  73432. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block4.stree.txt
  73433. index 0fbd648f87f..a5dc4c1307c 100644
  73434. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block4.stree.txt
  73435. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block4.stree.txt
  73436. @@ -1,29 +1,52 @@
  73437. -Markup block - Gen<None> - 49 - (0:0,0)
  73438. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  73439. - SyntaxKind.Unknown;[];
  73440. - Statement block - Gen<None> - 49 - (0:0,0)
  73441. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  73442. - SyntaxKind.Transition;[@];
  73443. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  73444. - SyntaxKind.LeftBrace;[{];
  73445. - Markup block - Gen<None> - 46 - (2:0,2)
  73446. - Tag block - Gen<TagHelper> - 46 - (2:0,2) - input - inputtaghelper
  73447. - SelfClosing - <input data-required='@DateTime.Now suffix' />
  73448. - data-required - SingleQuotes
  73449. - Markup block - Gen<None> - 20 - (24:0,24)
  73450. - Expression block - Gen<Expr> - 13 - (24:0,24)
  73451. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (24:0,24) - Tokens:1
  73452. - SyntaxKind.Transition;[@];
  73453. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (25:0,25) - Tokens:3
  73454. - SyntaxKind.Identifier;[DateTime];
  73455. - SyntaxKind.Dot;[.];
  73456. - SyntaxKind.Identifier;[Now];
  73457. - Markup span - Gen<Markup> - [ suffix] - SpanEditHandler;Accepts:Any - (37:0,37) - Tokens:2
  73458. - SyntaxKind.Whitespace;[ ];
  73459. - SyntaxKind.Text;[suffix];
  73460. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (48:0,48) - Tokens:1
  73461. - SyntaxKind.Unknown;[];
  73462. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (48:0,48) - Tokens:1
  73463. - SyntaxKind.RightBrace;[}];
  73464. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (49:0,49) - Tokens:1
  73465. - SyntaxKind.Unknown;[];
  73466. +RazorDocument - [0..49)::49 - [@{<input data-required='@DateTime.Now suffix' />}]
  73467. + MarkupBlock - [0..49)::49
  73468. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73469. + Marker;[];
  73470. + CSharpCodeBlock - [0..49)::49
  73471. + CSharpStatement - [0..49)::49
  73472. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73473. + Transition;[@];
  73474. + CSharpStatementBody - [1..49)::48
  73475. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73476. + LeftBrace;[{];
  73477. + CSharpCodeBlock - [2..48)::46
  73478. + MarkupBlock - [2..48)::46
  73479. + MarkupTagHelperElement - [2..48)::46 - input[SelfClosing] - inputtaghelper
  73480. + MarkupTagHelperStartTag - [2..48)::46
  73481. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73482. + OpenAngle;[<];
  73483. + Text;[input];
  73484. + MarkupTagHelperAttribute - [8..45)::37 - data-required - SingleQuotes - Unbound - [ data-required='@DateTime.Now suffix']
  73485. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73486. + Whitespace;[ ];
  73487. + MarkupTextLiteral - [9..22)::13 - [data-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73488. + Text;[data-required];
  73489. + Equals;[=];
  73490. + MarkupTextLiteral - [23..24)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73491. + SingleQuote;['];
  73492. + MarkupTagHelperAttributeValue - [24..44)::20
  73493. + CSharpCodeBlock - [24..37)::13
  73494. + CSharpImplicitExpression - [24..37)::13
  73495. + CSharpTransition - [24..25)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73496. + Transition;[@];
  73497. + CSharpImplicitExpressionBody - [25..37)::12
  73498. + CSharpCodeBlock - [25..37)::12
  73499. + CSharpExpressionLiteral - [25..37)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  73500. + Identifier;[DateTime];
  73501. + Dot;[.];
  73502. + Identifier;[Now];
  73503. + MarkupTextLiteral - [37..44)::7 - [ suffix] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73504. + Whitespace;[ ];
  73505. + Text;[suffix];
  73506. + MarkupTextLiteral - [44..45)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73507. + SingleQuote;['];
  73508. + MarkupTextLiteral - [45..48)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  73509. + Whitespace;[ ];
  73510. + ForwardSlash;[/];
  73511. + CloseAngle;[>];
  73512. + CSharpStatementLiteral - [48..48)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  73513. + Marker;[];
  73514. + RazorMetaCode - [48..49)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73515. + RightBrace;[}];
  73516. + MarkupTextLiteral - [49..49)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73517. + Marker;[];
  73518. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block5.stree.txt
  73519. index 489e04fe213..684f596021e 100644
  73520. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block5.stree.txt
  73521. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block5.stree.txt
  73522. @@ -1,32 +1,55 @@
  73523. -Markup block - Gen<None> - 56 - (0:0,0)
  73524. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  73525. - SyntaxKind.Unknown;[];
  73526. - Statement block - Gen<None> - 56 - (0:0,0)
  73527. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  73528. - SyntaxKind.Transition;[@];
  73529. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  73530. - SyntaxKind.LeftBrace;[{];
  73531. - Markup block - Gen<None> - 53 - (2:0,2)
  73532. - Tag block - Gen<TagHelper> - 53 - (2:0,2) - input - inputtaghelper
  73533. - SelfClosing - <input data-required='prefix @DateTime.Now suffix' />
  73534. - data-required - SingleQuotes
  73535. - Markup block - Gen<None> - 27 - (24:0,24)
  73536. - Markup span - Gen<Markup> - [prefix ] - SpanEditHandler;Accepts:Any - (24:0,24) - Tokens:2
  73537. - SyntaxKind.Text;[prefix];
  73538. - SyntaxKind.Whitespace;[ ];
  73539. - Expression block - Gen<Expr> - 13 - (31:0,31)
  73540. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (31:0,31) - Tokens:1
  73541. - SyntaxKind.Transition;[@];
  73542. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (32:0,32) - Tokens:3
  73543. - SyntaxKind.Identifier;[DateTime];
  73544. - SyntaxKind.Dot;[.];
  73545. - SyntaxKind.Identifier;[Now];
  73546. - Markup span - Gen<Markup> - [ suffix] - SpanEditHandler;Accepts:Any - (44:0,44) - Tokens:2
  73547. - SyntaxKind.Whitespace;[ ];
  73548. - SyntaxKind.Text;[suffix];
  73549. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (55:0,55) - Tokens:1
  73550. - SyntaxKind.Unknown;[];
  73551. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (55:0,55) - Tokens:1
  73552. - SyntaxKind.RightBrace;[}];
  73553. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (56:0,56) - Tokens:1
  73554. - SyntaxKind.Unknown;[];
  73555. +RazorDocument - [0..56)::56 - [@{<input data-required='prefix @DateTime.Now suffix' />}]
  73556. + MarkupBlock - [0..56)::56
  73557. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73558. + Marker;[];
  73559. + CSharpCodeBlock - [0..56)::56
  73560. + CSharpStatement - [0..56)::56
  73561. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73562. + Transition;[@];
  73563. + CSharpStatementBody - [1..56)::55
  73564. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73565. + LeftBrace;[{];
  73566. + CSharpCodeBlock - [2..55)::53
  73567. + MarkupBlock - [2..55)::53
  73568. + MarkupTagHelperElement - [2..55)::53 - input[SelfClosing] - inputtaghelper
  73569. + MarkupTagHelperStartTag - [2..55)::53
  73570. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73571. + OpenAngle;[<];
  73572. + Text;[input];
  73573. + MarkupTagHelperAttribute - [8..52)::44 - data-required - SingleQuotes - Unbound - [ data-required='prefix @DateTime.Now suffix']
  73574. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73575. + Whitespace;[ ];
  73576. + MarkupTextLiteral - [9..22)::13 - [data-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73577. + Text;[data-required];
  73578. + Equals;[=];
  73579. + MarkupTextLiteral - [23..24)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73580. + SingleQuote;['];
  73581. + MarkupTagHelperAttributeValue - [24..51)::27
  73582. + MarkupTextLiteral - [24..31)::7 - [prefix ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73583. + Text;[prefix];
  73584. + Whitespace;[ ];
  73585. + CSharpCodeBlock - [31..44)::13
  73586. + CSharpImplicitExpression - [31..44)::13
  73587. + CSharpTransition - [31..32)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73588. + Transition;[@];
  73589. + CSharpImplicitExpressionBody - [32..44)::12
  73590. + CSharpCodeBlock - [32..44)::12
  73591. + CSharpExpressionLiteral - [32..44)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  73592. + Identifier;[DateTime];
  73593. + Dot;[.];
  73594. + Identifier;[Now];
  73595. + MarkupTextLiteral - [44..51)::7 - [ suffix] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73596. + Whitespace;[ ];
  73597. + Text;[suffix];
  73598. + MarkupTextLiteral - [51..52)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73599. + SingleQuote;['];
  73600. + MarkupTextLiteral - [52..55)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  73601. + Whitespace;[ ];
  73602. + ForwardSlash;[/];
  73603. + CloseAngle;[>];
  73604. + CSharpStatementLiteral - [55..55)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  73605. + Marker;[];
  73606. + RazorMetaCode - [55..56)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73607. + RightBrace;[}];
  73608. + MarkupTextLiteral - [56..56)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73609. + Marker;[];
  73610. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block6.stree.txt
  73611. index 23f6ce17bcc..61dfa753760 100644
  73612. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block6.stree.txt
  73613. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block6.stree.txt
  73614. @@ -1,34 +1,65 @@
  73615. -Markup block - Gen<None> - 85 - (0:0,0)
  73616. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  73617. - SyntaxKind.Unknown;[];
  73618. - Statement block - Gen<None> - 85 - (0:0,0)
  73619. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  73620. - SyntaxKind.Transition;[@];
  73621. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  73622. - SyntaxKind.LeftBrace;[{];
  73623. - Markup block - Gen<None> - 82 - (2:0,2)
  73624. - Tag block - Gen<TagHelper> - 82 - (2:0,2) - input - inputtaghelper
  73625. - SelfClosing - <input pre-attribute data-required='prefix @DateTime.Now suffix' post-attribute />
  73626. - pre-attribute - Minimized
  73627. - data-required - SingleQuotes
  73628. - Markup block - Gen<None> - 27 - (38:0,38)
  73629. - Markup span - Gen<Markup> - [prefix ] - SpanEditHandler;Accepts:Any - (38:0,38) - Tokens:2
  73630. - SyntaxKind.Text;[prefix];
  73631. - SyntaxKind.Whitespace;[ ];
  73632. - Expression block - Gen<Expr> - 13 - (45:0,45)
  73633. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (45:0,45) - Tokens:1
  73634. - SyntaxKind.Transition;[@];
  73635. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (46:0,46) - Tokens:3
  73636. - SyntaxKind.Identifier;[DateTime];
  73637. - SyntaxKind.Dot;[.];
  73638. - SyntaxKind.Identifier;[Now];
  73639. - Markup span - Gen<Markup> - [ suffix] - SpanEditHandler;Accepts:Any - (58:0,58) - Tokens:2
  73640. - SyntaxKind.Whitespace;[ ];
  73641. - SyntaxKind.Text;[suffix];
  73642. - post-attribute - Minimized
  73643. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (84:0,84) - Tokens:1
  73644. - SyntaxKind.Unknown;[];
  73645. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (84:0,84) - Tokens:1
  73646. - SyntaxKind.RightBrace;[}];
  73647. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (85:0,85) - Tokens:1
  73648. - SyntaxKind.Unknown;[];
  73649. +RazorDocument - [0..85)::85 - [@{<input pre-attribute data-required='prefix @DateTime.Now suffix' post-attribute />}]
  73650. + MarkupBlock - [0..85)::85
  73651. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73652. + Marker;[];
  73653. + CSharpCodeBlock - [0..85)::85
  73654. + CSharpStatement - [0..85)::85
  73655. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73656. + Transition;[@];
  73657. + CSharpStatementBody - [1..85)::84
  73658. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73659. + LeftBrace;[{];
  73660. + CSharpCodeBlock - [2..84)::82
  73661. + MarkupBlock - [2..84)::82
  73662. + MarkupTagHelperElement - [2..84)::82 - input[SelfClosing] - inputtaghelper
  73663. + MarkupTagHelperStartTag - [2..84)::82
  73664. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73665. + OpenAngle;[<];
  73666. + Text;[input];
  73667. + MarkupMinimizedTagHelperAttribute - [8..22)::14 - pre-attribute - Minimized - Unbound - [ pre-attribute]
  73668. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73669. + Whitespace;[ ];
  73670. + MarkupTextLiteral - [9..22)::13 - [pre-attribute] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73671. + Text;[pre-attribute];
  73672. + MarkupTagHelperAttribute - [22..66)::44 - data-required - SingleQuotes - Unbound - [ data-required='prefix @DateTime.Now suffix']
  73673. + MarkupTextLiteral - [22..23)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73674. + Whitespace;[ ];
  73675. + MarkupTextLiteral - [23..36)::13 - [data-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73676. + Text;[data-required];
  73677. + Equals;[=];
  73678. + MarkupTextLiteral - [37..38)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73679. + SingleQuote;['];
  73680. + MarkupTagHelperAttributeValue - [38..65)::27
  73681. + MarkupTextLiteral - [38..45)::7 - [prefix ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73682. + Text;[prefix];
  73683. + Whitespace;[ ];
  73684. + CSharpCodeBlock - [45..58)::13
  73685. + CSharpImplicitExpression - [45..58)::13
  73686. + CSharpTransition - [45..46)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73687. + Transition;[@];
  73688. + CSharpImplicitExpressionBody - [46..58)::12
  73689. + CSharpCodeBlock - [46..58)::12
  73690. + CSharpExpressionLiteral - [46..58)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  73691. + Identifier;[DateTime];
  73692. + Dot;[.];
  73693. + Identifier;[Now];
  73694. + MarkupTextLiteral - [58..65)::7 - [ suffix] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73695. + Whitespace;[ ];
  73696. + Text;[suffix];
  73697. + MarkupTextLiteral - [65..66)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73698. + SingleQuote;['];
  73699. + MarkupMinimizedTagHelperAttribute - [66..81)::15 - post-attribute - Minimized - Unbound - [ post-attribute]
  73700. + MarkupTextLiteral - [66..67)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73701. + Whitespace;[ ];
  73702. + MarkupTextLiteral - [67..81)::14 - [post-attribute] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73703. + Text;[post-attribute];
  73704. + MarkupTextLiteral - [81..84)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  73705. + Whitespace;[ ];
  73706. + ForwardSlash;[/];
  73707. + CloseAngle;[>];
  73708. + CSharpStatementLiteral - [84..84)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  73709. + Marker;[];
  73710. + RazorMetaCode - [84..85)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73711. + RightBrace;[}];
  73712. + MarkupTextLiteral - [85..85)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73713. + Marker;[];
  73714. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block7.stree.txt
  73715. index d91749c1366..3374274c2ae 100644
  73716. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block7.stree.txt
  73717. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Block7.stree.txt
  73718. @@ -1,37 +1,63 @@
  73719. -Markup block - Gen<None> - 63 - (0:0,0)
  73720. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  73721. - SyntaxKind.Unknown;[];
  73722. - Statement block - Gen<None> - 63 - (0:0,0)
  73723. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  73724. - SyntaxKind.Transition;[@];
  73725. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  73726. - SyntaxKind.LeftBrace;[{];
  73727. - Markup block - Gen<None> - 60 - (2:0,2)
  73728. - Tag block - Gen<TagHelper> - 60 - (2:0,2) - input - inputtaghelper
  73729. - SelfClosing - <input data-required='@DateTime.Now middle @DateTime.Now' />
  73730. - data-required - SingleQuotes
  73731. - Markup block - Gen<None> - 34 - (24:0,24)
  73732. - Expression block - Gen<Expr> - 13 - (24:0,24)
  73733. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (24:0,24) - Tokens:1
  73734. - SyntaxKind.Transition;[@];
  73735. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (25:0,25) - Tokens:3
  73736. - SyntaxKind.Identifier;[DateTime];
  73737. - SyntaxKind.Dot;[.];
  73738. - SyntaxKind.Identifier;[Now];
  73739. - Markup span - Gen<Markup> - [ middle ] - SpanEditHandler;Accepts:Any - (37:0,37) - Tokens:3
  73740. - SyntaxKind.Whitespace;[ ];
  73741. - SyntaxKind.Text;[middle];
  73742. - SyntaxKind.Whitespace;[ ];
  73743. - Expression block - Gen<Expr> - 13 - (45:0,45)
  73744. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (45:0,45) - Tokens:1
  73745. - SyntaxKind.Transition;[@];
  73746. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (46:0,46) - Tokens:3
  73747. - SyntaxKind.Identifier;[DateTime];
  73748. - SyntaxKind.Dot;[.];
  73749. - SyntaxKind.Identifier;[Now];
  73750. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (62:0,62) - Tokens:1
  73751. - SyntaxKind.Unknown;[];
  73752. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (62:0,62) - Tokens:1
  73753. - SyntaxKind.RightBrace;[}];
  73754. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (63:0,63) - Tokens:1
  73755. - SyntaxKind.Unknown;[];
  73756. +RazorDocument - [0..63)::63 - [@{<input data-required='@DateTime.Now middle @DateTime.Now' />}]
  73757. + MarkupBlock - [0..63)::63
  73758. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73759. + Marker;[];
  73760. + CSharpCodeBlock - [0..63)::63
  73761. + CSharpStatement - [0..63)::63
  73762. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73763. + Transition;[@];
  73764. + CSharpStatementBody - [1..63)::62
  73765. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73766. + LeftBrace;[{];
  73767. + CSharpCodeBlock - [2..62)::60
  73768. + MarkupBlock - [2..62)::60
  73769. + MarkupTagHelperElement - [2..62)::60 - input[SelfClosing] - inputtaghelper
  73770. + MarkupTagHelperStartTag - [2..62)::60
  73771. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73772. + OpenAngle;[<];
  73773. + Text;[input];
  73774. + MarkupTagHelperAttribute - [8..59)::51 - data-required - SingleQuotes - Unbound - [ data-required='@DateTime.Now middle @DateTime.Now']
  73775. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73776. + Whitespace;[ ];
  73777. + MarkupTextLiteral - [9..22)::13 - [data-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73778. + Text;[data-required];
  73779. + Equals;[=];
  73780. + MarkupTextLiteral - [23..24)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73781. + SingleQuote;['];
  73782. + MarkupTagHelperAttributeValue - [24..58)::34
  73783. + CSharpCodeBlock - [24..37)::13
  73784. + CSharpImplicitExpression - [24..37)::13
  73785. + CSharpTransition - [24..25)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73786. + Transition;[@];
  73787. + CSharpImplicitExpressionBody - [25..37)::12
  73788. + CSharpCodeBlock - [25..37)::12
  73789. + CSharpExpressionLiteral - [25..37)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  73790. + Identifier;[DateTime];
  73791. + Dot;[.];
  73792. + Identifier;[Now];
  73793. + MarkupTextLiteral - [37..45)::8 - [ middle ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73794. + Whitespace;[ ];
  73795. + Text;[middle];
  73796. + Whitespace;[ ];
  73797. + CSharpCodeBlock - [45..58)::13
  73798. + CSharpImplicitExpression - [45..58)::13
  73799. + CSharpTransition - [45..46)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73800. + Transition;[@];
  73801. + CSharpImplicitExpressionBody - [46..58)::12
  73802. + CSharpCodeBlock - [46..58)::12
  73803. + CSharpExpressionLiteral - [46..58)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  73804. + Identifier;[DateTime];
  73805. + Dot;[.];
  73806. + Identifier;[Now];
  73807. + MarkupTextLiteral - [58..59)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73808. + SingleQuote;['];
  73809. + MarkupTextLiteral - [59..62)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  73810. + Whitespace;[ ];
  73811. + ForwardSlash;[/];
  73812. + CloseAngle;[>];
  73813. + CSharpStatementLiteral - [62..62)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  73814. + Marker;[];
  73815. + RazorMetaCode - [62..63)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73816. + RightBrace;[}];
  73817. + MarkupTextLiteral - [63..63)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73818. + Marker;[];
  73819. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document1.stree.txt
  73820. index 4070a3cb2f0..1712c5a1484 100644
  73821. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document1.stree.txt
  73822. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document1.stree.txt
  73823. @@ -1,12 +1,32 @@
  73824. -Markup block - Gen<None> - 39 - (0:0,0)
  73825. - Tag block - Gen<TagHelper> - 39 - (0:0,0) - input - inputtaghelper
  73826. - SelfClosing - <input data-required='@DateTime.Now' />
  73827. - data-required - SingleQuotes
  73828. - Markup block - Gen<None> - 13 - (22:0,22)
  73829. - Expression block - Gen<Expr> - 13 - (22:0,22)
  73830. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (22:0,22) - Tokens:1
  73831. - SyntaxKind.Transition;[@];
  73832. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (23:0,23) - Tokens:3
  73833. - SyntaxKind.Identifier;[DateTime];
  73834. - SyntaxKind.Dot;[.];
  73835. - SyntaxKind.Identifier;[Now];
  73836. +RazorDocument - [0..39)::39 - [<input data-required='@DateTime.Now' />]
  73837. + MarkupBlock - [0..39)::39
  73838. + MarkupTagHelperElement - [0..39)::39 - input[SelfClosing] - inputtaghelper
  73839. + MarkupTagHelperStartTag - [0..39)::39
  73840. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73841. + OpenAngle;[<];
  73842. + Text;[input];
  73843. + MarkupTagHelperAttribute - [6..36)::30 - data-required - SingleQuotes - Unbound - [ data-required='@DateTime.Now']
  73844. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73845. + Whitespace;[ ];
  73846. + MarkupTextLiteral - [7..20)::13 - [data-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73847. + Text;[data-required];
  73848. + Equals;[=];
  73849. + MarkupTextLiteral - [21..22)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73850. + SingleQuote;['];
  73851. + MarkupTagHelperAttributeValue - [22..35)::13
  73852. + CSharpCodeBlock - [22..35)::13
  73853. + CSharpImplicitExpression - [22..35)::13
  73854. + CSharpTransition - [22..23)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73855. + Transition;[@];
  73856. + CSharpImplicitExpressionBody - [23..35)::12
  73857. + CSharpCodeBlock - [23..35)::12
  73858. + CSharpExpressionLiteral - [23..35)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  73859. + Identifier;[DateTime];
  73860. + Dot;[.];
  73861. + Identifier;[Now];
  73862. + MarkupTextLiteral - [35..36)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73863. + SingleQuote;['];
  73864. + MarkupTextLiteral - [36..39)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73865. + Whitespace;[ ];
  73866. + ForwardSlash;[/];
  73867. + CloseAngle;[>];
  73868. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document2.stree.txt
  73869. index fbf9d1f307c..aa98bf87851 100644
  73870. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document2.stree.txt
  73871. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document2.stree.txt
  73872. @@ -1,6 +1,24 @@
  73873. -Markup block - Gen<None> - 31 - (0:0,0)
  73874. - Tag block - Gen<TagHelper> - 31 - (0:0,0) - input - inputtaghelper
  73875. - SelfClosing - <input data-required='value' />
  73876. - data-required - SingleQuotes
  73877. - Markup span - Gen<Markup> - [value] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:1
  73878. - SyntaxKind.Text;[value];
  73879. +RazorDocument - [0..31)::31 - [<input data-required='value' />]
  73880. + MarkupBlock - [0..31)::31
  73881. + MarkupTagHelperElement - [0..31)::31 - input[SelfClosing] - inputtaghelper
  73882. + MarkupTagHelperStartTag - [0..31)::31
  73883. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73884. + OpenAngle;[<];
  73885. + Text;[input];
  73886. + MarkupTagHelperAttribute - [6..28)::22 - data-required - SingleQuotes - Unbound - [ data-required='value']
  73887. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73888. + Whitespace;[ ];
  73889. + MarkupTextLiteral - [7..20)::13 - [data-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73890. + Text;[data-required];
  73891. + Equals;[=];
  73892. + MarkupTextLiteral - [21..22)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73893. + SingleQuote;['];
  73894. + MarkupTagHelperAttributeValue - [22..27)::5
  73895. + MarkupTextLiteral - [22..27)::5 - [value] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73896. + Text;[value];
  73897. + MarkupTextLiteral - [27..28)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73898. + SingleQuote;['];
  73899. + MarkupTextLiteral - [28..31)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73900. + Whitespace;[ ];
  73901. + ForwardSlash;[/];
  73902. + CloseAngle;[>];
  73903. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document3.stree.txt
  73904. index d76b453d548..81c87a341b9 100644
  73905. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document3.stree.txt
  73906. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document3.stree.txt
  73907. @@ -1,15 +1,35 @@
  73908. -Markup block - Gen<None> - 46 - (0:0,0)
  73909. - Tag block - Gen<TagHelper> - 46 - (0:0,0) - input - inputtaghelper
  73910. - SelfClosing - <input data-required='prefix @DateTime.Now' />
  73911. - data-required - SingleQuotes
  73912. - Markup block - Gen<None> - 20 - (22:0,22)
  73913. - Markup span - Gen<Markup> - [prefix ] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:2
  73914. - SyntaxKind.Text;[prefix];
  73915. - SyntaxKind.Whitespace;[ ];
  73916. - Expression block - Gen<Expr> - 13 - (29:0,29)
  73917. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (29:0,29) - Tokens:1
  73918. - SyntaxKind.Transition;[@];
  73919. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (30:0,30) - Tokens:3
  73920. - SyntaxKind.Identifier;[DateTime];
  73921. - SyntaxKind.Dot;[.];
  73922. - SyntaxKind.Identifier;[Now];
  73923. +RazorDocument - [0..46)::46 - [<input data-required='prefix @DateTime.Now' />]
  73924. + MarkupBlock - [0..46)::46
  73925. + MarkupTagHelperElement - [0..46)::46 - input[SelfClosing] - inputtaghelper
  73926. + MarkupTagHelperStartTag - [0..46)::46
  73927. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73928. + OpenAngle;[<];
  73929. + Text;[input];
  73930. + MarkupTagHelperAttribute - [6..43)::37 - data-required - SingleQuotes - Unbound - [ data-required='prefix @DateTime.Now']
  73931. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73932. + Whitespace;[ ];
  73933. + MarkupTextLiteral - [7..20)::13 - [data-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73934. + Text;[data-required];
  73935. + Equals;[=];
  73936. + MarkupTextLiteral - [21..22)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73937. + SingleQuote;['];
  73938. + MarkupTagHelperAttributeValue - [22..42)::20
  73939. + MarkupTextLiteral - [22..29)::7 - [prefix ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73940. + Text;[prefix];
  73941. + Whitespace;[ ];
  73942. + CSharpCodeBlock - [29..42)::13
  73943. + CSharpImplicitExpression - [29..42)::13
  73944. + CSharpTransition - [29..30)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73945. + Transition;[@];
  73946. + CSharpImplicitExpressionBody - [30..42)::12
  73947. + CSharpCodeBlock - [30..42)::12
  73948. + CSharpExpressionLiteral - [30..42)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  73949. + Identifier;[DateTime];
  73950. + Dot;[.];
  73951. + Identifier;[Now];
  73952. + MarkupTextLiteral - [42..43)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73953. + SingleQuote;['];
  73954. + MarkupTextLiteral - [43..46)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73955. + Whitespace;[ ];
  73956. + ForwardSlash;[/];
  73957. + CloseAngle;[>];
  73958. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document4.stree.txt
  73959. index d4aad7b2f88..975e485558a 100644
  73960. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document4.stree.txt
  73961. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document4.stree.txt
  73962. @@ -1,15 +1,35 @@
  73963. -Markup block - Gen<None> - 46 - (0:0,0)
  73964. - Tag block - Gen<TagHelper> - 46 - (0:0,0) - input - inputtaghelper
  73965. - SelfClosing - <input data-required='@DateTime.Now suffix' />
  73966. - data-required - SingleQuotes
  73967. - Markup block - Gen<None> - 20 - (22:0,22)
  73968. - Expression block - Gen<Expr> - 13 - (22:0,22)
  73969. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (22:0,22) - Tokens:1
  73970. - SyntaxKind.Transition;[@];
  73971. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (23:0,23) - Tokens:3
  73972. - SyntaxKind.Identifier;[DateTime];
  73973. - SyntaxKind.Dot;[.];
  73974. - SyntaxKind.Identifier;[Now];
  73975. - Markup span - Gen<Markup> - [ suffix] - SpanEditHandler;Accepts:Any - (35:0,35) - Tokens:2
  73976. - SyntaxKind.Whitespace;[ ];
  73977. - SyntaxKind.Text;[suffix];
  73978. +RazorDocument - [0..46)::46 - [<input data-required='@DateTime.Now suffix' />]
  73979. + MarkupBlock - [0..46)::46
  73980. + MarkupTagHelperElement - [0..46)::46 - input[SelfClosing] - inputtaghelper
  73981. + MarkupTagHelperStartTag - [0..46)::46
  73982. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73983. + OpenAngle;[<];
  73984. + Text;[input];
  73985. + MarkupTagHelperAttribute - [6..43)::37 - data-required - SingleQuotes - Unbound - [ data-required='@DateTime.Now suffix']
  73986. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73987. + Whitespace;[ ];
  73988. + MarkupTextLiteral - [7..20)::13 - [data-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73989. + Text;[data-required];
  73990. + Equals;[=];
  73991. + MarkupTextLiteral - [21..22)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  73992. + SingleQuote;['];
  73993. + MarkupTagHelperAttributeValue - [22..42)::20
  73994. + CSharpCodeBlock - [22..35)::13
  73995. + CSharpImplicitExpression - [22..35)::13
  73996. + CSharpTransition - [22..23)::1 - Gen<None> - SpanEditHandler;Accepts:None
  73997. + Transition;[@];
  73998. + CSharpImplicitExpressionBody - [23..35)::12
  73999. + CSharpCodeBlock - [23..35)::12
  74000. + CSharpExpressionLiteral - [23..35)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  74001. + Identifier;[DateTime];
  74002. + Dot;[.];
  74003. + Identifier;[Now];
  74004. + MarkupTextLiteral - [35..42)::7 - [ suffix] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74005. + Whitespace;[ ];
  74006. + Text;[suffix];
  74007. + MarkupTextLiteral - [42..43)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74008. + SingleQuote;['];
  74009. + MarkupTextLiteral - [43..46)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74010. + Whitespace;[ ];
  74011. + ForwardSlash;[/];
  74012. + CloseAngle;[>];
  74013. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document5.stree.txt
  74014. index 5a2804e54a7..9d2dfb5cf3c 100644
  74015. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document5.stree.txt
  74016. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document5.stree.txt
  74017. @@ -1,18 +1,38 @@
  74018. -Markup block - Gen<None> - 53 - (0:0,0)
  74019. - Tag block - Gen<TagHelper> - 53 - (0:0,0) - input - inputtaghelper
  74020. - SelfClosing - <input data-required='prefix @DateTime.Now suffix' />
  74021. - data-required - SingleQuotes
  74022. - Markup block - Gen<None> - 27 - (22:0,22)
  74023. - Markup span - Gen<Markup> - [prefix ] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:2
  74024. - SyntaxKind.Text;[prefix];
  74025. - SyntaxKind.Whitespace;[ ];
  74026. - Expression block - Gen<Expr> - 13 - (29:0,29)
  74027. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (29:0,29) - Tokens:1
  74028. - SyntaxKind.Transition;[@];
  74029. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (30:0,30) - Tokens:3
  74030. - SyntaxKind.Identifier;[DateTime];
  74031. - SyntaxKind.Dot;[.];
  74032. - SyntaxKind.Identifier;[Now];
  74033. - Markup span - Gen<Markup> - [ suffix] - SpanEditHandler;Accepts:Any - (42:0,42) - Tokens:2
  74034. - SyntaxKind.Whitespace;[ ];
  74035. - SyntaxKind.Text;[suffix];
  74036. +RazorDocument - [0..53)::53 - [<input data-required='prefix @DateTime.Now suffix' />]
  74037. + MarkupBlock - [0..53)::53
  74038. + MarkupTagHelperElement - [0..53)::53 - input[SelfClosing] - inputtaghelper
  74039. + MarkupTagHelperStartTag - [0..53)::53
  74040. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74041. + OpenAngle;[<];
  74042. + Text;[input];
  74043. + MarkupTagHelperAttribute - [6..50)::44 - data-required - SingleQuotes - Unbound - [ data-required='prefix @DateTime.Now suffix']
  74044. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74045. + Whitespace;[ ];
  74046. + MarkupTextLiteral - [7..20)::13 - [data-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74047. + Text;[data-required];
  74048. + Equals;[=];
  74049. + MarkupTextLiteral - [21..22)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74050. + SingleQuote;['];
  74051. + MarkupTagHelperAttributeValue - [22..49)::27
  74052. + MarkupTextLiteral - [22..29)::7 - [prefix ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74053. + Text;[prefix];
  74054. + Whitespace;[ ];
  74055. + CSharpCodeBlock - [29..42)::13
  74056. + CSharpImplicitExpression - [29..42)::13
  74057. + CSharpTransition - [29..30)::1 - Gen<None> - SpanEditHandler;Accepts:None
  74058. + Transition;[@];
  74059. + CSharpImplicitExpressionBody - [30..42)::12
  74060. + CSharpCodeBlock - [30..42)::12
  74061. + CSharpExpressionLiteral - [30..42)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  74062. + Identifier;[DateTime];
  74063. + Dot;[.];
  74064. + Identifier;[Now];
  74065. + MarkupTextLiteral - [42..49)::7 - [ suffix] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74066. + Whitespace;[ ];
  74067. + Text;[suffix];
  74068. + MarkupTextLiteral - [49..50)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74069. + SingleQuote;['];
  74070. + MarkupTextLiteral - [50..53)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74071. + Whitespace;[ ];
  74072. + ForwardSlash;[/];
  74073. + CloseAngle;[>];
  74074. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document6.stree.txt
  74075. index b715994f7db..f7880750f96 100644
  74076. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document6.stree.txt
  74077. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document6.stree.txt
  74078. @@ -1,20 +1,48 @@
  74079. -Markup block - Gen<None> - 82 - (0:0,0)
  74080. - Tag block - Gen<TagHelper> - 82 - (0:0,0) - input - inputtaghelper
  74081. - SelfClosing - <input pre-attribute data-required='prefix @DateTime.Now suffix' post-attribute />
  74082. - pre-attribute - Minimized
  74083. - data-required - SingleQuotes
  74084. - Markup block - Gen<None> - 27 - (36:0,36)
  74085. - Markup span - Gen<Markup> - [prefix ] - SpanEditHandler;Accepts:Any - (36:0,36) - Tokens:2
  74086. - SyntaxKind.Text;[prefix];
  74087. - SyntaxKind.Whitespace;[ ];
  74088. - Expression block - Gen<Expr> - 13 - (43:0,43)
  74089. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (43:0,43) - Tokens:1
  74090. - SyntaxKind.Transition;[@];
  74091. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (44:0,44) - Tokens:3
  74092. - SyntaxKind.Identifier;[DateTime];
  74093. - SyntaxKind.Dot;[.];
  74094. - SyntaxKind.Identifier;[Now];
  74095. - Markup span - Gen<Markup> - [ suffix] - SpanEditHandler;Accepts:Any - (56:0,56) - Tokens:2
  74096. - SyntaxKind.Whitespace;[ ];
  74097. - SyntaxKind.Text;[suffix];
  74098. - post-attribute - Minimized
  74099. +RazorDocument - [0..82)::82 - [<input pre-attribute data-required='prefix @DateTime.Now suffix' post-attribute />]
  74100. + MarkupBlock - [0..82)::82
  74101. + MarkupTagHelperElement - [0..82)::82 - input[SelfClosing] - inputtaghelper
  74102. + MarkupTagHelperStartTag - [0..82)::82
  74103. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74104. + OpenAngle;[<];
  74105. + Text;[input];
  74106. + MarkupMinimizedTagHelperAttribute - [6..20)::14 - pre-attribute - Minimized - Unbound - [ pre-attribute]
  74107. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74108. + Whitespace;[ ];
  74109. + MarkupTextLiteral - [7..20)::13 - [pre-attribute] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74110. + Text;[pre-attribute];
  74111. + MarkupTagHelperAttribute - [20..64)::44 - data-required - SingleQuotes - Unbound - [ data-required='prefix @DateTime.Now suffix']
  74112. + MarkupTextLiteral - [20..21)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74113. + Whitespace;[ ];
  74114. + MarkupTextLiteral - [21..34)::13 - [data-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74115. + Text;[data-required];
  74116. + Equals;[=];
  74117. + MarkupTextLiteral - [35..36)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74118. + SingleQuote;['];
  74119. + MarkupTagHelperAttributeValue - [36..63)::27
  74120. + MarkupTextLiteral - [36..43)::7 - [prefix ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74121. + Text;[prefix];
  74122. + Whitespace;[ ];
  74123. + CSharpCodeBlock - [43..56)::13
  74124. + CSharpImplicitExpression - [43..56)::13
  74125. + CSharpTransition - [43..44)::1 - Gen<None> - SpanEditHandler;Accepts:None
  74126. + Transition;[@];
  74127. + CSharpImplicitExpressionBody - [44..56)::12
  74128. + CSharpCodeBlock - [44..56)::12
  74129. + CSharpExpressionLiteral - [44..56)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  74130. + Identifier;[DateTime];
  74131. + Dot;[.];
  74132. + Identifier;[Now];
  74133. + MarkupTextLiteral - [56..63)::7 - [ suffix] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74134. + Whitespace;[ ];
  74135. + Text;[suffix];
  74136. + MarkupTextLiteral - [63..64)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74137. + SingleQuote;['];
  74138. + MarkupMinimizedTagHelperAttribute - [64..79)::15 - post-attribute - Minimized - Unbound - [ post-attribute]
  74139. + MarkupTextLiteral - [64..65)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74140. + Whitespace;[ ];
  74141. + MarkupTextLiteral - [65..79)::14 - [post-attribute] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74142. + Text;[post-attribute];
  74143. + MarkupTextLiteral - [79..82)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74144. + Whitespace;[ ];
  74145. + ForwardSlash;[/];
  74146. + CloseAngle;[>];
  74147. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document7.stree.txt
  74148. index ca0a4f66eed..b0278691b3d 100644
  74149. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document7.stree.txt
  74150. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/GeneratesExpectedOutputForUnboundDataDashAttributes_Document7.stree.txt
  74151. @@ -1,23 +1,46 @@
  74152. -Markup block - Gen<None> - 60 - (0:0,0)
  74153. - Tag block - Gen<TagHelper> - 60 - (0:0,0) - input - inputtaghelper
  74154. - SelfClosing - <input data-required='@DateTime.Now middle @DateTime.Now' />
  74155. - data-required - SingleQuotes
  74156. - Markup block - Gen<None> - 34 - (22:0,22)
  74157. - Expression block - Gen<Expr> - 13 - (22:0,22)
  74158. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (22:0,22) - Tokens:1
  74159. - SyntaxKind.Transition;[@];
  74160. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (23:0,23) - Tokens:3
  74161. - SyntaxKind.Identifier;[DateTime];
  74162. - SyntaxKind.Dot;[.];
  74163. - SyntaxKind.Identifier;[Now];
  74164. - Markup span - Gen<Markup> - [ middle ] - SpanEditHandler;Accepts:Any - (35:0,35) - Tokens:3
  74165. - SyntaxKind.Whitespace;[ ];
  74166. - SyntaxKind.Text;[middle];
  74167. - SyntaxKind.Whitespace;[ ];
  74168. - Expression block - Gen<Expr> - 13 - (43:0,43)
  74169. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (43:0,43) - Tokens:1
  74170. - SyntaxKind.Transition;[@];
  74171. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (44:0,44) - Tokens:3
  74172. - SyntaxKind.Identifier;[DateTime];
  74173. - SyntaxKind.Dot;[.];
  74174. - SyntaxKind.Identifier;[Now];
  74175. +RazorDocument - [0..60)::60 - [<input data-required='@DateTime.Now middle @DateTime.Now' />]
  74176. + MarkupBlock - [0..60)::60
  74177. + MarkupTagHelperElement - [0..60)::60 - input[SelfClosing] - inputtaghelper
  74178. + MarkupTagHelperStartTag - [0..60)::60
  74179. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74180. + OpenAngle;[<];
  74181. + Text;[input];
  74182. + MarkupTagHelperAttribute - [6..57)::51 - data-required - SingleQuotes - Unbound - [ data-required='@DateTime.Now middle @DateTime.Now']
  74183. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74184. + Whitespace;[ ];
  74185. + MarkupTextLiteral - [7..20)::13 - [data-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74186. + Text;[data-required];
  74187. + Equals;[=];
  74188. + MarkupTextLiteral - [21..22)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74189. + SingleQuote;['];
  74190. + MarkupTagHelperAttributeValue - [22..56)::34
  74191. + CSharpCodeBlock - [22..35)::13
  74192. + CSharpImplicitExpression - [22..35)::13
  74193. + CSharpTransition - [22..23)::1 - Gen<None> - SpanEditHandler;Accepts:None
  74194. + Transition;[@];
  74195. + CSharpImplicitExpressionBody - [23..35)::12
  74196. + CSharpCodeBlock - [23..35)::12
  74197. + CSharpExpressionLiteral - [23..35)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  74198. + Identifier;[DateTime];
  74199. + Dot;[.];
  74200. + Identifier;[Now];
  74201. + MarkupTextLiteral - [35..43)::8 - [ middle ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74202. + Whitespace;[ ];
  74203. + Text;[middle];
  74204. + Whitespace;[ ];
  74205. + CSharpCodeBlock - [43..56)::13
  74206. + CSharpImplicitExpression - [43..56)::13
  74207. + CSharpTransition - [43..44)::1 - Gen<None> - SpanEditHandler;Accepts:None
  74208. + Transition;[@];
  74209. + CSharpImplicitExpressionBody - [44..56)::12
  74210. + CSharpCodeBlock - [44..56)::12
  74211. + CSharpExpressionLiteral - [44..56)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  74212. + Identifier;[DateTime];
  74213. + Dot;[.];
  74214. + Identifier;[Now];
  74215. + MarkupTextLiteral - [56..57)::1 - ['] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74216. + SingleQuote;['];
  74217. + MarkupTextLiteral - [57..60)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74218. + Whitespace;[ ];
  74219. + ForwardSlash;[/];
  74220. + CloseAngle;[>];
  74221. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml1.stree.txt
  74222. index a6d60ffb5b2..2dd3c5e0db7 100644
  74223. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml1.stree.txt
  74224. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml1.stree.txt
  74225. @@ -1,13 +1,23 @@
  74226. -Markup block - Gen<None> - 11 - (0:0,0)
  74227. - Tag block - Gen<None> - 1 - (0:0,0)
  74228. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  74229. - SyntaxKind.OpenAngle;[<];
  74230. - Tag block - Gen<None> - 1 - (1:0,1)
  74231. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:1
  74232. - SyntaxKind.OpenAngle;[<];
  74233. - Tag block - Gen<TagHelper> - 9 - (2:0,2) - p - ptaghelper
  74234. - StartTagAndEndTag - <p> ... </p>
  74235. - SyntaxKind.HtmlTextLiteral - [>>] - [5..7) - FullWidth: 2 - Slots: 1
  74236. - SyntaxKind.List - [>>] - [5..7) - FullWidth: 2 - Slots: 2
  74237. - SyntaxKind.CloseAngle;[>];
  74238. - SyntaxKind.CloseAngle;[>];
  74239. +RazorDocument - [0..11)::11 - [<<<p>>></p>]
  74240. + MarkupBlock - [0..11)::11
  74241. + MarkupTagBlock - [0..1)::1 - [<]
  74242. + MarkupTextLiteral - [0..1)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74243. + OpenAngle;[<];
  74244. + MarkupTagBlock - [1..2)::1 - [<]
  74245. + MarkupTextLiteral - [1..2)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74246. + OpenAngle;[<];
  74247. + MarkupTagHelperElement - [2..11)::9 - p[StartTagAndEndTag] - ptaghelper
  74248. + MarkupTagHelperStartTag - [2..5)::3
  74249. + MarkupTextLiteral - [2..5)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74250. + OpenAngle;[<];
  74251. + Text;[p];
  74252. + CloseAngle;[>];
  74253. + MarkupTextLiteral - [5..7)::2 - [>>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74254. + CloseAngle;[>];
  74255. + CloseAngle;[>];
  74256. + MarkupTagHelperEndTag - [7..11)::4
  74257. + MarkupTextLiteral - [7..11)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74258. + OpenAngle;[<];
  74259. + ForwardSlash;[/];
  74260. + Text;[p];
  74261. + CloseAngle;[>];
  74262. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml10.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml10.stree.txt
  74263. index 57b1b11e065..d2c472f3b72 100644
  74264. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml10.stree.txt
  74265. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml10.stree.txt
  74266. @@ -1,33 +1,49 @@
  74267. -Markup block - Gen<None> - 42 - (0:0,0)
  74268. - Tag block - Gen<TagHelper> - 42 - (0:0,0) - p - ptaghelper
  74269. - StartTagAndEndTag - <p> ... </p>
  74270. - Tag block - Gen<None> - 17 - (3:0,3)
  74271. - Markup span - Gen<Markup> - [< ] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:2
  74272. - SyntaxKind.OpenAngle;[<];
  74273. - SyntaxKind.Whitespace;[ ];
  74274. - Expression block - Gen<Expr> - 13 - (5:0,5)
  74275. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (5:0,5) - Tokens:1
  74276. - SyntaxKind.Transition;[@];
  74277. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (6:0,6) - Tokens:3
  74278. - SyntaxKind.Identifier;[DateTime];
  74279. - SyntaxKind.Dot;[.];
  74280. - SyntaxKind.Identifier;[Now];
  74281. - Markup span - Gen<Markup> - [ >] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:2
  74282. - SyntaxKind.Whitespace;[ ];
  74283. - SyntaxKind.CloseAngle;[>];
  74284. - Tag block - Gen<None> - 3 - (20:0,20)
  74285. - Markup span - Gen<Markup> - [</ ] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:3
  74286. - SyntaxKind.OpenAngle;[<];
  74287. - SyntaxKind.ForwardSlash;[/];
  74288. - SyntaxKind.Whitespace;[ ];
  74289. - Expression block - Gen<Expr> - 13 - (23:0,23)
  74290. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (23:0,23) - Tokens:1
  74291. - SyntaxKind.Transition;[@];
  74292. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (24:0,24) - Tokens:3
  74293. - SyntaxKind.Identifier;[DateTime];
  74294. - SyntaxKind.Dot;[.];
  74295. - SyntaxKind.Identifier;[Now];
  74296. - SyntaxKind.HtmlTextLiteral - [ >] - [36..38) - FullWidth: 2 - Slots: 1
  74297. - SyntaxKind.List - [ >] - [36..38) - FullWidth: 2 - Slots: 2
  74298. - SyntaxKind.Whitespace;[ ];
  74299. - SyntaxKind.CloseAngle;[>];
  74300. +RazorDocument - [0..42)::42 - [<p>< @DateTime.Now ></ @DateTime.Now ></p>]
  74301. + MarkupBlock - [0..42)::42
  74302. + MarkupTagHelperElement - [0..42)::42 - p[StartTagAndEndTag] - ptaghelper
  74303. + MarkupTagHelperStartTag - [0..3)::3
  74304. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74305. + OpenAngle;[<];
  74306. + Text;[p];
  74307. + CloseAngle;[>];
  74308. + MarkupTagBlock - [3..20)::17 - [< @DateTime.Now >]
  74309. + MarkupTextLiteral - [3..5)::2 - [< ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74310. + OpenAngle;[<];
  74311. + Whitespace;[ ];
  74312. + CSharpCodeBlock - [5..18)::13
  74313. + CSharpImplicitExpression - [5..18)::13
  74314. + CSharpTransition - [5..6)::1 - Gen<None> - SpanEditHandler;Accepts:None
  74315. + Transition;[@];
  74316. + CSharpImplicitExpressionBody - [6..18)::12
  74317. + CSharpCodeBlock - [6..18)::12
  74318. + CSharpExpressionLiteral - [6..18)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  74319. + Identifier;[DateTime];
  74320. + Dot;[.];
  74321. + Identifier;[Now];
  74322. + MarkupTextLiteral - [18..20)::2 - [ >] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74323. + Whitespace;[ ];
  74324. + CloseAngle;[>];
  74325. + MarkupTagBlock - [20..23)::3 - [</ ]
  74326. + MarkupTextLiteral - [20..23)::3 - [</ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74327. + OpenAngle;[<];
  74328. + ForwardSlash;[/];
  74329. + Whitespace;[ ];
  74330. + CSharpCodeBlock - [23..36)::13
  74331. + CSharpImplicitExpression - [23..36)::13
  74332. + CSharpTransition - [23..24)::1 - Gen<None> - SpanEditHandler;Accepts:None
  74333. + Transition;[@];
  74334. + CSharpImplicitExpressionBody - [24..36)::12
  74335. + CSharpCodeBlock - [24..36)::12
  74336. + CSharpExpressionLiteral - [24..36)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  74337. + Identifier;[DateTime];
  74338. + Dot;[.];
  74339. + Identifier;[Now];
  74340. + MarkupTextLiteral - [36..38)::2 - [ >] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74341. + Whitespace;[ ];
  74342. + CloseAngle;[>];
  74343. + MarkupTagHelperEndTag - [38..42)::4
  74344. + MarkupTextLiteral - [38..42)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74345. + OpenAngle;[<];
  74346. + ForwardSlash;[/];
  74347. + Text;[p];
  74348. + CloseAngle;[>];
  74349. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml2.stree.txt
  74350. index 25c79c17d97..585e25bb519 100644
  74351. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml2.stree.txt
  74352. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml2.stree.txt
  74353. @@ -1,6 +1,13 @@
  74354. -Markup block - Gen<None> - 6 - (0:0,0)
  74355. - Tag block - Gen<None> - 1 - (0:0,0)
  74356. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  74357. - SyntaxKind.OpenAngle;[<];
  74358. - Tag block - Gen<TagHelper> - 5 - (1:0,1) - p - ptaghelper
  74359. - SelfClosing - <p />
  74360. +RazorDocument - [0..6)::6 - [<<p />]
  74361. + MarkupBlock - [0..6)::6
  74362. + MarkupTagBlock - [0..1)::1 - [<]
  74363. + MarkupTextLiteral - [0..1)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74364. + OpenAngle;[<];
  74365. + MarkupTagHelperElement - [1..6)::5 - p[SelfClosing] - ptaghelper
  74366. + MarkupTagHelperStartTag - [1..6)::5
  74367. + MarkupTextLiteral - [1..6)::5 - [<p />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74368. + OpenAngle;[<];
  74369. + Text;[p];
  74370. + Whitespace;[ ];
  74371. + ForwardSlash;[/];
  74372. + CloseAngle;[>];
  74373. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml3.stree.txt
  74374. index 4f181f6f85c..aefc9073054 100644
  74375. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml3.stree.txt
  74376. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml3.stree.txt
  74377. @@ -1,12 +1,14 @@
  74378. -Markup block - Gen<None> - 6 - (0:0,0)
  74379. - Tag block - Gen<None> - 6 - (0:0,0)
  74380. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  74381. - SyntaxKind.OpenAngle;[<];
  74382. - Markup block - Gen<None> - 2 - (1:0,1)
  74383. - Markup span - Gen<Markup> - [ p] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:2
  74384. - SyntaxKind.Whitespace;[ ];
  74385. - SyntaxKind.Text;[p];
  74386. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:3
  74387. - SyntaxKind.Whitespace;[ ];
  74388. - SyntaxKind.ForwardSlash;[/];
  74389. - SyntaxKind.CloseAngle;[>];
  74390. +RazorDocument - [0..6)::6 - [< p />]
  74391. + MarkupBlock - [0..6)::6
  74392. + MarkupTagBlock - [0..6)::6 - [< p />]
  74393. + MarkupTextLiteral - [0..1)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74394. + OpenAngle;[<];
  74395. + MarkupMinimizedAttributeBlock - [1..3)::2 - [ p]
  74396. + MarkupTextLiteral - [1..2)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74397. + Whitespace;[ ];
  74398. + MarkupTextLiteral - [2..3)::1 - [p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74399. + Text;[p];
  74400. + MarkupTextLiteral - [3..6)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74401. + Whitespace;[ ];
  74402. + ForwardSlash;[/];
  74403. + CloseAngle;[>];
  74404. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml4.stree.txt
  74405. index e029295ed41..26cda9df431 100644
  74406. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml4.stree.txt
  74407. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml4.stree.txt
  74408. @@ -1,8 +1,15 @@
  74409. -Markup block - Gen<None> - 12 - (0:0,0)
  74410. - Tag block - Gen<None> - 7 - (0:0,0)
  74411. - Markup span - Gen<Markup> - [<input ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  74412. - SyntaxKind.OpenAngle;[<];
  74413. - SyntaxKind.Text;[input];
  74414. - SyntaxKind.Whitespace;[ ];
  74415. - Tag block - Gen<TagHelper> - 5 - (7:0,7) - p - ptaghelper
  74416. - SelfClosing - <p />
  74417. +RazorDocument - [0..12)::12 - [<input <p />]
  74418. + MarkupBlock - [0..12)::12
  74419. + MarkupTagBlock - [0..7)::7 - [<input ]
  74420. + MarkupTextLiteral - [0..7)::7 - [<input ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74421. + OpenAngle;[<];
  74422. + Text;[input];
  74423. + Whitespace;[ ];
  74424. + MarkupTagHelperElement - [7..12)::5 - p[SelfClosing] - ptaghelper
  74425. + MarkupTagHelperStartTag - [7..12)::5
  74426. + MarkupTextLiteral - [7..12)::5 - [<p />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74427. + OpenAngle;[<];
  74428. + Text;[p];
  74429. + Whitespace;[ ];
  74430. + ForwardSlash;[/];
  74431. + CloseAngle;[>];
  74432. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml5.stree.txt
  74433. index d3377374078..4e4800e1a43 100644
  74434. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml5.stree.txt
  74435. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml5.stree.txt
  74436. @@ -1,18 +1,29 @@
  74437. -Markup block - Gen<None> - 19 - (0:0,0)
  74438. - Tag block - Gen<None> - 14 - (0:0,0)
  74439. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  74440. - SyntaxKind.OpenAngle;[<];
  74441. - Markup block - Gen<Attr:class, class="@(1:0,1),"@(12:0,12)> - 12 - (1:0,1)
  74442. - Markup span - Gen<None> - [ class="] - SpanEditHandler;Accepts:Any - (1:0,1) - Tokens:4
  74443. - SyntaxKind.Whitespace;[ ];
  74444. - SyntaxKind.Text;[class];
  74445. - SyntaxKind.Equals;[=];
  74446. - SyntaxKind.DoubleQuote;["];
  74447. - Markup span - Gen<LitAttr:@(9:0,9)> - [foo] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:1
  74448. - SyntaxKind.Text;[foo];
  74449. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:1
  74450. - SyntaxKind.DoubleQuote;["];
  74451. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:1
  74452. - SyntaxKind.Whitespace;[ ];
  74453. - Tag block - Gen<TagHelper> - 5 - (14:0,14) - p - ptaghelper
  74454. - SelfClosing - <p />
  74455. +RazorDocument - [0..19)::19 - [< class="foo" <p />]
  74456. + MarkupBlock - [0..19)::19
  74457. + MarkupTagBlock - [0..14)::14 - [< class="foo" ]
  74458. + MarkupTextLiteral - [0..1)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74459. + OpenAngle;[<];
  74460. + MarkupAttributeBlock - [1..13)::12 - [ class="foo"]
  74461. + MarkupTextLiteral - [1..2)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74462. + Whitespace;[ ];
  74463. + MarkupTextLiteral - [2..7)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74464. + Text;[class];
  74465. + Equals;[=];
  74466. + MarkupTextLiteral - [8..9)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  74467. + DoubleQuote;["];
  74468. + GenericBlock - [9..12)::3
  74469. + MarkupLiteralAttributeValue - [9..12)::3 - [foo]
  74470. + MarkupTextLiteral - [9..12)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74471. + Text;[foo];
  74472. + MarkupTextLiteral - [12..13)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  74473. + DoubleQuote;["];
  74474. + MarkupTextLiteral - [13..14)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74475. + Whitespace;[ ];
  74476. + MarkupTagHelperElement - [14..19)::5 - p[SelfClosing] - ptaghelper
  74477. + MarkupTagHelperStartTag - [14..19)::5
  74478. + MarkupTextLiteral - [14..19)::5 - [<p />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74479. + OpenAngle;[<];
  74480. + Text;[p];
  74481. + Whitespace;[ ];
  74482. + ForwardSlash;[/];
  74483. + CloseAngle;[>];
  74484. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml6.stree.txt
  74485. index 36b6f9d8e62..993705be5d2 100644
  74486. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml6.stree.txt
  74487. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml6.stree.txt
  74488. @@ -1,16 +1,26 @@
  74489. -Markup block - Gen<None> - 13 - (0:0,0)
  74490. - Tag block - Gen<None> - 2 - (0:0,0)
  74491. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  74492. - SyntaxKind.OpenAngle;[<];
  74493. - SyntaxKind.ForwardSlash;[/];
  74494. - Tag block - Gen<None> - 1 - (2:0,2)
  74495. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  74496. - SyntaxKind.OpenAngle;[<];
  74497. - Tag block - Gen<TagHelper> - 9 - (3:0,3) - p - ptaghelper
  74498. - StartTagAndEndTag - <p> ... </p>
  74499. - SyntaxKind.HtmlTextLiteral - [/>] - [6..8) - FullWidth: 2 - Slots: 1
  74500. - SyntaxKind.List - [/>] - [6..8) - FullWidth: 2 - Slots: 2
  74501. - SyntaxKind.ForwardSlash;[/];
  74502. - SyntaxKind.CloseAngle;[>];
  74503. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:1
  74504. - SyntaxKind.CloseAngle;[>];
  74505. +RazorDocument - [0..13)::13 - [</<<p>/></p>>]
  74506. + MarkupBlock - [0..13)::13
  74507. + MarkupTagBlock - [0..2)::2 - [</]
  74508. + MarkupTextLiteral - [0..2)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74509. + OpenAngle;[<];
  74510. + ForwardSlash;[/];
  74511. + MarkupTagBlock - [2..3)::1 - [<]
  74512. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74513. + OpenAngle;[<];
  74514. + MarkupTagHelperElement - [3..12)::9 - p[StartTagAndEndTag] - ptaghelper
  74515. + MarkupTagHelperStartTag - [3..6)::3
  74516. + MarkupTextLiteral - [3..6)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74517. + OpenAngle;[<];
  74518. + Text;[p];
  74519. + CloseAngle;[>];
  74520. + MarkupTextLiteral - [6..8)::2 - [/>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74521. + ForwardSlash;[/];
  74522. + CloseAngle;[>];
  74523. + MarkupTagHelperEndTag - [8..12)::4
  74524. + MarkupTextLiteral - [8..12)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74525. + OpenAngle;[<];
  74526. + ForwardSlash;[/];
  74527. + Text;[p];
  74528. + CloseAngle;[>];
  74529. + MarkupTextLiteral - [12..13)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74530. + CloseAngle;[>];
  74531. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml7.stree.txt
  74532. index af4b2ac4028..5beba63c386 100644
  74533. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml7.stree.txt
  74534. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml7.stree.txt
  74535. @@ -1,21 +1,31 @@
  74536. -Markup block - Gen<None> - 21 - (0:0,0)
  74537. - Tag block - Gen<None> - 2 - (0:0,0)
  74538. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  74539. - SyntaxKind.OpenAngle;[<];
  74540. - SyntaxKind.ForwardSlash;[/];
  74541. - Tag block - Gen<None> - 1 - (2:0,2)
  74542. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  74543. - SyntaxKind.OpenAngle;[<];
  74544. - Tag block - Gen<TagHelper> - 17 - (3:0,3) - p - ptaghelper
  74545. - StartTagAndEndTag - <p> ... </p>
  74546. - SyntaxKind.HtmlTextLiteral - [/>] - [6..8) - FullWidth: 2 - Slots: 1
  74547. - SyntaxKind.List - [/>] - [6..8) - FullWidth: 2 - Slots: 2
  74548. - SyntaxKind.ForwardSlash;[/];
  74549. - SyntaxKind.CloseAngle;[>];
  74550. - Tag block - Gen<None> - 8 - (8:0,8)
  74551. - Markup span - Gen<Markup> - [<strong>] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:3
  74552. - SyntaxKind.OpenAngle;[<];
  74553. - SyntaxKind.Text;[strong];
  74554. - SyntaxKind.CloseAngle;[>];
  74555. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:1
  74556. - SyntaxKind.CloseAngle;[>];
  74557. +RazorDocument - [0..21)::21 - [</<<p>/><strong></p>>]
  74558. + MarkupBlock - [0..21)::21
  74559. + MarkupTagBlock - [0..2)::2 - [</]
  74560. + MarkupTextLiteral - [0..2)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74561. + OpenAngle;[<];
  74562. + ForwardSlash;[/];
  74563. + MarkupTagBlock - [2..3)::1 - [<]
  74564. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74565. + OpenAngle;[<];
  74566. + MarkupTagHelperElement - [3..20)::17 - p[StartTagAndEndTag] - ptaghelper
  74567. + MarkupTagHelperStartTag - [3..6)::3
  74568. + MarkupTextLiteral - [3..6)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74569. + OpenAngle;[<];
  74570. + Text;[p];
  74571. + CloseAngle;[>];
  74572. + MarkupTextLiteral - [6..8)::2 - [/>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74573. + ForwardSlash;[/];
  74574. + CloseAngle;[>];
  74575. + MarkupTagBlock - [8..16)::8 - [<strong>]
  74576. + MarkupTextLiteral - [8..16)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74577. + OpenAngle;[<];
  74578. + Text;[strong];
  74579. + CloseAngle;[>];
  74580. + MarkupTagHelperEndTag - [16..20)::4
  74581. + MarkupTextLiteral - [16..20)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74582. + OpenAngle;[<];
  74583. + ForwardSlash;[/];
  74584. + Text;[p];
  74585. + CloseAngle;[>];
  74586. + MarkupTextLiteral - [20..21)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74587. + CloseAngle;[>];
  74588. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml8.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml8.stree.txt
  74589. index 9ff6a024f3f..f0a3fe94d80 100644
  74590. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml8.stree.txt
  74591. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml8.stree.txt
  74592. @@ -1,28 +1,41 @@
  74593. -Markup block - Gen<None> - 34 - (0:0,0)
  74594. - Tag block - Gen<None> - 2 - (0:0,0)
  74595. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  74596. - SyntaxKind.OpenAngle;[<];
  74597. - SyntaxKind.ForwardSlash;[/];
  74598. - Tag block - Gen<None> - 1 - (2:0,2)
  74599. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  74600. - SyntaxKind.OpenAngle;[<];
  74601. - Tag block - Gen<TagHelper> - 30 - (3:0,3) - p - ptaghelper
  74602. - StartTagAndEndTag - <p> ... </p>
  74603. - Expression block - Gen<Expr> - 13 - (6:0,6)
  74604. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (6:0,6) - Tokens:1
  74605. - SyntaxKind.Transition;[@];
  74606. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (7:0,7) - Tokens:3
  74607. - SyntaxKind.Identifier;[DateTime];
  74608. - SyntaxKind.Dot;[.];
  74609. - SyntaxKind.Identifier;[Now];
  74610. - SyntaxKind.HtmlTextLiteral - [/>] - [19..21) - FullWidth: 2 - Slots: 1
  74611. - SyntaxKind.List - [/>] - [19..21) - FullWidth: 2 - Slots: 2
  74612. - SyntaxKind.ForwardSlash;[/];
  74613. - SyntaxKind.CloseAngle;[>];
  74614. - Tag block - Gen<None> - 8 - (21:0,21)
  74615. - Markup span - Gen<Markup> - [<strong>] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:3
  74616. - SyntaxKind.OpenAngle;[<];
  74617. - SyntaxKind.Text;[strong];
  74618. - SyntaxKind.CloseAngle;[>];
  74619. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (33:0,33) - Tokens:1
  74620. - SyntaxKind.CloseAngle;[>];
  74621. +RazorDocument - [0..34)::34 - [</<<p>@DateTime.Now/><strong></p>>]
  74622. + MarkupBlock - [0..34)::34
  74623. + MarkupTagBlock - [0..2)::2 - [</]
  74624. + MarkupTextLiteral - [0..2)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74625. + OpenAngle;[<];
  74626. + ForwardSlash;[/];
  74627. + MarkupTagBlock - [2..3)::1 - [<]
  74628. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74629. + OpenAngle;[<];
  74630. + MarkupTagHelperElement - [3..33)::30 - p[StartTagAndEndTag] - ptaghelper
  74631. + MarkupTagHelperStartTag - [3..6)::3
  74632. + MarkupTextLiteral - [3..6)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74633. + OpenAngle;[<];
  74634. + Text;[p];
  74635. + CloseAngle;[>];
  74636. + CSharpCodeBlock - [6..19)::13
  74637. + CSharpImplicitExpression - [6..19)::13
  74638. + CSharpTransition - [6..7)::1 - Gen<None> - SpanEditHandler;Accepts:None
  74639. + Transition;[@];
  74640. + CSharpImplicitExpressionBody - [7..19)::12
  74641. + CSharpCodeBlock - [7..19)::12
  74642. + CSharpExpressionLiteral - [7..19)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  74643. + Identifier;[DateTime];
  74644. + Dot;[.];
  74645. + Identifier;[Now];
  74646. + MarkupTextLiteral - [19..21)::2 - [/>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74647. + ForwardSlash;[/];
  74648. + CloseAngle;[>];
  74649. + MarkupTagBlock - [21..29)::8 - [<strong>]
  74650. + MarkupTextLiteral - [21..29)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74651. + OpenAngle;[<];
  74652. + Text;[strong];
  74653. + CloseAngle;[>];
  74654. + MarkupTagHelperEndTag - [29..33)::4
  74655. + MarkupTextLiteral - [29..33)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74656. + OpenAngle;[<];
  74657. + ForwardSlash;[/];
  74658. + Text;[p];
  74659. + CloseAngle;[>];
  74660. + MarkupTextLiteral - [33..34)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74661. + CloseAngle;[>];
  74662. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml9.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml9.stree.txt
  74663. index 57b1cd57139..3cccfeb3096 100644
  74664. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml9.stree.txt
  74665. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_AllowsInvalidHtml9.stree.txt
  74666. @@ -1,39 +1,52 @@
  74667. -Markup block - Gen<None> - 52 - (0:0,0)
  74668. - Tag block - Gen<None> - 4 - (0:0,0)
  74669. - Markup span - Gen<Markup> - [</ ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  74670. - SyntaxKind.OpenAngle;[<];
  74671. - SyntaxKind.ForwardSlash;[/];
  74672. - SyntaxKind.Whitespace;[ ];
  74673. - SyntaxKind.HtmlTextLiteral - [/] - [4..5) - FullWidth: 1 - Slots: 1
  74674. - SyntaxKind.ForwardSlash;[/];
  74675. - Tag block - Gen<None> - 4 - (5:0,5)
  74676. - Markup span - Gen<Markup> - [< >] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:3
  74677. - SyntaxKind.OpenAngle;[<];
  74678. - SyntaxKind.Whitespace;[ ];
  74679. - SyntaxKind.CloseAngle;[>];
  74680. - Tag block - Gen<TagHelper> - 32 - (9:0,9) - p - ptaghelper
  74681. - StartTagAndEndTag - <p> ... </p>
  74682. - Expression block - Gen<Expr> - 13 - (12:0,12)
  74683. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:1
  74684. - SyntaxKind.Transition;[@];
  74685. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (13:0,13) - Tokens:3
  74686. - SyntaxKind.Identifier;[DateTime];
  74687. - SyntaxKind.Dot;[.];
  74688. - SyntaxKind.Identifier;[Now];
  74689. - SyntaxKind.HtmlTextLiteral - [ / >] - [25..29) - FullWidth: 4 - Slots: 1
  74690. - SyntaxKind.List - [ / >] - [25..29) - FullWidth: 4 - Slots: 4
  74691. - SyntaxKind.Whitespace;[ ];
  74692. - SyntaxKind.ForwardSlash;[/];
  74693. - SyntaxKind.Whitespace;[ ];
  74694. - SyntaxKind.CloseAngle;[>];
  74695. - Tag block - Gen<None> - 8 - (29:0,29)
  74696. - Markup span - Gen<Markup> - [<strong>] - SpanEditHandler;Accepts:Any - (29:0,29) - Tokens:3
  74697. - SyntaxKind.OpenAngle;[<];
  74698. - SyntaxKind.Text;[strong];
  74699. - SyntaxKind.CloseAngle;[>];
  74700. - Tag block - Gen<None> - 11 - (41:0,41)
  74701. - Markup span - Gen<Markup> - [</ >] - SpanEditHandler;Accepts:Any - (41:0,41) - Tokens:4
  74702. - SyntaxKind.OpenAngle;[<];
  74703. - SyntaxKind.ForwardSlash;[/];
  74704. - SyntaxKind.Whitespace;[ ];
  74705. - SyntaxKind.CloseAngle;[>];
  74706. +RazorDocument - [0..52)::52 - [</ /< ><p>@DateTime.Now / ><strong></p></ >]
  74707. + MarkupBlock - [0..52)::52
  74708. + MarkupTagBlock - [0..4)::4 - [</ ]
  74709. + MarkupTextLiteral - [0..4)::4 - [</ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74710. + OpenAngle;[<];
  74711. + ForwardSlash;[/];
  74712. + Whitespace;[ ];
  74713. + MarkupTextLiteral - [4..5)::1 - [/] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74714. + ForwardSlash;[/];
  74715. + MarkupTagBlock - [5..9)::4 - [< >]
  74716. + MarkupTextLiteral - [5..9)::4 - [< >] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74717. + OpenAngle;[<];
  74718. + Whitespace;[ ];
  74719. + CloseAngle;[>];
  74720. + MarkupTagHelperElement - [9..41)::32 - p[StartTagAndEndTag] - ptaghelper
  74721. + MarkupTagHelperStartTag - [9..12)::3
  74722. + MarkupTextLiteral - [9..12)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74723. + OpenAngle;[<];
  74724. + Text;[p];
  74725. + CloseAngle;[>];
  74726. + CSharpCodeBlock - [12..25)::13
  74727. + CSharpImplicitExpression - [12..25)::13
  74728. + CSharpTransition - [12..13)::1 - Gen<None> - SpanEditHandler;Accepts:None
  74729. + Transition;[@];
  74730. + CSharpImplicitExpressionBody - [13..25)::12
  74731. + CSharpCodeBlock - [13..25)::12
  74732. + CSharpExpressionLiteral - [13..25)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  74733. + Identifier;[DateTime];
  74734. + Dot;[.];
  74735. + Identifier;[Now];
  74736. + MarkupTextLiteral - [25..29)::4 - [ / >] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74737. + Whitespace;[ ];
  74738. + ForwardSlash;[/];
  74739. + Whitespace;[ ];
  74740. + CloseAngle;[>];
  74741. + MarkupTagBlock - [29..37)::8 - [<strong>]
  74742. + MarkupTextLiteral - [29..37)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74743. + OpenAngle;[<];
  74744. + Text;[strong];
  74745. + CloseAngle;[>];
  74746. + MarkupTagHelperEndTag - [37..41)::4
  74747. + MarkupTextLiteral - [37..41)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74748. + OpenAngle;[<];
  74749. + ForwardSlash;[/];
  74750. + Text;[p];
  74751. + CloseAngle;[>];
  74752. + MarkupTagBlock - [41..52)::11 - [</ >]
  74753. + MarkupTextLiteral - [41..52)::11 - [</ >] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74754. + OpenAngle;[<];
  74755. + ForwardSlash;[/];
  74756. + Whitespace;[ ];
  74757. + CloseAngle;[>];
  74758. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper1.stree.txt
  74759. index 1f900238b49..a2ca91149ac 100644
  74760. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper1.stree.txt
  74761. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper1.stree.txt
  74762. @@ -1,27 +1,66 @@
  74763. -Markup block - Gen<None> - 73 - (0:0,0)
  74764. - Tag block - Gen<TagHelper> - 64 - (0:0,0) - p - ptaghelper
  74765. - StartTagAndEndTag - <p class=foo [email protected] style=color:red;> ... </p>
  74766. - class - NoQuotes
  74767. - Markup span - Gen<Markup> - [foo] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:1
  74768. - SyntaxKind.Text;[foo];
  74769. - dynamic - DoubleQuotes
  74770. - Markup block - Gen<None> - 13 - (21:0,21)
  74771. - Markup block - Gen<DynAttr:@(21:0,21)> - 13 - (21:0,21)
  74772. - Expression block - Gen<Expr> - 13 - (21:0,21)
  74773. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:1
  74774. - SyntaxKind.Transition;[@];
  74775. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (22:0,22) - Tokens:3
  74776. - SyntaxKind.Identifier;[DateTime];
  74777. - SyntaxKind.Dot;[.];
  74778. - SyntaxKind.Identifier;[Now];
  74779. - style - NoQuotes
  74780. - Markup span - Gen<Markup> - [color:red;] - SpanEditHandler;Accepts:Any - (41:0,41) - Tokens:1
  74781. - SyntaxKind.Text;[color:red;];
  74782. - Tag block - Gen<TagHelper> - 8 - (52:0,52) - strong - strongtaghelper
  74783. - StartTagAndEndTag - <strong>
  74784. - Tag block - Gen<None> - 9 - (64:0,64)
  74785. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (64:0,64) - Tokens:4
  74786. - SyntaxKind.OpenAngle;[<];
  74787. - SyntaxKind.ForwardSlash;[/];
  74788. - SyntaxKind.Text;[strong];
  74789. - SyntaxKind.CloseAngle;[>];
  74790. +RazorDocument - [0..73)::73 - [<p class=foo [email protected] style=color:red;><strong></p></strong>]
  74791. + MarkupBlock - [0..73)::73
  74792. + MarkupTagHelperElement - [0..64)::64 - p[StartTagAndEndTag] - ptaghelper
  74793. + MarkupTagHelperStartTag - [0..52)::52
  74794. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74795. + OpenAngle;[<];
  74796. + Text;[p];
  74797. + MarkupTagHelperAttribute - [2..12)::10 - class - DoubleQuotes - Unbound - [ class=foo]
  74798. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74799. + Whitespace;[ ];
  74800. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74801. + Text;[class];
  74802. + Equals;[=];
  74803. + MarkupTagHelperAttributeValue - [9..12)::3
  74804. + MarkupLiteralAttributeValue - [9..12)::3 - [foo]
  74805. + MarkupTextLiteral - [9..12)::3 - [foo] - Gen<None> - SpanEditHandler;Accepts:Any
  74806. + Text;[foo];
  74807. + MarkupTagHelperAttribute - [12..34)::22 - dynamic - DoubleQuotes - Unbound - [ [email protected]]
  74808. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74809. + Whitespace;[ ];
  74810. + MarkupTextLiteral - [13..20)::7 - [dynamic] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74811. + Text;[dynamic];
  74812. + Equals;[=];
  74813. + MarkupTagHelperAttributeValue - [21..34)::13
  74814. + MarkupDynamicAttributeValue - [21..34)::13 - [@DateTime.Now]
  74815. + GenericBlock - [21..34)::13
  74816. + CSharpCodeBlock - [21..34)::13
  74817. + CSharpImplicitExpression - [21..34)::13
  74818. + CSharpTransition - [21..22)::1 - Gen<None> - SpanEditHandler;Accepts:None
  74819. + Transition;[@];
  74820. + CSharpImplicitExpressionBody - [22..34)::12
  74821. + CSharpCodeBlock - [22..34)::12
  74822. + CSharpExpressionLiteral - [22..34)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  74823. + Identifier;[DateTime];
  74824. + Dot;[.];
  74825. + Identifier;[Now];
  74826. + MarkupTagHelperAttribute - [34..51)::17 - style - DoubleQuotes - Unbound - [ style=color:red;]
  74827. + MarkupTextLiteral - [34..35)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74828. + Whitespace;[ ];
  74829. + MarkupTextLiteral - [35..40)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74830. + Text;[style];
  74831. + Equals;[=];
  74832. + MarkupTagHelperAttributeValue - [41..51)::10
  74833. + MarkupLiteralAttributeValue - [41..51)::10 - [color:red;]
  74834. + MarkupTextLiteral - [41..51)::10 - [color:red;] - Gen<None> - SpanEditHandler;Accepts:Any
  74835. + Text;[color:red;];
  74836. + MarkupTextLiteral - [51..52)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74837. + CloseAngle;[>];
  74838. + MarkupTagHelperElement - [52..60)::8 - strong[StartTagAndEndTag] - strongtaghelper
  74839. + MarkupTagHelperStartTag - [52..60)::8
  74840. + MarkupTextLiteral - [52..60)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74841. + OpenAngle;[<];
  74842. + Text;[strong];
  74843. + CloseAngle;[>];
  74844. + MarkupTagHelperEndTag - [60..64)::4
  74845. + MarkupTextLiteral - [60..64)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74846. + OpenAngle;[<];
  74847. + ForwardSlash;[/];
  74848. + Text;[p];
  74849. + CloseAngle;[>];
  74850. + MarkupTagBlock - [64..73)::9 - [</strong>]
  74851. + MarkupTextLiteral - [64..73)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74852. + OpenAngle;[<];
  74853. + ForwardSlash;[/];
  74854. + Text;[strong];
  74855. + CloseAngle;[>];
  74856. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper2.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper2.cspans.txt
  74857. index e3b29061bdf..f4e5ce935cb 100644
  74858. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper2.cspans.txt
  74859. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper2.cspans.txt
  74860. @@ -1,4 +1,4 @@
  74861. Markup span at (0:0,0 [5] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [5] )
  74862. -Markup span at (8:0,8 [6] ) (Accepts:Any) - Parent: Tag block at (5:0,5 [37] )
  74863. +Markup span at (8:0,8 [6] ) (Accepts:Any) - Parent: Tag block at (5:0,5 [31] )
  74864. Markup span at (22:0,22 [5] ) (Accepts:Any) - Parent: Tag block at (14:0,14 [22] )
  74865. Markup span at (36:0,36 [6] ) (Accepts:Any) - Parent: Tag block at (36:0,36 [6] )
  74866. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper2.stree.txt
  74867. index 4751710d9a0..cdc5660b9ce 100644
  74868. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper2.stree.txt
  74869. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper2.stree.txt
  74870. @@ -1,22 +1,36 @@
  74871. -Markup block - Gen<None> - 42 - (0:0,0)
  74872. - Tag block - Gen<None> - 5 - (0:0,0)
  74873. - Markup span - Gen<Markup> - [<div>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  74874. - SyntaxKind.OpenAngle;[<];
  74875. - SyntaxKind.Text;[div];
  74876. - SyntaxKind.CloseAngle;[>];
  74877. - Tag block - Gen<TagHelper> - 37 - (5:0,5) - p - ptaghelper
  74878. - StartTagAndEndTag - <p>
  74879. - SyntaxKind.HtmlTextLiteral - [Hello ] - [8..14) - FullWidth: 6 - Slots: 1
  74880. - SyntaxKind.List - [Hello ] - [8..14) - FullWidth: 6 - Slots: 2
  74881. - SyntaxKind.Text;[Hello];
  74882. - SyntaxKind.Whitespace;[ ];
  74883. - Tag block - Gen<TagHelper> - 22 - (14:0,14) - strong - strongtaghelper
  74884. - StartTagAndEndTag - <strong> ... </strong>
  74885. - SyntaxKind.HtmlTextLiteral - [World] - [22..27) - FullWidth: 5 - Slots: 1
  74886. - SyntaxKind.Text;[World];
  74887. - Tag block - Gen<None> - 6 - (36:0,36)
  74888. - Markup span - Gen<Markup> - [</div>] - SpanEditHandler;Accepts:Any - (36:0,36) - Tokens:4
  74889. - SyntaxKind.OpenAngle;[<];
  74890. - SyntaxKind.ForwardSlash;[/];
  74891. - SyntaxKind.Text;[div];
  74892. - SyntaxKind.CloseAngle;[>];
  74893. +RazorDocument - [0..42)::42 - [<div><p>Hello <strong>World</strong></div>]
  74894. + MarkupBlock - [0..42)::42
  74895. + MarkupTagBlock - [0..5)::5 - [<div>]
  74896. + MarkupTextLiteral - [0..5)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74897. + OpenAngle;[<];
  74898. + Text;[div];
  74899. + CloseAngle;[>];
  74900. + MarkupTagHelperElement - [5..36)::31 - p[StartTagAndEndTag] - ptaghelper
  74901. + MarkupTagHelperStartTag - [5..8)::3
  74902. + MarkupTextLiteral - [5..8)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74903. + OpenAngle;[<];
  74904. + Text;[p];
  74905. + CloseAngle;[>];
  74906. + MarkupTextLiteral - [8..14)::6 - [Hello ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74907. + Text;[Hello];
  74908. + Whitespace;[ ];
  74909. + MarkupTagHelperElement - [14..36)::22 - strong[StartTagAndEndTag] - strongtaghelper
  74910. + MarkupTagHelperStartTag - [14..22)::8
  74911. + MarkupTextLiteral - [14..22)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74912. + OpenAngle;[<];
  74913. + Text;[strong];
  74914. + CloseAngle;[>];
  74915. + MarkupTextLiteral - [22..27)::5 - [World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74916. + Text;[World];
  74917. + MarkupTagHelperEndTag - [27..36)::9
  74918. + MarkupTextLiteral - [27..36)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74919. + OpenAngle;[<];
  74920. + ForwardSlash;[/];
  74921. + Text;[strong];
  74922. + CloseAngle;[>];
  74923. + MarkupTagBlock - [36..42)::6 - [</div>]
  74924. + MarkupTextLiteral - [36..42)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74925. + OpenAngle;[<];
  74926. + ForwardSlash;[/];
  74927. + Text;[div];
  74928. + CloseAngle;[>];
  74929. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper2.tspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper2.tspans.txt
  74930. index 80e567b496b..36dd08e8185 100644
  74931. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper2.tspans.txt
  74932. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper2.tspans.txt
  74933. @@ -1,2 +1,2 @@
  74934. -TagHelper span at (5:0,5 [37] ) - ptaghelper
  74935. +TagHelper span at (5:0,5 [31] ) - ptaghelper
  74936. TagHelper span at (14:0,14 [22] ) - strongtaghelper
  74937. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper3.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper3.cspans.txt
  74938. index 0e3bf1526f1..a003b54d783 100644
  74939. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper3.cspans.txt
  74940. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper3.cspans.txt
  74941. @@ -1,4 +1,4 @@
  74942. Markup span at (0:0,0 [5] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [5] )
  74943. -Markup span at (8:0,8 [6] ) (Accepts:Any) - Parent: Tag block at (5:0,5 [28] )
  74944. -Markup span at (22:0,22 [5] ) (Accepts:Any) - Parent: Tag block at (14:0,14 [19] )
  74945. +Markup span at (8:0,8 [6] ) (Accepts:Any) - Parent: Tag block at (5:0,5 [22] )
  74946. +Markup span at (22:0,22 [5] ) (Accepts:Any) - Parent: Tag block at (14:0,14 [13] )
  74947. Markup span at (27:0,27 [6] ) (Accepts:Any) - Parent: Tag block at (27:0,27 [6] )
  74948. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper3.stree.txt
  74949. index 9aa52108aea..55169c40f8d 100644
  74950. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper3.stree.txt
  74951. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper3.stree.txt
  74952. @@ -1,22 +1,30 @@
  74953. -Markup block - Gen<None> - 33 - (0:0,0)
  74954. - Tag block - Gen<None> - 5 - (0:0,0)
  74955. - Markup span - Gen<Markup> - [<div>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  74956. - SyntaxKind.OpenAngle;[<];
  74957. - SyntaxKind.Text;[div];
  74958. - SyntaxKind.CloseAngle;[>];
  74959. - Tag block - Gen<TagHelper> - 28 - (5:0,5) - p - ptaghelper
  74960. - StartTagAndEndTag - <p>
  74961. - SyntaxKind.HtmlTextLiteral - [Hello ] - [8..14) - FullWidth: 6 - Slots: 1
  74962. - SyntaxKind.List - [Hello ] - [8..14) - FullWidth: 6 - Slots: 2
  74963. - SyntaxKind.Text;[Hello];
  74964. - SyntaxKind.Whitespace;[ ];
  74965. - Tag block - Gen<TagHelper> - 19 - (14:0,14) - strong - strongtaghelper
  74966. - StartTagAndEndTag - <strong>
  74967. - SyntaxKind.HtmlTextLiteral - [World] - [22..27) - FullWidth: 5 - Slots: 1
  74968. - SyntaxKind.Text;[World];
  74969. - Tag block - Gen<None> - 6 - (27:0,27)
  74970. - Markup span - Gen<Markup> - [</div>] - SpanEditHandler;Accepts:Any - (27:0,27) - Tokens:4
  74971. - SyntaxKind.OpenAngle;[<];
  74972. - SyntaxKind.ForwardSlash;[/];
  74973. - SyntaxKind.Text;[div];
  74974. - SyntaxKind.CloseAngle;[>];
  74975. +RazorDocument - [0..33)::33 - [<div><p>Hello <strong>World</div>]
  74976. + MarkupBlock - [0..33)::33
  74977. + MarkupTagBlock - [0..5)::5 - [<div>]
  74978. + MarkupTextLiteral - [0..5)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74979. + OpenAngle;[<];
  74980. + Text;[div];
  74981. + CloseAngle;[>];
  74982. + MarkupTagHelperElement - [5..27)::22 - p[StartTagAndEndTag] - ptaghelper
  74983. + MarkupTagHelperStartTag - [5..8)::3
  74984. + MarkupTextLiteral - [5..8)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74985. + OpenAngle;[<];
  74986. + Text;[p];
  74987. + CloseAngle;[>];
  74988. + MarkupTextLiteral - [8..14)::6 - [Hello ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74989. + Text;[Hello];
  74990. + Whitespace;[ ];
  74991. + MarkupTagHelperElement - [14..27)::13 - strong[StartTagAndEndTag] - strongtaghelper
  74992. + MarkupTagHelperStartTag - [14..22)::8
  74993. + MarkupTextLiteral - [14..22)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74994. + OpenAngle;[<];
  74995. + Text;[strong];
  74996. + CloseAngle;[>];
  74997. + MarkupTextLiteral - [22..27)::5 - [World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  74998. + Text;[World];
  74999. + MarkupTagBlock - [27..33)::6 - [</div>]
  75000. + MarkupTextLiteral - [27..33)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75001. + OpenAngle;[<];
  75002. + ForwardSlash;[/];
  75003. + Text;[div];
  75004. + CloseAngle;[>];
  75005. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper3.tspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper3.tspans.txt
  75006. index ebd3c39ddf6..9fc6edf71a4 100644
  75007. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper3.tspans.txt
  75008. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper3.tspans.txt
  75009. @@ -1,2 +1,2 @@
  75010. -TagHelper span at (5:0,5 [28] ) - ptaghelper
  75011. -TagHelper span at (14:0,14 [19] ) - strongtaghelper
  75012. +TagHelper span at (5:0,5 [22] ) - ptaghelper
  75013. +TagHelper span at (14:0,14 [13] ) - strongtaghelper
  75014. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper4.stree.txt
  75015. index bc8e4a8a813..dfb8f3a25a3 100644
  75016. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper4.stree.txt
  75017. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_CreatesErrorForIncompleteTagHelper4.stree.txt
  75018. @@ -1,17 +1,55 @@
  75019. -Markup block - Gen<None> - 52 - (0:0,0)
  75020. - Tag block - Gen<TagHelper> - 52 - (0:0,0) - p - ptaghelper
  75021. - StartTagAndEndTag - <p class="foo">
  75022. - class - DoubleQuotes
  75023. - Markup span - Gen<Markup> - [foo] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  75024. - SyntaxKind.Text;[foo];
  75025. - SyntaxKind.HtmlTextLiteral - [Hello ] - [15..21) - FullWidth: 6 - Slots: 1
  75026. - SyntaxKind.List - [Hello ] - [15..21) - FullWidth: 6 - Slots: 2
  75027. - SyntaxKind.Text;[Hello];
  75028. - SyntaxKind.Whitespace;[ ];
  75029. - Tag block - Gen<TagHelper> - 31 - (21:0,21) - p - ptaghelper
  75030. - StartTagAndEndTag - <p style="color:red;"> ... </p>
  75031. - style - DoubleQuotes
  75032. - Markup span - Gen<Markup> - [color:red;] - SpanEditHandler;Accepts:Any - (31:0,31) - Tokens:1
  75033. - SyntaxKind.Text;[color:red;];
  75034. - SyntaxKind.HtmlTextLiteral - [World] - [43..48) - FullWidth: 5 - Slots: 1
  75035. - SyntaxKind.Text;[World];
  75036. +RazorDocument - [0..52)::52 - [<p class="foo">Hello <p style="color:red;">World</p>]
  75037. + MarkupBlock - [0..52)::52
  75038. + MarkupTagHelperElement - [0..52)::52 - p[StartTagAndEndTag] - ptaghelper
  75039. + MarkupTagHelperStartTag - [0..15)::15
  75040. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75041. + OpenAngle;[<];
  75042. + Text;[p];
  75043. + MarkupTagHelperAttribute - [2..14)::12 - class - DoubleQuotes - Unbound - [ class="foo"]
  75044. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75045. + Whitespace;[ ];
  75046. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75047. + Text;[class];
  75048. + Equals;[=];
  75049. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  75050. + DoubleQuote;["];
  75051. + MarkupTagHelperAttributeValue - [10..13)::3
  75052. + MarkupLiteralAttributeValue - [10..13)::3 - [foo]
  75053. + MarkupTextLiteral - [10..13)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75054. + Text;[foo];
  75055. + MarkupTextLiteral - [13..14)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  75056. + DoubleQuote;["];
  75057. + MarkupTextLiteral - [14..15)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75058. + CloseAngle;[>];
  75059. + MarkupTextLiteral - [15..21)::6 - [Hello ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75060. + Text;[Hello];
  75061. + Whitespace;[ ];
  75062. + MarkupTagHelperElement - [21..52)::31 - p[StartTagAndEndTag] - ptaghelper
  75063. + MarkupTagHelperStartTag - [21..43)::22
  75064. + MarkupTextLiteral - [21..23)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75065. + OpenAngle;[<];
  75066. + Text;[p];
  75067. + MarkupTagHelperAttribute - [23..42)::19 - style - DoubleQuotes - Unbound - [ style="color:red;"]
  75068. + MarkupTextLiteral - [23..24)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75069. + Whitespace;[ ];
  75070. + MarkupTextLiteral - [24..29)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75071. + Text;[style];
  75072. + Equals;[=];
  75073. + MarkupTextLiteral - [30..31)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  75074. + DoubleQuote;["];
  75075. + MarkupTagHelperAttributeValue - [31..41)::10
  75076. + MarkupLiteralAttributeValue - [31..41)::10 - [color:red;]
  75077. + MarkupTextLiteral - [31..41)::10 - [color:red;] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75078. + Text;[color:red;];
  75079. + MarkupTextLiteral - [41..42)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  75080. + DoubleQuote;["];
  75081. + MarkupTextLiteral - [42..43)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75082. + CloseAngle;[>];
  75083. + MarkupTextLiteral - [43..48)::5 - [World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75084. + Text;[World];
  75085. + MarkupTagHelperEndTag - [48..52)::4
  75086. + MarkupTextLiteral - [48..52)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75087. + OpenAngle;[<];
  75088. + ForwardSlash;[/];
  75089. + Text;[p];
  75090. + CloseAngle;[>];
  75091. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks1.stree.txt
  75092. index d5dbab8aab5..4cd860643c8 100644
  75093. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks1.stree.txt
  75094. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks1.stree.txt
  75095. @@ -1,23 +1,61 @@
  75096. -Markup block - Gen<None> - 51 - (0:0,0)
  75097. - Tag block - Gen<TagHelper> - 51 - (0:0,0) - p - ptaghelper
  75098. - StartTagAndEndTag - <p class="@DateTime.Now" style='@DateTime.Now'> ... </p>
  75099. - class - DoubleQuotes
  75100. - Markup block - Gen<None> - 13 - (10:0,10)
  75101. - Markup block - Gen<DynAttr:@(10:0,10)> - 13 - (10:0,10)
  75102. - Expression block - Gen<Expr> - 13 - (10:0,10)
  75103. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  75104. - SyntaxKind.Transition;[@];
  75105. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (11:0,11) - Tokens:3
  75106. - SyntaxKind.Identifier;[DateTime];
  75107. - SyntaxKind.Dot;[.];
  75108. - SyntaxKind.Identifier;[Now];
  75109. - style - SingleQuotes
  75110. - Markup block - Gen<None> - 13 - (32:0,32)
  75111. - Markup block - Gen<DynAttr:@(32:0,32)> - 13 - (32:0,32)
  75112. - Expression block - Gen<Expr> - 13 - (32:0,32)
  75113. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (32:0,32) - Tokens:1
  75114. - SyntaxKind.Transition;[@];
  75115. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (33:0,33) - Tokens:3
  75116. - SyntaxKind.Identifier;[DateTime];
  75117. - SyntaxKind.Dot;[.];
  75118. - SyntaxKind.Identifier;[Now];
  75119. +RazorDocument - [0..51)::51 - [<p class="@DateTime.Now" style='@DateTime.Now'></p>]
  75120. + MarkupBlock - [0..51)::51
  75121. + MarkupTagHelperElement - [0..51)::51 - p[StartTagAndEndTag] - ptaghelper
  75122. + MarkupTagHelperStartTag - [0..47)::47
  75123. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75124. + OpenAngle;[<];
  75125. + Text;[p];
  75126. + MarkupTagHelperAttribute - [2..24)::22 - class - DoubleQuotes - Unbound - [ class="@DateTime.Now"]
  75127. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75128. + Whitespace;[ ];
  75129. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75130. + Text;[class];
  75131. + Equals;[=];
  75132. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  75133. + DoubleQuote;["];
  75134. + MarkupTagHelperAttributeValue - [10..23)::13
  75135. + MarkupDynamicAttributeValue - [10..23)::13 - [@DateTime.Now]
  75136. + GenericBlock - [10..23)::13
  75137. + CSharpCodeBlock - [10..23)::13
  75138. + CSharpImplicitExpression - [10..23)::13
  75139. + CSharpTransition - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  75140. + Transition;[@];
  75141. + CSharpImplicitExpressionBody - [11..23)::12
  75142. + CSharpCodeBlock - [11..23)::12
  75143. + CSharpExpressionLiteral - [11..23)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  75144. + Identifier;[DateTime];
  75145. + Dot;[.];
  75146. + Identifier;[Now];
  75147. + MarkupTextLiteral - [23..24)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  75148. + DoubleQuote;["];
  75149. + MarkupTagHelperAttribute - [24..46)::22 - style - SingleQuotes - Unbound - [ style='@DateTime.Now']
  75150. + MarkupTextLiteral - [24..25)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75151. + Whitespace;[ ];
  75152. + MarkupTextLiteral - [25..30)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75153. + Text;[style];
  75154. + Equals;[=];
  75155. + MarkupTextLiteral - [31..32)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  75156. + SingleQuote;['];
  75157. + MarkupTagHelperAttributeValue - [32..45)::13
  75158. + MarkupDynamicAttributeValue - [32..45)::13 - [@DateTime.Now]
  75159. + GenericBlock - [32..45)::13
  75160. + CSharpCodeBlock - [32..45)::13
  75161. + CSharpImplicitExpression - [32..45)::13
  75162. + CSharpTransition - [32..33)::1 - Gen<None> - SpanEditHandler;Accepts:None
  75163. + Transition;[@];
  75164. + CSharpImplicitExpressionBody - [33..45)::12
  75165. + CSharpCodeBlock - [33..45)::12
  75166. + CSharpExpressionLiteral - [33..45)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  75167. + Identifier;[DateTime];
  75168. + Dot;[.];
  75169. + Identifier;[Now];
  75170. + MarkupTextLiteral - [45..46)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  75171. + SingleQuote;['];
  75172. + MarkupTextLiteral - [46..47)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75173. + CloseAngle;[>];
  75174. + MarkupTagHelperEndTag - [47..51)::4
  75175. + MarkupTextLiteral - [47..51)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75176. + OpenAngle;[<];
  75177. + ForwardSlash;[/];
  75178. + Text;[p];
  75179. + CloseAngle;[>];
  75180. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks2.stree.txt
  75181. index 697539f6451..1deded266ca 100644
  75182. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks2.stree.txt
  75183. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks2.stree.txt
  75184. @@ -1,105 +1,137 @@
  75185. -Markup block - Gen<None> - 153 - (0:0,0)
  75186. - Tag block - Gen<TagHelper> - 153 - (0:0,0) - p - ptaghelper
  75187. - StartTagAndEndTag - <p class="@do { var foo = bar; <text>Foo</text> foo++; } while (foo<bar>);" style='@do { var foo = bar; <text>Foo</text> foo++; } while (foo<bar>);'> ... </p>
  75188. - class - DoubleQuotes
  75189. - Markup block - Gen<None> - 64 - (10:0,10)
  75190. - Markup block - Gen<DynAttr:@(10:0,10)> - 64 - (10:0,10)
  75191. - Statement block - Gen<None> - 64 - (10:0,10)
  75192. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  75193. - SyntaxKind.Transition;[@];
  75194. - Code span - Gen<Stmt> - [do { var foo = bar; ] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:13
  75195. - SyntaxKind.Keyword;[do];
  75196. - SyntaxKind.Whitespace;[ ];
  75197. - SyntaxKind.LeftBrace;[{];
  75198. - SyntaxKind.Whitespace;[ ];
  75199. - SyntaxKind.Identifier;[var];
  75200. - SyntaxKind.Whitespace;[ ];
  75201. - SyntaxKind.Identifier;[foo];
  75202. - SyntaxKind.Whitespace;[ ];
  75203. - SyntaxKind.Assign;[=];
  75204. - SyntaxKind.Whitespace;[ ];
  75205. - SyntaxKind.Identifier;[bar];
  75206. - SyntaxKind.Semicolon;[;];
  75207. - SyntaxKind.Whitespace;[ ];
  75208. - Markup block - Gen<None> - 16 - (31:0,31)
  75209. - Tag block - Gen<None> - 6 - (31:0,31)
  75210. - Transition span - Gen<None> - [<text>] - SpanEditHandler;Accepts:None - (31:0,31) - Tokens:3
  75211. - SyntaxKind.OpenAngle;[<];
  75212. - SyntaxKind.Text;[text];
  75213. - SyntaxKind.CloseAngle;[>];
  75214. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:None - (37:0,37) - Tokens:1
  75215. - SyntaxKind.Text;[Foo];
  75216. - Tag block - Gen<None> - 7 - (40:0,40)
  75217. - Transition span - Gen<None> - [</text>] - SpanEditHandler;Accepts:None - (40:0,40) - Tokens:4
  75218. - SyntaxKind.OpenAngle;[<];
  75219. - SyntaxKind.ForwardSlash;[/];
  75220. - SyntaxKind.Text;[text];
  75221. - SyntaxKind.CloseAngle;[>];
  75222. - Code span - Gen<Stmt> - [ foo++; } while (foo<bar>);] - SpanEditHandler;Accepts:None - (47:0,47) - Tokens:16
  75223. - SyntaxKind.Whitespace;[ ];
  75224. - SyntaxKind.Identifier;[foo];
  75225. - SyntaxKind.Increment;[++];
  75226. - SyntaxKind.Semicolon;[;];
  75227. - SyntaxKind.Whitespace;[ ];
  75228. - SyntaxKind.RightBrace;[}];
  75229. - SyntaxKind.Whitespace;[ ];
  75230. - SyntaxKind.Keyword;[while];
  75231. - SyntaxKind.Whitespace;[ ];
  75232. - SyntaxKind.LeftParenthesis;[(];
  75233. - SyntaxKind.Identifier;[foo];
  75234. - SyntaxKind.LessThan;[<];
  75235. - SyntaxKind.Identifier;[bar];
  75236. - SyntaxKind.GreaterThan;[>];
  75237. - SyntaxKind.RightParenthesis;[)];
  75238. - SyntaxKind.Semicolon;[;];
  75239. - style - SingleQuotes
  75240. - Markup block - Gen<None> - 64 - (83:0,83)
  75241. - Markup block - Gen<DynAttr:@(83:0,83)> - 64 - (83:0,83)
  75242. - Statement block - Gen<None> - 64 - (83:0,83)
  75243. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (83:0,83) - Tokens:1
  75244. - SyntaxKind.Transition;[@];
  75245. - Code span - Gen<Stmt> - [do { var foo = bar; ] - SpanEditHandler;Accepts:Any - (84:0,84) - Tokens:13
  75246. - SyntaxKind.Keyword;[do];
  75247. - SyntaxKind.Whitespace;[ ];
  75248. - SyntaxKind.LeftBrace;[{];
  75249. - SyntaxKind.Whitespace;[ ];
  75250. - SyntaxKind.Identifier;[var];
  75251. - SyntaxKind.Whitespace;[ ];
  75252. - SyntaxKind.Identifier;[foo];
  75253. - SyntaxKind.Whitespace;[ ];
  75254. - SyntaxKind.Assign;[=];
  75255. - SyntaxKind.Whitespace;[ ];
  75256. - SyntaxKind.Identifier;[bar];
  75257. - SyntaxKind.Semicolon;[;];
  75258. - SyntaxKind.Whitespace;[ ];
  75259. - Markup block - Gen<None> - 16 - (104:0,104)
  75260. - Tag block - Gen<None> - 6 - (104:0,104)
  75261. - Transition span - Gen<None> - [<text>] - SpanEditHandler;Accepts:None - (104:0,104) - Tokens:3
  75262. - SyntaxKind.OpenAngle;[<];
  75263. - SyntaxKind.Text;[text];
  75264. - SyntaxKind.CloseAngle;[>];
  75265. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:None - (110:0,110) - Tokens:1
  75266. - SyntaxKind.Text;[Foo];
  75267. - Tag block - Gen<None> - 7 - (113:0,113)
  75268. - Transition span - Gen<None> - [</text>] - SpanEditHandler;Accepts:None - (113:0,113) - Tokens:4
  75269. - SyntaxKind.OpenAngle;[<];
  75270. - SyntaxKind.ForwardSlash;[/];
  75271. - SyntaxKind.Text;[text];
  75272. - SyntaxKind.CloseAngle;[>];
  75273. - Code span - Gen<Stmt> - [ foo++; } while (foo<bar>);] - SpanEditHandler;Accepts:None - (120:0,120) - Tokens:16
  75274. - SyntaxKind.Whitespace;[ ];
  75275. - SyntaxKind.Identifier;[foo];
  75276. - SyntaxKind.Increment;[++];
  75277. - SyntaxKind.Semicolon;[;];
  75278. - SyntaxKind.Whitespace;[ ];
  75279. - SyntaxKind.RightBrace;[}];
  75280. - SyntaxKind.Whitespace;[ ];
  75281. - SyntaxKind.Keyword;[while];
  75282. - SyntaxKind.Whitespace;[ ];
  75283. - SyntaxKind.LeftParenthesis;[(];
  75284. - SyntaxKind.Identifier;[foo];
  75285. - SyntaxKind.LessThan;[<];
  75286. - SyntaxKind.Identifier;[bar];
  75287. - SyntaxKind.GreaterThan;[>];
  75288. - SyntaxKind.RightParenthesis;[)];
  75289. - SyntaxKind.Semicolon;[;];
  75290. +RazorDocument - [0..153)::153 - [<p class="@do { var foo = bar; <text>Foo</text> foo++; } while (foo<bar>);" style='@do { var foo = bar; <text>Foo</text> foo++; } while (foo<bar>);'></p>]
  75291. + MarkupBlock - [0..153)::153
  75292. + MarkupTagHelperElement - [0..153)::153 - p[StartTagAndEndTag] - ptaghelper
  75293. + MarkupTagHelperStartTag - [0..149)::149
  75294. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75295. + OpenAngle;[<];
  75296. + Text;[p];
  75297. + MarkupTagHelperAttribute - [2..75)::73 - class - DoubleQuotes - Unbound - [ class="@do { var foo = bar; <text>Foo</text> foo++; } while (foo<bar>);"]
  75298. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75299. + Whitespace;[ ];
  75300. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75301. + Text;[class];
  75302. + Equals;[=];
  75303. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  75304. + DoubleQuote;["];
  75305. + MarkupTagHelperAttributeValue - [10..74)::64
  75306. + MarkupDynamicAttributeValue - [10..74)::64 - [@do { var foo = bar; <text>Foo</text> foo++; } while (foo<bar>);]
  75307. + GenericBlock - [10..74)::64
  75308. + CSharpCodeBlock - [10..74)::64
  75309. + CSharpTransition - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  75310. + Transition;[@];
  75311. + CSharpStatementLiteral - [11..31)::20 - [do { var foo = bar; ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  75312. + Keyword;[do];
  75313. + Whitespace;[ ];
  75314. + LeftBrace;[{];
  75315. + Whitespace;[ ];
  75316. + Identifier;[var];
  75317. + Whitespace;[ ];
  75318. + Identifier;[foo];
  75319. + Whitespace;[ ];
  75320. + Assign;[=];
  75321. + Whitespace;[ ];
  75322. + Identifier;[bar];
  75323. + Semicolon;[;];
  75324. + Whitespace;[ ];
  75325. + MarkupBlock - [31..47)::16
  75326. + MarkupTagBlock - [31..37)::6 - [<text>]
  75327. + MarkupTransition - [31..37)::6 - Gen<None> - SpanEditHandler;Accepts:None
  75328. + OpenAngle;[<];
  75329. + Text;[text];
  75330. + CloseAngle;[>];
  75331. + MarkupTextLiteral - [37..40)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:None
  75332. + Text;[Foo];
  75333. + MarkupTagBlock - [40..47)::7 - [</text>]
  75334. + MarkupTransition - [40..47)::7 - Gen<None> - SpanEditHandler;Accepts:None
  75335. + OpenAngle;[<];
  75336. + ForwardSlash;[/];
  75337. + Text;[text];
  75338. + CloseAngle;[>];
  75339. + CSharpStatementLiteral - [47..74)::27 - [ foo++; } while (foo<bar>);] - Gen<Stmt> - SpanEditHandler;Accepts:None
  75340. + Whitespace;[ ];
  75341. + Identifier;[foo];
  75342. + Increment;[++];
  75343. + Semicolon;[;];
  75344. + Whitespace;[ ];
  75345. + RightBrace;[}];
  75346. + Whitespace;[ ];
  75347. + Keyword;[while];
  75348. + Whitespace;[ ];
  75349. + LeftParenthesis;[(];
  75350. + Identifier;[foo];
  75351. + LessThan;[<];
  75352. + Identifier;[bar];
  75353. + GreaterThan;[>];
  75354. + RightParenthesis;[)];
  75355. + Semicolon;[;];
  75356. + MarkupTextLiteral - [74..75)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  75357. + DoubleQuote;["];
  75358. + MarkupTagHelperAttribute - [75..148)::73 - style - SingleQuotes - Unbound - [ style='@do { var foo = bar; <text>Foo</text> foo++; } while (foo<bar>);']
  75359. + MarkupTextLiteral - [75..76)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75360. + Whitespace;[ ];
  75361. + MarkupTextLiteral - [76..81)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75362. + Text;[style];
  75363. + Equals;[=];
  75364. + MarkupTextLiteral - [82..83)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  75365. + SingleQuote;['];
  75366. + MarkupTagHelperAttributeValue - [83..147)::64
  75367. + MarkupDynamicAttributeValue - [83..147)::64 - [@do { var foo = bar; <text>Foo</text> foo++; } while (foo<bar>);]
  75368. + GenericBlock - [83..147)::64
  75369. + CSharpCodeBlock - [83..147)::64
  75370. + CSharpTransition - [83..84)::1 - Gen<None> - SpanEditHandler;Accepts:None
  75371. + Transition;[@];
  75372. + CSharpStatementLiteral - [84..104)::20 - [do { var foo = bar; ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  75373. + Keyword;[do];
  75374. + Whitespace;[ ];
  75375. + LeftBrace;[{];
  75376. + Whitespace;[ ];
  75377. + Identifier;[var];
  75378. + Whitespace;[ ];
  75379. + Identifier;[foo];
  75380. + Whitespace;[ ];
  75381. + Assign;[=];
  75382. + Whitespace;[ ];
  75383. + Identifier;[bar];
  75384. + Semicolon;[;];
  75385. + Whitespace;[ ];
  75386. + MarkupBlock - [104..120)::16
  75387. + MarkupTagBlock - [104..110)::6 - [<text>]
  75388. + MarkupTransition - [104..110)::6 - Gen<None> - SpanEditHandler;Accepts:None
  75389. + OpenAngle;[<];
  75390. + Text;[text];
  75391. + CloseAngle;[>];
  75392. + MarkupTextLiteral - [110..113)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:None
  75393. + Text;[Foo];
  75394. + MarkupTagBlock - [113..120)::7 - [</text>]
  75395. + MarkupTransition - [113..120)::7 - Gen<None> - SpanEditHandler;Accepts:None
  75396. + OpenAngle;[<];
  75397. + ForwardSlash;[/];
  75398. + Text;[text];
  75399. + CloseAngle;[>];
  75400. + CSharpStatementLiteral - [120..147)::27 - [ foo++; } while (foo<bar>);] - Gen<Stmt> - SpanEditHandler;Accepts:None
  75401. + Whitespace;[ ];
  75402. + Identifier;[foo];
  75403. + Increment;[++];
  75404. + Semicolon;[;];
  75405. + Whitespace;[ ];
  75406. + RightBrace;[}];
  75407. + Whitespace;[ ];
  75408. + Keyword;[while];
  75409. + Whitespace;[ ];
  75410. + LeftParenthesis;[(];
  75411. + Identifier;[foo];
  75412. + LessThan;[<];
  75413. + Identifier;[bar];
  75414. + GreaterThan;[>];
  75415. + RightParenthesis;[)];
  75416. + Semicolon;[;];
  75417. + MarkupTextLiteral - [147..148)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  75418. + SingleQuote;['];
  75419. + MarkupTextLiteral - [148..149)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75420. + CloseAngle;[>];
  75421. + MarkupTagHelperEndTag - [149..153)::4
  75422. + MarkupTextLiteral - [149..153)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75423. + OpenAngle;[<];
  75424. + ForwardSlash;[/];
  75425. + Text;[p];
  75426. + CloseAngle;[>];
  75427. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks3.stree.txt
  75428. index a18de7336ea..4a018347fd6 100644
  75429. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks3.stree.txt
  75430. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks3.stree.txt
  75431. @@ -1,28 +1,65 @@
  75432. -Markup block - Gen<None> - 62 - (0:0,0)
  75433. - Tag block - Gen<TagHelper> - 62 - (0:0,0) - p - ptaghelper
  75434. - StartTagAndEndTag - <p class="@DateTime.Now" style='@DateTime.Now'> ... </p>
  75435. - class - DoubleQuotes
  75436. - Markup block - Gen<None> - 13 - (10:0,10)
  75437. - Markup block - Gen<DynAttr:@(10:0,10)> - 13 - (10:0,10)
  75438. - Expression block - Gen<Expr> - 13 - (10:0,10)
  75439. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  75440. - SyntaxKind.Transition;[@];
  75441. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (11:0,11) - Tokens:3
  75442. - SyntaxKind.Identifier;[DateTime];
  75443. - SyntaxKind.Dot;[.];
  75444. - SyntaxKind.Identifier;[Now];
  75445. - style - SingleQuotes
  75446. - Markup block - Gen<None> - 13 - (32:0,32)
  75447. - Markup block - Gen<DynAttr:@(32:0,32)> - 13 - (32:0,32)
  75448. - Expression block - Gen<Expr> - 13 - (32:0,32)
  75449. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (32:0,32) - Tokens:1
  75450. - SyntaxKind.Transition;[@];
  75451. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (33:0,33) - Tokens:3
  75452. - SyntaxKind.Identifier;[DateTime];
  75453. - SyntaxKind.Dot;[.];
  75454. - SyntaxKind.Identifier;[Now];
  75455. - SyntaxKind.HtmlTextLiteral - [Hello World] - [47..58) - FullWidth: 11 - Slots: 1
  75456. - SyntaxKind.List - [Hello World] - [47..58) - FullWidth: 11 - Slots: 3
  75457. - SyntaxKind.Text;[Hello];
  75458. - SyntaxKind.Whitespace;[ ];
  75459. - SyntaxKind.Text;[World];
  75460. +RazorDocument - [0..62)::62 - [<p class="@DateTime.Now" style='@DateTime.Now'>Hello World</p>]
  75461. + MarkupBlock - [0..62)::62
  75462. + MarkupTagHelperElement - [0..62)::62 - p[StartTagAndEndTag] - ptaghelper
  75463. + MarkupTagHelperStartTag - [0..47)::47
  75464. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75465. + OpenAngle;[<];
  75466. + Text;[p];
  75467. + MarkupTagHelperAttribute - [2..24)::22 - class - DoubleQuotes - Unbound - [ class="@DateTime.Now"]
  75468. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75469. + Whitespace;[ ];
  75470. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75471. + Text;[class];
  75472. + Equals;[=];
  75473. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  75474. + DoubleQuote;["];
  75475. + MarkupTagHelperAttributeValue - [10..23)::13
  75476. + MarkupDynamicAttributeValue - [10..23)::13 - [@DateTime.Now]
  75477. + GenericBlock - [10..23)::13
  75478. + CSharpCodeBlock - [10..23)::13
  75479. + CSharpImplicitExpression - [10..23)::13
  75480. + CSharpTransition - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  75481. + Transition;[@];
  75482. + CSharpImplicitExpressionBody - [11..23)::12
  75483. + CSharpCodeBlock - [11..23)::12
  75484. + CSharpExpressionLiteral - [11..23)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  75485. + Identifier;[DateTime];
  75486. + Dot;[.];
  75487. + Identifier;[Now];
  75488. + MarkupTextLiteral - [23..24)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  75489. + DoubleQuote;["];
  75490. + MarkupTagHelperAttribute - [24..46)::22 - style - SingleQuotes - Unbound - [ style='@DateTime.Now']
  75491. + MarkupTextLiteral - [24..25)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75492. + Whitespace;[ ];
  75493. + MarkupTextLiteral - [25..30)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75494. + Text;[style];
  75495. + Equals;[=];
  75496. + MarkupTextLiteral - [31..32)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  75497. + SingleQuote;['];
  75498. + MarkupTagHelperAttributeValue - [32..45)::13
  75499. + MarkupDynamicAttributeValue - [32..45)::13 - [@DateTime.Now]
  75500. + GenericBlock - [32..45)::13
  75501. + CSharpCodeBlock - [32..45)::13
  75502. + CSharpImplicitExpression - [32..45)::13
  75503. + CSharpTransition - [32..33)::1 - Gen<None> - SpanEditHandler;Accepts:None
  75504. + Transition;[@];
  75505. + CSharpImplicitExpressionBody - [33..45)::12
  75506. + CSharpCodeBlock - [33..45)::12
  75507. + CSharpExpressionLiteral - [33..45)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  75508. + Identifier;[DateTime];
  75509. + Dot;[.];
  75510. + Identifier;[Now];
  75511. + MarkupTextLiteral - [45..46)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  75512. + SingleQuote;['];
  75513. + MarkupTextLiteral - [46..47)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75514. + CloseAngle;[>];
  75515. + MarkupTextLiteral - [47..58)::11 - [Hello World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75516. + Text;[Hello];
  75517. + Whitespace;[ ];
  75518. + Text;[World];
  75519. + MarkupTagHelperEndTag - [58..62)::4
  75520. + MarkupTextLiteral - [58..62)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75521. + OpenAngle;[<];
  75522. + ForwardSlash;[/];
  75523. + Text;[p];
  75524. + CloseAngle;[>];
  75525. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks4.stree.txt
  75526. index 3f079bb5c1d..9e369b5d2b1 100644
  75527. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks4.stree.txt
  75528. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks4.stree.txt
  75529. @@ -1,110 +1,141 @@
  75530. -Markup block - Gen<None> - 164 - (0:0,0)
  75531. - Tag block - Gen<TagHelper> - 164 - (0:0,0) - p - ptaghelper
  75532. - StartTagAndEndTag - <p class="@do { var foo = bar; <text>Foo</text> foo++; } while (foo<bar>);" style='@do { var foo = bar; <text>Foo</text> foo++; } while (foo<bar>);'> ... </p>
  75533. - class - DoubleQuotes
  75534. - Markup block - Gen<None> - 64 - (10:0,10)
  75535. - Markup block - Gen<DynAttr:@(10:0,10)> - 64 - (10:0,10)
  75536. - Statement block - Gen<None> - 64 - (10:0,10)
  75537. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  75538. - SyntaxKind.Transition;[@];
  75539. - Code span - Gen<Stmt> - [do { var foo = bar; ] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:13
  75540. - SyntaxKind.Keyword;[do];
  75541. - SyntaxKind.Whitespace;[ ];
  75542. - SyntaxKind.LeftBrace;[{];
  75543. - SyntaxKind.Whitespace;[ ];
  75544. - SyntaxKind.Identifier;[var];
  75545. - SyntaxKind.Whitespace;[ ];
  75546. - SyntaxKind.Identifier;[foo];
  75547. - SyntaxKind.Whitespace;[ ];
  75548. - SyntaxKind.Assign;[=];
  75549. - SyntaxKind.Whitespace;[ ];
  75550. - SyntaxKind.Identifier;[bar];
  75551. - SyntaxKind.Semicolon;[;];
  75552. - SyntaxKind.Whitespace;[ ];
  75553. - Markup block - Gen<None> - 16 - (31:0,31)
  75554. - Tag block - Gen<None> - 6 - (31:0,31)
  75555. - Transition span - Gen<None> - [<text>] - SpanEditHandler;Accepts:None - (31:0,31) - Tokens:3
  75556. - SyntaxKind.OpenAngle;[<];
  75557. - SyntaxKind.Text;[text];
  75558. - SyntaxKind.CloseAngle;[>];
  75559. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:None - (37:0,37) - Tokens:1
  75560. - SyntaxKind.Text;[Foo];
  75561. - Tag block - Gen<None> - 7 - (40:0,40)
  75562. - Transition span - Gen<None> - [</text>] - SpanEditHandler;Accepts:None - (40:0,40) - Tokens:4
  75563. - SyntaxKind.OpenAngle;[<];
  75564. - SyntaxKind.ForwardSlash;[/];
  75565. - SyntaxKind.Text;[text];
  75566. - SyntaxKind.CloseAngle;[>];
  75567. - Code span - Gen<Stmt> - [ foo++; } while (foo<bar>);] - SpanEditHandler;Accepts:None - (47:0,47) - Tokens:16
  75568. - SyntaxKind.Whitespace;[ ];
  75569. - SyntaxKind.Identifier;[foo];
  75570. - SyntaxKind.Increment;[++];
  75571. - SyntaxKind.Semicolon;[;];
  75572. - SyntaxKind.Whitespace;[ ];
  75573. - SyntaxKind.RightBrace;[}];
  75574. - SyntaxKind.Whitespace;[ ];
  75575. - SyntaxKind.Keyword;[while];
  75576. - SyntaxKind.Whitespace;[ ];
  75577. - SyntaxKind.LeftParenthesis;[(];
  75578. - SyntaxKind.Identifier;[foo];
  75579. - SyntaxKind.LessThan;[<];
  75580. - SyntaxKind.Identifier;[bar];
  75581. - SyntaxKind.GreaterThan;[>];
  75582. - SyntaxKind.RightParenthesis;[)];
  75583. - SyntaxKind.Semicolon;[;];
  75584. - style - SingleQuotes
  75585. - Markup block - Gen<None> - 64 - (83:0,83)
  75586. - Markup block - Gen<DynAttr:@(83:0,83)> - 64 - (83:0,83)
  75587. - Statement block - Gen<None> - 64 - (83:0,83)
  75588. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (83:0,83) - Tokens:1
  75589. - SyntaxKind.Transition;[@];
  75590. - Code span - Gen<Stmt> - [do { var foo = bar; ] - SpanEditHandler;Accepts:Any - (84:0,84) - Tokens:13
  75591. - SyntaxKind.Keyword;[do];
  75592. - SyntaxKind.Whitespace;[ ];
  75593. - SyntaxKind.LeftBrace;[{];
  75594. - SyntaxKind.Whitespace;[ ];
  75595. - SyntaxKind.Identifier;[var];
  75596. - SyntaxKind.Whitespace;[ ];
  75597. - SyntaxKind.Identifier;[foo];
  75598. - SyntaxKind.Whitespace;[ ];
  75599. - SyntaxKind.Assign;[=];
  75600. - SyntaxKind.Whitespace;[ ];
  75601. - SyntaxKind.Identifier;[bar];
  75602. - SyntaxKind.Semicolon;[;];
  75603. - SyntaxKind.Whitespace;[ ];
  75604. - Markup block - Gen<None> - 16 - (104:0,104)
  75605. - Tag block - Gen<None> - 6 - (104:0,104)
  75606. - Transition span - Gen<None> - [<text>] - SpanEditHandler;Accepts:None - (104:0,104) - Tokens:3
  75607. - SyntaxKind.OpenAngle;[<];
  75608. - SyntaxKind.Text;[text];
  75609. - SyntaxKind.CloseAngle;[>];
  75610. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:None - (110:0,110) - Tokens:1
  75611. - SyntaxKind.Text;[Foo];
  75612. - Tag block - Gen<None> - 7 - (113:0,113)
  75613. - Transition span - Gen<None> - [</text>] - SpanEditHandler;Accepts:None - (113:0,113) - Tokens:4
  75614. - SyntaxKind.OpenAngle;[<];
  75615. - SyntaxKind.ForwardSlash;[/];
  75616. - SyntaxKind.Text;[text];
  75617. - SyntaxKind.CloseAngle;[>];
  75618. - Code span - Gen<Stmt> - [ foo++; } while (foo<bar>);] - SpanEditHandler;Accepts:None - (120:0,120) - Tokens:16
  75619. - SyntaxKind.Whitespace;[ ];
  75620. - SyntaxKind.Identifier;[foo];
  75621. - SyntaxKind.Increment;[++];
  75622. - SyntaxKind.Semicolon;[;];
  75623. - SyntaxKind.Whitespace;[ ];
  75624. - SyntaxKind.RightBrace;[}];
  75625. - SyntaxKind.Whitespace;[ ];
  75626. - SyntaxKind.Keyword;[while];
  75627. - SyntaxKind.Whitespace;[ ];
  75628. - SyntaxKind.LeftParenthesis;[(];
  75629. - SyntaxKind.Identifier;[foo];
  75630. - SyntaxKind.LessThan;[<];
  75631. - SyntaxKind.Identifier;[bar];
  75632. - SyntaxKind.GreaterThan;[>];
  75633. - SyntaxKind.RightParenthesis;[)];
  75634. - SyntaxKind.Semicolon;[;];
  75635. - SyntaxKind.HtmlTextLiteral - [Hello World] - [149..160) - FullWidth: 11 - Slots: 1
  75636. - SyntaxKind.List - [Hello World] - [149..160) - FullWidth: 11 - Slots: 3
  75637. - SyntaxKind.Text;[Hello];
  75638. - SyntaxKind.Whitespace;[ ];
  75639. - SyntaxKind.Text;[World];
  75640. +RazorDocument - [0..164)::164 - [<p class="@do { var foo = bar; <text>Foo</text> foo++; } while (foo<bar>);" style='@do { var foo = bar; <text>Foo</text> foo++; } while (foo<bar>);'>Hello World</p>]
  75641. + MarkupBlock - [0..164)::164
  75642. + MarkupTagHelperElement - [0..164)::164 - p[StartTagAndEndTag] - ptaghelper
  75643. + MarkupTagHelperStartTag - [0..149)::149
  75644. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75645. + OpenAngle;[<];
  75646. + Text;[p];
  75647. + MarkupTagHelperAttribute - [2..75)::73 - class - DoubleQuotes - Unbound - [ class="@do { var foo = bar; <text>Foo</text> foo++; } while (foo<bar>);"]
  75648. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75649. + Whitespace;[ ];
  75650. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75651. + Text;[class];
  75652. + Equals;[=];
  75653. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  75654. + DoubleQuote;["];
  75655. + MarkupTagHelperAttributeValue - [10..74)::64
  75656. + MarkupDynamicAttributeValue - [10..74)::64 - [@do { var foo = bar; <text>Foo</text> foo++; } while (foo<bar>);]
  75657. + GenericBlock - [10..74)::64
  75658. + CSharpCodeBlock - [10..74)::64
  75659. + CSharpTransition - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  75660. + Transition;[@];
  75661. + CSharpStatementLiteral - [11..31)::20 - [do { var foo = bar; ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  75662. + Keyword;[do];
  75663. + Whitespace;[ ];
  75664. + LeftBrace;[{];
  75665. + Whitespace;[ ];
  75666. + Identifier;[var];
  75667. + Whitespace;[ ];
  75668. + Identifier;[foo];
  75669. + Whitespace;[ ];
  75670. + Assign;[=];
  75671. + Whitespace;[ ];
  75672. + Identifier;[bar];
  75673. + Semicolon;[;];
  75674. + Whitespace;[ ];
  75675. + MarkupBlock - [31..47)::16
  75676. + MarkupTagBlock - [31..37)::6 - [<text>]
  75677. + MarkupTransition - [31..37)::6 - Gen<None> - SpanEditHandler;Accepts:None
  75678. + OpenAngle;[<];
  75679. + Text;[text];
  75680. + CloseAngle;[>];
  75681. + MarkupTextLiteral - [37..40)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:None
  75682. + Text;[Foo];
  75683. + MarkupTagBlock - [40..47)::7 - [</text>]
  75684. + MarkupTransition - [40..47)::7 - Gen<None> - SpanEditHandler;Accepts:None
  75685. + OpenAngle;[<];
  75686. + ForwardSlash;[/];
  75687. + Text;[text];
  75688. + CloseAngle;[>];
  75689. + CSharpStatementLiteral - [47..74)::27 - [ foo++; } while (foo<bar>);] - Gen<Stmt> - SpanEditHandler;Accepts:None
  75690. + Whitespace;[ ];
  75691. + Identifier;[foo];
  75692. + Increment;[++];
  75693. + Semicolon;[;];
  75694. + Whitespace;[ ];
  75695. + RightBrace;[}];
  75696. + Whitespace;[ ];
  75697. + Keyword;[while];
  75698. + Whitespace;[ ];
  75699. + LeftParenthesis;[(];
  75700. + Identifier;[foo];
  75701. + LessThan;[<];
  75702. + Identifier;[bar];
  75703. + GreaterThan;[>];
  75704. + RightParenthesis;[)];
  75705. + Semicolon;[;];
  75706. + MarkupTextLiteral - [74..75)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  75707. + DoubleQuote;["];
  75708. + MarkupTagHelperAttribute - [75..148)::73 - style - SingleQuotes - Unbound - [ style='@do { var foo = bar; <text>Foo</text> foo++; } while (foo<bar>);']
  75709. + MarkupTextLiteral - [75..76)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75710. + Whitespace;[ ];
  75711. + MarkupTextLiteral - [76..81)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75712. + Text;[style];
  75713. + Equals;[=];
  75714. + MarkupTextLiteral - [82..83)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  75715. + SingleQuote;['];
  75716. + MarkupTagHelperAttributeValue - [83..147)::64
  75717. + MarkupDynamicAttributeValue - [83..147)::64 - [@do { var foo = bar; <text>Foo</text> foo++; } while (foo<bar>);]
  75718. + GenericBlock - [83..147)::64
  75719. + CSharpCodeBlock - [83..147)::64
  75720. + CSharpTransition - [83..84)::1 - Gen<None> - SpanEditHandler;Accepts:None
  75721. + Transition;[@];
  75722. + CSharpStatementLiteral - [84..104)::20 - [do { var foo = bar; ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  75723. + Keyword;[do];
  75724. + Whitespace;[ ];
  75725. + LeftBrace;[{];
  75726. + Whitespace;[ ];
  75727. + Identifier;[var];
  75728. + Whitespace;[ ];
  75729. + Identifier;[foo];
  75730. + Whitespace;[ ];
  75731. + Assign;[=];
  75732. + Whitespace;[ ];
  75733. + Identifier;[bar];
  75734. + Semicolon;[;];
  75735. + Whitespace;[ ];
  75736. + MarkupBlock - [104..120)::16
  75737. + MarkupTagBlock - [104..110)::6 - [<text>]
  75738. + MarkupTransition - [104..110)::6 - Gen<None> - SpanEditHandler;Accepts:None
  75739. + OpenAngle;[<];
  75740. + Text;[text];
  75741. + CloseAngle;[>];
  75742. + MarkupTextLiteral - [110..113)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:None
  75743. + Text;[Foo];
  75744. + MarkupTagBlock - [113..120)::7 - [</text>]
  75745. + MarkupTransition - [113..120)::7 - Gen<None> - SpanEditHandler;Accepts:None
  75746. + OpenAngle;[<];
  75747. + ForwardSlash;[/];
  75748. + Text;[text];
  75749. + CloseAngle;[>];
  75750. + CSharpStatementLiteral - [120..147)::27 - [ foo++; } while (foo<bar>);] - Gen<Stmt> - SpanEditHandler;Accepts:None
  75751. + Whitespace;[ ];
  75752. + Identifier;[foo];
  75753. + Increment;[++];
  75754. + Semicolon;[;];
  75755. + Whitespace;[ ];
  75756. + RightBrace;[}];
  75757. + Whitespace;[ ];
  75758. + Keyword;[while];
  75759. + Whitespace;[ ];
  75760. + LeftParenthesis;[(];
  75761. + Identifier;[foo];
  75762. + LessThan;[<];
  75763. + Identifier;[bar];
  75764. + GreaterThan;[>];
  75765. + RightParenthesis;[)];
  75766. + Semicolon;[;];
  75767. + MarkupTextLiteral - [147..148)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  75768. + SingleQuote;['];
  75769. + MarkupTextLiteral - [148..149)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75770. + CloseAngle;[>];
  75771. + MarkupTextLiteral - [149..160)::11 - [Hello World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75772. + Text;[Hello];
  75773. + Whitespace;[ ];
  75774. + Text;[World];
  75775. + MarkupTagHelperEndTag - [160..164)::4
  75776. + MarkupTextLiteral - [160..164)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75777. + OpenAngle;[<];
  75778. + ForwardSlash;[/];
  75779. + Text;[p];
  75780. + CloseAngle;[>];
  75781. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks5.stree.txt
  75782. index db4d031a925..a63149d76be 100644
  75783. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks5.stree.txt
  75784. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks5.stree.txt
  75785. @@ -1,31 +1,80 @@
  75786. -Markup block - Gen<None> - 69 - (0:0,0)
  75787. - Tag block - Gen<TagHelper> - 34 - (0:0,0) - p - ptaghelper
  75788. - StartTagAndEndTag - <p class="@DateTime.Now"> ... </p>
  75789. - class - DoubleQuotes
  75790. - Markup block - Gen<None> - 13 - (10:0,10)
  75791. - Markup block - Gen<DynAttr:@(10:0,10)> - 13 - (10:0,10)
  75792. - Expression block - Gen<Expr> - 13 - (10:0,10)
  75793. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  75794. - SyntaxKind.Transition;[@];
  75795. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (11:0,11) - Tokens:3
  75796. - SyntaxKind.Identifier;[DateTime];
  75797. - SyntaxKind.Dot;[.];
  75798. - SyntaxKind.Identifier;[Now];
  75799. - SyntaxKind.HtmlTextLiteral - [Hello] - [25..30) - FullWidth: 5 - Slots: 1
  75800. - SyntaxKind.Text;[Hello];
  75801. - SyntaxKind.HtmlTextLiteral - [ ] - [34..35) - FullWidth: 1 - Slots: 1
  75802. - SyntaxKind.Whitespace;[ ];
  75803. - Tag block - Gen<TagHelper> - 34 - (35:0,35) - p - ptaghelper
  75804. - StartTagAndEndTag - <p style='@DateTime.Now'> ... </p>
  75805. - style - SingleQuotes
  75806. - Markup block - Gen<None> - 13 - (45:0,45)
  75807. - Markup block - Gen<DynAttr:@(45:0,45)> - 13 - (45:0,45)
  75808. - Expression block - Gen<Expr> - 13 - (45:0,45)
  75809. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (45:0,45) - Tokens:1
  75810. - SyntaxKind.Transition;[@];
  75811. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (46:0,46) - Tokens:3
  75812. - SyntaxKind.Identifier;[DateTime];
  75813. - SyntaxKind.Dot;[.];
  75814. - SyntaxKind.Identifier;[Now];
  75815. - SyntaxKind.HtmlTextLiteral - [World] - [60..65) - FullWidth: 5 - Slots: 1
  75816. - SyntaxKind.Text;[World];
  75817. +RazorDocument - [0..69)::69 - [<p class="@DateTime.Now">Hello</p> <p style='@DateTime.Now'>World</p>]
  75818. + MarkupBlock - [0..69)::69
  75819. + MarkupTagHelperElement - [0..34)::34 - p[StartTagAndEndTag] - ptaghelper
  75820. + MarkupTagHelperStartTag - [0..25)::25
  75821. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75822. + OpenAngle;[<];
  75823. + Text;[p];
  75824. + MarkupTagHelperAttribute - [2..24)::22 - class - DoubleQuotes - Unbound - [ class="@DateTime.Now"]
  75825. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75826. + Whitespace;[ ];
  75827. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75828. + Text;[class];
  75829. + Equals;[=];
  75830. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  75831. + DoubleQuote;["];
  75832. + MarkupTagHelperAttributeValue - [10..23)::13
  75833. + MarkupDynamicAttributeValue - [10..23)::13 - [@DateTime.Now]
  75834. + GenericBlock - [10..23)::13
  75835. + CSharpCodeBlock - [10..23)::13
  75836. + CSharpImplicitExpression - [10..23)::13
  75837. + CSharpTransition - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  75838. + Transition;[@];
  75839. + CSharpImplicitExpressionBody - [11..23)::12
  75840. + CSharpCodeBlock - [11..23)::12
  75841. + CSharpExpressionLiteral - [11..23)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  75842. + Identifier;[DateTime];
  75843. + Dot;[.];
  75844. + Identifier;[Now];
  75845. + MarkupTextLiteral - [23..24)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  75846. + DoubleQuote;["];
  75847. + MarkupTextLiteral - [24..25)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75848. + CloseAngle;[>];
  75849. + MarkupTextLiteral - [25..30)::5 - [Hello] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75850. + Text;[Hello];
  75851. + MarkupTagHelperEndTag - [30..34)::4
  75852. + MarkupTextLiteral - [30..34)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75853. + OpenAngle;[<];
  75854. + ForwardSlash;[/];
  75855. + Text;[p];
  75856. + CloseAngle;[>];
  75857. + MarkupTextLiteral - [34..35)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75858. + Whitespace;[ ];
  75859. + MarkupTagHelperElement - [35..69)::34 - p[StartTagAndEndTag] - ptaghelper
  75860. + MarkupTagHelperStartTag - [35..60)::25
  75861. + MarkupTextLiteral - [35..37)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75862. + OpenAngle;[<];
  75863. + Text;[p];
  75864. + MarkupTagHelperAttribute - [37..59)::22 - style - SingleQuotes - Unbound - [ style='@DateTime.Now']
  75865. + MarkupTextLiteral - [37..38)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75866. + Whitespace;[ ];
  75867. + MarkupTextLiteral - [38..43)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75868. + Text;[style];
  75869. + Equals;[=];
  75870. + MarkupTextLiteral - [44..45)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  75871. + SingleQuote;['];
  75872. + MarkupTagHelperAttributeValue - [45..58)::13
  75873. + MarkupDynamicAttributeValue - [45..58)::13 - [@DateTime.Now]
  75874. + GenericBlock - [45..58)::13
  75875. + CSharpCodeBlock - [45..58)::13
  75876. + CSharpImplicitExpression - [45..58)::13
  75877. + CSharpTransition - [45..46)::1 - Gen<None> - SpanEditHandler;Accepts:None
  75878. + Transition;[@];
  75879. + CSharpImplicitExpressionBody - [46..58)::12
  75880. + CSharpCodeBlock - [46..58)::12
  75881. + CSharpExpressionLiteral - [46..58)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  75882. + Identifier;[DateTime];
  75883. + Dot;[.];
  75884. + Identifier;[Now];
  75885. + MarkupTextLiteral - [58..59)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  75886. + SingleQuote;['];
  75887. + MarkupTextLiteral - [59..60)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75888. + CloseAngle;[>];
  75889. + MarkupTextLiteral - [60..65)::5 - [World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75890. + Text;[World];
  75891. + MarkupTagHelperEndTag - [65..69)::4
  75892. + MarkupTextLiteral - [65..69)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  75893. + OpenAngle;[<];
  75894. + ForwardSlash;[/];
  75895. + Text;[p];
  75896. + CloseAngle;[>];
  75897. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks6.stree.txt
  75898. index bfe617397e8..b58398f1641 100644
  75899. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks6.stree.txt
  75900. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks6.stree.txt
  75901. @@ -1,113 +1,156 @@
  75902. -Markup block - Gen<None> - 171 - (0:0,0)
  75903. - Tag block - Gen<TagHelper> - 85 - (0:0,0) - p - ptaghelper
  75904. - StartTagAndEndTag - <p class="@do { var foo = bar; <text>Foo</text> foo++; } while (foo<bar>);"> ... </p>
  75905. - class - DoubleQuotes
  75906. - Markup block - Gen<None> - 64 - (10:0,10)
  75907. - Markup block - Gen<DynAttr:@(10:0,10)> - 64 - (10:0,10)
  75908. - Statement block - Gen<None> - 64 - (10:0,10)
  75909. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  75910. - SyntaxKind.Transition;[@];
  75911. - Code span - Gen<Stmt> - [do { var foo = bar; ] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:13
  75912. - SyntaxKind.Keyword;[do];
  75913. - SyntaxKind.Whitespace;[ ];
  75914. - SyntaxKind.LeftBrace;[{];
  75915. - SyntaxKind.Whitespace;[ ];
  75916. - SyntaxKind.Identifier;[var];
  75917. - SyntaxKind.Whitespace;[ ];
  75918. - SyntaxKind.Identifier;[foo];
  75919. - SyntaxKind.Whitespace;[ ];
  75920. - SyntaxKind.Assign;[=];
  75921. - SyntaxKind.Whitespace;[ ];
  75922. - SyntaxKind.Identifier;[bar];
  75923. - SyntaxKind.Semicolon;[;];
  75924. - SyntaxKind.Whitespace;[ ];
  75925. - Markup block - Gen<None> - 16 - (31:0,31)
  75926. - Tag block - Gen<None> - 6 - (31:0,31)
  75927. - Transition span - Gen<None> - [<text>] - SpanEditHandler;Accepts:None - (31:0,31) - Tokens:3
  75928. - SyntaxKind.OpenAngle;[<];
  75929. - SyntaxKind.Text;[text];
  75930. - SyntaxKind.CloseAngle;[>];
  75931. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:None - (37:0,37) - Tokens:1
  75932. - SyntaxKind.Text;[Foo];
  75933. - Tag block - Gen<None> - 7 - (40:0,40)
  75934. - Transition span - Gen<None> - [</text>] - SpanEditHandler;Accepts:None - (40:0,40) - Tokens:4
  75935. - SyntaxKind.OpenAngle;[<];
  75936. - SyntaxKind.ForwardSlash;[/];
  75937. - SyntaxKind.Text;[text];
  75938. - SyntaxKind.CloseAngle;[>];
  75939. - Code span - Gen<Stmt> - [ foo++; } while (foo<bar>);] - SpanEditHandler;Accepts:None - (47:0,47) - Tokens:16
  75940. - SyntaxKind.Whitespace;[ ];
  75941. - SyntaxKind.Identifier;[foo];
  75942. - SyntaxKind.Increment;[++];
  75943. - SyntaxKind.Semicolon;[;];
  75944. - SyntaxKind.Whitespace;[ ];
  75945. - SyntaxKind.RightBrace;[}];
  75946. - SyntaxKind.Whitespace;[ ];
  75947. - SyntaxKind.Keyword;[while];
  75948. - SyntaxKind.Whitespace;[ ];
  75949. - SyntaxKind.LeftParenthesis;[(];
  75950. - SyntaxKind.Identifier;[foo];
  75951. - SyntaxKind.LessThan;[<];
  75952. - SyntaxKind.Identifier;[bar];
  75953. - SyntaxKind.GreaterThan;[>];
  75954. - SyntaxKind.RightParenthesis;[)];
  75955. - SyntaxKind.Semicolon;[;];
  75956. - SyntaxKind.HtmlTextLiteral - [Hello] - [76..81) - FullWidth: 5 - Slots: 1
  75957. - SyntaxKind.Text;[Hello];
  75958. - SyntaxKind.HtmlTextLiteral - [ ] - [85..86) - FullWidth: 1 - Slots: 1
  75959. - SyntaxKind.Whitespace;[ ];
  75960. - Tag block - Gen<TagHelper> - 85 - (86:0,86) - p - ptaghelper
  75961. - StartTagAndEndTag - <p style='@do { var foo = bar; <text>Foo</text> foo++; } while (foo<bar>);'> ... </p>
  75962. - style - SingleQuotes
  75963. - Markup block - Gen<None> - 64 - (96:0,96)
  75964. - Markup block - Gen<DynAttr:@(96:0,96)> - 64 - (96:0,96)
  75965. - Statement block - Gen<None> - 64 - (96:0,96)
  75966. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (96:0,96) - Tokens:1
  75967. - SyntaxKind.Transition;[@];
  75968. - Code span - Gen<Stmt> - [do { var foo = bar; ] - SpanEditHandler;Accepts:Any - (97:0,97) - Tokens:13
  75969. - SyntaxKind.Keyword;[do];
  75970. - SyntaxKind.Whitespace;[ ];
  75971. - SyntaxKind.LeftBrace;[{];
  75972. - SyntaxKind.Whitespace;[ ];
  75973. - SyntaxKind.Identifier;[var];
  75974. - SyntaxKind.Whitespace;[ ];
  75975. - SyntaxKind.Identifier;[foo];
  75976. - SyntaxKind.Whitespace;[ ];
  75977. - SyntaxKind.Assign;[=];
  75978. - SyntaxKind.Whitespace;[ ];
  75979. - SyntaxKind.Identifier;[bar];
  75980. - SyntaxKind.Semicolon;[;];
  75981. - SyntaxKind.Whitespace;[ ];
  75982. - Markup block - Gen<None> - 16 - (117:0,117)
  75983. - Tag block - Gen<None> - 6 - (117:0,117)
  75984. - Transition span - Gen<None> - [<text>] - SpanEditHandler;Accepts:None - (117:0,117) - Tokens:3
  75985. - SyntaxKind.OpenAngle;[<];
  75986. - SyntaxKind.Text;[text];
  75987. - SyntaxKind.CloseAngle;[>];
  75988. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:None - (123:0,123) - Tokens:1
  75989. - SyntaxKind.Text;[Foo];
  75990. - Tag block - Gen<None> - 7 - (126:0,126)
  75991. - Transition span - Gen<None> - [</text>] - SpanEditHandler;Accepts:None - (126:0,126) - Tokens:4
  75992. - SyntaxKind.OpenAngle;[<];
  75993. - SyntaxKind.ForwardSlash;[/];
  75994. - SyntaxKind.Text;[text];
  75995. - SyntaxKind.CloseAngle;[>];
  75996. - Code span - Gen<Stmt> - [ foo++; } while (foo<bar>);] - SpanEditHandler;Accepts:None - (133:0,133) - Tokens:16
  75997. - SyntaxKind.Whitespace;[ ];
  75998. - SyntaxKind.Identifier;[foo];
  75999. - SyntaxKind.Increment;[++];
  76000. - SyntaxKind.Semicolon;[;];
  76001. - SyntaxKind.Whitespace;[ ];
  76002. - SyntaxKind.RightBrace;[}];
  76003. - SyntaxKind.Whitespace;[ ];
  76004. - SyntaxKind.Keyword;[while];
  76005. - SyntaxKind.Whitespace;[ ];
  76006. - SyntaxKind.LeftParenthesis;[(];
  76007. - SyntaxKind.Identifier;[foo];
  76008. - SyntaxKind.LessThan;[<];
  76009. - SyntaxKind.Identifier;[bar];
  76010. - SyntaxKind.GreaterThan;[>];
  76011. - SyntaxKind.RightParenthesis;[)];
  76012. - SyntaxKind.Semicolon;[;];
  76013. - SyntaxKind.HtmlTextLiteral - [World] - [162..167) - FullWidth: 5 - Slots: 1
  76014. - SyntaxKind.Text;[World];
  76015. +RazorDocument - [0..171)::171 - [<p class="@do { var foo = bar; <text>Foo</text> foo++; } while (foo<bar>);">Hello</p> <p style='@do { var foo = bar; <text>Foo</text> foo++; } while (foo<bar>);'>World</p>]
  76016. + MarkupBlock - [0..171)::171
  76017. + MarkupTagHelperElement - [0..85)::85 - p[StartTagAndEndTag] - ptaghelper
  76018. + MarkupTagHelperStartTag - [0..76)::76
  76019. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76020. + OpenAngle;[<];
  76021. + Text;[p];
  76022. + MarkupTagHelperAttribute - [2..75)::73 - class - DoubleQuotes - Unbound - [ class="@do { var foo = bar; <text>Foo</text> foo++; } while (foo<bar>);"]
  76023. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76024. + Whitespace;[ ];
  76025. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76026. + Text;[class];
  76027. + Equals;[=];
  76028. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  76029. + DoubleQuote;["];
  76030. + MarkupTagHelperAttributeValue - [10..74)::64
  76031. + MarkupDynamicAttributeValue - [10..74)::64 - [@do { var foo = bar; <text>Foo</text> foo++; } while (foo<bar>);]
  76032. + GenericBlock - [10..74)::64
  76033. + CSharpCodeBlock - [10..74)::64
  76034. + CSharpTransition - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  76035. + Transition;[@];
  76036. + CSharpStatementLiteral - [11..31)::20 - [do { var foo = bar; ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  76037. + Keyword;[do];
  76038. + Whitespace;[ ];
  76039. + LeftBrace;[{];
  76040. + Whitespace;[ ];
  76041. + Identifier;[var];
  76042. + Whitespace;[ ];
  76043. + Identifier;[foo];
  76044. + Whitespace;[ ];
  76045. + Assign;[=];
  76046. + Whitespace;[ ];
  76047. + Identifier;[bar];
  76048. + Semicolon;[;];
  76049. + Whitespace;[ ];
  76050. + MarkupBlock - [31..47)::16
  76051. + MarkupTagBlock - [31..37)::6 - [<text>]
  76052. + MarkupTransition - [31..37)::6 - Gen<None> - SpanEditHandler;Accepts:None
  76053. + OpenAngle;[<];
  76054. + Text;[text];
  76055. + CloseAngle;[>];
  76056. + MarkupTextLiteral - [37..40)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:None
  76057. + Text;[Foo];
  76058. + MarkupTagBlock - [40..47)::7 - [</text>]
  76059. + MarkupTransition - [40..47)::7 - Gen<None> - SpanEditHandler;Accepts:None
  76060. + OpenAngle;[<];
  76061. + ForwardSlash;[/];
  76062. + Text;[text];
  76063. + CloseAngle;[>];
  76064. + CSharpStatementLiteral - [47..74)::27 - [ foo++; } while (foo<bar>);] - Gen<Stmt> - SpanEditHandler;Accepts:None
  76065. + Whitespace;[ ];
  76066. + Identifier;[foo];
  76067. + Increment;[++];
  76068. + Semicolon;[;];
  76069. + Whitespace;[ ];
  76070. + RightBrace;[}];
  76071. + Whitespace;[ ];
  76072. + Keyword;[while];
  76073. + Whitespace;[ ];
  76074. + LeftParenthesis;[(];
  76075. + Identifier;[foo];
  76076. + LessThan;[<];
  76077. + Identifier;[bar];
  76078. + GreaterThan;[>];
  76079. + RightParenthesis;[)];
  76080. + Semicolon;[;];
  76081. + MarkupTextLiteral - [74..75)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  76082. + DoubleQuote;["];
  76083. + MarkupTextLiteral - [75..76)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76084. + CloseAngle;[>];
  76085. + MarkupTextLiteral - [76..81)::5 - [Hello] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76086. + Text;[Hello];
  76087. + MarkupTagHelperEndTag - [81..85)::4
  76088. + MarkupTextLiteral - [81..85)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76089. + OpenAngle;[<];
  76090. + ForwardSlash;[/];
  76091. + Text;[p];
  76092. + CloseAngle;[>];
  76093. + MarkupTextLiteral - [85..86)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76094. + Whitespace;[ ];
  76095. + MarkupTagHelperElement - [86..171)::85 - p[StartTagAndEndTag] - ptaghelper
  76096. + MarkupTagHelperStartTag - [86..162)::76
  76097. + MarkupTextLiteral - [86..88)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76098. + OpenAngle;[<];
  76099. + Text;[p];
  76100. + MarkupTagHelperAttribute - [88..161)::73 - style - SingleQuotes - Unbound - [ style='@do { var foo = bar; <text>Foo</text> foo++; } while (foo<bar>);']
  76101. + MarkupTextLiteral - [88..89)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76102. + Whitespace;[ ];
  76103. + MarkupTextLiteral - [89..94)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76104. + Text;[style];
  76105. + Equals;[=];
  76106. + MarkupTextLiteral - [95..96)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  76107. + SingleQuote;['];
  76108. + MarkupTagHelperAttributeValue - [96..160)::64
  76109. + MarkupDynamicAttributeValue - [96..160)::64 - [@do { var foo = bar; <text>Foo</text> foo++; } while (foo<bar>);]
  76110. + GenericBlock - [96..160)::64
  76111. + CSharpCodeBlock - [96..160)::64
  76112. + CSharpTransition - [96..97)::1 - Gen<None> - SpanEditHandler;Accepts:None
  76113. + Transition;[@];
  76114. + CSharpStatementLiteral - [97..117)::20 - [do { var foo = bar; ] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  76115. + Keyword;[do];
  76116. + Whitespace;[ ];
  76117. + LeftBrace;[{];
  76118. + Whitespace;[ ];
  76119. + Identifier;[var];
  76120. + Whitespace;[ ];
  76121. + Identifier;[foo];
  76122. + Whitespace;[ ];
  76123. + Assign;[=];
  76124. + Whitespace;[ ];
  76125. + Identifier;[bar];
  76126. + Semicolon;[;];
  76127. + Whitespace;[ ];
  76128. + MarkupBlock - [117..133)::16
  76129. + MarkupTagBlock - [117..123)::6 - [<text>]
  76130. + MarkupTransition - [117..123)::6 - Gen<None> - SpanEditHandler;Accepts:None
  76131. + OpenAngle;[<];
  76132. + Text;[text];
  76133. + CloseAngle;[>];
  76134. + MarkupTextLiteral - [123..126)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:None
  76135. + Text;[Foo];
  76136. + MarkupTagBlock - [126..133)::7 - [</text>]
  76137. + MarkupTransition - [126..133)::7 - Gen<None> - SpanEditHandler;Accepts:None
  76138. + OpenAngle;[<];
  76139. + ForwardSlash;[/];
  76140. + Text;[text];
  76141. + CloseAngle;[>];
  76142. + CSharpStatementLiteral - [133..160)::27 - [ foo++; } while (foo<bar>);] - Gen<Stmt> - SpanEditHandler;Accepts:None
  76143. + Whitespace;[ ];
  76144. + Identifier;[foo];
  76145. + Increment;[++];
  76146. + Semicolon;[;];
  76147. + Whitespace;[ ];
  76148. + RightBrace;[}];
  76149. + Whitespace;[ ];
  76150. + Keyword;[while];
  76151. + Whitespace;[ ];
  76152. + LeftParenthesis;[(];
  76153. + Identifier;[foo];
  76154. + LessThan;[<];
  76155. + Identifier;[bar];
  76156. + GreaterThan;[>];
  76157. + RightParenthesis;[)];
  76158. + Semicolon;[;];
  76159. + MarkupTextLiteral - [160..161)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  76160. + SingleQuote;['];
  76161. + MarkupTextLiteral - [161..162)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76162. + CloseAngle;[>];
  76163. + MarkupTextLiteral - [162..167)::5 - [World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76164. + Text;[World];
  76165. + MarkupTagHelperEndTag - [167..171)::4
  76166. + MarkupTextLiteral - [167..171)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76167. + OpenAngle;[<];
  76168. + ForwardSlash;[/];
  76169. + Text;[p];
  76170. + CloseAngle;[>];
  76171. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks7.stree.txt
  76172. index 9433379abbe..26ac739f706 100644
  76173. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks7.stree.txt
  76174. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexAttributeTagHelperTagBlocks7.stree.txt
  76175. @@ -1,66 +1,109 @@
  76176. -Markup block - Gen<None> - 122 - (0:0,0)
  76177. - Tag block - Gen<TagHelper> - 122 - (0:0,0) - p - ptaghelper
  76178. - StartTagAndEndTag - <p class="@DateTime.Now" style='@DateTime.Now'> ... </p>
  76179. - class - DoubleQuotes
  76180. - Markup block - Gen<None> - 13 - (10:0,10)
  76181. - Markup block - Gen<DynAttr:@(10:0,10)> - 13 - (10:0,10)
  76182. - Expression block - Gen<Expr> - 13 - (10:0,10)
  76183. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  76184. - SyntaxKind.Transition;[@];
  76185. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (11:0,11) - Tokens:3
  76186. - SyntaxKind.Identifier;[DateTime];
  76187. - SyntaxKind.Dot;[.];
  76188. - SyntaxKind.Identifier;[Now];
  76189. - style - SingleQuotes
  76190. - Markup block - Gen<None> - 13 - (32:0,32)
  76191. - Markup block - Gen<DynAttr:@(32:0,32)> - 13 - (32:0,32)
  76192. - Expression block - Gen<Expr> - 13 - (32:0,32)
  76193. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (32:0,32) - Tokens:1
  76194. - SyntaxKind.Transition;[@];
  76195. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (33:0,33) - Tokens:3
  76196. - SyntaxKind.Identifier;[DateTime];
  76197. - SyntaxKind.Dot;[.];
  76198. - SyntaxKind.Identifier;[Now];
  76199. - SyntaxKind.HtmlTextLiteral - [Hello World ] - [47..59) - FullWidth: 12 - Slots: 1
  76200. - SyntaxKind.List - [Hello World ] - [47..59) - FullWidth: 12 - Slots: 4
  76201. - SyntaxKind.Text;[Hello];
  76202. - SyntaxKind.Whitespace;[ ];
  76203. - SyntaxKind.Text;[World];
  76204. - SyntaxKind.Whitespace;[ ];
  76205. - Tag block - Gen<None> - 30 - (59:0,59)
  76206. - Markup span - Gen<Markup> - [<strong] - SpanEditHandler;Accepts:Any - (59:0,59) - Tokens:2
  76207. - SyntaxKind.OpenAngle;[<];
  76208. - SyntaxKind.Text;[strong];
  76209. - Markup block - Gen<Attr:class, class="@(66:0,66),"@(87:0,87)> - 22 - (66:0,66)
  76210. - Markup span - Gen<None> - [ class="] - SpanEditHandler;Accepts:Any - (66:0,66) - Tokens:4
  76211. - SyntaxKind.Whitespace;[ ];
  76212. - SyntaxKind.Text;[class];
  76213. - SyntaxKind.Equals;[=];
  76214. - SyntaxKind.DoubleQuote;["];
  76215. - Markup block - Gen<DynAttr:@(74:0,74)> - 13 - (74:0,74)
  76216. - Expression block - Gen<Expr> - 13 - (74:0,74)
  76217. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (74:0,74) - Tokens:1
  76218. - SyntaxKind.Transition;[@];
  76219. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (75:0,75) - Tokens:3
  76220. - SyntaxKind.Identifier;[DateTime];
  76221. - SyntaxKind.Dot;[.];
  76222. - SyntaxKind.Identifier;[Now];
  76223. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (87:0,87) - Tokens:1
  76224. - SyntaxKind.DoubleQuote;["];
  76225. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (88:0,88) - Tokens:1
  76226. - SyntaxKind.CloseAngle;[>];
  76227. - SyntaxKind.HtmlTextLiteral - [inside of strong tag] - [89..109) - FullWidth: 20 - Slots: 1
  76228. - SyntaxKind.List - [inside of strong tag] - [89..109) - FullWidth: 20 - Slots: 7
  76229. - SyntaxKind.Text;[inside];
  76230. - SyntaxKind.Whitespace;[ ];
  76231. - SyntaxKind.Text;[of];
  76232. - SyntaxKind.Whitespace;[ ];
  76233. - SyntaxKind.Text;[strong];
  76234. - SyntaxKind.Whitespace;[ ];
  76235. - SyntaxKind.Text;[tag];
  76236. - Tag block - Gen<None> - 9 - (109:0,109)
  76237. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (109:0,109) - Tokens:4
  76238. - SyntaxKind.OpenAngle;[<];
  76239. - SyntaxKind.ForwardSlash;[/];
  76240. - SyntaxKind.Text;[strong];
  76241. - SyntaxKind.CloseAngle;[>];
  76242. +RazorDocument - [0..122)::122 - [<p class="@DateTime.Now" style='@DateTime.Now'>Hello World <strong class="@DateTime.Now">inside of strong tag</strong></p>]
  76243. + MarkupBlock - [0..122)::122
  76244. + MarkupTagHelperElement - [0..122)::122 - p[StartTagAndEndTag] - ptaghelper
  76245. + MarkupTagHelperStartTag - [0..47)::47
  76246. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76247. + OpenAngle;[<];
  76248. + Text;[p];
  76249. + MarkupTagHelperAttribute - [2..24)::22 - class - DoubleQuotes - Unbound - [ class="@DateTime.Now"]
  76250. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76251. + Whitespace;[ ];
  76252. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76253. + Text;[class];
  76254. + Equals;[=];
  76255. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  76256. + DoubleQuote;["];
  76257. + MarkupTagHelperAttributeValue - [10..23)::13
  76258. + MarkupDynamicAttributeValue - [10..23)::13 - [@DateTime.Now]
  76259. + GenericBlock - [10..23)::13
  76260. + CSharpCodeBlock - [10..23)::13
  76261. + CSharpImplicitExpression - [10..23)::13
  76262. + CSharpTransition - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  76263. + Transition;[@];
  76264. + CSharpImplicitExpressionBody - [11..23)::12
  76265. + CSharpCodeBlock - [11..23)::12
  76266. + CSharpExpressionLiteral - [11..23)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  76267. + Identifier;[DateTime];
  76268. + Dot;[.];
  76269. + Identifier;[Now];
  76270. + MarkupTextLiteral - [23..24)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  76271. + DoubleQuote;["];
  76272. + MarkupTagHelperAttribute - [24..46)::22 - style - SingleQuotes - Unbound - [ style='@DateTime.Now']
  76273. + MarkupTextLiteral - [24..25)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76274. + Whitespace;[ ];
  76275. + MarkupTextLiteral - [25..30)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76276. + Text;[style];
  76277. + Equals;[=];
  76278. + MarkupTextLiteral - [31..32)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  76279. + SingleQuote;['];
  76280. + MarkupTagHelperAttributeValue - [32..45)::13
  76281. + MarkupDynamicAttributeValue - [32..45)::13 - [@DateTime.Now]
  76282. + GenericBlock - [32..45)::13
  76283. + CSharpCodeBlock - [32..45)::13
  76284. + CSharpImplicitExpression - [32..45)::13
  76285. + CSharpTransition - [32..33)::1 - Gen<None> - SpanEditHandler;Accepts:None
  76286. + Transition;[@];
  76287. + CSharpImplicitExpressionBody - [33..45)::12
  76288. + CSharpCodeBlock - [33..45)::12
  76289. + CSharpExpressionLiteral - [33..45)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  76290. + Identifier;[DateTime];
  76291. + Dot;[.];
  76292. + Identifier;[Now];
  76293. + MarkupTextLiteral - [45..46)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  76294. + SingleQuote;['];
  76295. + MarkupTextLiteral - [46..47)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76296. + CloseAngle;[>];
  76297. + MarkupTextLiteral - [47..59)::12 - [Hello World ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76298. + Text;[Hello];
  76299. + Whitespace;[ ];
  76300. + Text;[World];
  76301. + Whitespace;[ ];
  76302. + MarkupTagBlock - [59..89)::30 - [<strong class="@DateTime.Now">]
  76303. + MarkupTextLiteral - [59..66)::7 - [<strong] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76304. + OpenAngle;[<];
  76305. + Text;[strong];
  76306. + MarkupAttributeBlock - [66..88)::22 - [ class="@DateTime.Now"]
  76307. + MarkupTextLiteral - [66..67)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76308. + Whitespace;[ ];
  76309. + MarkupTextLiteral - [67..72)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76310. + Text;[class];
  76311. + Equals;[=];
  76312. + MarkupTextLiteral - [73..74)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  76313. + DoubleQuote;["];
  76314. + GenericBlock - [74..87)::13
  76315. + MarkupDynamicAttributeValue - [74..87)::13 - [@DateTime.Now]
  76316. + GenericBlock - [74..87)::13
  76317. + CSharpCodeBlock - [74..87)::13
  76318. + CSharpImplicitExpression - [74..87)::13
  76319. + CSharpTransition - [74..75)::1 - Gen<None> - SpanEditHandler;Accepts:None
  76320. + Transition;[@];
  76321. + CSharpImplicitExpressionBody - [75..87)::12
  76322. + CSharpCodeBlock - [75..87)::12
  76323. + CSharpExpressionLiteral - [75..87)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  76324. + Identifier;[DateTime];
  76325. + Dot;[.];
  76326. + Identifier;[Now];
  76327. + MarkupTextLiteral - [87..88)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  76328. + DoubleQuote;["];
  76329. + MarkupTextLiteral - [88..89)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76330. + CloseAngle;[>];
  76331. + MarkupTextLiteral - [89..109)::20 - [inside of strong tag] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76332. + Text;[inside];
  76333. + Whitespace;[ ];
  76334. + Text;[of];
  76335. + Whitespace;[ ];
  76336. + Text;[strong];
  76337. + Whitespace;[ ];
  76338. + Text;[tag];
  76339. + MarkupTagBlock - [109..118)::9 - [</strong>]
  76340. + MarkupTextLiteral - [109..118)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76341. + OpenAngle;[<];
  76342. + ForwardSlash;[/];
  76343. + Text;[strong];
  76344. + CloseAngle;[>];
  76345. + MarkupTagHelperEndTag - [118..122)::4
  76346. + MarkupTextLiteral - [118..122)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76347. + OpenAngle;[<];
  76348. + ForwardSlash;[/];
  76349. + Text;[p];
  76350. + CloseAngle;[>];
  76351. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks1.stree.txt
  76352. index ac7dc6b913e..46e6589625a 100644
  76353. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks1.stree.txt
  76354. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks1.stree.txt
  76355. @@ -1,10 +1,24 @@
  76356. -Markup block - Gen<None> - 20 - (0:0,0)
  76357. - Tag block - Gen<TagHelper> - 20 - (0:0,0) - p - ptaghelper
  76358. - StartTagAndEndTag - <p> ... </p>
  76359. - Expression block - Gen<Expr> - 13 - (3:0,3)
  76360. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  76361. - SyntaxKind.Transition;[@];
  76362. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (4:0,4) - Tokens:3
  76363. - SyntaxKind.Identifier;[DateTime];
  76364. - SyntaxKind.Dot;[.];
  76365. - SyntaxKind.Identifier;[Now];
  76366. +RazorDocument - [0..20)::20 - [<p>@DateTime.Now</p>]
  76367. + MarkupBlock - [0..20)::20
  76368. + MarkupTagHelperElement - [0..20)::20 - p[StartTagAndEndTag] - ptaghelper
  76369. + MarkupTagHelperStartTag - [0..3)::3
  76370. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76371. + OpenAngle;[<];
  76372. + Text;[p];
  76373. + CloseAngle;[>];
  76374. + CSharpCodeBlock - [3..16)::13
  76375. + CSharpImplicitExpression - [3..16)::13
  76376. + CSharpTransition - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  76377. + Transition;[@];
  76378. + CSharpImplicitExpressionBody - [4..16)::12
  76379. + CSharpCodeBlock - [4..16)::12
  76380. + CSharpExpressionLiteral - [4..16)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  76381. + Identifier;[DateTime];
  76382. + Dot;[.];
  76383. + Identifier;[Now];
  76384. + MarkupTagHelperEndTag - [16..20)::4
  76385. + MarkupTextLiteral - [16..20)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76386. + OpenAngle;[<];
  76387. + ForwardSlash;[/];
  76388. + Text;[p];
  76389. + CloseAngle;[>];
  76390. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks2.stree.txt
  76391. index 1d83c067100..c7fd6887941 100644
  76392. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks2.stree.txt
  76393. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks2.stree.txt
  76394. @@ -1,44 +1,65 @@
  76395. -Markup block - Gen<None> - 65 - (0:0,0)
  76396. - Tag block - Gen<TagHelper> - 65 - (0:0,0) - p - ptaghelper
  76397. - StartTagAndEndTag - <p> ... </p>
  76398. - Statement block - Gen<None> - 58 - (3:0,3)
  76399. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  76400. - SyntaxKind.Transition;[@];
  76401. - Code span - Gen<Stmt> - [do { var foo = bar;] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:12
  76402. - SyntaxKind.Keyword;[do];
  76403. - SyntaxKind.Whitespace;[ ];
  76404. - SyntaxKind.LeftBrace;[{];
  76405. - SyntaxKind.Whitespace;[ ];
  76406. - SyntaxKind.Identifier;[var];
  76407. - SyntaxKind.Whitespace;[ ];
  76408. - SyntaxKind.Identifier;[foo];
  76409. - SyntaxKind.Whitespace;[ ];
  76410. - SyntaxKind.Assign;[=];
  76411. - SyntaxKind.Whitespace;[ ];
  76412. - SyntaxKind.Identifier;[bar];
  76413. - SyntaxKind.Semicolon;[;];
  76414. - Markup block - Gen<None> - 12 - (23:0,23)
  76415. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:1
  76416. - SyntaxKind.Whitespace;[ ];
  76417. - Tag block - Gen<TagHelper> - 10 - (24:0,24) - p - ptaghelper
  76418. - StartTagAndEndTag - <p> ... </p>
  76419. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:Any - (27:0,27) - Tokens:1
  76420. - SyntaxKind.Text;[Foo];
  76421. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (34:0,34) - Tokens:1
  76422. - SyntaxKind.Whitespace;[ ];
  76423. - Code span - Gen<Stmt> - [foo++; } while (foo<bar>);] - SpanEditHandler;Accepts:None - (35:0,35) - Tokens:15
  76424. - SyntaxKind.Identifier;[foo];
  76425. - SyntaxKind.Increment;[++];
  76426. - SyntaxKind.Semicolon;[;];
  76427. - SyntaxKind.Whitespace;[ ];
  76428. - SyntaxKind.RightBrace;[}];
  76429. - SyntaxKind.Whitespace;[ ];
  76430. - SyntaxKind.Keyword;[while];
  76431. - SyntaxKind.Whitespace;[ ];
  76432. - SyntaxKind.LeftParenthesis;[(];
  76433. - SyntaxKind.Identifier;[foo];
  76434. - SyntaxKind.LessThan;[<];
  76435. - SyntaxKind.Identifier;[bar];
  76436. - SyntaxKind.GreaterThan;[>];
  76437. - SyntaxKind.RightParenthesis;[)];
  76438. - SyntaxKind.Semicolon;[;];
  76439. +RazorDocument - [0..65)::65 - [<p>@do { var foo = bar; <p>Foo</p> foo++; } while (foo<bar>);</p>]
  76440. + MarkupBlock - [0..65)::65
  76441. + MarkupTagHelperElement - [0..65)::65 - p[StartTagAndEndTag] - ptaghelper
  76442. + MarkupTagHelperStartTag - [0..3)::3
  76443. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76444. + OpenAngle;[<];
  76445. + Text;[p];
  76446. + CloseAngle;[>];
  76447. + CSharpCodeBlock - [3..61)::58
  76448. + CSharpTransition - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  76449. + Transition;[@];
  76450. + CSharpStatementLiteral - [4..23)::19 - [do { var foo = bar;] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  76451. + Keyword;[do];
  76452. + Whitespace;[ ];
  76453. + LeftBrace;[{];
  76454. + Whitespace;[ ];
  76455. + Identifier;[var];
  76456. + Whitespace;[ ];
  76457. + Identifier;[foo];
  76458. + Whitespace;[ ];
  76459. + Assign;[=];
  76460. + Whitespace;[ ];
  76461. + Identifier;[bar];
  76462. + Semicolon;[;];
  76463. + MarkupBlock - [23..35)::12
  76464. + MarkupTextLiteral - [23..24)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76465. + Whitespace;[ ];
  76466. + MarkupTagHelperElement - [24..34)::10 - p[StartTagAndEndTag] - ptaghelper
  76467. + MarkupTagHelperStartTag - [24..27)::3
  76468. + MarkupTextLiteral - [24..27)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  76469. + OpenAngle;[<];
  76470. + Text;[p];
  76471. + CloseAngle;[>];
  76472. + MarkupTextLiteral - [27..30)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76473. + Text;[Foo];
  76474. + MarkupTagHelperEndTag - [30..34)::4
  76475. + MarkupTextLiteral - [30..34)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  76476. + OpenAngle;[<];
  76477. + ForwardSlash;[/];
  76478. + Text;[p];
  76479. + CloseAngle;[>];
  76480. + MarkupTextLiteral - [34..35)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  76481. + Whitespace;[ ];
  76482. + CSharpStatementLiteral - [35..61)::26 - [foo++; } while (foo<bar>);] - Gen<Stmt> - SpanEditHandler;Accepts:None
  76483. + Identifier;[foo];
  76484. + Increment;[++];
  76485. + Semicolon;[;];
  76486. + Whitespace;[ ];
  76487. + RightBrace;[}];
  76488. + Whitespace;[ ];
  76489. + Keyword;[while];
  76490. + Whitespace;[ ];
  76491. + LeftParenthesis;[(];
  76492. + Identifier;[foo];
  76493. + LessThan;[<];
  76494. + Identifier;[bar];
  76495. + GreaterThan;[>];
  76496. + RightParenthesis;[)];
  76497. + Semicolon;[;];
  76498. + MarkupTagHelperEndTag - [61..65)::4
  76499. + MarkupTextLiteral - [61..65)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76500. + OpenAngle;[<];
  76501. + ForwardSlash;[/];
  76502. + Text;[p];
  76503. + CloseAngle;[>];
  76504. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks3.stree.txt
  76505. index c5ba364362d..316334424f4 100644
  76506. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks3.stree.txt
  76507. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks3.stree.txt
  76508. @@ -1,15 +1,29 @@
  76509. -Markup block - Gen<None> - 32 - (0:0,0)
  76510. - Tag block - Gen<TagHelper> - 32 - (0:0,0) - p - ptaghelper
  76511. - StartTagAndEndTag - <p> ... </p>
  76512. - Markup span - Gen<Markup> - [Hello World ] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:4
  76513. - SyntaxKind.Text;[Hello];
  76514. - SyntaxKind.Whitespace;[ ];
  76515. - SyntaxKind.Text;[World];
  76516. - SyntaxKind.Whitespace;[ ];
  76517. - Expression block - Gen<Expr> - 13 - (15:0,15)
  76518. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:1
  76519. - SyntaxKind.Transition;[@];
  76520. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (16:0,16) - Tokens:3
  76521. - SyntaxKind.Identifier;[DateTime];
  76522. - SyntaxKind.Dot;[.];
  76523. - SyntaxKind.Identifier;[Now];
  76524. +RazorDocument - [0..32)::32 - [<p>Hello World @DateTime.Now</p>]
  76525. + MarkupBlock - [0..32)::32
  76526. + MarkupTagHelperElement - [0..32)::32 - p[StartTagAndEndTag] - ptaghelper
  76527. + MarkupTagHelperStartTag - [0..3)::3
  76528. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76529. + OpenAngle;[<];
  76530. + Text;[p];
  76531. + CloseAngle;[>];
  76532. + MarkupTextLiteral - [3..15)::12 - [Hello World ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76533. + Text;[Hello];
  76534. + Whitespace;[ ];
  76535. + Text;[World];
  76536. + Whitespace;[ ];
  76537. + CSharpCodeBlock - [15..28)::13
  76538. + CSharpImplicitExpression - [15..28)::13
  76539. + CSharpTransition - [15..16)::1 - Gen<None> - SpanEditHandler;Accepts:None
  76540. + Transition;[@];
  76541. + CSharpImplicitExpressionBody - [16..28)::12
  76542. + CSharpCodeBlock - [16..28)::12
  76543. + CSharpExpressionLiteral - [16..28)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  76544. + Identifier;[DateTime];
  76545. + Dot;[.];
  76546. + Identifier;[Now];
  76547. + MarkupTagHelperEndTag - [28..32)::4
  76548. + MarkupTextLiteral - [28..32)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76549. + OpenAngle;[<];
  76550. + ForwardSlash;[/];
  76551. + Text;[p];
  76552. + CloseAngle;[>];
  76553. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks4.stree.txt
  76554. index 3d0d33de607..018a58a688c 100644
  76555. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks4.stree.txt
  76556. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks4.stree.txt
  76557. @@ -1,49 +1,70 @@
  76558. -Markup block - Gen<None> - 77 - (0:0,0)
  76559. - Tag block - Gen<TagHelper> - 77 - (0:0,0) - p - ptaghelper
  76560. - StartTagAndEndTag - <p> ... </p>
  76561. - Markup span - Gen<Markup> - [Hello World ] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:4
  76562. - SyntaxKind.Text;[Hello];
  76563. - SyntaxKind.Whitespace;[ ];
  76564. - SyntaxKind.Text;[World];
  76565. - SyntaxKind.Whitespace;[ ];
  76566. - Statement block - Gen<None> - 58 - (15:0,15)
  76567. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:1
  76568. - SyntaxKind.Transition;[@];
  76569. - Code span - Gen<Stmt> - [do { var foo = bar;] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:12
  76570. - SyntaxKind.Keyword;[do];
  76571. - SyntaxKind.Whitespace;[ ];
  76572. - SyntaxKind.LeftBrace;[{];
  76573. - SyntaxKind.Whitespace;[ ];
  76574. - SyntaxKind.Identifier;[var];
  76575. - SyntaxKind.Whitespace;[ ];
  76576. - SyntaxKind.Identifier;[foo];
  76577. - SyntaxKind.Whitespace;[ ];
  76578. - SyntaxKind.Assign;[=];
  76579. - SyntaxKind.Whitespace;[ ];
  76580. - SyntaxKind.Identifier;[bar];
  76581. - SyntaxKind.Semicolon;[;];
  76582. - Markup block - Gen<None> - 12 - (35:0,35)
  76583. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (35:0,35) - Tokens:1
  76584. - SyntaxKind.Whitespace;[ ];
  76585. - Tag block - Gen<TagHelper> - 10 - (36:0,36) - p - ptaghelper
  76586. - StartTagAndEndTag - <p> ... </p>
  76587. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:Any - (39:0,39) - Tokens:1
  76588. - SyntaxKind.Text;[Foo];
  76589. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (46:0,46) - Tokens:1
  76590. - SyntaxKind.Whitespace;[ ];
  76591. - Code span - Gen<Stmt> - [foo++; } while (foo<bar>);] - SpanEditHandler;Accepts:None - (47:0,47) - Tokens:15
  76592. - SyntaxKind.Identifier;[foo];
  76593. - SyntaxKind.Increment;[++];
  76594. - SyntaxKind.Semicolon;[;];
  76595. - SyntaxKind.Whitespace;[ ];
  76596. - SyntaxKind.RightBrace;[}];
  76597. - SyntaxKind.Whitespace;[ ];
  76598. - SyntaxKind.Keyword;[while];
  76599. - SyntaxKind.Whitespace;[ ];
  76600. - SyntaxKind.LeftParenthesis;[(];
  76601. - SyntaxKind.Identifier;[foo];
  76602. - SyntaxKind.LessThan;[<];
  76603. - SyntaxKind.Identifier;[bar];
  76604. - SyntaxKind.GreaterThan;[>];
  76605. - SyntaxKind.RightParenthesis;[)];
  76606. - SyntaxKind.Semicolon;[;];
  76607. +RazorDocument - [0..77)::77 - [<p>Hello World @do { var foo = bar; <p>Foo</p> foo++; } while (foo<bar>);</p>]
  76608. + MarkupBlock - [0..77)::77
  76609. + MarkupTagHelperElement - [0..77)::77 - p[StartTagAndEndTag] - ptaghelper
  76610. + MarkupTagHelperStartTag - [0..3)::3
  76611. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76612. + OpenAngle;[<];
  76613. + Text;[p];
  76614. + CloseAngle;[>];
  76615. + MarkupTextLiteral - [3..15)::12 - [Hello World ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76616. + Text;[Hello];
  76617. + Whitespace;[ ];
  76618. + Text;[World];
  76619. + Whitespace;[ ];
  76620. + CSharpCodeBlock - [15..73)::58
  76621. + CSharpTransition - [15..16)::1 - Gen<None> - SpanEditHandler;Accepts:None
  76622. + Transition;[@];
  76623. + CSharpStatementLiteral - [16..35)::19 - [do { var foo = bar;] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  76624. + Keyword;[do];
  76625. + Whitespace;[ ];
  76626. + LeftBrace;[{];
  76627. + Whitespace;[ ];
  76628. + Identifier;[var];
  76629. + Whitespace;[ ];
  76630. + Identifier;[foo];
  76631. + Whitespace;[ ];
  76632. + Assign;[=];
  76633. + Whitespace;[ ];
  76634. + Identifier;[bar];
  76635. + Semicolon;[;];
  76636. + MarkupBlock - [35..47)::12
  76637. + MarkupTextLiteral - [35..36)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76638. + Whitespace;[ ];
  76639. + MarkupTagHelperElement - [36..46)::10 - p[StartTagAndEndTag] - ptaghelper
  76640. + MarkupTagHelperStartTag - [36..39)::3
  76641. + MarkupTextLiteral - [36..39)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  76642. + OpenAngle;[<];
  76643. + Text;[p];
  76644. + CloseAngle;[>];
  76645. + MarkupTextLiteral - [39..42)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76646. + Text;[Foo];
  76647. + MarkupTagHelperEndTag - [42..46)::4
  76648. + MarkupTextLiteral - [42..46)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  76649. + OpenAngle;[<];
  76650. + ForwardSlash;[/];
  76651. + Text;[p];
  76652. + CloseAngle;[>];
  76653. + MarkupTextLiteral - [46..47)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  76654. + Whitespace;[ ];
  76655. + CSharpStatementLiteral - [47..73)::26 - [foo++; } while (foo<bar>);] - Gen<Stmt> - SpanEditHandler;Accepts:None
  76656. + Identifier;[foo];
  76657. + Increment;[++];
  76658. + Semicolon;[;];
  76659. + Whitespace;[ ];
  76660. + RightBrace;[}];
  76661. + Whitespace;[ ];
  76662. + Keyword;[while];
  76663. + Whitespace;[ ];
  76664. + LeftParenthesis;[(];
  76665. + Identifier;[foo];
  76666. + LessThan;[<];
  76667. + Identifier;[bar];
  76668. + GreaterThan;[>];
  76669. + RightParenthesis;[)];
  76670. + Semicolon;[;];
  76671. + MarkupTagHelperEndTag - [73..77)::4
  76672. + MarkupTextLiteral - [73..77)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76673. + OpenAngle;[<];
  76674. + ForwardSlash;[/];
  76675. + Text;[p];
  76676. + CloseAngle;[>];
  76677. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks5.stree.txt
  76678. index f63f6e58dc8..665530f01e9 100644
  76679. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks5.stree.txt
  76680. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks5.stree.txt
  76681. @@ -1,21 +1,48 @@
  76682. -Markup block - Gen<None> - 41 - (0:0,0)
  76683. - Tag block - Gen<TagHelper> - 20 - (0:0,0) - p - ptaghelper
  76684. - StartTagAndEndTag - <p> ... </p>
  76685. - Expression block - Gen<Expr> - 13 - (3:0,3)
  76686. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  76687. - SyntaxKind.Transition;[@];
  76688. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (4:0,4) - Tokens:3
  76689. - SyntaxKind.Identifier;[DateTime];
  76690. - SyntaxKind.Dot;[.];
  76691. - SyntaxKind.Identifier;[Now];
  76692. - SyntaxKind.HtmlTextLiteral - [ ] - [20..21) - FullWidth: 1 - Slots: 1
  76693. - SyntaxKind.Whitespace;[ ];
  76694. - Tag block - Gen<TagHelper> - 20 - (21:0,21) - p - ptaghelper
  76695. - StartTagAndEndTag - <p> ... </p>
  76696. - Expression block - Gen<Expr> - 13 - (24:0,24)
  76697. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (24:0,24) - Tokens:1
  76698. - SyntaxKind.Transition;[@];
  76699. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (25:0,25) - Tokens:3
  76700. - SyntaxKind.Identifier;[DateTime];
  76701. - SyntaxKind.Dot;[.];
  76702. - SyntaxKind.Identifier;[Now];
  76703. +RazorDocument - [0..41)::41 - [<p>@DateTime.Now</p> <p>@DateTime.Now</p>]
  76704. + MarkupBlock - [0..41)::41
  76705. + MarkupTagHelperElement - [0..20)::20 - p[StartTagAndEndTag] - ptaghelper
  76706. + MarkupTagHelperStartTag - [0..3)::3
  76707. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76708. + OpenAngle;[<];
  76709. + Text;[p];
  76710. + CloseAngle;[>];
  76711. + CSharpCodeBlock - [3..16)::13
  76712. + CSharpImplicitExpression - [3..16)::13
  76713. + CSharpTransition - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  76714. + Transition;[@];
  76715. + CSharpImplicitExpressionBody - [4..16)::12
  76716. + CSharpCodeBlock - [4..16)::12
  76717. + CSharpExpressionLiteral - [4..16)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  76718. + Identifier;[DateTime];
  76719. + Dot;[.];
  76720. + Identifier;[Now];
  76721. + MarkupTagHelperEndTag - [16..20)::4
  76722. + MarkupTextLiteral - [16..20)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76723. + OpenAngle;[<];
  76724. + ForwardSlash;[/];
  76725. + Text;[p];
  76726. + CloseAngle;[>];
  76727. + MarkupTextLiteral - [20..21)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76728. + Whitespace;[ ];
  76729. + MarkupTagHelperElement - [21..41)::20 - p[StartTagAndEndTag] - ptaghelper
  76730. + MarkupTagHelperStartTag - [21..24)::3
  76731. + MarkupTextLiteral - [21..24)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76732. + OpenAngle;[<];
  76733. + Text;[p];
  76734. + CloseAngle;[>];
  76735. + CSharpCodeBlock - [24..37)::13
  76736. + CSharpImplicitExpression - [24..37)::13
  76737. + CSharpTransition - [24..25)::1 - Gen<None> - SpanEditHandler;Accepts:None
  76738. + Transition;[@];
  76739. + CSharpImplicitExpressionBody - [25..37)::12
  76740. + CSharpCodeBlock - [25..37)::12
  76741. + CSharpExpressionLiteral - [25..37)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  76742. + Identifier;[DateTime];
  76743. + Dot;[.];
  76744. + Identifier;[Now];
  76745. + MarkupTagHelperEndTag - [37..41)::4
  76746. + MarkupTextLiteral - [37..41)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76747. + OpenAngle;[<];
  76748. + ForwardSlash;[/];
  76749. + Text;[p];
  76750. + CloseAngle;[>];
  76751. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks6.stree.txt
  76752. index 2d1b78b0b54..330c1f53ab5 100644
  76753. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks6.stree.txt
  76754. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks6.stree.txt
  76755. @@ -1,89 +1,130 @@
  76756. -Markup block - Gen<None> - 131 - (0:0,0)
  76757. - Tag block - Gen<TagHelper> - 65 - (0:0,0) - p - ptaghelper
  76758. - StartTagAndEndTag - <p> ... </p>
  76759. - Statement block - Gen<None> - 58 - (3:0,3)
  76760. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  76761. - SyntaxKind.Transition;[@];
  76762. - Code span - Gen<Stmt> - [do { var foo = bar;] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:12
  76763. - SyntaxKind.Keyword;[do];
  76764. - SyntaxKind.Whitespace;[ ];
  76765. - SyntaxKind.LeftBrace;[{];
  76766. - SyntaxKind.Whitespace;[ ];
  76767. - SyntaxKind.Identifier;[var];
  76768. - SyntaxKind.Whitespace;[ ];
  76769. - SyntaxKind.Identifier;[foo];
  76770. - SyntaxKind.Whitespace;[ ];
  76771. - SyntaxKind.Assign;[=];
  76772. - SyntaxKind.Whitespace;[ ];
  76773. - SyntaxKind.Identifier;[bar];
  76774. - SyntaxKind.Semicolon;[;];
  76775. - Markup block - Gen<None> - 12 - (23:0,23)
  76776. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:1
  76777. - SyntaxKind.Whitespace;[ ];
  76778. - Tag block - Gen<TagHelper> - 10 - (24:0,24) - p - ptaghelper
  76779. - StartTagAndEndTag - <p> ... </p>
  76780. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:Any - (27:0,27) - Tokens:1
  76781. - SyntaxKind.Text;[Foo];
  76782. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (34:0,34) - Tokens:1
  76783. - SyntaxKind.Whitespace;[ ];
  76784. - Code span - Gen<Stmt> - [foo++; } while (foo<bar>);] - SpanEditHandler;Accepts:None - (35:0,35) - Tokens:15
  76785. - SyntaxKind.Identifier;[foo];
  76786. - SyntaxKind.Increment;[++];
  76787. - SyntaxKind.Semicolon;[;];
  76788. - SyntaxKind.Whitespace;[ ];
  76789. - SyntaxKind.RightBrace;[}];
  76790. - SyntaxKind.Whitespace;[ ];
  76791. - SyntaxKind.Keyword;[while];
  76792. - SyntaxKind.Whitespace;[ ];
  76793. - SyntaxKind.LeftParenthesis;[(];
  76794. - SyntaxKind.Identifier;[foo];
  76795. - SyntaxKind.LessThan;[<];
  76796. - SyntaxKind.Identifier;[bar];
  76797. - SyntaxKind.GreaterThan;[>];
  76798. - SyntaxKind.RightParenthesis;[)];
  76799. - SyntaxKind.Semicolon;[;];
  76800. - SyntaxKind.HtmlTextLiteral - [ ] - [65..66) - FullWidth: 1 - Slots: 1
  76801. - SyntaxKind.Whitespace;[ ];
  76802. - Tag block - Gen<TagHelper> - 65 - (66:0,66) - p - ptaghelper
  76803. - StartTagAndEndTag - <p> ... </p>
  76804. - Statement block - Gen<None> - 58 - (69:0,69)
  76805. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (69:0,69) - Tokens:1
  76806. - SyntaxKind.Transition;[@];
  76807. - Code span - Gen<Stmt> - [do { var foo = bar;] - SpanEditHandler;Accepts:Any - (70:0,70) - Tokens:12
  76808. - SyntaxKind.Keyword;[do];
  76809. - SyntaxKind.Whitespace;[ ];
  76810. - SyntaxKind.LeftBrace;[{];
  76811. - SyntaxKind.Whitespace;[ ];
  76812. - SyntaxKind.Identifier;[var];
  76813. - SyntaxKind.Whitespace;[ ];
  76814. - SyntaxKind.Identifier;[foo];
  76815. - SyntaxKind.Whitespace;[ ];
  76816. - SyntaxKind.Assign;[=];
  76817. - SyntaxKind.Whitespace;[ ];
  76818. - SyntaxKind.Identifier;[bar];
  76819. - SyntaxKind.Semicolon;[;];
  76820. - Markup block - Gen<None> - 12 - (89:0,89)
  76821. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (89:0,89) - Tokens:1
  76822. - SyntaxKind.Whitespace;[ ];
  76823. - Tag block - Gen<TagHelper> - 10 - (90:0,90) - p - ptaghelper
  76824. - StartTagAndEndTag - <p> ... </p>
  76825. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:Any - (93:0,93) - Tokens:1
  76826. - SyntaxKind.Text;[Foo];
  76827. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (100:0,100) - Tokens:1
  76828. - SyntaxKind.Whitespace;[ ];
  76829. - Code span - Gen<Stmt> - [foo++; } while (foo<bar>);] - SpanEditHandler;Accepts:None - (101:0,101) - Tokens:15
  76830. - SyntaxKind.Identifier;[foo];
  76831. - SyntaxKind.Increment;[++];
  76832. - SyntaxKind.Semicolon;[;];
  76833. - SyntaxKind.Whitespace;[ ];
  76834. - SyntaxKind.RightBrace;[}];
  76835. - SyntaxKind.Whitespace;[ ];
  76836. - SyntaxKind.Keyword;[while];
  76837. - SyntaxKind.Whitespace;[ ];
  76838. - SyntaxKind.LeftParenthesis;[(];
  76839. - SyntaxKind.Identifier;[foo];
  76840. - SyntaxKind.LessThan;[<];
  76841. - SyntaxKind.Identifier;[bar];
  76842. - SyntaxKind.GreaterThan;[>];
  76843. - SyntaxKind.RightParenthesis;[)];
  76844. - SyntaxKind.Semicolon;[;];
  76845. +RazorDocument - [0..131)::131 - [<p>@do { var foo = bar; <p>Foo</p> foo++; } while (foo<bar>);</p> <p>@do { var foo = bar; <p>Foo</p> foo++; } while (foo<bar>);</p>]
  76846. + MarkupBlock - [0..131)::131
  76847. + MarkupTagHelperElement - [0..65)::65 - p[StartTagAndEndTag] - ptaghelper
  76848. + MarkupTagHelperStartTag - [0..3)::3
  76849. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76850. + OpenAngle;[<];
  76851. + Text;[p];
  76852. + CloseAngle;[>];
  76853. + CSharpCodeBlock - [3..61)::58
  76854. + CSharpTransition - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  76855. + Transition;[@];
  76856. + CSharpStatementLiteral - [4..23)::19 - [do { var foo = bar;] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  76857. + Keyword;[do];
  76858. + Whitespace;[ ];
  76859. + LeftBrace;[{];
  76860. + Whitespace;[ ];
  76861. + Identifier;[var];
  76862. + Whitespace;[ ];
  76863. + Identifier;[foo];
  76864. + Whitespace;[ ];
  76865. + Assign;[=];
  76866. + Whitespace;[ ];
  76867. + Identifier;[bar];
  76868. + Semicolon;[;];
  76869. + MarkupBlock - [23..35)::12
  76870. + MarkupTextLiteral - [23..24)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76871. + Whitespace;[ ];
  76872. + MarkupTagHelperElement - [24..34)::10 - p[StartTagAndEndTag] - ptaghelper
  76873. + MarkupTagHelperStartTag - [24..27)::3
  76874. + MarkupTextLiteral - [24..27)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  76875. + OpenAngle;[<];
  76876. + Text;[p];
  76877. + CloseAngle;[>];
  76878. + MarkupTextLiteral - [27..30)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76879. + Text;[Foo];
  76880. + MarkupTagHelperEndTag - [30..34)::4
  76881. + MarkupTextLiteral - [30..34)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  76882. + OpenAngle;[<];
  76883. + ForwardSlash;[/];
  76884. + Text;[p];
  76885. + CloseAngle;[>];
  76886. + MarkupTextLiteral - [34..35)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  76887. + Whitespace;[ ];
  76888. + CSharpStatementLiteral - [35..61)::26 - [foo++; } while (foo<bar>);] - Gen<Stmt> - SpanEditHandler;Accepts:None
  76889. + Identifier;[foo];
  76890. + Increment;[++];
  76891. + Semicolon;[;];
  76892. + Whitespace;[ ];
  76893. + RightBrace;[}];
  76894. + Whitespace;[ ];
  76895. + Keyword;[while];
  76896. + Whitespace;[ ];
  76897. + LeftParenthesis;[(];
  76898. + Identifier;[foo];
  76899. + LessThan;[<];
  76900. + Identifier;[bar];
  76901. + GreaterThan;[>];
  76902. + RightParenthesis;[)];
  76903. + Semicolon;[;];
  76904. + MarkupTagHelperEndTag - [61..65)::4
  76905. + MarkupTextLiteral - [61..65)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76906. + OpenAngle;[<];
  76907. + ForwardSlash;[/];
  76908. + Text;[p];
  76909. + CloseAngle;[>];
  76910. + MarkupTextLiteral - [65..66)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76911. + Whitespace;[ ];
  76912. + MarkupTagHelperElement - [66..131)::65 - p[StartTagAndEndTag] - ptaghelper
  76913. + MarkupTagHelperStartTag - [66..69)::3
  76914. + MarkupTextLiteral - [66..69)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76915. + OpenAngle;[<];
  76916. + Text;[p];
  76917. + CloseAngle;[>];
  76918. + CSharpCodeBlock - [69..127)::58
  76919. + CSharpTransition - [69..70)::1 - Gen<None> - SpanEditHandler;Accepts:None
  76920. + Transition;[@];
  76921. + CSharpStatementLiteral - [70..89)::19 - [do { var foo = bar;] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  76922. + Keyword;[do];
  76923. + Whitespace;[ ];
  76924. + LeftBrace;[{];
  76925. + Whitespace;[ ];
  76926. + Identifier;[var];
  76927. + Whitespace;[ ];
  76928. + Identifier;[foo];
  76929. + Whitespace;[ ];
  76930. + Assign;[=];
  76931. + Whitespace;[ ];
  76932. + Identifier;[bar];
  76933. + Semicolon;[;];
  76934. + MarkupBlock - [89..101)::12
  76935. + MarkupTextLiteral - [89..90)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76936. + Whitespace;[ ];
  76937. + MarkupTagHelperElement - [90..100)::10 - p[StartTagAndEndTag] - ptaghelper
  76938. + MarkupTagHelperStartTag - [90..93)::3
  76939. + MarkupTextLiteral - [90..93)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  76940. + OpenAngle;[<];
  76941. + Text;[p];
  76942. + CloseAngle;[>];
  76943. + MarkupTextLiteral - [93..96)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76944. + Text;[Foo];
  76945. + MarkupTagHelperEndTag - [96..100)::4
  76946. + MarkupTextLiteral - [96..100)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  76947. + OpenAngle;[<];
  76948. + ForwardSlash;[/];
  76949. + Text;[p];
  76950. + CloseAngle;[>];
  76951. + MarkupTextLiteral - [100..101)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  76952. + Whitespace;[ ];
  76953. + CSharpStatementLiteral - [101..127)::26 - [foo++; } while (foo<bar>);] - Gen<Stmt> - SpanEditHandler;Accepts:None
  76954. + Identifier;[foo];
  76955. + Increment;[++];
  76956. + Semicolon;[;];
  76957. + Whitespace;[ ];
  76958. + RightBrace;[}];
  76959. + Whitespace;[ ];
  76960. + Keyword;[while];
  76961. + Whitespace;[ ];
  76962. + LeftParenthesis;[(];
  76963. + Identifier;[foo];
  76964. + LessThan;[<];
  76965. + Identifier;[bar];
  76966. + GreaterThan;[>];
  76967. + RightParenthesis;[)];
  76968. + Semicolon;[;];
  76969. + MarkupTagHelperEndTag - [127..131)::4
  76970. + MarkupTextLiteral - [127..131)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  76971. + OpenAngle;[<];
  76972. + ForwardSlash;[/];
  76973. + Text;[p];
  76974. + CloseAngle;[>];
  76975. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks7.stree.txt
  76976. index 5a970df0681..3e4acaf1600 100644
  76977. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks7.stree.txt
  76978. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks7.stree.txt
  76979. @@ -1,42 +1,58 @@
  76980. -Markup block - Gen<None> - 77 - (0:0,0)
  76981. - Tag block - Gen<TagHelper> - 77 - (0:0,0) - p - ptaghelper
  76982. - StartTagAndEndTag - <p> ... </p>
  76983. - Markup span - Gen<Markup> - [Hello ] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:2
  76984. - SyntaxKind.Text;[Hello];
  76985. - SyntaxKind.Whitespace;[ ];
  76986. - Expression block - Gen<Expr> - 13 - (9:0,9)
  76987. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (9:0,9) - Tokens:1
  76988. - SyntaxKind.Transition;[@];
  76989. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (10:0,10) - Tokens:3
  76990. - SyntaxKind.Identifier;[DateTime];
  76991. - SyntaxKind.Dot;[.];
  76992. - SyntaxKind.Identifier;[Now];
  76993. - Tag block - Gen<None> - 8 - (22:0,22)
  76994. - Markup span - Gen<Markup> - [<strong>] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:3
  76995. - SyntaxKind.OpenAngle;[<];
  76996. - SyntaxKind.Text;[strong];
  76997. - SyntaxKind.CloseAngle;[>];
  76998. - Markup span - Gen<Markup> - [inside of ] - SpanEditHandler;Accepts:Any - (30:0,30) - Tokens:4
  76999. - SyntaxKind.Text;[inside];
  77000. - SyntaxKind.Whitespace;[ ];
  77001. - SyntaxKind.Text;[of];
  77002. - SyntaxKind.Whitespace;[ ];
  77003. - Expression block - Gen<Expr> - 13 - (40:0,40)
  77004. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (40:0,40) - Tokens:1
  77005. - SyntaxKind.Transition;[@];
  77006. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (41:0,41) - Tokens:3
  77007. - SyntaxKind.Identifier;[DateTime];
  77008. - SyntaxKind.Dot;[.];
  77009. - SyntaxKind.Identifier;[Now];
  77010. - SyntaxKind.HtmlTextLiteral - [ strong tag] - [53..64) - FullWidth: 11 - Slots: 1
  77011. - SyntaxKind.List - [ strong tag] - [53..64) - FullWidth: 11 - Slots: 4
  77012. - SyntaxKind.Whitespace;[ ];
  77013. - SyntaxKind.Text;[strong];
  77014. - SyntaxKind.Whitespace;[ ];
  77015. - SyntaxKind.Text;[tag];
  77016. - Tag block - Gen<None> - 9 - (64:0,64)
  77017. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (64:0,64) - Tokens:4
  77018. - SyntaxKind.OpenAngle;[<];
  77019. - SyntaxKind.ForwardSlash;[/];
  77020. - SyntaxKind.Text;[strong];
  77021. - SyntaxKind.CloseAngle;[>];
  77022. +RazorDocument - [0..77)::77 - [<p>Hello @DateTime.Now<strong>inside of @DateTime.Now strong tag</strong></p>]
  77023. + MarkupBlock - [0..77)::77
  77024. + MarkupTagHelperElement - [0..77)::77 - p[StartTagAndEndTag] - ptaghelper
  77025. + MarkupTagHelperStartTag - [0..3)::3
  77026. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77027. + OpenAngle;[<];
  77028. + Text;[p];
  77029. + CloseAngle;[>];
  77030. + MarkupTextLiteral - [3..9)::6 - [Hello ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77031. + Text;[Hello];
  77032. + Whitespace;[ ];
  77033. + CSharpCodeBlock - [9..22)::13
  77034. + CSharpImplicitExpression - [9..22)::13
  77035. + CSharpTransition - [9..10)::1 - Gen<None> - SpanEditHandler;Accepts:None
  77036. + Transition;[@];
  77037. + CSharpImplicitExpressionBody - [10..22)::12
  77038. + CSharpCodeBlock - [10..22)::12
  77039. + CSharpExpressionLiteral - [10..22)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  77040. + Identifier;[DateTime];
  77041. + Dot;[.];
  77042. + Identifier;[Now];
  77043. + MarkupTagBlock - [22..30)::8 - [<strong>]
  77044. + MarkupTextLiteral - [22..30)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77045. + OpenAngle;[<];
  77046. + Text;[strong];
  77047. + CloseAngle;[>];
  77048. + MarkupTextLiteral - [30..40)::10 - [inside of ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77049. + Text;[inside];
  77050. + Whitespace;[ ];
  77051. + Text;[of];
  77052. + Whitespace;[ ];
  77053. + CSharpCodeBlock - [40..53)::13
  77054. + CSharpImplicitExpression - [40..53)::13
  77055. + CSharpTransition - [40..41)::1 - Gen<None> - SpanEditHandler;Accepts:None
  77056. + Transition;[@];
  77057. + CSharpImplicitExpressionBody - [41..53)::12
  77058. + CSharpCodeBlock - [41..53)::12
  77059. + CSharpExpressionLiteral - [41..53)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  77060. + Identifier;[DateTime];
  77061. + Dot;[.];
  77062. + Identifier;[Now];
  77063. + MarkupTextLiteral - [53..64)::11 - [ strong tag] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77064. + Whitespace;[ ];
  77065. + Text;[strong];
  77066. + Whitespace;[ ];
  77067. + Text;[tag];
  77068. + MarkupTagBlock - [64..73)::9 - [</strong>]
  77069. + MarkupTextLiteral - [64..73)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77070. + OpenAngle;[<];
  77071. + ForwardSlash;[/];
  77072. + Text;[strong];
  77073. + CloseAngle;[>];
  77074. + MarkupTagHelperEndTag - [73..77)::4
  77075. + MarkupTextLiteral - [73..77)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77076. + OpenAngle;[<];
  77077. + ForwardSlash;[/];
  77078. + Text;[p];
  77079. + CloseAngle;[>];
  77080. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks8.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks8.stree.txt
  77081. index 5792836bd7d..41311d31667 100644
  77082. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks8.stree.txt
  77083. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesComplexTagHelperTagBlocks8.stree.txt
  77084. @@ -1,110 +1,140 @@
  77085. -Markup block - Gen<None> - 167 - (0:0,0)
  77086. - Tag block - Gen<TagHelper> - 167 - (0:0,0) - p - ptaghelper
  77087. - StartTagAndEndTag - <p> ... </p>
  77088. - Markup span - Gen<Markup> - [Hello ] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:2
  77089. - SyntaxKind.Text;[Hello];
  77090. - SyntaxKind.Whitespace;[ ];
  77091. - Statement block - Gen<None> - 58 - (9:0,9)
  77092. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (9:0,9) - Tokens:1
  77093. - SyntaxKind.Transition;[@];
  77094. - Code span - Gen<Stmt> - [do { var foo = bar;] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:12
  77095. - SyntaxKind.Keyword;[do];
  77096. - SyntaxKind.Whitespace;[ ];
  77097. - SyntaxKind.LeftBrace;[{];
  77098. - SyntaxKind.Whitespace;[ ];
  77099. - SyntaxKind.Identifier;[var];
  77100. - SyntaxKind.Whitespace;[ ];
  77101. - SyntaxKind.Identifier;[foo];
  77102. - SyntaxKind.Whitespace;[ ];
  77103. - SyntaxKind.Assign;[=];
  77104. - SyntaxKind.Whitespace;[ ];
  77105. - SyntaxKind.Identifier;[bar];
  77106. - SyntaxKind.Semicolon;[;];
  77107. - Markup block - Gen<None> - 12 - (29:0,29)
  77108. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (29:0,29) - Tokens:1
  77109. - SyntaxKind.Whitespace;[ ];
  77110. - Tag block - Gen<TagHelper> - 10 - (30:0,30) - p - ptaghelper
  77111. - StartTagAndEndTag - <p> ... </p>
  77112. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:Any - (33:0,33) - Tokens:1
  77113. - SyntaxKind.Text;[Foo];
  77114. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (40:0,40) - Tokens:1
  77115. - SyntaxKind.Whitespace;[ ];
  77116. - Code span - Gen<Stmt> - [foo++; } while (foo<bar>);] - SpanEditHandler;Accepts:None - (41:0,41) - Tokens:15
  77117. - SyntaxKind.Identifier;[foo];
  77118. - SyntaxKind.Increment;[++];
  77119. - SyntaxKind.Semicolon;[;];
  77120. - SyntaxKind.Whitespace;[ ];
  77121. - SyntaxKind.RightBrace;[}];
  77122. - SyntaxKind.Whitespace;[ ];
  77123. - SyntaxKind.Keyword;[while];
  77124. - SyntaxKind.Whitespace;[ ];
  77125. - SyntaxKind.LeftParenthesis;[(];
  77126. - SyntaxKind.Identifier;[foo];
  77127. - SyntaxKind.LessThan;[<];
  77128. - SyntaxKind.Identifier;[bar];
  77129. - SyntaxKind.GreaterThan;[>];
  77130. - SyntaxKind.RightParenthesis;[)];
  77131. - SyntaxKind.Semicolon;[;];
  77132. - Tag block - Gen<None> - 8 - (67:0,67)
  77133. - Markup span - Gen<Markup> - [<strong>] - SpanEditHandler;Accepts:Any - (67:0,67) - Tokens:3
  77134. - SyntaxKind.OpenAngle;[<];
  77135. - SyntaxKind.Text;[strong];
  77136. - SyntaxKind.CloseAngle;[>];
  77137. - Markup span - Gen<Markup> - [inside of ] - SpanEditHandler;Accepts:Any - (75:0,75) - Tokens:4
  77138. - SyntaxKind.Text;[inside];
  77139. - SyntaxKind.Whitespace;[ ];
  77140. - SyntaxKind.Text;[of];
  77141. - SyntaxKind.Whitespace;[ ];
  77142. - Statement block - Gen<None> - 58 - (85:0,85)
  77143. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (85:0,85) - Tokens:1
  77144. - SyntaxKind.Transition;[@];
  77145. - Code span - Gen<Stmt> - [do { var foo = bar;] - SpanEditHandler;Accepts:Any - (86:0,86) - Tokens:12
  77146. - SyntaxKind.Keyword;[do];
  77147. - SyntaxKind.Whitespace;[ ];
  77148. - SyntaxKind.LeftBrace;[{];
  77149. - SyntaxKind.Whitespace;[ ];
  77150. - SyntaxKind.Identifier;[var];
  77151. - SyntaxKind.Whitespace;[ ];
  77152. - SyntaxKind.Identifier;[foo];
  77153. - SyntaxKind.Whitespace;[ ];
  77154. - SyntaxKind.Assign;[=];
  77155. - SyntaxKind.Whitespace;[ ];
  77156. - SyntaxKind.Identifier;[bar];
  77157. - SyntaxKind.Semicolon;[;];
  77158. - Markup block - Gen<None> - 12 - (105:0,105)
  77159. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (105:0,105) - Tokens:1
  77160. - SyntaxKind.Whitespace;[ ];
  77161. - Tag block - Gen<TagHelper> - 10 - (106:0,106) - p - ptaghelper
  77162. - StartTagAndEndTag - <p> ... </p>
  77163. - Markup span - Gen<Markup> - [Foo] - SpanEditHandler;Accepts:Any - (109:0,109) - Tokens:1
  77164. - SyntaxKind.Text;[Foo];
  77165. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:None - (116:0,116) - Tokens:1
  77166. - SyntaxKind.Whitespace;[ ];
  77167. - Code span - Gen<Stmt> - [foo++; } while (foo<bar>);] - SpanEditHandler;Accepts:None - (117:0,117) - Tokens:15
  77168. - SyntaxKind.Identifier;[foo];
  77169. - SyntaxKind.Increment;[++];
  77170. - SyntaxKind.Semicolon;[;];
  77171. - SyntaxKind.Whitespace;[ ];
  77172. - SyntaxKind.RightBrace;[}];
  77173. - SyntaxKind.Whitespace;[ ];
  77174. - SyntaxKind.Keyword;[while];
  77175. - SyntaxKind.Whitespace;[ ];
  77176. - SyntaxKind.LeftParenthesis;[(];
  77177. - SyntaxKind.Identifier;[foo];
  77178. - SyntaxKind.LessThan;[<];
  77179. - SyntaxKind.Identifier;[bar];
  77180. - SyntaxKind.GreaterThan;[>];
  77181. - SyntaxKind.RightParenthesis;[)];
  77182. - SyntaxKind.Semicolon;[;];
  77183. - SyntaxKind.HtmlTextLiteral - [ strong tag] - [143..154) - FullWidth: 11 - Slots: 1
  77184. - SyntaxKind.List - [ strong tag] - [143..154) - FullWidth: 11 - Slots: 4
  77185. - SyntaxKind.Whitespace;[ ];
  77186. - SyntaxKind.Text;[strong];
  77187. - SyntaxKind.Whitespace;[ ];
  77188. - SyntaxKind.Text;[tag];
  77189. - Tag block - Gen<None> - 9 - (154:0,154)
  77190. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (154:0,154) - Tokens:4
  77191. - SyntaxKind.OpenAngle;[<];
  77192. - SyntaxKind.ForwardSlash;[/];
  77193. - SyntaxKind.Text;[strong];
  77194. - SyntaxKind.CloseAngle;[>];
  77195. +RazorDocument - [0..167)::167 - [<p>Hello @do { var foo = bar; <p>Foo</p> foo++; } while (foo<bar>);<strong>inside of @do { var foo = bar; <p>Foo</p> foo++; } while (foo<bar>); strong tag</strong></p>]
  77196. + MarkupBlock - [0..167)::167
  77197. + MarkupTagHelperElement - [0..167)::167 - p[StartTagAndEndTag] - ptaghelper
  77198. + MarkupTagHelperStartTag - [0..3)::3
  77199. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77200. + OpenAngle;[<];
  77201. + Text;[p];
  77202. + CloseAngle;[>];
  77203. + MarkupTextLiteral - [3..9)::6 - [Hello ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77204. + Text;[Hello];
  77205. + Whitespace;[ ];
  77206. + CSharpCodeBlock - [9..67)::58
  77207. + CSharpTransition - [9..10)::1 - Gen<None> - SpanEditHandler;Accepts:None
  77208. + Transition;[@];
  77209. + CSharpStatementLiteral - [10..29)::19 - [do { var foo = bar;] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  77210. + Keyword;[do];
  77211. + Whitespace;[ ];
  77212. + LeftBrace;[{];
  77213. + Whitespace;[ ];
  77214. + Identifier;[var];
  77215. + Whitespace;[ ];
  77216. + Identifier;[foo];
  77217. + Whitespace;[ ];
  77218. + Assign;[=];
  77219. + Whitespace;[ ];
  77220. + Identifier;[bar];
  77221. + Semicolon;[;];
  77222. + MarkupBlock - [29..41)::12
  77223. + MarkupTextLiteral - [29..30)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77224. + Whitespace;[ ];
  77225. + MarkupTagHelperElement - [30..40)::10 - p[StartTagAndEndTag] - ptaghelper
  77226. + MarkupTagHelperStartTag - [30..33)::3
  77227. + MarkupTextLiteral - [30..33)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  77228. + OpenAngle;[<];
  77229. + Text;[p];
  77230. + CloseAngle;[>];
  77231. + MarkupTextLiteral - [33..36)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77232. + Text;[Foo];
  77233. + MarkupTagHelperEndTag - [36..40)::4
  77234. + MarkupTextLiteral - [36..40)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  77235. + OpenAngle;[<];
  77236. + ForwardSlash;[/];
  77237. + Text;[p];
  77238. + CloseAngle;[>];
  77239. + MarkupTextLiteral - [40..41)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  77240. + Whitespace;[ ];
  77241. + CSharpStatementLiteral - [41..67)::26 - [foo++; } while (foo<bar>);] - Gen<Stmt> - SpanEditHandler;Accepts:None
  77242. + Identifier;[foo];
  77243. + Increment;[++];
  77244. + Semicolon;[;];
  77245. + Whitespace;[ ];
  77246. + RightBrace;[}];
  77247. + Whitespace;[ ];
  77248. + Keyword;[while];
  77249. + Whitespace;[ ];
  77250. + LeftParenthesis;[(];
  77251. + Identifier;[foo];
  77252. + LessThan;[<];
  77253. + Identifier;[bar];
  77254. + GreaterThan;[>];
  77255. + RightParenthesis;[)];
  77256. + Semicolon;[;];
  77257. + MarkupTagBlock - [67..75)::8 - [<strong>]
  77258. + MarkupTextLiteral - [67..75)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77259. + OpenAngle;[<];
  77260. + Text;[strong];
  77261. + CloseAngle;[>];
  77262. + MarkupTextLiteral - [75..85)::10 - [inside of ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77263. + Text;[inside];
  77264. + Whitespace;[ ];
  77265. + Text;[of];
  77266. + Whitespace;[ ];
  77267. + CSharpCodeBlock - [85..143)::58
  77268. + CSharpTransition - [85..86)::1 - Gen<None> - SpanEditHandler;Accepts:None
  77269. + Transition;[@];
  77270. + CSharpStatementLiteral - [86..105)::19 - [do { var foo = bar;] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  77271. + Keyword;[do];
  77272. + Whitespace;[ ];
  77273. + LeftBrace;[{];
  77274. + Whitespace;[ ];
  77275. + Identifier;[var];
  77276. + Whitespace;[ ];
  77277. + Identifier;[foo];
  77278. + Whitespace;[ ];
  77279. + Assign;[=];
  77280. + Whitespace;[ ];
  77281. + Identifier;[bar];
  77282. + Semicolon;[;];
  77283. + MarkupBlock - [105..117)::12
  77284. + MarkupTextLiteral - [105..106)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77285. + Whitespace;[ ];
  77286. + MarkupTagHelperElement - [106..116)::10 - p[StartTagAndEndTag] - ptaghelper
  77287. + MarkupTagHelperStartTag - [106..109)::3
  77288. + MarkupTextLiteral - [106..109)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  77289. + OpenAngle;[<];
  77290. + Text;[p];
  77291. + CloseAngle;[>];
  77292. + MarkupTextLiteral - [109..112)::3 - [Foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77293. + Text;[Foo];
  77294. + MarkupTagHelperEndTag - [112..116)::4
  77295. + MarkupTextLiteral - [112..116)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  77296. + OpenAngle;[<];
  77297. + ForwardSlash;[/];
  77298. + Text;[p];
  77299. + CloseAngle;[>];
  77300. + MarkupTextLiteral - [116..117)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:None
  77301. + Whitespace;[ ];
  77302. + CSharpStatementLiteral - [117..143)::26 - [foo++; } while (foo<bar>);] - Gen<Stmt> - SpanEditHandler;Accepts:None
  77303. + Identifier;[foo];
  77304. + Increment;[++];
  77305. + Semicolon;[;];
  77306. + Whitespace;[ ];
  77307. + RightBrace;[}];
  77308. + Whitespace;[ ];
  77309. + Keyword;[while];
  77310. + Whitespace;[ ];
  77311. + LeftParenthesis;[(];
  77312. + Identifier;[foo];
  77313. + LessThan;[<];
  77314. + Identifier;[bar];
  77315. + GreaterThan;[>];
  77316. + RightParenthesis;[)];
  77317. + Semicolon;[;];
  77318. + MarkupTextLiteral - [143..154)::11 - [ strong tag] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77319. + Whitespace;[ ];
  77320. + Text;[strong];
  77321. + Whitespace;[ ];
  77322. + Text;[tag];
  77323. + MarkupTagBlock - [154..163)::9 - [</strong>]
  77324. + MarkupTextLiteral - [154..163)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77325. + OpenAngle;[<];
  77326. + ForwardSlash;[/];
  77327. + Text;[strong];
  77328. + CloseAngle;[>];
  77329. + MarkupTagHelperEndTag - [163..167)::4
  77330. + MarkupTextLiteral - [163..167)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77331. + OpenAngle;[<];
  77332. + ForwardSlash;[/];
  77333. + Text;[p];
  77334. + CloseAngle;[>];
  77335. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesOddlySpacedTagHelperTagBlocks1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesOddlySpacedTagHelperTagBlocks1.stree.txt
  77336. index d789af3ce5d..6b15f8da58d 100644
  77337. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesOddlySpacedTagHelperTagBlocks1.stree.txt
  77338. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesOddlySpacedTagHelperTagBlocks1.stree.txt
  77339. @@ -1,23 +1,66 @@
  77340. -Markup block - Gen<None> - 66 - (0:0,0)
  77341. - Tag block - Gen<TagHelper> - 66 - (0:0,0) - p - ptaghelper
  77342. - StartTagAndEndTag - <p class=" foo" style=" color : red ; " > ... </p>
  77343. - class - DoubleQuotes
  77344. - Markup span - Gen<Markup> - [ foo] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:2
  77345. - SyntaxKind.Whitespace;[ ];
  77346. - SyntaxKind.Text;[foo];
  77347. - style - DoubleQuotes
  77348. - Markup block - Gen<None> - 21 - (35:0,35)
  77349. - Markup span - Gen<Markup> - [ color] - SpanEditHandler;Accepts:Any - (35:0,35) - Tokens:2
  77350. - SyntaxKind.Whitespace;[ ];
  77351. - SyntaxKind.Text;[color];
  77352. - Markup span - Gen<Markup> - [ :] - SpanEditHandler;Accepts:Any - (43:0,43) - Tokens:2
  77353. - SyntaxKind.Whitespace;[ ];
  77354. - SyntaxKind.Text;[:];
  77355. - Markup span - Gen<Markup> - [ red] - SpanEditHandler;Accepts:Any - (45:0,45) - Tokens:2
  77356. - SyntaxKind.Whitespace;[ ];
  77357. - SyntaxKind.Text;[red];
  77358. - Markup span - Gen<Markup> - [ ;] - SpanEditHandler;Accepts:Any - (50:0,50) - Tokens:2
  77359. - SyntaxKind.Whitespace;[ ];
  77360. - SyntaxKind.Text;[;];
  77361. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (53:0,53) - Tokens:1
  77362. - SyntaxKind.Whitespace;[ ];
  77363. +RazorDocument - [0..66)::66 - [<p class=" foo" style=" color : red ; " ></p>]
  77364. + MarkupBlock - [0..66)::66
  77365. + MarkupTagHelperElement - [0..66)::66 - p[StartTagAndEndTag] - ptaghelper
  77366. + MarkupTagHelperStartTag - [0..62)::62
  77367. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77368. + OpenAngle;[<];
  77369. + Text;[p];
  77370. + MarkupTagHelperAttribute - [2..24)::22 - class - DoubleQuotes - Unbound - [ class=" foo"]
  77371. + MarkupTextLiteral - [2..8)::6 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77372. + Whitespace;[ ];
  77373. + MarkupTextLiteral - [8..13)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77374. + Text;[class];
  77375. + Equals;[=];
  77376. + MarkupTextLiteral - [14..15)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  77377. + DoubleQuote;["];
  77378. + MarkupTagHelperAttributeValue - [15..23)::8
  77379. + MarkupLiteralAttributeValue - [15..23)::8 - [ foo]
  77380. + MarkupTextLiteral - [15..20)::5 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77381. + Whitespace;[ ];
  77382. + MarkupTextLiteral - [20..23)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77383. + Text;[foo];
  77384. + MarkupTextLiteral - [23..24)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  77385. + DoubleQuote;["];
  77386. + MarkupTagHelperAttribute - [24..57)::33 - style - DoubleQuotes - Unbound - [ style=" color : red ; "]
  77387. + MarkupTextLiteral - [24..28)::4 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77388. + Whitespace;[ ];
  77389. + MarkupTextLiteral - [28..33)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77390. + Text;[style];
  77391. + Equals;[=];
  77392. + MarkupTextLiteral - [34..35)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  77393. + DoubleQuote;["];
  77394. + MarkupTagHelperAttributeValue - [35..56)::21
  77395. + MarkupLiteralAttributeValue - [35..43)::8 - [ color]
  77396. + MarkupTextLiteral - [35..38)::3 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77397. + Whitespace;[ ];
  77398. + MarkupTextLiteral - [38..43)::5 - [color] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77399. + Text;[color];
  77400. + MarkupLiteralAttributeValue - [43..45)::2 - [ :]
  77401. + MarkupTextLiteral - [43..44)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77402. + Whitespace;[ ];
  77403. + MarkupTextLiteral - [44..45)::1 - [:] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77404. + Text;[:];
  77405. + MarkupLiteralAttributeValue - [45..50)::5 - [ red]
  77406. + MarkupTextLiteral - [45..47)::2 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77407. + Whitespace;[ ];
  77408. + MarkupTextLiteral - [47..50)::3 - [red] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77409. + Text;[red];
  77410. + MarkupLiteralAttributeValue - [50..53)::3 - [ ;]
  77411. + MarkupTextLiteral - [50..52)::2 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77412. + Whitespace;[ ];
  77413. + MarkupTextLiteral - [52..53)::1 - [;] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77414. + Text;[;];
  77415. + MarkupLiteralAttributeValue - [53..56)::3 - [ ]
  77416. + MarkupTextLiteral - [53..56)::3 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77417. + Whitespace;[ ];
  77418. + MarkupTextLiteral - [56..57)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  77419. + DoubleQuote;["];
  77420. + MarkupTextLiteral - [57..62)::5 - [ >] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77421. + Whitespace;[ ];
  77422. + CloseAngle;[>];
  77423. + MarkupTagHelperEndTag - [62..66)::4
  77424. + MarkupTextLiteral - [62..66)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77425. + OpenAngle;[<];
  77426. + ForwardSlash;[/];
  77427. + Text;[p];
  77428. + CloseAngle;[>];
  77429. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesOddlySpacedTagHelperTagBlocks2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesOddlySpacedTagHelperTagBlocks2.stree.txt
  77430. index 081b464a5d1..6faa9a45823 100644
  77431. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesOddlySpacedTagHelperTagBlocks2.stree.txt
  77432. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesOddlySpacedTagHelperTagBlocks2.stree.txt
  77433. @@ -1,28 +1,70 @@
  77434. -Markup block - Gen<None> - 77 - (0:0,0)
  77435. - Tag block - Gen<TagHelper> - 77 - (0:0,0) - p - ptaghelper
  77436. - StartTagAndEndTag - <p class=" foo" style=" color : red ; " > ... </p>
  77437. - class - DoubleQuotes
  77438. - Markup span - Gen<Markup> - [ foo] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:2
  77439. - SyntaxKind.Whitespace;[ ];
  77440. - SyntaxKind.Text;[foo];
  77441. - style - DoubleQuotes
  77442. - Markup block - Gen<None> - 21 - (35:0,35)
  77443. - Markup span - Gen<Markup> - [ color] - SpanEditHandler;Accepts:Any - (35:0,35) - Tokens:2
  77444. - SyntaxKind.Whitespace;[ ];
  77445. - SyntaxKind.Text;[color];
  77446. - Markup span - Gen<Markup> - [ :] - SpanEditHandler;Accepts:Any - (43:0,43) - Tokens:2
  77447. - SyntaxKind.Whitespace;[ ];
  77448. - SyntaxKind.Text;[:];
  77449. - Markup span - Gen<Markup> - [ red] - SpanEditHandler;Accepts:Any - (45:0,45) - Tokens:2
  77450. - SyntaxKind.Whitespace;[ ];
  77451. - SyntaxKind.Text;[red];
  77452. - Markup span - Gen<Markup> - [ ;] - SpanEditHandler;Accepts:Any - (50:0,50) - Tokens:2
  77453. - SyntaxKind.Whitespace;[ ];
  77454. - SyntaxKind.Text;[;];
  77455. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (53:0,53) - Tokens:1
  77456. - SyntaxKind.Whitespace;[ ];
  77457. - SyntaxKind.HtmlTextLiteral - [Hello World] - [62..73) - FullWidth: 11 - Slots: 1
  77458. - SyntaxKind.List - [Hello World] - [62..73) - FullWidth: 11 - Slots: 3
  77459. - SyntaxKind.Text;[Hello];
  77460. - SyntaxKind.Whitespace;[ ];
  77461. - SyntaxKind.Text;[World];
  77462. +RazorDocument - [0..77)::77 - [<p class=" foo" style=" color : red ; " >Hello World</p>]
  77463. + MarkupBlock - [0..77)::77
  77464. + MarkupTagHelperElement - [0..77)::77 - p[StartTagAndEndTag] - ptaghelper
  77465. + MarkupTagHelperStartTag - [0..62)::62
  77466. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77467. + OpenAngle;[<];
  77468. + Text;[p];
  77469. + MarkupTagHelperAttribute - [2..24)::22 - class - DoubleQuotes - Unbound - [ class=" foo"]
  77470. + MarkupTextLiteral - [2..8)::6 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77471. + Whitespace;[ ];
  77472. + MarkupTextLiteral - [8..13)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77473. + Text;[class];
  77474. + Equals;[=];
  77475. + MarkupTextLiteral - [14..15)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  77476. + DoubleQuote;["];
  77477. + MarkupTagHelperAttributeValue - [15..23)::8
  77478. + MarkupLiteralAttributeValue - [15..23)::8 - [ foo]
  77479. + MarkupTextLiteral - [15..20)::5 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77480. + Whitespace;[ ];
  77481. + MarkupTextLiteral - [20..23)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77482. + Text;[foo];
  77483. + MarkupTextLiteral - [23..24)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  77484. + DoubleQuote;["];
  77485. + MarkupTagHelperAttribute - [24..57)::33 - style - DoubleQuotes - Unbound - [ style=" color : red ; "]
  77486. + MarkupTextLiteral - [24..28)::4 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77487. + Whitespace;[ ];
  77488. + MarkupTextLiteral - [28..33)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77489. + Text;[style];
  77490. + Equals;[=];
  77491. + MarkupTextLiteral - [34..35)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  77492. + DoubleQuote;["];
  77493. + MarkupTagHelperAttributeValue - [35..56)::21
  77494. + MarkupLiteralAttributeValue - [35..43)::8 - [ color]
  77495. + MarkupTextLiteral - [35..38)::3 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77496. + Whitespace;[ ];
  77497. + MarkupTextLiteral - [38..43)::5 - [color] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77498. + Text;[color];
  77499. + MarkupLiteralAttributeValue - [43..45)::2 - [ :]
  77500. + MarkupTextLiteral - [43..44)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77501. + Whitespace;[ ];
  77502. + MarkupTextLiteral - [44..45)::1 - [:] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77503. + Text;[:];
  77504. + MarkupLiteralAttributeValue - [45..50)::5 - [ red]
  77505. + MarkupTextLiteral - [45..47)::2 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77506. + Whitespace;[ ];
  77507. + MarkupTextLiteral - [47..50)::3 - [red] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77508. + Text;[red];
  77509. + MarkupLiteralAttributeValue - [50..53)::3 - [ ;]
  77510. + MarkupTextLiteral - [50..52)::2 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77511. + Whitespace;[ ];
  77512. + MarkupTextLiteral - [52..53)::1 - [;] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77513. + Text;[;];
  77514. + MarkupLiteralAttributeValue - [53..56)::3 - [ ]
  77515. + MarkupTextLiteral - [53..56)::3 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77516. + Whitespace;[ ];
  77517. + MarkupTextLiteral - [56..57)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  77518. + DoubleQuote;["];
  77519. + MarkupTextLiteral - [57..62)::5 - [ >] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77520. + Whitespace;[ ];
  77521. + CloseAngle;[>];
  77522. + MarkupTextLiteral - [62..73)::11 - [Hello World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77523. + Text;[Hello];
  77524. + Whitespace;[ ];
  77525. + Text;[World];
  77526. + MarkupTagHelperEndTag - [73..77)::4
  77527. + MarkupTextLiteral - [73..77)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77528. + OpenAngle;[<];
  77529. + ForwardSlash;[/];
  77530. + Text;[p];
  77531. + CloseAngle;[>];
  77532. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesOddlySpacedTagHelperTagBlocks3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesOddlySpacedTagHelperTagBlocks3.stree.txt
  77533. index 34ec32f3883..9e987e23adc 100644
  77534. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesOddlySpacedTagHelperTagBlocks3.stree.txt
  77535. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesOddlySpacedTagHelperTagBlocks3.stree.txt
  77536. @@ -1,25 +1,74 @@
  77537. -Markup block - Gen<None> - 73 - (0:0,0)
  77538. - Tag block - Gen<TagHelper> - 34 - (0:0,0) - p - ptaghelper
  77539. - StartTagAndEndTag - <p class=" foo " > ... </p>
  77540. - class - DoubleQuotes
  77541. - Markup block - Gen<None> - 8 - (14:0,14)
  77542. - Markup span - Gen<Markup> - [ foo] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:2
  77543. - SyntaxKind.Whitespace;[ ];
  77544. - SyntaxKind.Text;[foo];
  77545. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:1
  77546. - SyntaxKind.Whitespace;[ ];
  77547. - SyntaxKind.HtmlTextLiteral - [Hello] - [25..30) - FullWidth: 5 - Slots: 1
  77548. - SyntaxKind.Text;[Hello];
  77549. - SyntaxKind.HtmlTextLiteral - [ ] - [34..35) - FullWidth: 1 - Slots: 1
  77550. - SyntaxKind.Whitespace;[ ];
  77551. - Tag block - Gen<TagHelper> - 38 - (35:0,35) - p - ptaghelper
  77552. - StartTagAndEndTag - <p style=" color:red; " > ... </p>
  77553. - style - DoubleQuotes
  77554. - Markup block - Gen<None> - 13 - (48:0,48)
  77555. - Markup span - Gen<Markup> - [ color:red;] - SpanEditHandler;Accepts:Any - (48:0,48) - Tokens:2
  77556. - SyntaxKind.Whitespace;[ ];
  77557. - SyntaxKind.Text;[color:red;];
  77558. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Any - (60:0,60) - Tokens:1
  77559. - SyntaxKind.Whitespace;[ ];
  77560. - SyntaxKind.HtmlTextLiteral - [World] - [64..69) - FullWidth: 5 - Slots: 1
  77561. - SyntaxKind.Text;[World];
  77562. +RazorDocument - [0..73)::73 - [<p class=" foo " >Hello</p> <p style=" color:red; " >World</p>]
  77563. + MarkupBlock - [0..73)::73
  77564. + MarkupTagHelperElement - [0..34)::34 - p[StartTagAndEndTag] - ptaghelper
  77565. + MarkupTagHelperStartTag - [0..25)::25
  77566. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77567. + OpenAngle;[<];
  77568. + Text;[p];
  77569. + MarkupTagHelperAttribute - [2..23)::21 - class - DoubleQuotes - Unbound - [ class=" foo "]
  77570. + MarkupTextLiteral - [2..7)::5 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77571. + Whitespace;[ ];
  77572. + MarkupTextLiteral - [7..12)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77573. + Text;[class];
  77574. + Equals;[=];
  77575. + MarkupTextLiteral - [13..14)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  77576. + DoubleQuote;["];
  77577. + MarkupTagHelperAttributeValue - [14..22)::8
  77578. + MarkupLiteralAttributeValue - [14..20)::6 - [ foo]
  77579. + MarkupTextLiteral - [14..17)::3 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77580. + Whitespace;[ ];
  77581. + MarkupTextLiteral - [17..20)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77582. + Text;[foo];
  77583. + MarkupLiteralAttributeValue - [20..22)::2 - [ ]
  77584. + MarkupTextLiteral - [20..22)::2 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77585. + Whitespace;[ ];
  77586. + MarkupTextLiteral - [22..23)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  77587. + DoubleQuote;["];
  77588. + MarkupTextLiteral - [23..25)::2 - [ >] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77589. + Whitespace;[ ];
  77590. + CloseAngle;[>];
  77591. + MarkupTextLiteral - [25..30)::5 - [Hello] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77592. + Text;[Hello];
  77593. + MarkupTagHelperEndTag - [30..34)::4
  77594. + MarkupTextLiteral - [30..34)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77595. + OpenAngle;[<];
  77596. + ForwardSlash;[/];
  77597. + Text;[p];
  77598. + CloseAngle;[>];
  77599. + MarkupTextLiteral - [34..35)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77600. + Whitespace;[ ];
  77601. + MarkupTagHelperElement - [35..73)::38 - p[StartTagAndEndTag] - ptaghelper
  77602. + MarkupTagHelperStartTag - [35..64)::29
  77603. + MarkupTextLiteral - [35..37)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77604. + OpenAngle;[<];
  77605. + Text;[p];
  77606. + MarkupTagHelperAttribute - [37..62)::25 - style - DoubleQuotes - Unbound - [ style=" color:red; "]
  77607. + MarkupTextLiteral - [37..41)::4 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77608. + Whitespace;[ ];
  77609. + MarkupTextLiteral - [41..46)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77610. + Text;[style];
  77611. + Equals;[=];
  77612. + MarkupTextLiteral - [47..48)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  77613. + DoubleQuote;["];
  77614. + MarkupTagHelperAttributeValue - [48..61)::13
  77615. + MarkupLiteralAttributeValue - [48..60)::12 - [ color:red;]
  77616. + MarkupTextLiteral - [48..50)::2 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77617. + Whitespace;[ ];
  77618. + MarkupTextLiteral - [50..60)::10 - [color:red;] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77619. + Text;[color:red;];
  77620. + MarkupLiteralAttributeValue - [60..61)::1 - [ ]
  77621. + MarkupTextLiteral - [60..61)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77622. + Whitespace;[ ];
  77623. + MarkupTextLiteral - [61..62)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  77624. + DoubleQuote;["];
  77625. + MarkupTextLiteral - [62..64)::2 - [ >] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77626. + Whitespace;[ ];
  77627. + CloseAngle;[>];
  77628. + MarkupTextLiteral - [64..69)::5 - [World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77629. + Text;[World];
  77630. + MarkupTagHelperEndTag - [69..73)::4
  77631. + MarkupTextLiteral - [69..73)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77632. + OpenAngle;[<];
  77633. + ForwardSlash;[/];
  77634. + Text;[p];
  77635. + CloseAngle;[>];
  77636. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesPlainTagHelperTagBlocks1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesPlainTagHelperTagBlocks1.stree.txt
  77637. index 6e1b6c4d218..486c8312a72 100644
  77638. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesPlainTagHelperTagBlocks1.stree.txt
  77639. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesPlainTagHelperTagBlocks1.stree.txt
  77640. @@ -1,3 +1,14 @@
  77641. -Markup block - Gen<None> - 7 - (0:0,0)
  77642. - Tag block - Gen<TagHelper> - 7 - (0:0,0) - p - ptaghelper
  77643. - StartTagAndEndTag - <p> ... </p>
  77644. +RazorDocument - [0..7)::7 - [<p></p>]
  77645. + MarkupBlock - [0..7)::7
  77646. + MarkupTagHelperElement - [0..7)::7 - p[StartTagAndEndTag] - ptaghelper
  77647. + MarkupTagHelperStartTag - [0..3)::3
  77648. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77649. + OpenAngle;[<];
  77650. + Text;[p];
  77651. + CloseAngle;[>];
  77652. + MarkupTagHelperEndTag - [3..7)::4
  77653. + MarkupTextLiteral - [3..7)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77654. + OpenAngle;[<];
  77655. + ForwardSlash;[/];
  77656. + Text;[p];
  77657. + CloseAngle;[>];
  77658. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesPlainTagHelperTagBlocks2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesPlainTagHelperTagBlocks2.stree.txt
  77659. index 02a4e73afc9..0700f899e9e 100644
  77660. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesPlainTagHelperTagBlocks2.stree.txt
  77661. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesPlainTagHelperTagBlocks2.stree.txt
  77662. @@ -1,8 +1,18 @@
  77663. -Markup block - Gen<None> - 18 - (0:0,0)
  77664. - Tag block - Gen<TagHelper> - 18 - (0:0,0) - p - ptaghelper
  77665. - StartTagAndEndTag - <p> ... </p>
  77666. - SyntaxKind.HtmlTextLiteral - [Hello World] - [3..14) - FullWidth: 11 - Slots: 1
  77667. - SyntaxKind.List - [Hello World] - [3..14) - FullWidth: 11 - Slots: 3
  77668. - SyntaxKind.Text;[Hello];
  77669. - SyntaxKind.Whitespace;[ ];
  77670. - SyntaxKind.Text;[World];
  77671. +RazorDocument - [0..18)::18 - [<p>Hello World</p>]
  77672. + MarkupBlock - [0..18)::18
  77673. + MarkupTagHelperElement - [0..18)::18 - p[StartTagAndEndTag] - ptaghelper
  77674. + MarkupTagHelperStartTag - [0..3)::3
  77675. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77676. + OpenAngle;[<];
  77677. + Text;[p];
  77678. + CloseAngle;[>];
  77679. + MarkupTextLiteral - [3..14)::11 - [Hello World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77680. + Text;[Hello];
  77681. + Whitespace;[ ];
  77682. + Text;[World];
  77683. + MarkupTagHelperEndTag - [14..18)::4
  77684. + MarkupTextLiteral - [14..18)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77685. + OpenAngle;[<];
  77686. + ForwardSlash;[/];
  77687. + Text;[p];
  77688. + CloseAngle;[>];
  77689. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesPlainTagHelperTagBlocks3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesPlainTagHelperTagBlocks3.stree.txt
  77690. index 617df53e369..7bad5ee3725 100644
  77691. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesPlainTagHelperTagBlocks3.stree.txt
  77692. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesPlainTagHelperTagBlocks3.stree.txt
  77693. @@ -1,11 +1,32 @@
  77694. -Markup block - Gen<None> - 25 - (0:0,0)
  77695. - Tag block - Gen<TagHelper> - 12 - (0:0,0) - p - ptaghelper
  77696. - StartTagAndEndTag - <p> ... </p>
  77697. - SyntaxKind.HtmlTextLiteral - [Hello] - [3..8) - FullWidth: 5 - Slots: 1
  77698. - SyntaxKind.Text;[Hello];
  77699. - SyntaxKind.HtmlTextLiteral - [ ] - [12..13) - FullWidth: 1 - Slots: 1
  77700. - SyntaxKind.Whitespace;[ ];
  77701. - Tag block - Gen<TagHelper> - 12 - (13:0,13) - p - ptaghelper
  77702. - StartTagAndEndTag - <p> ... </p>
  77703. - SyntaxKind.HtmlTextLiteral - [World] - [16..21) - FullWidth: 5 - Slots: 1
  77704. - SyntaxKind.Text;[World];
  77705. +RazorDocument - [0..25)::25 - [<p>Hello</p> <p>World</p>]
  77706. + MarkupBlock - [0..25)::25
  77707. + MarkupTagHelperElement - [0..12)::12 - p[StartTagAndEndTag] - ptaghelper
  77708. + MarkupTagHelperStartTag - [0..3)::3
  77709. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77710. + OpenAngle;[<];
  77711. + Text;[p];
  77712. + CloseAngle;[>];
  77713. + MarkupTextLiteral - [3..8)::5 - [Hello] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77714. + Text;[Hello];
  77715. + MarkupTagHelperEndTag - [8..12)::4
  77716. + MarkupTextLiteral - [8..12)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77717. + OpenAngle;[<];
  77718. + ForwardSlash;[/];
  77719. + Text;[p];
  77720. + CloseAngle;[>];
  77721. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77722. + Whitespace;[ ];
  77723. + MarkupTagHelperElement - [13..25)::12 - p[StartTagAndEndTag] - ptaghelper
  77724. + MarkupTagHelperStartTag - [13..16)::3
  77725. + MarkupTextLiteral - [13..16)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77726. + OpenAngle;[<];
  77727. + Text;[p];
  77728. + CloseAngle;[>];
  77729. + MarkupTextLiteral - [16..21)::5 - [World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77730. + Text;[World];
  77731. + MarkupTagHelperEndTag - [21..25)::4
  77732. + MarkupTextLiteral - [21..25)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77733. + OpenAngle;[<];
  77734. + ForwardSlash;[/];
  77735. + Text;[p];
  77736. + CloseAngle;[>];
  77737. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesPlainTagHelperTagBlocks4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesPlainTagHelperTagBlocks4.stree.txt
  77738. index 3305990936a..4851c15aa5a 100644
  77739. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesPlainTagHelperTagBlocks4.stree.txt
  77740. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesPlainTagHelperTagBlocks4.stree.txt
  77741. @@ -1,29 +1,38 @@
  77742. -Markup block - Gen<None> - 56 - (0:0,0)
  77743. - Tag block - Gen<TagHelper> - 56 - (0:0,0) - p - ptaghelper
  77744. - StartTagAndEndTag - <p> ... </p>
  77745. - SyntaxKind.HtmlTextLiteral - [Hello World ] - [3..15) - FullWidth: 12 - Slots: 1
  77746. - SyntaxKind.List - [Hello World ] - [3..15) - FullWidth: 12 - Slots: 4
  77747. - SyntaxKind.Text;[Hello];
  77748. - SyntaxKind.Whitespace;[ ];
  77749. - SyntaxKind.Text;[World];
  77750. - SyntaxKind.Whitespace;[ ];
  77751. - Tag block - Gen<None> - 8 - (15:0,15)
  77752. - Markup span - Gen<Markup> - [<strong>] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:3
  77753. - SyntaxKind.OpenAngle;[<];
  77754. - SyntaxKind.Text;[strong];
  77755. - SyntaxKind.CloseAngle;[>];
  77756. - SyntaxKind.HtmlTextLiteral - [inside of strong tag] - [23..43) - FullWidth: 20 - Slots: 1
  77757. - SyntaxKind.List - [inside of strong tag] - [23..43) - FullWidth: 20 - Slots: 7
  77758. - SyntaxKind.Text;[inside];
  77759. - SyntaxKind.Whitespace;[ ];
  77760. - SyntaxKind.Text;[of];
  77761. - SyntaxKind.Whitespace;[ ];
  77762. - SyntaxKind.Text;[strong];
  77763. - SyntaxKind.Whitespace;[ ];
  77764. - SyntaxKind.Text;[tag];
  77765. - Tag block - Gen<None> - 9 - (43:0,43)
  77766. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (43:0,43) - Tokens:4
  77767. - SyntaxKind.OpenAngle;[<];
  77768. - SyntaxKind.ForwardSlash;[/];
  77769. - SyntaxKind.Text;[strong];
  77770. - SyntaxKind.CloseAngle;[>];
  77771. +RazorDocument - [0..56)::56 - [<p>Hello World <strong>inside of strong tag</strong></p>]
  77772. + MarkupBlock - [0..56)::56
  77773. + MarkupTagHelperElement - [0..56)::56 - p[StartTagAndEndTag] - ptaghelper
  77774. + MarkupTagHelperStartTag - [0..3)::3
  77775. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77776. + OpenAngle;[<];
  77777. + Text;[p];
  77778. + CloseAngle;[>];
  77779. + MarkupTextLiteral - [3..15)::12 - [Hello World ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77780. + Text;[Hello];
  77781. + Whitespace;[ ];
  77782. + Text;[World];
  77783. + Whitespace;[ ];
  77784. + MarkupTagBlock - [15..23)::8 - [<strong>]
  77785. + MarkupTextLiteral - [15..23)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77786. + OpenAngle;[<];
  77787. + Text;[strong];
  77788. + CloseAngle;[>];
  77789. + MarkupTextLiteral - [23..43)::20 - [inside of strong tag] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77790. + Text;[inside];
  77791. + Whitespace;[ ];
  77792. + Text;[of];
  77793. + Whitespace;[ ];
  77794. + Text;[strong];
  77795. + Whitespace;[ ];
  77796. + Text;[tag];
  77797. + MarkupTagBlock - [43..52)::9 - [</strong>]
  77798. + MarkupTextLiteral - [43..52)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77799. + OpenAngle;[<];
  77800. + ForwardSlash;[/];
  77801. + Text;[strong];
  77802. + CloseAngle;[>];
  77803. + MarkupTagHelperEndTag - [52..56)::4
  77804. + MarkupTextLiteral - [52..56)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77805. + OpenAngle;[<];
  77806. + ForwardSlash;[/];
  77807. + Text;[p];
  77808. + CloseAngle;[>];
  77809. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers1.stree.txt
  77810. index d3fd3fe63ef..3def95a5798 100644
  77811. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers1.stree.txt
  77812. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers1.stree.txt
  77813. @@ -1,11 +1,22 @@
  77814. -Markup block - Gen<None> - 31 - (0:0,0)
  77815. - Tag block - Gen<TagHelper> - 31 - (0:0,0) - script - scripttaghelper
  77816. - StartTagAndEndTag - <script> ... </script>
  77817. - Markup span - Gen<Markup> - [<script></foo>] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:7
  77818. - SyntaxKind.OpenAngle;[<];
  77819. - SyntaxKind.Text;[script];
  77820. - SyntaxKind.CloseAngle;[>];
  77821. - SyntaxKind.OpenAngle;[<];
  77822. - SyntaxKind.ForwardSlash;[/];
  77823. - SyntaxKind.Text;[foo];
  77824. - SyntaxKind.CloseAngle;[>];
  77825. +RazorDocument - [0..31)::31 - [<script><script></foo></script>]
  77826. + MarkupBlock - [0..31)::31
  77827. + MarkupTagHelperElement - [0..31)::31 - script[StartTagAndEndTag] - scripttaghelper
  77828. + MarkupTagHelperStartTag - [0..8)::8
  77829. + MarkupTextLiteral - [0..8)::8 - [<script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77830. + OpenAngle;[<];
  77831. + Text;[script];
  77832. + CloseAngle;[>];
  77833. + MarkupTextLiteral - [8..22)::14 - [<script></foo>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77834. + OpenAngle;[<];
  77835. + Text;[script];
  77836. + CloseAngle;[>];
  77837. + OpenAngle;[<];
  77838. + ForwardSlash;[/];
  77839. + Text;[foo];
  77840. + CloseAngle;[>];
  77841. + MarkupTagHelperEndTag - [22..31)::9
  77842. + MarkupTextLiteral - [22..31)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77843. + OpenAngle;[<];
  77844. + ForwardSlash;[/];
  77845. + Text;[script];
  77846. + CloseAngle;[>];
  77847. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers2.stree.txt
  77848. index a6190d64fd2..22c1ec86379 100644
  77849. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers2.stree.txt
  77850. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers2.stree.txt
  77851. @@ -1,15 +1,26 @@
  77852. -Markup block - Gen<None> - 40 - (0:0,0)
  77853. - Tag block - Gen<TagHelper> - 40 - (0:0,0) - script - scripttaghelper
  77854. - StartTagAndEndTag - <script> ... </script>
  77855. - Markup span - Gen<Markup> - [Hello World <div></div>] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:11
  77856. - SyntaxKind.Text;[Hello];
  77857. - SyntaxKind.Whitespace;[ ];
  77858. - SyntaxKind.Text;[World];
  77859. - SyntaxKind.Whitespace;[ ];
  77860. - SyntaxKind.OpenAngle;[<];
  77861. - SyntaxKind.Text;[div];
  77862. - SyntaxKind.CloseAngle;[>];
  77863. - SyntaxKind.OpenAngle;[<];
  77864. - SyntaxKind.ForwardSlash;[/];
  77865. - SyntaxKind.Text;[div];
  77866. - SyntaxKind.CloseAngle;[>];
  77867. +RazorDocument - [0..40)::40 - [<script>Hello World <div></div></script>]
  77868. + MarkupBlock - [0..40)::40
  77869. + MarkupTagHelperElement - [0..40)::40 - script[StartTagAndEndTag] - scripttaghelper
  77870. + MarkupTagHelperStartTag - [0..8)::8
  77871. + MarkupTextLiteral - [0..8)::8 - [<script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77872. + OpenAngle;[<];
  77873. + Text;[script];
  77874. + CloseAngle;[>];
  77875. + MarkupTextLiteral - [8..31)::23 - [Hello World <div></div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77876. + Text;[Hello];
  77877. + Whitespace;[ ];
  77878. + Text;[World];
  77879. + Whitespace;[ ];
  77880. + OpenAngle;[<];
  77881. + Text;[div];
  77882. + CloseAngle;[>];
  77883. + OpenAngle;[<];
  77884. + ForwardSlash;[/];
  77885. + Text;[div];
  77886. + CloseAngle;[>];
  77887. + MarkupTagHelperEndTag - [31..40)::9
  77888. + MarkupTextLiteral - [31..40)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77889. + OpenAngle;[<];
  77890. + ForwardSlash;[/];
  77891. + Text;[script];
  77892. + CloseAngle;[>];
  77893. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers3.stree.txt
  77894. index 79c78b59987..0eac8b8ea75 100644
  77895. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers3.stree.txt
  77896. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers3.stree.txt
  77897. @@ -1,21 +1,52 @@
  77898. -Markup block - Gen<None> - 53 - (0:0,0)
  77899. - Tag block - Gen<TagHelper> - 29 - (0:0,0) - script - scripttaghelper
  77900. - StartTagAndEndTag - <script> ... </script>
  77901. - Markup span - Gen<Markup> - [Hel<p>lo</p>] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:9
  77902. - SyntaxKind.Text;[Hel];
  77903. - SyntaxKind.OpenAngle;[<];
  77904. - SyntaxKind.Text;[p];
  77905. - SyntaxKind.CloseAngle;[>];
  77906. - SyntaxKind.Text;[lo];
  77907. - SyntaxKind.OpenAngle;[<];
  77908. - SyntaxKind.ForwardSlash;[/];
  77909. - SyntaxKind.Text;[p];
  77910. - SyntaxKind.CloseAngle;[>];
  77911. - SyntaxKind.HtmlTextLiteral - [ ] - [29..30) - FullWidth: 1 - Slots: 1
  77912. - SyntaxKind.Whitespace;[ ];
  77913. - Tag block - Gen<TagHelper> - 23 - (30:0,30) - p - ptaghelper
  77914. - StartTagAndEndTag - <p> ... </p>
  77915. - Tag block - Gen<TagHelper> - 16 - (33:0,33) - div - divtaghelper
  77916. - StartTagAndEndTag - <div> ... </div>
  77917. - SyntaxKind.HtmlTextLiteral - [World] - [38..43) - FullWidth: 5 - Slots: 1
  77918. - SyntaxKind.Text;[World];
  77919. +RazorDocument - [0..53)::53 - [<script>Hel<p>lo</p></script> <p><div>World</div></p>]
  77920. + MarkupBlock - [0..53)::53
  77921. + MarkupTagHelperElement - [0..29)::29 - script[StartTagAndEndTag] - scripttaghelper
  77922. + MarkupTagHelperStartTag - [0..8)::8
  77923. + MarkupTextLiteral - [0..8)::8 - [<script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77924. + OpenAngle;[<];
  77925. + Text;[script];
  77926. + CloseAngle;[>];
  77927. + MarkupTextLiteral - [8..20)::12 - [Hel<p>lo</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77928. + Text;[Hel];
  77929. + OpenAngle;[<];
  77930. + Text;[p];
  77931. + CloseAngle;[>];
  77932. + Text;[lo];
  77933. + OpenAngle;[<];
  77934. + ForwardSlash;[/];
  77935. + Text;[p];
  77936. + CloseAngle;[>];
  77937. + MarkupTagHelperEndTag - [20..29)::9
  77938. + MarkupTextLiteral - [20..29)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77939. + OpenAngle;[<];
  77940. + ForwardSlash;[/];
  77941. + Text;[script];
  77942. + CloseAngle;[>];
  77943. + MarkupTextLiteral - [29..30)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77944. + Whitespace;[ ];
  77945. + MarkupTagHelperElement - [30..53)::23 - p[StartTagAndEndTag] - ptaghelper
  77946. + MarkupTagHelperStartTag - [30..33)::3
  77947. + MarkupTextLiteral - [30..33)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77948. + OpenAngle;[<];
  77949. + Text;[p];
  77950. + CloseAngle;[>];
  77951. + MarkupTagHelperElement - [33..49)::16 - div[StartTagAndEndTag] - divtaghelper
  77952. + MarkupTagHelperStartTag - [33..38)::5
  77953. + MarkupTextLiteral - [33..38)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77954. + OpenAngle;[<];
  77955. + Text;[div];
  77956. + CloseAngle;[>];
  77957. + MarkupTextLiteral - [38..43)::5 - [World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77958. + Text;[World];
  77959. + MarkupTagHelperEndTag - [43..49)::6
  77960. + MarkupTextLiteral - [43..49)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77961. + OpenAngle;[<];
  77962. + ForwardSlash;[/];
  77963. + Text;[div];
  77964. + CloseAngle;[>];
  77965. + MarkupTagHelperEndTag - [49..53)::4
  77966. + MarkupTextLiteral - [49..53)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  77967. + OpenAngle;[<];
  77968. + ForwardSlash;[/];
  77969. + Text;[p];
  77970. + CloseAngle;[>];
  77971. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers4.stree.txt
  77972. index 7e9a9d56526..71cb1a852b5 100644
  77973. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers4.stree.txt
  77974. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers4.stree.txt
  77975. @@ -1,26 +1,47 @@
  77976. -Markup block - Gen<None> - 75 - (0:0,0)
  77977. - Tag block - Gen<TagHelper> - 39 - (0:0,0) - script - scripttaghelper
  77978. - StartTagAndEndTag - <script> ... </script>
  77979. - Markup span - Gen<Markup> - [Hel<strong>lo</strong>] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:9
  77980. - SyntaxKind.Text;[Hel];
  77981. - SyntaxKind.OpenAngle;[<];
  77982. - SyntaxKind.Text;[strong];
  77983. - SyntaxKind.CloseAngle;[>];
  77984. - SyntaxKind.Text;[lo];
  77985. - SyntaxKind.OpenAngle;[<];
  77986. - SyntaxKind.ForwardSlash;[/];
  77987. - SyntaxKind.Text;[strong];
  77988. - SyntaxKind.CloseAngle;[>];
  77989. - SyntaxKind.HtmlTextLiteral - [ ] - [39..40) - FullWidth: 1 - Slots: 1
  77990. - SyntaxKind.Whitespace;[ ];
  77991. - Tag block - Gen<TagHelper> - 35 - (40:0,40) - script - scripttaghelper
  77992. - StartTagAndEndTag - <script> ... </script>
  77993. - Markup span - Gen<Markup> - [<span>World</span>] - SpanEditHandler;Accepts:Any - (48:0,48) - Tokens:8
  77994. - SyntaxKind.OpenAngle;[<];
  77995. - SyntaxKind.Text;[span];
  77996. - SyntaxKind.CloseAngle;[>];
  77997. - SyntaxKind.Text;[World];
  77998. - SyntaxKind.OpenAngle;[<];
  77999. - SyntaxKind.ForwardSlash;[/];
  78000. - SyntaxKind.Text;[span];
  78001. - SyntaxKind.CloseAngle;[>];
  78002. +RazorDocument - [0..75)::75 - [<script>Hel<strong>lo</strong></script> <script><span>World</span></script>]
  78003. + MarkupBlock - [0..75)::75
  78004. + MarkupTagHelperElement - [0..39)::39 - script[StartTagAndEndTag] - scripttaghelper
  78005. + MarkupTagHelperStartTag - [0..8)::8
  78006. + MarkupTextLiteral - [0..8)::8 - [<script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78007. + OpenAngle;[<];
  78008. + Text;[script];
  78009. + CloseAngle;[>];
  78010. + MarkupTextLiteral - [8..30)::22 - [Hel<strong>lo</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78011. + Text;[Hel];
  78012. + OpenAngle;[<];
  78013. + Text;[strong];
  78014. + CloseAngle;[>];
  78015. + Text;[lo];
  78016. + OpenAngle;[<];
  78017. + ForwardSlash;[/];
  78018. + Text;[strong];
  78019. + CloseAngle;[>];
  78020. + MarkupTagHelperEndTag - [30..39)::9
  78021. + MarkupTextLiteral - [30..39)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78022. + OpenAngle;[<];
  78023. + ForwardSlash;[/];
  78024. + Text;[script];
  78025. + CloseAngle;[>];
  78026. + MarkupTextLiteral - [39..40)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78027. + Whitespace;[ ];
  78028. + MarkupTagHelperElement - [40..75)::35 - script[StartTagAndEndTag] - scripttaghelper
  78029. + MarkupTagHelperStartTag - [40..48)::8
  78030. + MarkupTextLiteral - [40..48)::8 - [<script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78031. + OpenAngle;[<];
  78032. + Text;[script];
  78033. + CloseAngle;[>];
  78034. + MarkupTextLiteral - [48..66)::18 - [<span>World</span>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78035. + OpenAngle;[<];
  78036. + Text;[span];
  78037. + CloseAngle;[>];
  78038. + Text;[World];
  78039. + OpenAngle;[<];
  78040. + ForwardSlash;[/];
  78041. + Text;[span];
  78042. + CloseAngle;[>];
  78043. + MarkupTagHelperEndTag - [66..75)::9
  78044. + MarkupTextLiteral - [66..75)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78045. + OpenAngle;[<];
  78046. + ForwardSlash;[/];
  78047. + Text;[script];
  78048. + CloseAngle;[>];
  78049. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers5.stree.txt
  78050. index e308a1049bc..783eb3ceb10 100644
  78051. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers5.stree.txt
  78052. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers5.stree.txt
  78053. @@ -1,9 +1,39 @@
  78054. -Markup block - Gen<None> - 41 - (0:0,0)
  78055. - Tag block - Gen<TagHelper> - 41 - (0:0,0) - script - scripttaghelper
  78056. - SelfClosing - <script class="foo" style="color:red;" />
  78057. - class - DoubleQuotes
  78058. - Markup span - Gen<Markup> - [foo] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:1
  78059. - SyntaxKind.Text;[foo];
  78060. - style - DoubleQuotes
  78061. - Markup span - Gen<Markup> - [color:red;] - SpanEditHandler;Accepts:Any - (27:0,27) - Tokens:1
  78062. - SyntaxKind.Text;[color:red;];
  78063. +RazorDocument - [0..41)::41 - [<script class="foo" style="color:red;" />]
  78064. + MarkupBlock - [0..41)::41
  78065. + MarkupTagHelperElement - [0..41)::41 - script[SelfClosing] - scripttaghelper
  78066. + MarkupTagHelperStartTag - [0..41)::41
  78067. + MarkupTextLiteral - [0..7)::7 - [<script] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78068. + OpenAngle;[<];
  78069. + Text;[script];
  78070. + MarkupTagHelperAttribute - [7..19)::12 - class - DoubleQuotes - Unbound - [ class="foo"]
  78071. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78072. + Whitespace;[ ];
  78073. + MarkupTextLiteral - [8..13)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78074. + Text;[class];
  78075. + Equals;[=];
  78076. + MarkupTextLiteral - [14..15)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78077. + DoubleQuote;["];
  78078. + MarkupTagHelperAttributeValue - [15..18)::3
  78079. + MarkupLiteralAttributeValue - [15..18)::3 - [foo]
  78080. + MarkupTextLiteral - [15..18)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78081. + Text;[foo];
  78082. + MarkupTextLiteral - [18..19)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78083. + DoubleQuote;["];
  78084. + MarkupTagHelperAttribute - [19..38)::19 - style - DoubleQuotes - Unbound - [ style="color:red;"]
  78085. + MarkupTextLiteral - [19..20)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78086. + Whitespace;[ ];
  78087. + MarkupTextLiteral - [20..25)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78088. + Text;[style];
  78089. + Equals;[=];
  78090. + MarkupTextLiteral - [26..27)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78091. + DoubleQuote;["];
  78092. + MarkupTagHelperAttributeValue - [27..37)::10
  78093. + MarkupLiteralAttributeValue - [27..37)::10 - [color:red;]
  78094. + MarkupTextLiteral - [27..37)::10 - [color:red;] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78095. + Text;[color:red;];
  78096. + MarkupTextLiteral - [37..38)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78097. + DoubleQuote;["];
  78098. + MarkupTextLiteral - [38..41)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78099. + Whitespace;[ ];
  78100. + ForwardSlash;[/];
  78101. + CloseAngle;[>];
  78102. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers6.stree.txt
  78103. index ceadb19abcd..87b4040c2d8 100644
  78104. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers6.stree.txt
  78105. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers6.stree.txt
  78106. @@ -1,19 +1,61 @@
  78107. -Markup block - Gen<None> - 67 - (0:0,0)
  78108. - Tag block - Gen<TagHelper> - 67 - (0:0,0) - p - ptaghelper
  78109. - StartTagAndEndTag - <p> ... </p>
  78110. - SyntaxKind.HtmlTextLiteral - [Hello ] - [3..9) - FullWidth: 6 - Slots: 1
  78111. - SyntaxKind.List - [Hello ] - [3..9) - FullWidth: 6 - Slots: 2
  78112. - SyntaxKind.Text;[Hello];
  78113. - SyntaxKind.Whitespace;[ ];
  78114. - Tag block - Gen<TagHelper> - 48 - (9:0,9) - script - scripttaghelper
  78115. - StartTagAndEndTag - <script class="foo" style="color:red;"> ... </script>
  78116. - class - DoubleQuotes
  78117. - Markup span - Gen<Markup> - [foo] - SpanEditHandler;Accepts:Any - (24:0,24) - Tokens:1
  78118. - SyntaxKind.Text;[foo];
  78119. - style - DoubleQuotes
  78120. - Markup span - Gen<Markup> - [color:red;] - SpanEditHandler;Accepts:Any - (36:0,36) - Tokens:1
  78121. - SyntaxKind.Text;[color:red;];
  78122. - SyntaxKind.HtmlTextLiteral - [ World] - [57..63) - FullWidth: 6 - Slots: 1
  78123. - SyntaxKind.List - [ World] - [57..63) - FullWidth: 6 - Slots: 2
  78124. - SyntaxKind.Whitespace;[ ];
  78125. - SyntaxKind.Text;[World];
  78126. +RazorDocument - [0..67)::67 - [<p>Hello <script class="foo" style="color:red;"></script> World</p>]
  78127. + MarkupBlock - [0..67)::67
  78128. + MarkupTagHelperElement - [0..67)::67 - p[StartTagAndEndTag] - ptaghelper
  78129. + MarkupTagHelperStartTag - [0..3)::3
  78130. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78131. + OpenAngle;[<];
  78132. + Text;[p];
  78133. + CloseAngle;[>];
  78134. + MarkupTextLiteral - [3..9)::6 - [Hello ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78135. + Text;[Hello];
  78136. + Whitespace;[ ];
  78137. + MarkupTagHelperElement - [9..57)::48 - script[StartTagAndEndTag] - scripttaghelper
  78138. + MarkupTagHelperStartTag - [9..48)::39
  78139. + MarkupTextLiteral - [9..16)::7 - [<script] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78140. + OpenAngle;[<];
  78141. + Text;[script];
  78142. + MarkupTagHelperAttribute - [16..28)::12 - class - DoubleQuotes - Unbound - [ class="foo"]
  78143. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78144. + Whitespace;[ ];
  78145. + MarkupTextLiteral - [17..22)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78146. + Text;[class];
  78147. + Equals;[=];
  78148. + MarkupTextLiteral - [23..24)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78149. + DoubleQuote;["];
  78150. + MarkupTagHelperAttributeValue - [24..27)::3
  78151. + MarkupLiteralAttributeValue - [24..27)::3 - [foo]
  78152. + MarkupTextLiteral - [24..27)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78153. + Text;[foo];
  78154. + MarkupTextLiteral - [27..28)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78155. + DoubleQuote;["];
  78156. + MarkupTagHelperAttribute - [28..47)::19 - style - DoubleQuotes - Unbound - [ style="color:red;"]
  78157. + MarkupTextLiteral - [28..29)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78158. + Whitespace;[ ];
  78159. + MarkupTextLiteral - [29..34)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78160. + Text;[style];
  78161. + Equals;[=];
  78162. + MarkupTextLiteral - [35..36)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78163. + DoubleQuote;["];
  78164. + MarkupTagHelperAttributeValue - [36..46)::10
  78165. + MarkupLiteralAttributeValue - [36..46)::10 - [color:red;]
  78166. + MarkupTextLiteral - [36..46)::10 - [color:red;] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78167. + Text;[color:red;];
  78168. + MarkupTextLiteral - [46..47)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78169. + DoubleQuote;["];
  78170. + MarkupTextLiteral - [47..48)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78171. + CloseAngle;[>];
  78172. + MarkupTagHelperEndTag - [48..57)::9
  78173. + MarkupTextLiteral - [48..57)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78174. + OpenAngle;[<];
  78175. + ForwardSlash;[/];
  78176. + Text;[script];
  78177. + CloseAngle;[>];
  78178. + MarkupTextLiteral - [57..63)::6 - [ World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78179. + Whitespace;[ ];
  78180. + Text;[World];
  78181. + MarkupTagHelperEndTag - [63..67)::4
  78182. + MarkupTextLiteral - [63..67)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78183. + OpenAngle;[<];
  78184. + ForwardSlash;[/];
  78185. + Text;[p];
  78186. + CloseAngle;[>];
  78187. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers7.stree.txt
  78188. index 6dae63d6177..659b282ddfe 100644
  78189. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers7.stree.txt
  78190. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesScriptTagHelpers7.stree.txt
  78191. @@ -1,25 +1,66 @@
  78192. -Markup block - Gen<None> - 77 - (0:0,0)
  78193. - Tag block - Gen<TagHelper> - 77 - (0:0,0) - p - ptaghelper
  78194. - StartTagAndEndTag - <p> ... </p>
  78195. - SyntaxKind.HtmlTextLiteral - [Hello ] - [3..9) - FullWidth: 6 - Slots: 1
  78196. - SyntaxKind.List - [Hello ] - [3..9) - FullWidth: 6 - Slots: 2
  78197. - SyntaxKind.Text;[Hello];
  78198. - SyntaxKind.Whitespace;[ ];
  78199. - Tag block - Gen<TagHelper> - 58 - (9:0,9) - script - scripttaghelper
  78200. - StartTagAndEndTag - <script class="@@[email protected]" style="color:red;"> ... </script>
  78201. - class - DoubleQuotes
  78202. - Markup block - Gen<None> - 13 - (24:0,24)
  78203. - Markup block - Gen<None> - 2 - (24:0,24)
  78204. - Markup span - Gen<Markup> - [@] - SpanEditHandler;Accepts:None - (24:0,24) - Tokens:1
  78205. - SyntaxKind.Transition;[@];
  78206. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (25:0,25) - Tokens:1
  78207. - SyntaxKind.Transition;[@];
  78208. - Markup span - Gen<Markup> - [[email protected]] - SpanEditHandler;Accepts:Any - (26:0,26) - Tokens:1
  78209. - SyntaxKind.Text;[[email protected]];
  78210. - style - DoubleQuotes
  78211. - Markup span - Gen<Markup> - [color:red;] - SpanEditHandler;Accepts:Any - (46:0,46) - Tokens:1
  78212. - SyntaxKind.Text;[color:red;];
  78213. - SyntaxKind.HtmlTextLiteral - [ World] - [67..73) - FullWidth: 6 - Slots: 1
  78214. - SyntaxKind.List - [ World] - [67..73) - FullWidth: 6 - Slots: 2
  78215. - SyntaxKind.Whitespace;[ ];
  78216. - SyntaxKind.Text;[World];
  78217. +RazorDocument - [0..77)::77 - [<p>Hello <script class="@@[email protected]" style="color:red;"></script> World</p>]
  78218. + MarkupBlock - [0..77)::77
  78219. + MarkupTagHelperElement - [0..77)::77 - p[StartTagAndEndTag] - ptaghelper
  78220. + MarkupTagHelperStartTag - [0..3)::3
  78221. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78222. + OpenAngle;[<];
  78223. + Text;[p];
  78224. + CloseAngle;[>];
  78225. + MarkupTextLiteral - [3..9)::6 - [Hello ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78226. + Text;[Hello];
  78227. + Whitespace;[ ];
  78228. + MarkupTagHelperElement - [9..67)::58 - script[StartTagAndEndTag] - scripttaghelper
  78229. + MarkupTagHelperStartTag - [9..58)::49
  78230. + MarkupTextLiteral - [9..16)::7 - [<script] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78231. + OpenAngle;[<];
  78232. + Text;[script];
  78233. + MarkupTagHelperAttribute - [16..38)::22 - class - DoubleQuotes - Unbound - [ class="@@[email protected]"]
  78234. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78235. + Whitespace;[ ];
  78236. + MarkupTextLiteral - [17..22)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78237. + Text;[class];
  78238. + Equals;[=];
  78239. + MarkupTextLiteral - [23..24)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78240. + DoubleQuote;["];
  78241. + MarkupTagHelperAttributeValue - [24..37)::13
  78242. + MarkupBlock - [24..26)::2
  78243. + MarkupTextLiteral - [24..25)::1 - [@] - Gen<LitAttr:@(24:0,24)> - SpanEditHandler;Accepts:None
  78244. + Transition;[@];
  78245. + MarkupEphemeralTextLiteral - [25..26)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  78246. + Transition;[@];
  78247. + MarkupLiteralAttributeValue - [26..37)::11 - [[email protected]]
  78248. + MarkupTextLiteral - [26..37)::11 - [[email protected]] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78249. + Text;[[email protected]];
  78250. + MarkupTextLiteral - [37..38)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78251. + DoubleQuote;["];
  78252. + MarkupTagHelperAttribute - [38..57)::19 - style - DoubleQuotes - Unbound - [ style="color:red;"]
  78253. + MarkupTextLiteral - [38..39)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78254. + Whitespace;[ ];
  78255. + MarkupTextLiteral - [39..44)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78256. + Text;[style];
  78257. + Equals;[=];
  78258. + MarkupTextLiteral - [45..46)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78259. + DoubleQuote;["];
  78260. + MarkupTagHelperAttributeValue - [46..56)::10
  78261. + MarkupLiteralAttributeValue - [46..56)::10 - [color:red;]
  78262. + MarkupTextLiteral - [46..56)::10 - [color:red;] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78263. + Text;[color:red;];
  78264. + MarkupTextLiteral - [56..57)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78265. + DoubleQuote;["];
  78266. + MarkupTextLiteral - [57..58)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78267. + CloseAngle;[>];
  78268. + MarkupTagHelperEndTag - [58..67)::9
  78269. + MarkupTextLiteral - [58..67)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78270. + OpenAngle;[<];
  78271. + ForwardSlash;[/];
  78272. + Text;[script];
  78273. + CloseAngle;[>];
  78274. + MarkupTextLiteral - [67..73)::6 - [ World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78275. + Whitespace;[ ];
  78276. + Text;[World];
  78277. + MarkupTagHelperEndTag - [73..77)::4
  78278. + MarkupTextLiteral - [73..77)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78279. + OpenAngle;[<];
  78280. + ForwardSlash;[/];
  78281. + Text;[p];
  78282. + CloseAngle;[>];
  78283. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesSelfClosingTagHelpers1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesSelfClosingTagHelpers1.stree.txt
  78284. index 5c829074ef4..a4e4f20755c 100644
  78285. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesSelfClosingTagHelpers1.stree.txt
  78286. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesSelfClosingTagHelpers1.stree.txt
  78287. @@ -1,9 +1,39 @@
  78288. -Markup block - Gen<None> - 36 - (0:0,0)
  78289. - Tag block - Gen<TagHelper> - 36 - (0:0,0) - p - ptaghelper
  78290. - SelfClosing - <p class="foo" style="color:red;" />
  78291. - class - DoubleQuotes
  78292. - Markup span - Gen<Markup> - [foo] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  78293. - SyntaxKind.Text;[foo];
  78294. - style - DoubleQuotes
  78295. - Markup span - Gen<Markup> - [color:red;] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:1
  78296. - SyntaxKind.Text;[color:red;];
  78297. +RazorDocument - [0..36)::36 - [<p class="foo" style="color:red;" />]
  78298. + MarkupBlock - [0..36)::36
  78299. + MarkupTagHelperElement - [0..36)::36 - p[SelfClosing] - ptaghelper
  78300. + MarkupTagHelperStartTag - [0..36)::36
  78301. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78302. + OpenAngle;[<];
  78303. + Text;[p];
  78304. + MarkupTagHelperAttribute - [2..14)::12 - class - DoubleQuotes - Unbound - [ class="foo"]
  78305. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78306. + Whitespace;[ ];
  78307. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78308. + Text;[class];
  78309. + Equals;[=];
  78310. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78311. + DoubleQuote;["];
  78312. + MarkupTagHelperAttributeValue - [10..13)::3
  78313. + MarkupLiteralAttributeValue - [10..13)::3 - [foo]
  78314. + MarkupTextLiteral - [10..13)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78315. + Text;[foo];
  78316. + MarkupTextLiteral - [13..14)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78317. + DoubleQuote;["];
  78318. + MarkupTagHelperAttribute - [14..33)::19 - style - DoubleQuotes - Unbound - [ style="color:red;"]
  78319. + MarkupTextLiteral - [14..15)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78320. + Whitespace;[ ];
  78321. + MarkupTextLiteral - [15..20)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78322. + Text;[style];
  78323. + Equals;[=];
  78324. + MarkupTextLiteral - [21..22)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78325. + DoubleQuote;["];
  78326. + MarkupTagHelperAttributeValue - [22..32)::10
  78327. + MarkupLiteralAttributeValue - [22..32)::10 - [color:red;]
  78328. + MarkupTextLiteral - [22..32)::10 - [color:red;] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78329. + Text;[color:red;];
  78330. + MarkupTextLiteral - [32..33)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78331. + DoubleQuote;["];
  78332. + MarkupTextLiteral - [33..36)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78333. + Whitespace;[ ];
  78334. + ForwardSlash;[/];
  78335. + CloseAngle;[>];
  78336. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesSelfClosingTagHelpers2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesSelfClosingTagHelpers2.stree.txt
  78337. index 0f45a00e605..f4fac8987c8 100644
  78338. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesSelfClosingTagHelpers2.stree.txt
  78339. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesSelfClosingTagHelpers2.stree.txt
  78340. @@ -1,19 +1,57 @@
  78341. -Markup block - Gen<None> - 55 - (0:0,0)
  78342. - Tag block - Gen<TagHelper> - 55 - (0:0,0) - p - ptaghelper
  78343. - StartTagAndEndTag - <p> ... </p>
  78344. - SyntaxKind.HtmlTextLiteral - [Hello ] - [3..9) - FullWidth: 6 - Slots: 1
  78345. - SyntaxKind.List - [Hello ] - [3..9) - FullWidth: 6 - Slots: 2
  78346. - SyntaxKind.Text;[Hello];
  78347. - SyntaxKind.Whitespace;[ ];
  78348. - Tag block - Gen<TagHelper> - 36 - (9:0,9) - p - ptaghelper
  78349. - SelfClosing - <p class="foo" style="color:red;" />
  78350. - class - DoubleQuotes
  78351. - Markup span - Gen<Markup> - [foo] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:1
  78352. - SyntaxKind.Text;[foo];
  78353. - style - DoubleQuotes
  78354. - Markup span - Gen<Markup> - [color:red;] - SpanEditHandler;Accepts:Any - (31:0,31) - Tokens:1
  78355. - SyntaxKind.Text;[color:red;];
  78356. - SyntaxKind.HtmlTextLiteral - [ World] - [45..51) - FullWidth: 6 - Slots: 1
  78357. - SyntaxKind.List - [ World] - [45..51) - FullWidth: 6 - Slots: 2
  78358. - SyntaxKind.Whitespace;[ ];
  78359. - SyntaxKind.Text;[World];
  78360. +RazorDocument - [0..55)::55 - [<p>Hello <p class="foo" style="color:red;" /> World</p>]
  78361. + MarkupBlock - [0..55)::55
  78362. + MarkupTagHelperElement - [0..55)::55 - p[StartTagAndEndTag] - ptaghelper
  78363. + MarkupTagHelperStartTag - [0..3)::3
  78364. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78365. + OpenAngle;[<];
  78366. + Text;[p];
  78367. + CloseAngle;[>];
  78368. + MarkupTextLiteral - [3..9)::6 - [Hello ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78369. + Text;[Hello];
  78370. + Whitespace;[ ];
  78371. + MarkupTagHelperElement - [9..45)::36 - p[SelfClosing] - ptaghelper
  78372. + MarkupTagHelperStartTag - [9..45)::36
  78373. + MarkupTextLiteral - [9..11)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78374. + OpenAngle;[<];
  78375. + Text;[p];
  78376. + MarkupTagHelperAttribute - [11..23)::12 - class - DoubleQuotes - Unbound - [ class="foo"]
  78377. + MarkupTextLiteral - [11..12)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78378. + Whitespace;[ ];
  78379. + MarkupTextLiteral - [12..17)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78380. + Text;[class];
  78381. + Equals;[=];
  78382. + MarkupTextLiteral - [18..19)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78383. + DoubleQuote;["];
  78384. + MarkupTagHelperAttributeValue - [19..22)::3
  78385. + MarkupLiteralAttributeValue - [19..22)::3 - [foo]
  78386. + MarkupTextLiteral - [19..22)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78387. + Text;[foo];
  78388. + MarkupTextLiteral - [22..23)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78389. + DoubleQuote;["];
  78390. + MarkupTagHelperAttribute - [23..42)::19 - style - DoubleQuotes - Unbound - [ style="color:red;"]
  78391. + MarkupTextLiteral - [23..24)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78392. + Whitespace;[ ];
  78393. + MarkupTextLiteral - [24..29)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78394. + Text;[style];
  78395. + Equals;[=];
  78396. + MarkupTextLiteral - [30..31)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78397. + DoubleQuote;["];
  78398. + MarkupTagHelperAttributeValue - [31..41)::10
  78399. + MarkupLiteralAttributeValue - [31..41)::10 - [color:red;]
  78400. + MarkupTextLiteral - [31..41)::10 - [color:red;] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78401. + Text;[color:red;];
  78402. + MarkupTextLiteral - [41..42)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78403. + DoubleQuote;["];
  78404. + MarkupTextLiteral - [42..45)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78405. + Whitespace;[ ];
  78406. + ForwardSlash;[/];
  78407. + CloseAngle;[>];
  78408. + MarkupTextLiteral - [45..51)::6 - [ World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78409. + Whitespace;[ ];
  78410. + Text;[World];
  78411. + MarkupTagHelperEndTag - [51..55)::4
  78412. + MarkupTextLiteral - [51..55)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78413. + OpenAngle;[<];
  78414. + ForwardSlash;[/];
  78415. + Text;[p];
  78416. + CloseAngle;[>];
  78417. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesSelfClosingTagHelpers3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesSelfClosingTagHelpers3.stree.txt
  78418. index 153387713f7..f1605095a7e 100644
  78419. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesSelfClosingTagHelpers3.stree.txt
  78420. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesSelfClosingTagHelpers3.stree.txt
  78421. @@ -1,17 +1,54 @@
  78422. -Markup block - Gen<None> - 52 - (0:0,0)
  78423. - Markup span - Gen<Markup> - [Hello] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  78424. - SyntaxKind.Text;[Hello];
  78425. - Tag block - Gen<TagHelper> - 17 - (5:0,5) - p - ptaghelper
  78426. - SelfClosing - <p class="foo" />
  78427. - class - DoubleQuotes
  78428. - Markup span - Gen<Markup> - [foo] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:1
  78429. - SyntaxKind.Text;[foo];
  78430. - SyntaxKind.HtmlTextLiteral - [ ] - [22..23) - FullWidth: 1 - Slots: 1
  78431. - SyntaxKind.Whitespace;[ ];
  78432. - Tag block - Gen<TagHelper> - 24 - (23:0,23) - p - ptaghelper
  78433. - SelfClosing - <p style="color:red;" />
  78434. - style - DoubleQuotes
  78435. - Markup span - Gen<Markup> - [color:red;] - SpanEditHandler;Accepts:Any - (33:0,33) - Tokens:1
  78436. - SyntaxKind.Text;[color:red;];
  78437. - Markup span - Gen<Markup> - [World] - SpanEditHandler;Accepts:Any - (47:0,47) - Tokens:1
  78438. - SyntaxKind.Text;[World];
  78439. +RazorDocument - [0..52)::52 - [Hello<p class="foo" /> <p style="color:red;" />World]
  78440. + MarkupBlock - [0..52)::52
  78441. + MarkupTextLiteral - [0..5)::5 - [Hello] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78442. + Text;[Hello];
  78443. + MarkupTagHelperElement - [5..22)::17 - p[SelfClosing] - ptaghelper
  78444. + MarkupTagHelperStartTag - [5..22)::17
  78445. + MarkupTextLiteral - [5..7)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78446. + OpenAngle;[<];
  78447. + Text;[p];
  78448. + MarkupTagHelperAttribute - [7..19)::12 - class - DoubleQuotes - Unbound - [ class="foo"]
  78449. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78450. + Whitespace;[ ];
  78451. + MarkupTextLiteral - [8..13)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78452. + Text;[class];
  78453. + Equals;[=];
  78454. + MarkupTextLiteral - [14..15)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78455. + DoubleQuote;["];
  78456. + MarkupTagHelperAttributeValue - [15..18)::3
  78457. + MarkupLiteralAttributeValue - [15..18)::3 - [foo]
  78458. + MarkupTextLiteral - [15..18)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78459. + Text;[foo];
  78460. + MarkupTextLiteral - [18..19)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78461. + DoubleQuote;["];
  78462. + MarkupTextLiteral - [19..22)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78463. + Whitespace;[ ];
  78464. + ForwardSlash;[/];
  78465. + CloseAngle;[>];
  78466. + MarkupTextLiteral - [22..23)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78467. + Whitespace;[ ];
  78468. + MarkupTagHelperElement - [23..47)::24 - p[SelfClosing] - ptaghelper
  78469. + MarkupTagHelperStartTag - [23..47)::24
  78470. + MarkupTextLiteral - [23..25)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78471. + OpenAngle;[<];
  78472. + Text;[p];
  78473. + MarkupTagHelperAttribute - [25..44)::19 - style - DoubleQuotes - Unbound - [ style="color:red;"]
  78474. + MarkupTextLiteral - [25..26)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78475. + Whitespace;[ ];
  78476. + MarkupTextLiteral - [26..31)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78477. + Text;[style];
  78478. + Equals;[=];
  78479. + MarkupTextLiteral - [32..33)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78480. + DoubleQuote;["];
  78481. + MarkupTagHelperAttributeValue - [33..43)::10
  78482. + MarkupLiteralAttributeValue - [33..43)::10 - [color:red;]
  78483. + MarkupTextLiteral - [33..43)::10 - [color:red;] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78484. + Text;[color:red;];
  78485. + MarkupTextLiteral - [43..44)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78486. + DoubleQuote;["];
  78487. + MarkupTextLiteral - [44..47)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78488. + Whitespace;[ ];
  78489. + ForwardSlash;[/];
  78490. + CloseAngle;[>];
  78491. + MarkupTextLiteral - [47..52)::5 - [World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78492. + Text;[World];
  78493. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithPlainAttributes1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithPlainAttributes1.stree.txt
  78494. index d6f08b9908d..06efe6b521b 100644
  78495. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithPlainAttributes1.stree.txt
  78496. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithPlainAttributes1.stree.txt
  78497. @@ -1,9 +1,43 @@
  78498. -Markup block - Gen<None> - 38 - (0:0,0)
  78499. - Tag block - Gen<TagHelper> - 38 - (0:0,0) - p - ptaghelper
  78500. - StartTagAndEndTag - <p class="foo" style="color:red;"> ... </p>
  78501. - class - DoubleQuotes
  78502. - Markup span - Gen<Markup> - [foo] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  78503. - SyntaxKind.Text;[foo];
  78504. - style - DoubleQuotes
  78505. - Markup span - Gen<Markup> - [color:red;] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:1
  78506. - SyntaxKind.Text;[color:red;];
  78507. +RazorDocument - [0..38)::38 - [<p class="foo" style="color:red;"></p>]
  78508. + MarkupBlock - [0..38)::38
  78509. + MarkupTagHelperElement - [0..38)::38 - p[StartTagAndEndTag] - ptaghelper
  78510. + MarkupTagHelperStartTag - [0..34)::34
  78511. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78512. + OpenAngle;[<];
  78513. + Text;[p];
  78514. + MarkupTagHelperAttribute - [2..14)::12 - class - DoubleQuotes - Unbound - [ class="foo"]
  78515. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78516. + Whitespace;[ ];
  78517. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78518. + Text;[class];
  78519. + Equals;[=];
  78520. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78521. + DoubleQuote;["];
  78522. + MarkupTagHelperAttributeValue - [10..13)::3
  78523. + MarkupLiteralAttributeValue - [10..13)::3 - [foo]
  78524. + MarkupTextLiteral - [10..13)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78525. + Text;[foo];
  78526. + MarkupTextLiteral - [13..14)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78527. + DoubleQuote;["];
  78528. + MarkupTagHelperAttribute - [14..33)::19 - style - DoubleQuotes - Unbound - [ style="color:red;"]
  78529. + MarkupTextLiteral - [14..15)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78530. + Whitespace;[ ];
  78531. + MarkupTextLiteral - [15..20)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78532. + Text;[style];
  78533. + Equals;[=];
  78534. + MarkupTextLiteral - [21..22)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78535. + DoubleQuote;["];
  78536. + MarkupTagHelperAttributeValue - [22..32)::10
  78537. + MarkupLiteralAttributeValue - [22..32)::10 - [color:red;]
  78538. + MarkupTextLiteral - [22..32)::10 - [color:red;] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78539. + Text;[color:red;];
  78540. + MarkupTextLiteral - [32..33)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78541. + DoubleQuote;["];
  78542. + MarkupTextLiteral - [33..34)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78543. + CloseAngle;[>];
  78544. + MarkupTagHelperEndTag - [34..38)::4
  78545. + MarkupTextLiteral - [34..38)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78546. + OpenAngle;[<];
  78547. + ForwardSlash;[/];
  78548. + Text;[p];
  78549. + CloseAngle;[>];
  78550. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithPlainAttributes2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithPlainAttributes2.stree.txt
  78551. index 40e20244b5c..de476da3826 100644
  78552. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithPlainAttributes2.stree.txt
  78553. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithPlainAttributes2.stree.txt
  78554. @@ -1,14 +1,47 @@
  78555. -Markup block - Gen<None> - 49 - (0:0,0)
  78556. - Tag block - Gen<TagHelper> - 49 - (0:0,0) - p - ptaghelper
  78557. - StartTagAndEndTag - <p class="foo" style="color:red;"> ... </p>
  78558. - class - DoubleQuotes
  78559. - Markup span - Gen<Markup> - [foo] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  78560. - SyntaxKind.Text;[foo];
  78561. - style - DoubleQuotes
  78562. - Markup span - Gen<Markup> - [color:red;] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:1
  78563. - SyntaxKind.Text;[color:red;];
  78564. - SyntaxKind.HtmlTextLiteral - [Hello World] - [34..45) - FullWidth: 11 - Slots: 1
  78565. - SyntaxKind.List - [Hello World] - [34..45) - FullWidth: 11 - Slots: 3
  78566. - SyntaxKind.Text;[Hello];
  78567. - SyntaxKind.Whitespace;[ ];
  78568. - SyntaxKind.Text;[World];
  78569. +RazorDocument - [0..49)::49 - [<p class="foo" style="color:red;">Hello World</p>]
  78570. + MarkupBlock - [0..49)::49
  78571. + MarkupTagHelperElement - [0..49)::49 - p[StartTagAndEndTag] - ptaghelper
  78572. + MarkupTagHelperStartTag - [0..34)::34
  78573. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78574. + OpenAngle;[<];
  78575. + Text;[p];
  78576. + MarkupTagHelperAttribute - [2..14)::12 - class - DoubleQuotes - Unbound - [ class="foo"]
  78577. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78578. + Whitespace;[ ];
  78579. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78580. + Text;[class];
  78581. + Equals;[=];
  78582. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78583. + DoubleQuote;["];
  78584. + MarkupTagHelperAttributeValue - [10..13)::3
  78585. + MarkupLiteralAttributeValue - [10..13)::3 - [foo]
  78586. + MarkupTextLiteral - [10..13)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78587. + Text;[foo];
  78588. + MarkupTextLiteral - [13..14)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78589. + DoubleQuote;["];
  78590. + MarkupTagHelperAttribute - [14..33)::19 - style - DoubleQuotes - Unbound - [ style="color:red;"]
  78591. + MarkupTextLiteral - [14..15)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78592. + Whitespace;[ ];
  78593. + MarkupTextLiteral - [15..20)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78594. + Text;[style];
  78595. + Equals;[=];
  78596. + MarkupTextLiteral - [21..22)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78597. + DoubleQuote;["];
  78598. + MarkupTagHelperAttributeValue - [22..32)::10
  78599. + MarkupLiteralAttributeValue - [22..32)::10 - [color:red;]
  78600. + MarkupTextLiteral - [22..32)::10 - [color:red;] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78601. + Text;[color:red;];
  78602. + MarkupTextLiteral - [32..33)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78603. + DoubleQuote;["];
  78604. + MarkupTextLiteral - [33..34)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78605. + CloseAngle;[>];
  78606. + MarkupTextLiteral - [34..45)::11 - [Hello World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78607. + Text;[Hello];
  78608. + Whitespace;[ ];
  78609. + Text;[World];
  78610. + MarkupTagHelperEndTag - [45..49)::4
  78611. + MarkupTextLiteral - [45..49)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78612. + OpenAngle;[<];
  78613. + ForwardSlash;[/];
  78614. + Text;[p];
  78615. + CloseAngle;[>];
  78616. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithPlainAttributes3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithPlainAttributes3.stree.txt
  78617. index 0eccf9b4d38..c89bb22d861 100644
  78618. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithPlainAttributes3.stree.txt
  78619. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithPlainAttributes3.stree.txt
  78620. @@ -1,17 +1,62 @@
  78621. -Markup block - Gen<None> - 56 - (0:0,0)
  78622. - Tag block - Gen<TagHelper> - 24 - (0:0,0) - p - ptaghelper
  78623. - StartTagAndEndTag - <p class="foo"> ... </p>
  78624. - class - DoubleQuotes
  78625. - Markup span - Gen<Markup> - [foo] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  78626. - SyntaxKind.Text;[foo];
  78627. - SyntaxKind.HtmlTextLiteral - [Hello] - [15..20) - FullWidth: 5 - Slots: 1
  78628. - SyntaxKind.Text;[Hello];
  78629. - SyntaxKind.HtmlTextLiteral - [ ] - [24..25) - FullWidth: 1 - Slots: 1
  78630. - SyntaxKind.Whitespace;[ ];
  78631. - Tag block - Gen<TagHelper> - 31 - (25:0,25) - p - ptaghelper
  78632. - StartTagAndEndTag - <p style="color:red;"> ... </p>
  78633. - style - DoubleQuotes
  78634. - Markup span - Gen<Markup> - [color:red;] - SpanEditHandler;Accepts:Any - (35:0,35) - Tokens:1
  78635. - SyntaxKind.Text;[color:red;];
  78636. - SyntaxKind.HtmlTextLiteral - [World] - [47..52) - FullWidth: 5 - Slots: 1
  78637. - SyntaxKind.Text;[World];
  78638. +RazorDocument - [0..56)::56 - [<p class="foo">Hello</p> <p style="color:red;">World</p>]
  78639. + MarkupBlock - [0..56)::56
  78640. + MarkupTagHelperElement - [0..24)::24 - p[StartTagAndEndTag] - ptaghelper
  78641. + MarkupTagHelperStartTag - [0..15)::15
  78642. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78643. + OpenAngle;[<];
  78644. + Text;[p];
  78645. + MarkupTagHelperAttribute - [2..14)::12 - class - DoubleQuotes - Unbound - [ class="foo"]
  78646. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78647. + Whitespace;[ ];
  78648. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78649. + Text;[class];
  78650. + Equals;[=];
  78651. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78652. + DoubleQuote;["];
  78653. + MarkupTagHelperAttributeValue - [10..13)::3
  78654. + MarkupLiteralAttributeValue - [10..13)::3 - [foo]
  78655. + MarkupTextLiteral - [10..13)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78656. + Text;[foo];
  78657. + MarkupTextLiteral - [13..14)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78658. + DoubleQuote;["];
  78659. + MarkupTextLiteral - [14..15)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78660. + CloseAngle;[>];
  78661. + MarkupTextLiteral - [15..20)::5 - [Hello] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78662. + Text;[Hello];
  78663. + MarkupTagHelperEndTag - [20..24)::4
  78664. + MarkupTextLiteral - [20..24)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78665. + OpenAngle;[<];
  78666. + ForwardSlash;[/];
  78667. + Text;[p];
  78668. + CloseAngle;[>];
  78669. + MarkupTextLiteral - [24..25)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78670. + Whitespace;[ ];
  78671. + MarkupTagHelperElement - [25..56)::31 - p[StartTagAndEndTag] - ptaghelper
  78672. + MarkupTagHelperStartTag - [25..47)::22
  78673. + MarkupTextLiteral - [25..27)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78674. + OpenAngle;[<];
  78675. + Text;[p];
  78676. + MarkupTagHelperAttribute - [27..46)::19 - style - DoubleQuotes - Unbound - [ style="color:red;"]
  78677. + MarkupTextLiteral - [27..28)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78678. + Whitespace;[ ];
  78679. + MarkupTextLiteral - [28..33)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78680. + Text;[style];
  78681. + Equals;[=];
  78682. + MarkupTextLiteral - [34..35)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78683. + DoubleQuote;["];
  78684. + MarkupTagHelperAttributeValue - [35..45)::10
  78685. + MarkupLiteralAttributeValue - [35..45)::10 - [color:red;]
  78686. + MarkupTextLiteral - [35..45)::10 - [color:red;] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78687. + Text;[color:red;];
  78688. + MarkupTextLiteral - [45..46)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78689. + DoubleQuote;["];
  78690. + MarkupTextLiteral - [46..47)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78691. + CloseAngle;[>];
  78692. + MarkupTextLiteral - [47..52)::5 - [World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78693. + Text;[World];
  78694. + MarkupTagHelperEndTag - [52..56)::4
  78695. + MarkupTextLiteral - [52..56)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78696. + OpenAngle;[<];
  78697. + ForwardSlash;[/];
  78698. + Text;[p];
  78699. + CloseAngle;[>];
  78700. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithPlainAttributes4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithPlainAttributes4.stree.txt
  78701. index 73b71bd774a..eecb4cde20d 100644
  78702. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithPlainAttributes4.stree.txt
  78703. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithPlainAttributes4.stree.txt
  78704. @@ -1,46 +1,82 @@
  78705. -Markup block - Gen<None> - 99 - (0:0,0)
  78706. - Tag block - Gen<TagHelper> - 99 - (0:0,0) - p - ptaghelper
  78707. - StartTagAndEndTag - <p class="foo" style="color:red;"> ... </p>
  78708. - class - DoubleQuotes
  78709. - Markup span - Gen<Markup> - [foo] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  78710. - SyntaxKind.Text;[foo];
  78711. - style - DoubleQuotes
  78712. - Markup span - Gen<Markup> - [color:red;] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:1
  78713. - SyntaxKind.Text;[color:red;];
  78714. - SyntaxKind.HtmlTextLiteral - [Hello World ] - [34..46) - FullWidth: 12 - Slots: 1
  78715. - SyntaxKind.List - [Hello World ] - [34..46) - FullWidth: 12 - Slots: 4
  78716. - SyntaxKind.Text;[Hello];
  78717. - SyntaxKind.Whitespace;[ ];
  78718. - SyntaxKind.Text;[World];
  78719. - SyntaxKind.Whitespace;[ ];
  78720. - Tag block - Gen<None> - 20 - (46:0,46)
  78721. - Markup span - Gen<Markup> - [<strong] - SpanEditHandler;Accepts:Any - (46:0,46) - Tokens:2
  78722. - SyntaxKind.OpenAngle;[<];
  78723. - SyntaxKind.Text;[strong];
  78724. - Markup block - Gen<Attr:class, class="@(53:0,53),"@(64:0,64)> - 12 - (53:0,53)
  78725. - Markup span - Gen<None> - [ class="] - SpanEditHandler;Accepts:Any - (53:0,53) - Tokens:4
  78726. - SyntaxKind.Whitespace;[ ];
  78727. - SyntaxKind.Text;[class];
  78728. - SyntaxKind.Equals;[=];
  78729. - SyntaxKind.DoubleQuote;["];
  78730. - Markup span - Gen<LitAttr:@(61:0,61)> - [foo] - SpanEditHandler;Accepts:Any - (61:0,61) - Tokens:1
  78731. - SyntaxKind.Text;[foo];
  78732. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (64:0,64) - Tokens:1
  78733. - SyntaxKind.DoubleQuote;["];
  78734. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (65:0,65) - Tokens:1
  78735. - SyntaxKind.CloseAngle;[>];
  78736. - SyntaxKind.HtmlTextLiteral - [inside of strong tag] - [66..86) - FullWidth: 20 - Slots: 1
  78737. - SyntaxKind.List - [inside of strong tag] - [66..86) - FullWidth: 20 - Slots: 7
  78738. - SyntaxKind.Text;[inside];
  78739. - SyntaxKind.Whitespace;[ ];
  78740. - SyntaxKind.Text;[of];
  78741. - SyntaxKind.Whitespace;[ ];
  78742. - SyntaxKind.Text;[strong];
  78743. - SyntaxKind.Whitespace;[ ];
  78744. - SyntaxKind.Text;[tag];
  78745. - Tag block - Gen<None> - 9 - (86:0,86)
  78746. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (86:0,86) - Tokens:4
  78747. - SyntaxKind.OpenAngle;[<];
  78748. - SyntaxKind.ForwardSlash;[/];
  78749. - SyntaxKind.Text;[strong];
  78750. - SyntaxKind.CloseAngle;[>];
  78751. +RazorDocument - [0..99)::99 - [<p class="foo" style="color:red;">Hello World <strong class="foo">inside of strong tag</strong></p>]
  78752. + MarkupBlock - [0..99)::99
  78753. + MarkupTagHelperElement - [0..99)::99 - p[StartTagAndEndTag] - ptaghelper
  78754. + MarkupTagHelperStartTag - [0..34)::34
  78755. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78756. + OpenAngle;[<];
  78757. + Text;[p];
  78758. + MarkupTagHelperAttribute - [2..14)::12 - class - DoubleQuotes - Unbound - [ class="foo"]
  78759. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78760. + Whitespace;[ ];
  78761. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78762. + Text;[class];
  78763. + Equals;[=];
  78764. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78765. + DoubleQuote;["];
  78766. + MarkupTagHelperAttributeValue - [10..13)::3
  78767. + MarkupLiteralAttributeValue - [10..13)::3 - [foo]
  78768. + MarkupTextLiteral - [10..13)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78769. + Text;[foo];
  78770. + MarkupTextLiteral - [13..14)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78771. + DoubleQuote;["];
  78772. + MarkupTagHelperAttribute - [14..33)::19 - style - DoubleQuotes - Unbound - [ style="color:red;"]
  78773. + MarkupTextLiteral - [14..15)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78774. + Whitespace;[ ];
  78775. + MarkupTextLiteral - [15..20)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78776. + Text;[style];
  78777. + Equals;[=];
  78778. + MarkupTextLiteral - [21..22)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78779. + DoubleQuote;["];
  78780. + MarkupTagHelperAttributeValue - [22..32)::10
  78781. + MarkupLiteralAttributeValue - [22..32)::10 - [color:red;]
  78782. + MarkupTextLiteral - [22..32)::10 - [color:red;] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78783. + Text;[color:red;];
  78784. + MarkupTextLiteral - [32..33)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78785. + DoubleQuote;["];
  78786. + MarkupTextLiteral - [33..34)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78787. + CloseAngle;[>];
  78788. + MarkupTextLiteral - [34..46)::12 - [Hello World ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78789. + Text;[Hello];
  78790. + Whitespace;[ ];
  78791. + Text;[World];
  78792. + Whitespace;[ ];
  78793. + MarkupTagBlock - [46..66)::20 - [<strong class="foo">]
  78794. + MarkupTextLiteral - [46..53)::7 - [<strong] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78795. + OpenAngle;[<];
  78796. + Text;[strong];
  78797. + MarkupAttributeBlock - [53..65)::12 - [ class="foo"]
  78798. + MarkupTextLiteral - [53..54)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78799. + Whitespace;[ ];
  78800. + MarkupTextLiteral - [54..59)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78801. + Text;[class];
  78802. + Equals;[=];
  78803. + MarkupTextLiteral - [60..61)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78804. + DoubleQuote;["];
  78805. + GenericBlock - [61..64)::3
  78806. + MarkupLiteralAttributeValue - [61..64)::3 - [foo]
  78807. + MarkupTextLiteral - [61..64)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78808. + Text;[foo];
  78809. + MarkupTextLiteral - [64..65)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  78810. + DoubleQuote;["];
  78811. + MarkupTextLiteral - [65..66)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78812. + CloseAngle;[>];
  78813. + MarkupTextLiteral - [66..86)::20 - [inside of strong tag] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78814. + Text;[inside];
  78815. + Whitespace;[ ];
  78816. + Text;[of];
  78817. + Whitespace;[ ];
  78818. + Text;[strong];
  78819. + Whitespace;[ ];
  78820. + Text;[tag];
  78821. + MarkupTagBlock - [86..95)::9 - [</strong>]
  78822. + MarkupTextLiteral - [86..95)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78823. + OpenAngle;[<];
  78824. + ForwardSlash;[/];
  78825. + Text;[strong];
  78826. + CloseAngle;[>];
  78827. + MarkupTagHelperEndTag - [95..99)::4
  78828. + MarkupTextLiteral - [95..99)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78829. + OpenAngle;[<];
  78830. + ForwardSlash;[/];
  78831. + Text;[p];
  78832. + CloseAngle;[>];
  78833. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithQuotelessAttributes1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithQuotelessAttributes1.stree.txt
  78834. index f9a32f65694..6ea008edb5f 100644
  78835. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithQuotelessAttributes1.stree.txt
  78836. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithQuotelessAttributes1.stree.txt
  78837. @@ -1,19 +1,54 @@
  78838. -Markup block - Gen<None> - 56 - (0:0,0)
  78839. - Tag block - Gen<TagHelper> - 56 - (0:0,0) - p - ptaghelper
  78840. - StartTagAndEndTag - <p class=foo [email protected] style=color:red;> ... </p>
  78841. - class - NoQuotes
  78842. - Markup span - Gen<Markup> - [foo] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:1
  78843. - SyntaxKind.Text;[foo];
  78844. - dynamic - DoubleQuotes
  78845. - Markup block - Gen<None> - 13 - (21:0,21)
  78846. - Markup block - Gen<DynAttr:@(21:0,21)> - 13 - (21:0,21)
  78847. - Expression block - Gen<Expr> - 13 - (21:0,21)
  78848. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:1
  78849. - SyntaxKind.Transition;[@];
  78850. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (22:0,22) - Tokens:3
  78851. - SyntaxKind.Identifier;[DateTime];
  78852. - SyntaxKind.Dot;[.];
  78853. - SyntaxKind.Identifier;[Now];
  78854. - style - NoQuotes
  78855. - Markup span - Gen<Markup> - [color:red;] - SpanEditHandler;Accepts:Any - (41:0,41) - Tokens:1
  78856. - SyntaxKind.Text;[color:red;];
  78857. +RazorDocument - [0..56)::56 - [<p class=foo [email protected] style=color:red;></p>]
  78858. + MarkupBlock - [0..56)::56
  78859. + MarkupTagHelperElement - [0..56)::56 - p[StartTagAndEndTag] - ptaghelper
  78860. + MarkupTagHelperStartTag - [0..52)::52
  78861. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78862. + OpenAngle;[<];
  78863. + Text;[p];
  78864. + MarkupTagHelperAttribute - [2..12)::10 - class - DoubleQuotes - Unbound - [ class=foo]
  78865. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78866. + Whitespace;[ ];
  78867. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78868. + Text;[class];
  78869. + Equals;[=];
  78870. + MarkupTagHelperAttributeValue - [9..12)::3
  78871. + MarkupLiteralAttributeValue - [9..12)::3 - [foo]
  78872. + MarkupTextLiteral - [9..12)::3 - [foo] - Gen<None> - SpanEditHandler;Accepts:Any
  78873. + Text;[foo];
  78874. + MarkupTagHelperAttribute - [12..34)::22 - dynamic - DoubleQuotes - Unbound - [ [email protected]]
  78875. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78876. + Whitespace;[ ];
  78877. + MarkupTextLiteral - [13..20)::7 - [dynamic] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78878. + Text;[dynamic];
  78879. + Equals;[=];
  78880. + MarkupTagHelperAttributeValue - [21..34)::13
  78881. + MarkupDynamicAttributeValue - [21..34)::13 - [@DateTime.Now]
  78882. + GenericBlock - [21..34)::13
  78883. + CSharpCodeBlock - [21..34)::13
  78884. + CSharpImplicitExpression - [21..34)::13
  78885. + CSharpTransition - [21..22)::1 - Gen<None> - SpanEditHandler;Accepts:None
  78886. + Transition;[@];
  78887. + CSharpImplicitExpressionBody - [22..34)::12
  78888. + CSharpCodeBlock - [22..34)::12
  78889. + CSharpExpressionLiteral - [22..34)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  78890. + Identifier;[DateTime];
  78891. + Dot;[.];
  78892. + Identifier;[Now];
  78893. + MarkupTagHelperAttribute - [34..51)::17 - style - DoubleQuotes - Unbound - [ style=color:red;]
  78894. + MarkupTextLiteral - [34..35)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78895. + Whitespace;[ ];
  78896. + MarkupTextLiteral - [35..40)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78897. + Text;[style];
  78898. + Equals;[=];
  78899. + MarkupTagHelperAttributeValue - [41..51)::10
  78900. + MarkupLiteralAttributeValue - [41..51)::10 - [color:red;]
  78901. + MarkupTextLiteral - [41..51)::10 - [color:red;] - Gen<None> - SpanEditHandler;Accepts:Any
  78902. + Text;[color:red;];
  78903. + MarkupTextLiteral - [51..52)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78904. + CloseAngle;[>];
  78905. + MarkupTagHelperEndTag - [52..56)::4
  78906. + MarkupTextLiteral - [52..56)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78907. + OpenAngle;[<];
  78908. + ForwardSlash;[/];
  78909. + Text;[p];
  78910. + CloseAngle;[>];
  78911. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithQuotelessAttributes2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithQuotelessAttributes2.stree.txt
  78912. index 6d146b0c300..56eec9c0068 100644
  78913. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithQuotelessAttributes2.stree.txt
  78914. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithQuotelessAttributes2.stree.txt
  78915. @@ -1,24 +1,58 @@
  78916. -Markup block - Gen<None> - 67 - (0:0,0)
  78917. - Tag block - Gen<TagHelper> - 67 - (0:0,0) - p - ptaghelper
  78918. - StartTagAndEndTag - <p class=foo [email protected] style=color:red;> ... </p>
  78919. - class - NoQuotes
  78920. - Markup span - Gen<Markup> - [foo] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:1
  78921. - SyntaxKind.Text;[foo];
  78922. - dynamic - DoubleQuotes
  78923. - Markup block - Gen<None> - 13 - (21:0,21)
  78924. - Markup block - Gen<DynAttr:@(21:0,21)> - 13 - (21:0,21)
  78925. - Expression block - Gen<Expr> - 13 - (21:0,21)
  78926. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:1
  78927. - SyntaxKind.Transition;[@];
  78928. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (22:0,22) - Tokens:3
  78929. - SyntaxKind.Identifier;[DateTime];
  78930. - SyntaxKind.Dot;[.];
  78931. - SyntaxKind.Identifier;[Now];
  78932. - style - NoQuotes
  78933. - Markup span - Gen<Markup> - [color:red;] - SpanEditHandler;Accepts:Any - (41:0,41) - Tokens:1
  78934. - SyntaxKind.Text;[color:red;];
  78935. - SyntaxKind.HtmlTextLiteral - [Hello World] - [52..63) - FullWidth: 11 - Slots: 1
  78936. - SyntaxKind.List - [Hello World] - [52..63) - FullWidth: 11 - Slots: 3
  78937. - SyntaxKind.Text;[Hello];
  78938. - SyntaxKind.Whitespace;[ ];
  78939. - SyntaxKind.Text;[World];
  78940. +RazorDocument - [0..67)::67 - [<p class=foo [email protected] style=color:red;>Hello World</p>]
  78941. + MarkupBlock - [0..67)::67
  78942. + MarkupTagHelperElement - [0..67)::67 - p[StartTagAndEndTag] - ptaghelper
  78943. + MarkupTagHelperStartTag - [0..52)::52
  78944. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78945. + OpenAngle;[<];
  78946. + Text;[p];
  78947. + MarkupTagHelperAttribute - [2..12)::10 - class - DoubleQuotes - Unbound - [ class=foo]
  78948. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78949. + Whitespace;[ ];
  78950. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78951. + Text;[class];
  78952. + Equals;[=];
  78953. + MarkupTagHelperAttributeValue - [9..12)::3
  78954. + MarkupLiteralAttributeValue - [9..12)::3 - [foo]
  78955. + MarkupTextLiteral - [9..12)::3 - [foo] - Gen<None> - SpanEditHandler;Accepts:Any
  78956. + Text;[foo];
  78957. + MarkupTagHelperAttribute - [12..34)::22 - dynamic - DoubleQuotes - Unbound - [ [email protected]]
  78958. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78959. + Whitespace;[ ];
  78960. + MarkupTextLiteral - [13..20)::7 - [dynamic] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78961. + Text;[dynamic];
  78962. + Equals;[=];
  78963. + MarkupTagHelperAttributeValue - [21..34)::13
  78964. + MarkupDynamicAttributeValue - [21..34)::13 - [@DateTime.Now]
  78965. + GenericBlock - [21..34)::13
  78966. + CSharpCodeBlock - [21..34)::13
  78967. + CSharpImplicitExpression - [21..34)::13
  78968. + CSharpTransition - [21..22)::1 - Gen<None> - SpanEditHandler;Accepts:None
  78969. + Transition;[@];
  78970. + CSharpImplicitExpressionBody - [22..34)::12
  78971. + CSharpCodeBlock - [22..34)::12
  78972. + CSharpExpressionLiteral - [22..34)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  78973. + Identifier;[DateTime];
  78974. + Dot;[.];
  78975. + Identifier;[Now];
  78976. + MarkupTagHelperAttribute - [34..51)::17 - style - DoubleQuotes - Unbound - [ style=color:red;]
  78977. + MarkupTextLiteral - [34..35)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78978. + Whitespace;[ ];
  78979. + MarkupTextLiteral - [35..40)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78980. + Text;[style];
  78981. + Equals;[=];
  78982. + MarkupTagHelperAttributeValue - [41..51)::10
  78983. + MarkupLiteralAttributeValue - [41..51)::10 - [color:red;]
  78984. + MarkupTextLiteral - [41..51)::10 - [color:red;] - Gen<None> - SpanEditHandler;Accepts:Any
  78985. + Text;[color:red;];
  78986. + MarkupTextLiteral - [51..52)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78987. + CloseAngle;[>];
  78988. + MarkupTextLiteral - [52..63)::11 - [Hello World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78989. + Text;[Hello];
  78990. + Whitespace;[ ];
  78991. + Text;[World];
  78992. + MarkupTagHelperEndTag - [63..67)::4
  78993. + MarkupTextLiteral - [63..67)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  78994. + OpenAngle;[<];
  78995. + ForwardSlash;[/];
  78996. + Text;[p];
  78997. + CloseAngle;[>];
  78998. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithQuotelessAttributes3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithQuotelessAttributes3.stree.txt
  78999. index 1d4b98a3fc9..6912e8e6e07 100644
  79000. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithQuotelessAttributes3.stree.txt
  79001. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithQuotelessAttributes3.stree.txt
  79002. @@ -1,32 +1,66 @@
  79003. -Markup block - Gen<None> - 69 - (0:0,0)
  79004. - Tag block - Gen<TagHelper> - 69 - (0:0,0) - p - ptaghelper
  79005. - StartTagAndEndTag - <p class=foo [email protected] style=color@@:red;> ... </p>
  79006. - class - NoQuotes
  79007. - Markup span - Gen<Markup> - [foo] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:1
  79008. - SyntaxKind.Text;[foo];
  79009. - dynamic - DoubleQuotes
  79010. - Markup block - Gen<None> - 13 - (21:0,21)
  79011. - Markup block - Gen<DynAttr:@(21:0,21)> - 13 - (21:0,21)
  79012. - Expression block - Gen<Expr> - 13 - (21:0,21)
  79013. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:1
  79014. - SyntaxKind.Transition;[@];
  79015. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (22:0,22) - Tokens:3
  79016. - SyntaxKind.Identifier;[DateTime];
  79017. - SyntaxKind.Dot;[.];
  79018. - SyntaxKind.Identifier;[Now];
  79019. - style - DoubleQuotes
  79020. - Markup block - Gen<None> - 12 - (41:0,41)
  79021. - Markup span - Gen<Markup> - [color] - SpanEditHandler;Accepts:Any - (41:0,41) - Tokens:1
  79022. - SyntaxKind.Text;[color];
  79023. - Markup block - Gen<None> - 2 - (46:0,46)
  79024. - Markup span - Gen<Markup> - [@] - SpanEditHandler;Accepts:None - (46:0,46) - Tokens:1
  79025. - SyntaxKind.Transition;[@];
  79026. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (47:0,47) - Tokens:1
  79027. - SyntaxKind.Transition;[@];
  79028. - Markup span - Gen<Markup> - [:red;] - SpanEditHandler;Accepts:Any - (48:0,48) - Tokens:1
  79029. - SyntaxKind.Text;[:red;];
  79030. - SyntaxKind.HtmlTextLiteral - [Hello World] - [54..65) - FullWidth: 11 - Slots: 1
  79031. - SyntaxKind.List - [Hello World] - [54..65) - FullWidth: 11 - Slots: 3
  79032. - SyntaxKind.Text;[Hello];
  79033. - SyntaxKind.Whitespace;[ ];
  79034. - SyntaxKind.Text;[World];
  79035. +RazorDocument - [0..69)::69 - [<p class=foo [email protected] style=color@@:red;>Hello World</p>]
  79036. + MarkupBlock - [0..69)::69
  79037. + MarkupTagHelperElement - [0..69)::69 - p[StartTagAndEndTag] - ptaghelper
  79038. + MarkupTagHelperStartTag - [0..54)::54
  79039. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79040. + OpenAngle;[<];
  79041. + Text;[p];
  79042. + MarkupTagHelperAttribute - [2..12)::10 - class - DoubleQuotes - Unbound - [ class=foo]
  79043. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79044. + Whitespace;[ ];
  79045. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79046. + Text;[class];
  79047. + Equals;[=];
  79048. + MarkupTagHelperAttributeValue - [9..12)::3
  79049. + MarkupLiteralAttributeValue - [9..12)::3 - [foo]
  79050. + MarkupTextLiteral - [9..12)::3 - [foo] - Gen<None> - SpanEditHandler;Accepts:Any
  79051. + Text;[foo];
  79052. + MarkupTagHelperAttribute - [12..34)::22 - dynamic - DoubleQuotes - Unbound - [ [email protected]]
  79053. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79054. + Whitespace;[ ];
  79055. + MarkupTextLiteral - [13..20)::7 - [dynamic] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79056. + Text;[dynamic];
  79057. + Equals;[=];
  79058. + MarkupTagHelperAttributeValue - [21..34)::13
  79059. + MarkupDynamicAttributeValue - [21..34)::13 - [@DateTime.Now]
  79060. + GenericBlock - [21..34)::13
  79061. + CSharpCodeBlock - [21..34)::13
  79062. + CSharpImplicitExpression - [21..34)::13
  79063. + CSharpTransition - [21..22)::1 - Gen<None> - SpanEditHandler;Accepts:None
  79064. + Transition;[@];
  79065. + CSharpImplicitExpressionBody - [22..34)::12
  79066. + CSharpCodeBlock - [22..34)::12
  79067. + CSharpExpressionLiteral - [22..34)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  79068. + Identifier;[DateTime];
  79069. + Dot;[.];
  79070. + Identifier;[Now];
  79071. + MarkupTagHelperAttribute - [34..53)::19 - style - DoubleQuotes - Unbound - [ style=color@@:red;]
  79072. + MarkupTextLiteral - [34..35)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79073. + Whitespace;[ ];
  79074. + MarkupTextLiteral - [35..40)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79075. + Text;[style];
  79076. + Equals;[=];
  79077. + MarkupTagHelperAttributeValue - [41..53)::12
  79078. + MarkupLiteralAttributeValue - [41..46)::5 - [color]
  79079. + MarkupTextLiteral - [41..46)::5 - [color] - Gen<None> - SpanEditHandler;Accepts:Any
  79080. + Text;[color];
  79081. + MarkupBlock - [46..48)::2
  79082. + MarkupTextLiteral - [46..47)::1 - [@] - Gen<LitAttr:@(46:0,46)> - SpanEditHandler;Accepts:None
  79083. + Transition;[@];
  79084. + MarkupEphemeralTextLiteral - [47..48)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  79085. + Transition;[@];
  79086. + MarkupLiteralAttributeValue - [48..53)::5 - [:red;]
  79087. + MarkupTextLiteral - [48..53)::5 - [:red;] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79088. + Text;[:red;];
  79089. + MarkupTextLiteral - [53..54)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79090. + CloseAngle;[>];
  79091. + MarkupTextLiteral - [54..65)::11 - [Hello World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79092. + Text;[Hello];
  79093. + Whitespace;[ ];
  79094. + Text;[World];
  79095. + MarkupTagHelperEndTag - [65..69)::4
  79096. + MarkupTextLiteral - [65..69)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79097. + OpenAngle;[<];
  79098. + ForwardSlash;[/];
  79099. + Text;[p];
  79100. + CloseAngle;[>];
  79101. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithQuotelessAttributes4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithQuotelessAttributes4.stree.txt
  79102. index 5286cf9b214..4912f8248fc 100644
  79103. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithQuotelessAttributes4.stree.txt
  79104. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithQuotelessAttributes4.stree.txt
  79105. @@ -1,37 +1,92 @@
  79106. -Markup block - Gen<None> - 96 - (0:0,0)
  79107. - Tag block - Gen<TagHelper> - 44 - (0:0,0) - p - ptaghelper
  79108. - StartTagAndEndTag - <p class=foo [email protected]> ... </p>
  79109. - class - NoQuotes
  79110. - Markup span - Gen<Markup> - [foo] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:1
  79111. - SyntaxKind.Text;[foo];
  79112. - dynamic - DoubleQuotes
  79113. - Markup block - Gen<None> - 13 - (21:0,21)
  79114. - Markup block - Gen<DynAttr:@(21:0,21)> - 13 - (21:0,21)
  79115. - Expression block - Gen<Expr> - 13 - (21:0,21)
  79116. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:1
  79117. - SyntaxKind.Transition;[@];
  79118. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (22:0,22) - Tokens:3
  79119. - SyntaxKind.Identifier;[DateTime];
  79120. - SyntaxKind.Dot;[.];
  79121. - SyntaxKind.Identifier;[Now];
  79122. - SyntaxKind.HtmlTextLiteral - [Hello] - [35..40) - FullWidth: 5 - Slots: 1
  79123. - SyntaxKind.Text;[Hello];
  79124. - SyntaxKind.HtmlTextLiteral - [ ] - [44..45) - FullWidth: 1 - Slots: 1
  79125. - SyntaxKind.Whitespace;[ ];
  79126. - Tag block - Gen<TagHelper> - 51 - (45:0,45) - p - ptaghelper
  79127. - StartTagAndEndTag - <p style=color:red; [email protected]> ... </p>
  79128. - style - NoQuotes
  79129. - Markup span - Gen<Markup> - [color:red;] - SpanEditHandler;Accepts:Any - (54:0,54) - Tokens:1
  79130. - SyntaxKind.Text;[color:red;];
  79131. - dynamic - DoubleQuotes
  79132. - Markup block - Gen<None> - 13 - (73:0,73)
  79133. - Markup block - Gen<DynAttr:@(73:0,73)> - 13 - (73:0,73)
  79134. - Expression block - Gen<Expr> - 13 - (73:0,73)
  79135. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (73:0,73) - Tokens:1
  79136. - SyntaxKind.Transition;[@];
  79137. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (74:0,74) - Tokens:3
  79138. - SyntaxKind.Identifier;[DateTime];
  79139. - SyntaxKind.Dot;[.];
  79140. - SyntaxKind.Identifier;[Now];
  79141. - SyntaxKind.HtmlTextLiteral - [World] - [87..92) - FullWidth: 5 - Slots: 1
  79142. - SyntaxKind.Text;[World];
  79143. +RazorDocument - [0..96)::96 - [<p class=foo [email protected]>Hello</p> <p style=color:red; [email protected]>World</p>]
  79144. + MarkupBlock - [0..96)::96
  79145. + MarkupTagHelperElement - [0..44)::44 - p[StartTagAndEndTag] - ptaghelper
  79146. + MarkupTagHelperStartTag - [0..35)::35
  79147. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79148. + OpenAngle;[<];
  79149. + Text;[p];
  79150. + MarkupTagHelperAttribute - [2..12)::10 - class - DoubleQuotes - Unbound - [ class=foo]
  79151. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79152. + Whitespace;[ ];
  79153. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79154. + Text;[class];
  79155. + Equals;[=];
  79156. + MarkupTagHelperAttributeValue - [9..12)::3
  79157. + MarkupLiteralAttributeValue - [9..12)::3 - [foo]
  79158. + MarkupTextLiteral - [9..12)::3 - [foo] - Gen<None> - SpanEditHandler;Accepts:Any
  79159. + Text;[foo];
  79160. + MarkupTagHelperAttribute - [12..34)::22 - dynamic - DoubleQuotes - Unbound - [ [email protected]]
  79161. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79162. + Whitespace;[ ];
  79163. + MarkupTextLiteral - [13..20)::7 - [dynamic] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79164. + Text;[dynamic];
  79165. + Equals;[=];
  79166. + MarkupTagHelperAttributeValue - [21..34)::13
  79167. + MarkupDynamicAttributeValue - [21..34)::13 - [@DateTime.Now]
  79168. + GenericBlock - [21..34)::13
  79169. + CSharpCodeBlock - [21..34)::13
  79170. + CSharpImplicitExpression - [21..34)::13
  79171. + CSharpTransition - [21..22)::1 - Gen<None> - SpanEditHandler;Accepts:None
  79172. + Transition;[@];
  79173. + CSharpImplicitExpressionBody - [22..34)::12
  79174. + CSharpCodeBlock - [22..34)::12
  79175. + CSharpExpressionLiteral - [22..34)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  79176. + Identifier;[DateTime];
  79177. + Dot;[.];
  79178. + Identifier;[Now];
  79179. + MarkupTextLiteral - [34..35)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79180. + CloseAngle;[>];
  79181. + MarkupTextLiteral - [35..40)::5 - [Hello] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79182. + Text;[Hello];
  79183. + MarkupTagHelperEndTag - [40..44)::4
  79184. + MarkupTextLiteral - [40..44)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79185. + OpenAngle;[<];
  79186. + ForwardSlash;[/];
  79187. + Text;[p];
  79188. + CloseAngle;[>];
  79189. + MarkupTextLiteral - [44..45)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79190. + Whitespace;[ ];
  79191. + MarkupTagHelperElement - [45..96)::51 - p[StartTagAndEndTag] - ptaghelper
  79192. + MarkupTagHelperStartTag - [45..87)::42
  79193. + MarkupTextLiteral - [45..47)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79194. + OpenAngle;[<];
  79195. + Text;[p];
  79196. + MarkupTagHelperAttribute - [47..64)::17 - style - DoubleQuotes - Unbound - [ style=color:red;]
  79197. + MarkupTextLiteral - [47..48)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79198. + Whitespace;[ ];
  79199. + MarkupTextLiteral - [48..53)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79200. + Text;[style];
  79201. + Equals;[=];
  79202. + MarkupTagHelperAttributeValue - [54..64)::10
  79203. + MarkupLiteralAttributeValue - [54..64)::10 - [color:red;]
  79204. + MarkupTextLiteral - [54..64)::10 - [color:red;] - Gen<None> - SpanEditHandler;Accepts:Any
  79205. + Text;[color:red;];
  79206. + MarkupTagHelperAttribute - [64..86)::22 - dynamic - DoubleQuotes - Unbound - [ [email protected]]
  79207. + MarkupTextLiteral - [64..65)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79208. + Whitespace;[ ];
  79209. + MarkupTextLiteral - [65..72)::7 - [dynamic] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79210. + Text;[dynamic];
  79211. + Equals;[=];
  79212. + MarkupTagHelperAttributeValue - [73..86)::13
  79213. + MarkupDynamicAttributeValue - [73..86)::13 - [@DateTime.Now]
  79214. + GenericBlock - [73..86)::13
  79215. + CSharpCodeBlock - [73..86)::13
  79216. + CSharpImplicitExpression - [73..86)::13
  79217. + CSharpTransition - [73..74)::1 - Gen<None> - SpanEditHandler;Accepts:None
  79218. + Transition;[@];
  79219. + CSharpImplicitExpressionBody - [74..86)::12
  79220. + CSharpCodeBlock - [74..86)::12
  79221. + CSharpExpressionLiteral - [74..86)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  79222. + Identifier;[DateTime];
  79223. + Dot;[.];
  79224. + Identifier;[Now];
  79225. + MarkupTextLiteral - [86..87)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79226. + CloseAngle;[>];
  79227. + MarkupTextLiteral - [87..92)::5 - [World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79228. + Text;[World];
  79229. + MarkupTagHelperEndTag - [92..96)::4
  79230. + MarkupTextLiteral - [92..96)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79231. + OpenAngle;[<];
  79232. + ForwardSlash;[/];
  79233. + Text;[p];
  79234. + CloseAngle;[>];
  79235. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithQuotelessAttributes5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithQuotelessAttributes5.stree.txt
  79236. index e7c302f52c2..48be37b33d4 100644
  79237. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithQuotelessAttributes5.stree.txt
  79238. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/TagHelperParseTreeRewriter_RewritesTagHelpersWithQuotelessAttributes5.stree.txt
  79239. @@ -1,56 +1,93 @@
  79240. -Markup block - Gen<None> - 117 - (0:0,0)
  79241. - Tag block - Gen<TagHelper> - 117 - (0:0,0) - p - ptaghelper
  79242. - StartTagAndEndTag - <p class=foo [email protected] style=color:red;> ... </p>
  79243. - class - NoQuotes
  79244. - Markup span - Gen<Markup> - [foo] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:1
  79245. - SyntaxKind.Text;[foo];
  79246. - dynamic - DoubleQuotes
  79247. - Markup block - Gen<None> - 13 - (21:0,21)
  79248. - Markup block - Gen<DynAttr:@(21:0,21)> - 13 - (21:0,21)
  79249. - Expression block - Gen<Expr> - 13 - (21:0,21)
  79250. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:1
  79251. - SyntaxKind.Transition;[@];
  79252. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (22:0,22) - Tokens:3
  79253. - SyntaxKind.Identifier;[DateTime];
  79254. - SyntaxKind.Dot;[.];
  79255. - SyntaxKind.Identifier;[Now];
  79256. - style - NoQuotes
  79257. - Markup span - Gen<Markup> - [color:red;] - SpanEditHandler;Accepts:Any - (41:0,41) - Tokens:1
  79258. - SyntaxKind.Text;[color:red;];
  79259. - SyntaxKind.HtmlTextLiteral - [Hello World ] - [52..64) - FullWidth: 12 - Slots: 1
  79260. - SyntaxKind.List - [Hello World ] - [52..64) - FullWidth: 12 - Slots: 4
  79261. - SyntaxKind.Text;[Hello];
  79262. - SyntaxKind.Whitespace;[ ];
  79263. - SyntaxKind.Text;[World];
  79264. - SyntaxKind.Whitespace;[ ];
  79265. - Tag block - Gen<None> - 20 - (64:0,64)
  79266. - Markup span - Gen<Markup> - [<strong] - SpanEditHandler;Accepts:Any - (64:0,64) - Tokens:2
  79267. - SyntaxKind.OpenAngle;[<];
  79268. - SyntaxKind.Text;[strong];
  79269. - Markup block - Gen<Attr:class, class="@(71:0,71),"@(82:0,82)> - 12 - (71:0,71)
  79270. - Markup span - Gen<None> - [ class="] - SpanEditHandler;Accepts:Any - (71:0,71) - Tokens:4
  79271. - SyntaxKind.Whitespace;[ ];
  79272. - SyntaxKind.Text;[class];
  79273. - SyntaxKind.Equals;[=];
  79274. - SyntaxKind.DoubleQuote;["];
  79275. - Markup span - Gen<LitAttr:@(79:0,79)> - [foo] - SpanEditHandler;Accepts:Any - (79:0,79) - Tokens:1
  79276. - SyntaxKind.Text;[foo];
  79277. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (82:0,82) - Tokens:1
  79278. - SyntaxKind.DoubleQuote;["];
  79279. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (83:0,83) - Tokens:1
  79280. - SyntaxKind.CloseAngle;[>];
  79281. - SyntaxKind.HtmlTextLiteral - [inside of strong tag] - [84..104) - FullWidth: 20 - Slots: 1
  79282. - SyntaxKind.List - [inside of strong tag] - [84..104) - FullWidth: 20 - Slots: 7
  79283. - SyntaxKind.Text;[inside];
  79284. - SyntaxKind.Whitespace;[ ];
  79285. - SyntaxKind.Text;[of];
  79286. - SyntaxKind.Whitespace;[ ];
  79287. - SyntaxKind.Text;[strong];
  79288. - SyntaxKind.Whitespace;[ ];
  79289. - SyntaxKind.Text;[tag];
  79290. - Tag block - Gen<None> - 9 - (104:0,104)
  79291. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (104:0,104) - Tokens:4
  79292. - SyntaxKind.OpenAngle;[<];
  79293. - SyntaxKind.ForwardSlash;[/];
  79294. - SyntaxKind.Text;[strong];
  79295. - SyntaxKind.CloseAngle;[>];
  79296. +RazorDocument - [0..117)::117 - [<p class=foo [email protected] style=color:red;>Hello World <strong class="foo">inside of strong tag</strong></p>]
  79297. + MarkupBlock - [0..117)::117
  79298. + MarkupTagHelperElement - [0..117)::117 - p[StartTagAndEndTag] - ptaghelper
  79299. + MarkupTagHelperStartTag - [0..52)::52
  79300. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79301. + OpenAngle;[<];
  79302. + Text;[p];
  79303. + MarkupTagHelperAttribute - [2..12)::10 - class - DoubleQuotes - Unbound - [ class=foo]
  79304. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79305. + Whitespace;[ ];
  79306. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79307. + Text;[class];
  79308. + Equals;[=];
  79309. + MarkupTagHelperAttributeValue - [9..12)::3
  79310. + MarkupLiteralAttributeValue - [9..12)::3 - [foo]
  79311. + MarkupTextLiteral - [9..12)::3 - [foo] - Gen<None> - SpanEditHandler;Accepts:Any
  79312. + Text;[foo];
  79313. + MarkupTagHelperAttribute - [12..34)::22 - dynamic - DoubleQuotes - Unbound - [ [email protected]]
  79314. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79315. + Whitespace;[ ];
  79316. + MarkupTextLiteral - [13..20)::7 - [dynamic] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79317. + Text;[dynamic];
  79318. + Equals;[=];
  79319. + MarkupTagHelperAttributeValue - [21..34)::13
  79320. + MarkupDynamicAttributeValue - [21..34)::13 - [@DateTime.Now]
  79321. + GenericBlock - [21..34)::13
  79322. + CSharpCodeBlock - [21..34)::13
  79323. + CSharpImplicitExpression - [21..34)::13
  79324. + CSharpTransition - [21..22)::1 - Gen<None> - SpanEditHandler;Accepts:None
  79325. + Transition;[@];
  79326. + CSharpImplicitExpressionBody - [22..34)::12
  79327. + CSharpCodeBlock - [22..34)::12
  79328. + CSharpExpressionLiteral - [22..34)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  79329. + Identifier;[DateTime];
  79330. + Dot;[.];
  79331. + Identifier;[Now];
  79332. + MarkupTagHelperAttribute - [34..51)::17 - style - DoubleQuotes - Unbound - [ style=color:red;]
  79333. + MarkupTextLiteral - [34..35)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79334. + Whitespace;[ ];
  79335. + MarkupTextLiteral - [35..40)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79336. + Text;[style];
  79337. + Equals;[=];
  79338. + MarkupTagHelperAttributeValue - [41..51)::10
  79339. + MarkupLiteralAttributeValue - [41..51)::10 - [color:red;]
  79340. + MarkupTextLiteral - [41..51)::10 - [color:red;] - Gen<None> - SpanEditHandler;Accepts:Any
  79341. + Text;[color:red;];
  79342. + MarkupTextLiteral - [51..52)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79343. + CloseAngle;[>];
  79344. + MarkupTextLiteral - [52..64)::12 - [Hello World ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79345. + Text;[Hello];
  79346. + Whitespace;[ ];
  79347. + Text;[World];
  79348. + Whitespace;[ ];
  79349. + MarkupTagBlock - [64..84)::20 - [<strong class="foo">]
  79350. + MarkupTextLiteral - [64..71)::7 - [<strong] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79351. + OpenAngle;[<];
  79352. + Text;[strong];
  79353. + MarkupAttributeBlock - [71..83)::12 - [ class="foo"]
  79354. + MarkupTextLiteral - [71..72)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79355. + Whitespace;[ ];
  79356. + MarkupTextLiteral - [72..77)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79357. + Text;[class];
  79358. + Equals;[=];
  79359. + MarkupTextLiteral - [78..79)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  79360. + DoubleQuote;["];
  79361. + GenericBlock - [79..82)::3
  79362. + MarkupLiteralAttributeValue - [79..82)::3 - [foo]
  79363. + MarkupTextLiteral - [79..82)::3 - [foo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79364. + Text;[foo];
  79365. + MarkupTextLiteral - [82..83)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  79366. + DoubleQuote;["];
  79367. + MarkupTextLiteral - [83..84)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79368. + CloseAngle;[>];
  79369. + MarkupTextLiteral - [84..104)::20 - [inside of strong tag] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79370. + Text;[inside];
  79371. + Whitespace;[ ];
  79372. + Text;[of];
  79373. + Whitespace;[ ];
  79374. + Text;[strong];
  79375. + Whitespace;[ ];
  79376. + Text;[tag];
  79377. + MarkupTagBlock - [104..113)::9 - [</strong>]
  79378. + MarkupTextLiteral - [104..113)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79379. + OpenAngle;[<];
  79380. + ForwardSlash;[/];
  79381. + Text;[strong];
  79382. + CloseAngle;[>];
  79383. + MarkupTagHelperEndTag - [113..117)::4
  79384. + MarkupTextLiteral - [113..117)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79385. + OpenAngle;[<];
  79386. + ForwardSlash;[/];
  79387. + Text;[p];
  79388. + CloseAngle;[>];
  79389. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers1.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers1.cspans.txt
  79390. index e69de29bb2d..92e6c778c69 100644
  79391. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers1.cspans.txt
  79392. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers1.cspans.txt
  79393. @@ -0,0 +1 @@
  79394. +Markup span at (10:0,10 [0] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [16] )
  79395. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers1.stree.txt
  79396. index a855effb2e2..a1f4e346c97 100644
  79397. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers1.stree.txt
  79398. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers1.stree.txt
  79399. @@ -1,5 +1,27 @@
  79400. -Markup block - Gen<None> - 16 - (0:0,0)
  79401. - Tag block - Gen<TagHelper> - 16 - (0:0,0) - p - ptaghelper
  79402. - StartTagAndEndTag - <p class=""> ... </p>
  79403. - class - DoubleQuotes
  79404. - Markup block - Gen<None> - 0 - (0:0,0)
  79405. +RazorDocument - [0..16)::16 - [<p class=""></p>]
  79406. + MarkupBlock - [0..16)::16
  79407. + MarkupTagHelperElement - [0..16)::16 - p[StartTagAndEndTag] - ptaghelper
  79408. + MarkupTagHelperStartTag - [0..12)::12
  79409. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79410. + OpenAngle;[<];
  79411. + Text;[p];
  79412. + MarkupTagHelperAttribute - [2..11)::9 - class - DoubleQuotes - Unbound - [ class=""]
  79413. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79414. + Whitespace;[ ];
  79415. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79416. + Text;[class];
  79417. + Equals;[=];
  79418. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  79419. + DoubleQuote;["];
  79420. + MarkupTagHelperAttributeValue - [10..10)::0
  79421. + MarkupTextLiteral - [10..10)::0 - []
  79422. + MarkupTextLiteral - [10..11)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  79423. + DoubleQuote;["];
  79424. + MarkupTextLiteral - [11..12)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79425. + CloseAngle;[>];
  79426. + MarkupTagHelperEndTag - [12..16)::4
  79427. + MarkupTextLiteral - [12..16)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79428. + OpenAngle;[<];
  79429. + ForwardSlash;[/];
  79430. + Text;[p];
  79431. + CloseAngle;[>];
  79432. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers2.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers2.cspans.txt
  79433. index e69de29bb2d..92e6c778c69 100644
  79434. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers2.cspans.txt
  79435. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers2.cspans.txt
  79436. @@ -0,0 +1 @@
  79437. +Markup span at (10:0,10 [0] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [16] )
  79438. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers2.stree.txt
  79439. index bb2bf1ba66c..1fb1c603d76 100644
  79440. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers2.stree.txt
  79441. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers2.stree.txt
  79442. @@ -1,5 +1,27 @@
  79443. -Markup block - Gen<None> - 16 - (0:0,0)
  79444. - Tag block - Gen<TagHelper> - 16 - (0:0,0) - p - ptaghelper
  79445. - StartTagAndEndTag - <p class=''> ... </p>
  79446. - class - SingleQuotes
  79447. - Markup block - Gen<None> - 0 - (0:0,0)
  79448. +RazorDocument - [0..16)::16 - [<p class=''></p>]
  79449. + MarkupBlock - [0..16)::16
  79450. + MarkupTagHelperElement - [0..16)::16 - p[StartTagAndEndTag] - ptaghelper
  79451. + MarkupTagHelperStartTag - [0..12)::12
  79452. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79453. + OpenAngle;[<];
  79454. + Text;[p];
  79455. + MarkupTagHelperAttribute - [2..11)::9 - class - SingleQuotes - Unbound - [ class='']
  79456. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79457. + Whitespace;[ ];
  79458. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79459. + Text;[class];
  79460. + Equals;[=];
  79461. + MarkupTextLiteral - [9..10)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  79462. + SingleQuote;['];
  79463. + MarkupTagHelperAttributeValue - [10..10)::0
  79464. + MarkupTextLiteral - [10..10)::0 - []
  79465. + MarkupTextLiteral - [10..11)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  79466. + SingleQuote;['];
  79467. + MarkupTextLiteral - [11..12)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79468. + CloseAngle;[>];
  79469. + MarkupTagHelperEndTag - [12..16)::4
  79470. + MarkupTextLiteral - [12..16)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79471. + OpenAngle;[<];
  79472. + ForwardSlash;[/];
  79473. + Text;[p];
  79474. + CloseAngle;[>];
  79475. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers3.stree.txt
  79476. index a81595cb331..e64fe16348c 100644
  79477. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers3.stree.txt
  79478. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers3.stree.txt
  79479. @@ -1,5 +1,23 @@
  79480. -Markup block - Gen<None> - 14 - (0:0,0)
  79481. - Tag block - Gen<TagHelper> - 14 - (0:0,0) - p - ptaghelper
  79482. - StartTagAndEndTag - <p class=> ... </p>
  79483. - class - DoubleQuotes
  79484. - Markup span - Gen<None> - [] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:0
  79485. +RazorDocument - [0..14)::14 - [<p class=></p>]
  79486. + MarkupBlock - [0..14)::14
  79487. + MarkupTagHelperElement - [0..14)::14 - p[StartTagAndEndTag] - ptaghelper
  79488. + MarkupTagHelperStartTag - [0..10)::10
  79489. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79490. + OpenAngle;[<];
  79491. + Text;[p];
  79492. + MarkupTagHelperAttribute - [2..9)::7 - class - DoubleQuotes - Unbound - [ class=]
  79493. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79494. + Whitespace;[ ];
  79495. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79496. + Text;[class];
  79497. + Equals;[=];
  79498. + MarkupTagHelperAttributeValue - [9..9)::0
  79499. + MarkupTextLiteral - [9..9)::0 - []
  79500. + MarkupTextLiteral - [9..10)::1 - [>] - Gen<None> - SpanEditHandler;Accepts:Any
  79501. + CloseAngle;[>];
  79502. + MarkupTagHelperEndTag - [10..14)::4
  79503. + MarkupTextLiteral - [10..14)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79504. + OpenAngle;[<];
  79505. + ForwardSlash;[/];
  79506. + Text;[p];
  79507. + CloseAngle;[>];
  79508. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers4.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers4.cspans.txt
  79509. index 9d88d89f4d8..eeee563c5d1 100644
  79510. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers4.cspans.txt
  79511. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers4.cspans.txt
  79512. @@ -1 +1,3 @@
  79513. +Markup span at (11:0,11 [0] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [33] )
  79514. Markup span at (20:0,20 [0] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [33] )
  79515. +Markup span at (29:0,29 [0] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [33] )
  79516. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers4.stree.txt
  79517. index 744c39ad6e9..6916bd352af 100644
  79518. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers4.stree.txt
  79519. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers4.stree.txt
  79520. @@ -1,9 +1,43 @@
  79521. -Markup block - Gen<None> - 33 - (0:0,0)
  79522. - Tag block - Gen<TagHelper> - 33 - (0:0,0) - p - ptaghelper
  79523. - SelfClosing - <p class1='' class2= class3="" />
  79524. - class1 - SingleQuotes
  79525. - Markup block - Gen<None> - 0 - (0:0,0)
  79526. - class2 - DoubleQuotes
  79527. - Markup span - Gen<None> - [] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:0
  79528. - class3 - DoubleQuotes
  79529. - Markup block - Gen<None> - 0 - (0:0,0)
  79530. +RazorDocument - [0..33)::33 - [<p class1='' class2= class3="" />]
  79531. + MarkupBlock - [0..33)::33
  79532. + MarkupTagHelperElement - [0..33)::33 - p[SelfClosing] - ptaghelper
  79533. + MarkupTagHelperStartTag - [0..33)::33
  79534. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79535. + OpenAngle;[<];
  79536. + Text;[p];
  79537. + MarkupTagHelperAttribute - [2..12)::10 - class1 - SingleQuotes - Unbound - [ class1='']
  79538. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79539. + Whitespace;[ ];
  79540. + MarkupTextLiteral - [3..9)::6 - [class1] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79541. + Text;[class1];
  79542. + Equals;[=];
  79543. + MarkupTextLiteral - [10..11)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  79544. + SingleQuote;['];
  79545. + MarkupTagHelperAttributeValue - [11..11)::0
  79546. + MarkupTextLiteral - [11..11)::0 - []
  79547. + MarkupTextLiteral - [11..12)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  79548. + SingleQuote;['];
  79549. + MarkupTagHelperAttribute - [12..20)::8 - class2 - DoubleQuotes - Unbound - [ class2=]
  79550. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79551. + Whitespace;[ ];
  79552. + MarkupTextLiteral - [13..19)::6 - [class2] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79553. + Text;[class2];
  79554. + Equals;[=];
  79555. + MarkupTagHelperAttributeValue - [20..20)::0
  79556. + MarkupTextLiteral - [20..20)::0 - []
  79557. + MarkupTagHelperAttribute - [20..30)::10 - class3 - DoubleQuotes - Unbound - [ class3=""]
  79558. + MarkupTextLiteral - [20..21)::1 - [ ] - Gen<None> - SpanEditHandler;Accepts:Any
  79559. + Whitespace;[ ];
  79560. + MarkupTextLiteral - [21..27)::6 - [class3] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79561. + Text;[class3];
  79562. + Equals;[=];
  79563. + MarkupTextLiteral - [28..29)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  79564. + DoubleQuote;["];
  79565. + MarkupTagHelperAttributeValue - [29..29)::0
  79566. + MarkupTextLiteral - [29..29)::0 - []
  79567. + MarkupTextLiteral - [29..30)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  79568. + DoubleQuote;["];
  79569. + MarkupTextLiteral - [30..33)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79570. + Whitespace;[ ];
  79571. + ForwardSlash;[/];
  79572. + CloseAngle;[>];
  79573. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers5.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers5.cspans.txt
  79574. index 8bfb2008370..7b54ebc00dc 100644
  79575. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers5.cspans.txt
  79576. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers5.cspans.txt
  79577. @@ -1 +1,3 @@
  79578. +Markup span at (11:0,11 [0] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [31] )
  79579. +Markup span at (20:0,20 [0] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [31] )
  79580. Markup span at (28:0,28 [0] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [31] )
  79581. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers5.stree.txt
  79582. index 728b1f691cd..5f595ff66b6 100644
  79583. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers5.stree.txt
  79584. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsEmptyAttributeTagHelpers5.stree.txt
  79585. @@ -1,9 +1,39 @@
  79586. -Markup block - Gen<None> - 31 - (0:0,0)
  79587. - Tag block - Gen<TagHelper> - 31 - (0:0,0) - p - ptaghelper
  79588. - SelfClosing - <p class1=''class2=""class3= />
  79589. - class1 - SingleQuotes
  79590. - Markup block - Gen<None> - 0 - (0:0,0)
  79591. - class2 - DoubleQuotes
  79592. - Markup block - Gen<None> - 0 - (0:0,0)
  79593. - class3 - DoubleQuotes
  79594. - Markup span - Gen<None> - [] - SpanEditHandler;Accepts:Any - (28:0,28) - Tokens:0
  79595. +RazorDocument - [0..31)::31 - [<p class1=''class2=""class3= />]
  79596. + MarkupBlock - [0..31)::31
  79597. + MarkupTagHelperElement - [0..31)::31 - p[SelfClosing] - ptaghelper
  79598. + MarkupTagHelperStartTag - [0..31)::31
  79599. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79600. + OpenAngle;[<];
  79601. + Text;[p];
  79602. + MarkupTagHelperAttribute - [2..12)::10 - class1 - SingleQuotes - Unbound - [ class1='']
  79603. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79604. + Whitespace;[ ];
  79605. + MarkupTextLiteral - [3..9)::6 - [class1] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79606. + Text;[class1];
  79607. + Equals;[=];
  79608. + MarkupTextLiteral - [10..11)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  79609. + SingleQuote;['];
  79610. + MarkupTagHelperAttributeValue - [11..11)::0
  79611. + MarkupTextLiteral - [11..11)::0 - []
  79612. + MarkupTextLiteral - [11..12)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  79613. + SingleQuote;['];
  79614. + MarkupTagHelperAttribute - [12..21)::9 - class2 - DoubleQuotes - Unbound - [class2=""]
  79615. + MarkupTextLiteral - [12..18)::6 - [class2] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79616. + Text;[class2];
  79617. + Equals;[=];
  79618. + MarkupTextLiteral - [19..20)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  79619. + DoubleQuote;["];
  79620. + MarkupTagHelperAttributeValue - [20..20)::0
  79621. + MarkupTextLiteral - [20..20)::0 - []
  79622. + MarkupTextLiteral - [20..21)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  79623. + DoubleQuote;["];
  79624. + MarkupTagHelperAttribute - [21..28)::7 - class3 - DoubleQuotes - Unbound - [class3=]
  79625. + MarkupTextLiteral - [21..27)::6 - [class3] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79626. + Text;[class3];
  79627. + Equals;[=];
  79628. + MarkupTagHelperAttributeValue - [28..28)::0
  79629. + MarkupTextLiteral - [28..28)::0 - []
  79630. + MarkupTextLiteral - [28..31)::3 - [ />] - Gen<None> - SpanEditHandler;Accepts:Any
  79631. + Whitespace;[ ];
  79632. + ForwardSlash;[/];
  79633. + CloseAngle;[>];
  79634. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block1.stree.txt
  79635. index a813cc962e0..241cad1812a 100644
  79636. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block1.stree.txt
  79637. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block1.stree.txt
  79638. @@ -1,18 +1,33 @@
  79639. -Markup block - Gen<None> - 29 - (0:0,0)
  79640. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  79641. - SyntaxKind.Unknown;[];
  79642. - Statement block - Gen<None> - 29 - (0:0,0)
  79643. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  79644. - SyntaxKind.Transition;[@];
  79645. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  79646. - SyntaxKind.LeftBrace;[{];
  79647. - Markup block - Gen<None> - 26 - (2:0,2)
  79648. - Tag block - Gen<TagHelper> - 26 - (2:0,2) - input - InputTagHelper1 - InputTagHelper3
  79649. - SelfClosing - <input unbound-required />
  79650. - unbound-required - Minimized
  79651. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (28:0,28) - Tokens:1
  79652. - SyntaxKind.Unknown;[];
  79653. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (28:0,28) - Tokens:1
  79654. - SyntaxKind.RightBrace;[}];
  79655. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (29:0,29) - Tokens:1
  79656. - SyntaxKind.Unknown;[];
  79657. +RazorDocument - [0..29)::29 - [@{<input unbound-required />}]
  79658. + MarkupBlock - [0..29)::29
  79659. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79660. + Marker;[];
  79661. + CSharpCodeBlock - [0..29)::29
  79662. + CSharpStatement - [0..29)::29
  79663. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  79664. + Transition;[@];
  79665. + CSharpStatementBody - [1..29)::28
  79666. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  79667. + LeftBrace;[{];
  79668. + CSharpCodeBlock - [2..28)::26
  79669. + MarkupBlock - [2..28)::26
  79670. + MarkupTagHelperElement - [2..28)::26 - input[SelfClosing] - InputTagHelper1 - InputTagHelper3
  79671. + MarkupTagHelperStartTag - [2..28)::26
  79672. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79673. + OpenAngle;[<];
  79674. + Text;[input];
  79675. + MarkupMinimizedTagHelperAttribute - [8..25)::17 - unbound-required - Minimized - Unbound - [ unbound-required]
  79676. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79677. + Whitespace;[ ];
  79678. + MarkupTextLiteral - [9..25)::16 - [unbound-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79679. + Text;[unbound-required];
  79680. + MarkupTextLiteral - [25..28)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  79681. + Whitespace;[ ];
  79682. + ForwardSlash;[/];
  79683. + CloseAngle;[>];
  79684. + CSharpStatementLiteral - [28..28)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  79685. + Marker;[];
  79686. + RazorMetaCode - [28..29)::1 - Gen<None> - SpanEditHandler;Accepts:None
  79687. + RightBrace;[}];
  79688. + MarkupTextLiteral - [29..29)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79689. + Marker;[];
  79690. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block10.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block10.stree.txt
  79691. index 18c001c11fe..2064d740602 100644
  79692. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block10.stree.txt
  79693. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block10.stree.txt
  79694. @@ -1,18 +1,32 @@
  79695. -Markup block - Gen<None> - 28 - (0:0,0)
  79696. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  79697. - SyntaxKind.Unknown;[];
  79698. - Statement block - Gen<None> - 28 - (0:0,0)
  79699. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  79700. - SyntaxKind.Transition;[@];
  79701. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  79702. - SyntaxKind.LeftBrace;[{];
  79703. - Markup block - Gen<None> - 25 - (2:0,2)
  79704. - Tag block - Gen<TagHelper> - 25 - (2:0,2) - input - InputTagHelper3
  79705. - SelfClosing - <input int-prefix-value/>
  79706. - int-prefix-value - Minimized
  79707. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (27:0,27) - Tokens:1
  79708. - SyntaxKind.Unknown;[];
  79709. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (27:0,27) - Tokens:1
  79710. - SyntaxKind.RightBrace;[}];
  79711. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (28:0,28) - Tokens:1
  79712. - SyntaxKind.Unknown;[];
  79713. +RazorDocument - [0..28)::28 - [@{<input int-prefix-value/>}]
  79714. + MarkupBlock - [0..28)::28
  79715. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79716. + Marker;[];
  79717. + CSharpCodeBlock - [0..28)::28
  79718. + CSharpStatement - [0..28)::28
  79719. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  79720. + Transition;[@];
  79721. + CSharpStatementBody - [1..28)::27
  79722. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  79723. + LeftBrace;[{];
  79724. + CSharpCodeBlock - [2..27)::25
  79725. + MarkupBlock - [2..27)::25
  79726. + MarkupTagHelperElement - [2..27)::25 - input[SelfClosing] - InputTagHelper3
  79727. + MarkupTagHelperStartTag - [2..27)::25
  79728. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79729. + OpenAngle;[<];
  79730. + Text;[input];
  79731. + MarkupMinimizedTagHelperAttribute - [8..25)::17 - int-prefix-value - Minimized - Bound - [ int-prefix-value]
  79732. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79733. + Whitespace;[ ];
  79734. + MarkupTextLiteral - [9..25)::16 - [int-prefix-value] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79735. + Text;[int-prefix-value];
  79736. + MarkupTextLiteral - [25..27)::2 - [/>] - Gen<Markup> - SpanEditHandler;Accepts:None
  79737. + ForwardSlash;[/];
  79738. + CloseAngle;[>];
  79739. + CSharpStatementLiteral - [27..27)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  79740. + Marker;[];
  79741. + RazorMetaCode - [27..28)::1 - Gen<None> - SpanEditHandler;Accepts:None
  79742. + RightBrace;[}];
  79743. + MarkupTextLiteral - [28..28)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79744. + Marker;[];
  79745. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block11.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block11.stree.txt
  79746. index 3fbac254e5d..a8e8450ee85 100644
  79747. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block11.stree.txt
  79748. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block11.stree.txt
  79749. @@ -1,18 +1,33 @@
  79750. -Markup block - Gen<None> - 32 - (0:0,0)
  79751. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  79752. - SyntaxKind.Unknown;[];
  79753. - Statement block - Gen<None> - 32 - (0:0,0)
  79754. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  79755. - SyntaxKind.Transition;[@];
  79756. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  79757. - SyntaxKind.LeftBrace;[{];
  79758. - Markup block - Gen<None> - 29 - (2:0,2)
  79759. - Tag block - Gen<TagHelper> - 29 - (2:0,2) - input - InputTagHelper3
  79760. - SelfClosing - <input string-prefix-value />
  79761. - string-prefix-value - Minimized
  79762. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (31:0,31) - Tokens:1
  79763. - SyntaxKind.Unknown;[];
  79764. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (31:0,31) - Tokens:1
  79765. - SyntaxKind.RightBrace;[}];
  79766. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (32:0,32) - Tokens:1
  79767. - SyntaxKind.Unknown;[];
  79768. +RazorDocument - [0..32)::32 - [@{<input string-prefix-value />}]
  79769. + MarkupBlock - [0..32)::32
  79770. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79771. + Marker;[];
  79772. + CSharpCodeBlock - [0..32)::32
  79773. + CSharpStatement - [0..32)::32
  79774. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  79775. + Transition;[@];
  79776. + CSharpStatementBody - [1..32)::31
  79777. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  79778. + LeftBrace;[{];
  79779. + CSharpCodeBlock - [2..31)::29
  79780. + MarkupBlock - [2..31)::29
  79781. + MarkupTagHelperElement - [2..31)::29 - input[SelfClosing] - InputTagHelper3
  79782. + MarkupTagHelperStartTag - [2..31)::29
  79783. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79784. + OpenAngle;[<];
  79785. + Text;[input];
  79786. + MarkupMinimizedTagHelperAttribute - [8..28)::20 - string-prefix-value - Minimized - Bound - [ string-prefix-value]
  79787. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79788. + Whitespace;[ ];
  79789. + MarkupTextLiteral - [9..28)::19 - [string-prefix-value] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79790. + Text;[string-prefix-value];
  79791. + MarkupTextLiteral - [28..31)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  79792. + Whitespace;[ ];
  79793. + ForwardSlash;[/];
  79794. + CloseAngle;[>];
  79795. + CSharpStatementLiteral - [31..31)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  79796. + Marker;[];
  79797. + RazorMetaCode - [31..32)::1 - Gen<None> - SpanEditHandler;Accepts:None
  79798. + RightBrace;[}];
  79799. + MarkupTextLiteral - [32..32)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79800. + Marker;[];
  79801. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block12.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block12.cspans.txt
  79802. index a9bbc9d9b68..37fd3df8138 100644
  79803. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block12.cspans.txt
  79804. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block12.cspans.txt
  79805. @@ -1,6 +1,7 @@
  79806. Markup span at (0:0,0 [0] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [32] )
  79807. Transition span at (0:0,0 [1] ) (Accepts:None) - Parent: Statement block at (0:0,0 [32] )
  79808. MetaCode span at (1:0,1 [1] ) (Accepts:None) - Parent: Statement block at (0:0,0 [32] )
  79809. +Code span at (27:0,27 [0] ) (Accepts:AnyExceptNewline) - Parent: Tag block at (2:0,2 [29] )
  79810. Code span at (31:0,31 [0] ) (Accepts:Any) - Parent: Statement block at (0:0,0 [32] )
  79811. MetaCode span at (31:0,31 [1] ) (Accepts:None) - Parent: Statement block at (0:0,0 [32] )
  79812. Markup span at (32:0,32 [0] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [32] )
  79813. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block12.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block12.stree.txt
  79814. index 11f738be5fc..9b025d20984 100644
  79815. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block12.stree.txt
  79816. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block12.stree.txt
  79817. @@ -1,19 +1,40 @@
  79818. -Markup block - Gen<None> - 32 - (0:0,0)
  79819. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  79820. - SyntaxKind.Unknown;[];
  79821. - Statement block - Gen<None> - 32 - (0:0,0)
  79822. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  79823. - SyntaxKind.Transition;[@];
  79824. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  79825. - SyntaxKind.LeftBrace;[{];
  79826. - Markup block - Gen<None> - 29 - (2:0,2)
  79827. - Tag block - Gen<TagHelper> - 29 - (2:0,2) - input - InputTagHelper3
  79828. - SelfClosing - <input int-prefix-value='' />
  79829. - int-prefix-value - SingleQuotes
  79830. - Markup block - Gen<None> - 0 - (0:0,0)
  79831. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (31:0,31) - Tokens:1
  79832. - SyntaxKind.Unknown;[];
  79833. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (31:0,31) - Tokens:1
  79834. - SyntaxKind.RightBrace;[}];
  79835. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (32:0,32) - Tokens:1
  79836. - SyntaxKind.Unknown;[];
  79837. +RazorDocument - [0..32)::32 - [@{<input int-prefix-value='' />}]
  79838. + MarkupBlock - [0..32)::32
  79839. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79840. + Marker;[];
  79841. + CSharpCodeBlock - [0..32)::32
  79842. + CSharpStatement - [0..32)::32
  79843. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  79844. + Transition;[@];
  79845. + CSharpStatementBody - [1..32)::31
  79846. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  79847. + LeftBrace;[{];
  79848. + CSharpCodeBlock - [2..31)::29
  79849. + MarkupBlock - [2..31)::29
  79850. + MarkupTagHelperElement - [2..31)::29 - input[SelfClosing] - InputTagHelper3
  79851. + MarkupTagHelperStartTag - [2..31)::29
  79852. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79853. + OpenAngle;[<];
  79854. + Text;[input];
  79855. + MarkupTagHelperAttribute - [8..28)::20 - int-prefix-value - SingleQuotes - Bound - [ int-prefix-value='']
  79856. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79857. + Whitespace;[ ];
  79858. + MarkupTextLiteral - [9..25)::16 - [int-prefix-value] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79859. + Text;[int-prefix-value];
  79860. + Equals;[=];
  79861. + MarkupTextLiteral - [26..27)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  79862. + SingleQuote;['];
  79863. + MarkupTagHelperAttributeValue - [27..27)::0
  79864. + CSharpExpressionLiteral - [27..27)::0 - [] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  79865. + MarkupTextLiteral - [27..28)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  79866. + SingleQuote;['];
  79867. + MarkupTextLiteral - [28..31)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  79868. + Whitespace;[ ];
  79869. + ForwardSlash;[/];
  79870. + CloseAngle;[>];
  79871. + CSharpStatementLiteral - [31..31)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  79872. + Marker;[];
  79873. + RazorMetaCode - [31..32)::1 - Gen<None> - SpanEditHandler;Accepts:None
  79874. + RightBrace;[}];
  79875. + MarkupTextLiteral - [32..32)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79876. + Marker;[];
  79877. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block13.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block13.cspans.txt
  79878. index 1b7db58ccc3..dfa5d6b255e 100644
  79879. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block13.cspans.txt
  79880. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block13.cspans.txt
  79881. @@ -1,6 +1,7 @@
  79882. Markup span at (0:0,0 [0] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [34] )
  79883. Transition span at (0:0,0 [1] ) (Accepts:None) - Parent: Statement block at (0:0,0 [34] )
  79884. MetaCode span at (1:0,1 [1] ) (Accepts:None) - Parent: Statement block at (0:0,0 [34] )
  79885. +Markup span at (30:0,30 [0] ) (Accepts:Any) - Parent: Tag block at (2:0,2 [31] )
  79886. Code span at (33:0,33 [0] ) (Accepts:Any) - Parent: Statement block at (0:0,0 [34] )
  79887. MetaCode span at (33:0,33 [1] ) (Accepts:None) - Parent: Statement block at (0:0,0 [34] )
  79888. Markup span at (34:0,34 [0] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [34] )
  79889. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block13.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block13.stree.txt
  79890. index a0dba460ff8..a945b9f6fbc 100644
  79891. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block13.stree.txt
  79892. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block13.stree.txt
  79893. @@ -1,19 +1,39 @@
  79894. -Markup block - Gen<None> - 34 - (0:0,0)
  79895. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  79896. - SyntaxKind.Unknown;[];
  79897. - Statement block - Gen<None> - 34 - (0:0,0)
  79898. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  79899. - SyntaxKind.Transition;[@];
  79900. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  79901. - SyntaxKind.LeftBrace;[{];
  79902. - Markup block - Gen<None> - 31 - (2:0,2)
  79903. - Tag block - Gen<TagHelper> - 31 - (2:0,2) - input - InputTagHelper3
  79904. - SelfClosing - <input string-prefix-value=''/>
  79905. - string-prefix-value - SingleQuotes
  79906. - Markup block - Gen<None> - 0 - (0:0,0)
  79907. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (33:0,33) - Tokens:1
  79908. - SyntaxKind.Unknown;[];
  79909. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (33:0,33) - Tokens:1
  79910. - SyntaxKind.RightBrace;[}];
  79911. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (34:0,34) - Tokens:1
  79912. - SyntaxKind.Unknown;[];
  79913. +RazorDocument - [0..34)::34 - [@{<input string-prefix-value=''/>}]
  79914. + MarkupBlock - [0..34)::34
  79915. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79916. + Marker;[];
  79917. + CSharpCodeBlock - [0..34)::34
  79918. + CSharpStatement - [0..34)::34
  79919. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  79920. + Transition;[@];
  79921. + CSharpStatementBody - [1..34)::33
  79922. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  79923. + LeftBrace;[{];
  79924. + CSharpCodeBlock - [2..33)::31
  79925. + MarkupBlock - [2..33)::31
  79926. + MarkupTagHelperElement - [2..33)::31 - input[SelfClosing] - InputTagHelper3
  79927. + MarkupTagHelperStartTag - [2..33)::31
  79928. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79929. + OpenAngle;[<];
  79930. + Text;[input];
  79931. + MarkupTagHelperAttribute - [8..31)::23 - string-prefix-value - SingleQuotes - Bound - [ string-prefix-value='']
  79932. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79933. + Whitespace;[ ];
  79934. + MarkupTextLiteral - [9..28)::19 - [string-prefix-value] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79935. + Text;[string-prefix-value];
  79936. + Equals;[=];
  79937. + MarkupTextLiteral - [29..30)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  79938. + SingleQuote;['];
  79939. + MarkupTagHelperAttributeValue - [30..30)::0
  79940. + MarkupTextLiteral - [30..30)::0 - []
  79941. + MarkupTextLiteral - [30..31)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  79942. + SingleQuote;['];
  79943. + MarkupTextLiteral - [31..33)::2 - [/>] - Gen<Markup> - SpanEditHandler;Accepts:None
  79944. + ForwardSlash;[/];
  79945. + CloseAngle;[>];
  79946. + CSharpStatementLiteral - [33..33)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  79947. + Marker;[];
  79948. + RazorMetaCode - [33..34)::1 - Gen<None> - SpanEditHandler;Accepts:None
  79949. + RightBrace;[}];
  79950. + MarkupTextLiteral - [34..34)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79951. + Marker;[];
  79952. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block14.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block14.stree.txt
  79953. index 1e353afdef3..1eb4764b8e7 100644
  79954. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block14.stree.txt
  79955. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block14.stree.txt
  79956. @@ -1,20 +1,40 @@
  79957. -Markup block - Gen<None> - 32 - (0:0,0)
  79958. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  79959. - SyntaxKind.Unknown;[];
  79960. - Statement block - Gen<None> - 32 - (0:0,0)
  79961. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  79962. - SyntaxKind.Transition;[@];
  79963. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  79964. - SyntaxKind.LeftBrace;[{];
  79965. - Markup block - Gen<None> - 29 - (2:0,2)
  79966. - Tag block - Gen<TagHelper> - 29 - (2:0,2) - input - InputTagHelper3
  79967. - SelfClosing - <input int-prefix-value='3'/>
  79968. - int-prefix-value - SingleQuotes
  79969. - Code span - Gen<Expr> - [3] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (27:0,27) - Tokens:1
  79970. - SyntaxKind.Text;[3];
  79971. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (31:0,31) - Tokens:1
  79972. - SyntaxKind.Unknown;[];
  79973. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (31:0,31) - Tokens:1
  79974. - SyntaxKind.RightBrace;[}];
  79975. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (32:0,32) - Tokens:1
  79976. - SyntaxKind.Unknown;[];
  79977. +RazorDocument - [0..32)::32 - [@{<input int-prefix-value='3'/>}]
  79978. + MarkupBlock - [0..32)::32
  79979. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79980. + Marker;[];
  79981. + CSharpCodeBlock - [0..32)::32
  79982. + CSharpStatement - [0..32)::32
  79983. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  79984. + Transition;[@];
  79985. + CSharpStatementBody - [1..32)::31
  79986. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  79987. + LeftBrace;[{];
  79988. + CSharpCodeBlock - [2..31)::29
  79989. + MarkupBlock - [2..31)::29
  79990. + MarkupTagHelperElement - [2..31)::29 - input[SelfClosing] - InputTagHelper3
  79991. + MarkupTagHelperStartTag - [2..31)::29
  79992. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79993. + OpenAngle;[<];
  79994. + Text;[input];
  79995. + MarkupTagHelperAttribute - [8..29)::21 - int-prefix-value - SingleQuotes - Bound - [ int-prefix-value='3']
  79996. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79997. + Whitespace;[ ];
  79998. + MarkupTextLiteral - [9..25)::16 - [int-prefix-value] - Gen<Markup> - SpanEditHandler;Accepts:Any
  79999. + Text;[int-prefix-value];
  80000. + Equals;[=];
  80001. + MarkupTextLiteral - [26..27)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  80002. + SingleQuote;['];
  80003. + MarkupTagHelperAttributeValue - [27..28)::1
  80004. + CSharpExpressionLiteral - [27..28)::1 - [3] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  80005. + Text;[3];
  80006. + MarkupTextLiteral - [28..29)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  80007. + SingleQuote;['];
  80008. + MarkupTextLiteral - [29..31)::2 - [/>] - Gen<Markup> - SpanEditHandler;Accepts:None
  80009. + ForwardSlash;[/];
  80010. + CloseAngle;[>];
  80011. + CSharpStatementLiteral - [31..31)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  80012. + Marker;[];
  80013. + RazorMetaCode - [31..32)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80014. + RightBrace;[}];
  80015. + MarkupTextLiteral - [32..32)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80016. + Marker;[];
  80017. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block15.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block15.stree.txt
  80018. index d1cb45f6a23..8de3649532c 100644
  80019. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block15.stree.txt
  80020. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block15.stree.txt
  80021. @@ -1,24 +1,44 @@
  80022. -Markup block - Gen<None> - 46 - (0:0,0)
  80023. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  80024. - SyntaxKind.Unknown;[];
  80025. - Statement block - Gen<None> - 46 - (0:0,0)
  80026. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  80027. - SyntaxKind.Transition;[@];
  80028. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  80029. - SyntaxKind.LeftBrace;[{];
  80030. - Markup block - Gen<None> - 43 - (2:0,2)
  80031. - Tag block - Gen<TagHelper> - 43 - (2:0,2) - input - InputTagHelper3
  80032. - SelfClosing - <input string-prefix-value='some string' />
  80033. - string-prefix-value - SingleQuotes
  80034. - Markup block - Gen<None> - 11 - (30:0,30)
  80035. - Markup span - Gen<Markup> - [some] - SpanEditHandler;Accepts:Any - (30:0,30) - Tokens:1
  80036. - SyntaxKind.Text;[some];
  80037. - Markup span - Gen<Markup> - [ string] - SpanEditHandler;Accepts:Any - (34:0,34) - Tokens:2
  80038. - SyntaxKind.Whitespace;[ ];
  80039. - SyntaxKind.Text;[string];
  80040. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (45:0,45) - Tokens:1
  80041. - SyntaxKind.Unknown;[];
  80042. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (45:0,45) - Tokens:1
  80043. - SyntaxKind.RightBrace;[}];
  80044. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (46:0,46) - Tokens:1
  80045. - SyntaxKind.Unknown;[];
  80046. +RazorDocument - [0..46)::46 - [@{<input string-prefix-value='some string' />}]
  80047. + MarkupBlock - [0..46)::46
  80048. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80049. + Marker;[];
  80050. + CSharpCodeBlock - [0..46)::46
  80051. + CSharpStatement - [0..46)::46
  80052. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80053. + Transition;[@];
  80054. + CSharpStatementBody - [1..46)::45
  80055. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80056. + LeftBrace;[{];
  80057. + CSharpCodeBlock - [2..45)::43
  80058. + MarkupBlock - [2..45)::43
  80059. + MarkupTagHelperElement - [2..45)::43 - input[SelfClosing] - InputTagHelper3
  80060. + MarkupTagHelperStartTag - [2..45)::43
  80061. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80062. + OpenAngle;[<];
  80063. + Text;[input];
  80064. + MarkupTagHelperAttribute - [8..42)::34 - string-prefix-value - SingleQuotes - Bound - [ string-prefix-value='some string']
  80065. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80066. + Whitespace;[ ];
  80067. + MarkupTextLiteral - [9..28)::19 - [string-prefix-value] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80068. + Text;[string-prefix-value];
  80069. + Equals;[=];
  80070. + MarkupTextLiteral - [29..30)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  80071. + SingleQuote;['];
  80072. + MarkupTagHelperAttributeValue - [30..41)::11
  80073. + MarkupTextLiteral - [30..34)::4 - [some] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80074. + Text;[some];
  80075. + MarkupTextLiteral - [34..41)::7 - [ string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80076. + Whitespace;[ ];
  80077. + Text;[string];
  80078. + MarkupTextLiteral - [41..42)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  80079. + SingleQuote;['];
  80080. + MarkupTextLiteral - [42..45)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  80081. + Whitespace;[ ];
  80082. + ForwardSlash;[/];
  80083. + CloseAngle;[>];
  80084. + CSharpStatementLiteral - [45..45)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  80085. + Marker;[];
  80086. + RazorMetaCode - [45..46)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80087. + RightBrace;[}];
  80088. + MarkupTextLiteral - [46..46)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80089. + Marker;[];
  80090. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block16.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block16.stree.txt
  80091. index 09a24d3c8a8..26724100c6c 100644
  80092. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block16.stree.txt
  80093. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block16.stree.txt
  80094. @@ -1,19 +1,38 @@
  80095. -Markup block - Gen<None> - 51 - (0:0,0)
  80096. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  80097. - SyntaxKind.Unknown;[];
  80098. - Statement block - Gen<None> - 51 - (0:0,0)
  80099. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  80100. - SyntaxKind.Transition;[@];
  80101. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  80102. - SyntaxKind.LeftBrace;[{];
  80103. - Markup block - Gen<None> - 48 - (2:0,2)
  80104. - Tag block - Gen<TagHelper> - 48 - (2:0,2) - input - InputTagHelper1 - InputTagHelper3
  80105. - SelfClosing - <input unbound-required bound-required-string />
  80106. - unbound-required - Minimized
  80107. - bound-required-string - Minimized
  80108. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (50:0,50) - Tokens:1
  80109. - SyntaxKind.Unknown;[];
  80110. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (50:0,50) - Tokens:1
  80111. - SyntaxKind.RightBrace;[}];
  80112. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (51:0,51) - Tokens:1
  80113. - SyntaxKind.Unknown;[];
  80114. +RazorDocument - [0..51)::51 - [@{<input unbound-required bound-required-string />}]
  80115. + MarkupBlock - [0..51)::51
  80116. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80117. + Marker;[];
  80118. + CSharpCodeBlock - [0..51)::51
  80119. + CSharpStatement - [0..51)::51
  80120. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80121. + Transition;[@];
  80122. + CSharpStatementBody - [1..51)::50
  80123. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80124. + LeftBrace;[{];
  80125. + CSharpCodeBlock - [2..50)::48
  80126. + MarkupBlock - [2..50)::48
  80127. + MarkupTagHelperElement - [2..50)::48 - input[SelfClosing] - InputTagHelper1 - InputTagHelper3
  80128. + MarkupTagHelperStartTag - [2..50)::48
  80129. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80130. + OpenAngle;[<];
  80131. + Text;[input];
  80132. + MarkupMinimizedTagHelperAttribute - [8..25)::17 - unbound-required - Minimized - Unbound - [ unbound-required]
  80133. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80134. + Whitespace;[ ];
  80135. + MarkupTextLiteral - [9..25)::16 - [unbound-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80136. + Text;[unbound-required];
  80137. + MarkupMinimizedTagHelperAttribute - [25..47)::22 - bound-required-string - Minimized - Bound - [ bound-required-string]
  80138. + MarkupTextLiteral - [25..26)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80139. + Whitespace;[ ];
  80140. + MarkupTextLiteral - [26..47)::21 - [bound-required-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80141. + Text;[bound-required-string];
  80142. + MarkupTextLiteral - [47..50)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  80143. + Whitespace;[ ];
  80144. + ForwardSlash;[/];
  80145. + CloseAngle;[>];
  80146. + CSharpStatementLiteral - [50..50)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  80147. + Marker;[];
  80148. + RazorMetaCode - [50..51)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80149. + RightBrace;[}];
  80150. + MarkupTextLiteral - [51..51)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80151. + Marker;[];
  80152. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block17.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block17.stree.txt
  80153. index d860f3e79b6..de83c6e0a1c 100644
  80154. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block17.stree.txt
  80155. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block17.stree.txt
  80156. @@ -1,19 +1,42 @@
  80157. -Markup block - Gen<None> - 33 - (0:0,0)
  80158. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  80159. - SyntaxKind.Unknown;[];
  80160. - Statement block - Gen<None> - 33 - (0:0,0)
  80161. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  80162. - SyntaxKind.Transition;[@];
  80163. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  80164. - SyntaxKind.LeftBrace;[{];
  80165. - Markup block - Gen<None> - 30 - (2:0,2)
  80166. - Tag block - Gen<TagHelper> - 30 - (2:0,2) - p - PTagHelper
  80167. - StartTagAndEndTag - <p bound-int bound-string> ... </p>
  80168. - bound-int - Minimized
  80169. - bound-string - Minimized
  80170. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (32:0,32) - Tokens:1
  80171. - SyntaxKind.Unknown;[];
  80172. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (32:0,32) - Tokens:1
  80173. - SyntaxKind.RightBrace;[}];
  80174. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (33:0,33) - Tokens:1
  80175. - SyntaxKind.Unknown;[];
  80176. +RazorDocument - [0..33)::33 - [@{<p bound-int bound-string></p>}]
  80177. + MarkupBlock - [0..33)::33
  80178. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80179. + Marker;[];
  80180. + CSharpCodeBlock - [0..33)::33
  80181. + CSharpStatement - [0..33)::33
  80182. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80183. + Transition;[@];
  80184. + CSharpStatementBody - [1..33)::32
  80185. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80186. + LeftBrace;[{];
  80187. + CSharpCodeBlock - [2..32)::30
  80188. + MarkupBlock - [2..32)::30
  80189. + MarkupTagHelperElement - [2..32)::30 - p[StartTagAndEndTag] - PTagHelper
  80190. + MarkupTagHelperStartTag - [2..28)::26
  80191. + MarkupTextLiteral - [2..4)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80192. + OpenAngle;[<];
  80193. + Text;[p];
  80194. + MarkupMinimizedTagHelperAttribute - [4..14)::10 - bound-int - Minimized - Bound - [ bound-int]
  80195. + MarkupTextLiteral - [4..5)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80196. + Whitespace;[ ];
  80197. + MarkupTextLiteral - [5..14)::9 - [bound-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80198. + Text;[bound-int];
  80199. + MarkupMinimizedTagHelperAttribute - [14..27)::13 - bound-string - Minimized - Bound - [ bound-string]
  80200. + MarkupTextLiteral - [14..15)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80201. + Whitespace;[ ];
  80202. + MarkupTextLiteral - [15..27)::12 - [bound-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80203. + Text;[bound-string];
  80204. + MarkupTextLiteral - [27..28)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  80205. + CloseAngle;[>];
  80206. + MarkupTagHelperEndTag - [28..32)::4
  80207. + MarkupTextLiteral - [28..32)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  80208. + OpenAngle;[<];
  80209. + ForwardSlash;[/];
  80210. + Text;[p];
  80211. + CloseAngle;[>];
  80212. + CSharpStatementLiteral - [32..32)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  80213. + Marker;[];
  80214. + RazorMetaCode - [32..33)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80215. + RightBrace;[}];
  80216. + MarkupTextLiteral - [33..33)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80217. + Marker;[];
  80218. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block18.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block18.stree.txt
  80219. index 5e6d00a7324..b3e5ccb59fd 100644
  80220. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block18.stree.txt
  80221. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block18.stree.txt
  80222. @@ -1,20 +1,43 @@
  80223. -Markup block - Gen<None> - 70 - (0:0,0)
  80224. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  80225. - SyntaxKind.Unknown;[];
  80226. - Statement block - Gen<None> - 70 - (0:0,0)
  80227. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  80228. - SyntaxKind.Transition;[@];
  80229. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  80230. - SyntaxKind.LeftBrace;[{];
  80231. - Markup block - Gen<None> - 67 - (2:0,2)
  80232. - Tag block - Gen<TagHelper> - 67 - (2:0,2) - input - InputTagHelper1 - InputTagHelper2 - InputTagHelper3
  80233. - SelfClosing - <input bound-required-int unbound-required bound-required-string />
  80234. - bound-required-int - Minimized
  80235. - unbound-required - Minimized
  80236. - bound-required-string - Minimized
  80237. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (69:0,69) - Tokens:1
  80238. - SyntaxKind.Unknown;[];
  80239. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (69:0,69) - Tokens:1
  80240. - SyntaxKind.RightBrace;[}];
  80241. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (70:0,70) - Tokens:1
  80242. - SyntaxKind.Unknown;[];
  80243. +RazorDocument - [0..70)::70 - [@{<input bound-required-int unbound-required bound-required-string />}]
  80244. + MarkupBlock - [0..70)::70
  80245. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80246. + Marker;[];
  80247. + CSharpCodeBlock - [0..70)::70
  80248. + CSharpStatement - [0..70)::70
  80249. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80250. + Transition;[@];
  80251. + CSharpStatementBody - [1..70)::69
  80252. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80253. + LeftBrace;[{];
  80254. + CSharpCodeBlock - [2..69)::67
  80255. + MarkupBlock - [2..69)::67
  80256. + MarkupTagHelperElement - [2..69)::67 - input[SelfClosing] - InputTagHelper1 - InputTagHelper2 - InputTagHelper3
  80257. + MarkupTagHelperStartTag - [2..69)::67
  80258. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80259. + OpenAngle;[<];
  80260. + Text;[input];
  80261. + MarkupMinimizedTagHelperAttribute - [8..27)::19 - bound-required-int - Minimized - Bound - [ bound-required-int]
  80262. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80263. + Whitespace;[ ];
  80264. + MarkupTextLiteral - [9..27)::18 - [bound-required-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80265. + Text;[bound-required-int];
  80266. + MarkupMinimizedTagHelperAttribute - [27..44)::17 - unbound-required - Minimized - Unbound - [ unbound-required]
  80267. + MarkupTextLiteral - [27..28)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80268. + Whitespace;[ ];
  80269. + MarkupTextLiteral - [28..44)::16 - [unbound-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80270. + Text;[unbound-required];
  80271. + MarkupMinimizedTagHelperAttribute - [44..66)::22 - bound-required-string - Minimized - Bound - [ bound-required-string]
  80272. + MarkupTextLiteral - [44..45)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80273. + Whitespace;[ ];
  80274. + MarkupTextLiteral - [45..66)::21 - [bound-required-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80275. + Text;[bound-required-string];
  80276. + MarkupTextLiteral - [66..69)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  80277. + Whitespace;[ ];
  80278. + ForwardSlash;[/];
  80279. + CloseAngle;[>];
  80280. + CSharpStatementLiteral - [69..69)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  80281. + Marker;[];
  80282. + RazorMetaCode - [69..70)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80283. + RightBrace;[}];
  80284. + MarkupTextLiteral - [70..70)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80285. + Marker;[];
  80286. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block19.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block19.stree.txt
  80287. index e40e8d2f9a3..74923d4fbeb 100644
  80288. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block19.stree.txt
  80289. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block19.stree.txt
  80290. @@ -1,20 +1,47 @@
  80291. -Markup block - Gen<None> - 46 - (0:0,0)
  80292. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  80293. - SyntaxKind.Unknown;[];
  80294. - Statement block - Gen<None> - 46 - (0:0,0)
  80295. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  80296. - SyntaxKind.Transition;[@];
  80297. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  80298. - SyntaxKind.LeftBrace;[{];
  80299. - Markup block - Gen<None> - 43 - (2:0,2)
  80300. - Tag block - Gen<TagHelper> - 43 - (2:0,2) - p - PTagHelper
  80301. - StartTagAndEndTag - <p bound-int bound-string bound-string> ... </p>
  80302. - bound-int - Minimized
  80303. - bound-string - Minimized
  80304. - bound-string - Minimized
  80305. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (45:0,45) - Tokens:1
  80306. - SyntaxKind.Unknown;[];
  80307. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (45:0,45) - Tokens:1
  80308. - SyntaxKind.RightBrace;[}];
  80309. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (46:0,46) - Tokens:1
  80310. - SyntaxKind.Unknown;[];
  80311. +RazorDocument - [0..46)::46 - [@{<p bound-int bound-string bound-string></p>}]
  80312. + MarkupBlock - [0..46)::46
  80313. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80314. + Marker;[];
  80315. + CSharpCodeBlock - [0..46)::46
  80316. + CSharpStatement - [0..46)::46
  80317. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80318. + Transition;[@];
  80319. + CSharpStatementBody - [1..46)::45
  80320. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80321. + LeftBrace;[{];
  80322. + CSharpCodeBlock - [2..45)::43
  80323. + MarkupBlock - [2..45)::43
  80324. + MarkupTagHelperElement - [2..45)::43 - p[StartTagAndEndTag] - PTagHelper
  80325. + MarkupTagHelperStartTag - [2..41)::39
  80326. + MarkupTextLiteral - [2..4)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80327. + OpenAngle;[<];
  80328. + Text;[p];
  80329. + MarkupMinimizedTagHelperAttribute - [4..14)::10 - bound-int - Minimized - Bound - [ bound-int]
  80330. + MarkupTextLiteral - [4..5)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80331. + Whitespace;[ ];
  80332. + MarkupTextLiteral - [5..14)::9 - [bound-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80333. + Text;[bound-int];
  80334. + MarkupMinimizedTagHelperAttribute - [14..27)::13 - bound-string - Minimized - Bound - [ bound-string]
  80335. + MarkupTextLiteral - [14..15)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80336. + Whitespace;[ ];
  80337. + MarkupTextLiteral - [15..27)::12 - [bound-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80338. + Text;[bound-string];
  80339. + MarkupMinimizedTagHelperAttribute - [27..40)::13 - bound-string - Minimized - Bound - [ bound-string]
  80340. + MarkupTextLiteral - [27..28)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80341. + Whitespace;[ ];
  80342. + MarkupTextLiteral - [28..40)::12 - [bound-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80343. + Text;[bound-string];
  80344. + MarkupTextLiteral - [40..41)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  80345. + CloseAngle;[>];
  80346. + MarkupTagHelperEndTag - [41..45)::4
  80347. + MarkupTextLiteral - [41..45)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  80348. + OpenAngle;[<];
  80349. + ForwardSlash;[/];
  80350. + Text;[p];
  80351. + CloseAngle;[>];
  80352. + CSharpStatementLiteral - [45..45)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  80353. + Marker;[];
  80354. + RazorMetaCode - [45..46)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80355. + RightBrace;[}];
  80356. + MarkupTextLiteral - [46..46)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80357. + Marker;[];
  80358. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block2.stree.txt
  80359. index a2fa4712638..b2600684454 100644
  80360. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block2.stree.txt
  80361. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block2.stree.txt
  80362. @@ -1,18 +1,37 @@
  80363. -Markup block - Gen<None> - 23 - (0:0,0)
  80364. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  80365. - SyntaxKind.Unknown;[];
  80366. - Statement block - Gen<None> - 23 - (0:0,0)
  80367. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  80368. - SyntaxKind.Transition;[@];
  80369. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  80370. - SyntaxKind.LeftBrace;[{];
  80371. - Markup block - Gen<None> - 20 - (2:0,2)
  80372. - Tag block - Gen<TagHelper> - 20 - (2:0,2) - p - PTagHelper
  80373. - StartTagAndEndTag - <p bound-string> ... </p>
  80374. - bound-string - Minimized
  80375. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:1
  80376. - SyntaxKind.Unknown;[];
  80377. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (22:0,22) - Tokens:1
  80378. - SyntaxKind.RightBrace;[}];
  80379. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:1
  80380. - SyntaxKind.Unknown;[];
  80381. +RazorDocument - [0..23)::23 - [@{<p bound-string></p>}]
  80382. + MarkupBlock - [0..23)::23
  80383. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80384. + Marker;[];
  80385. + CSharpCodeBlock - [0..23)::23
  80386. + CSharpStatement - [0..23)::23
  80387. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80388. + Transition;[@];
  80389. + CSharpStatementBody - [1..23)::22
  80390. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80391. + LeftBrace;[{];
  80392. + CSharpCodeBlock - [2..22)::20
  80393. + MarkupBlock - [2..22)::20
  80394. + MarkupTagHelperElement - [2..22)::20 - p[StartTagAndEndTag] - PTagHelper
  80395. + MarkupTagHelperStartTag - [2..18)::16
  80396. + MarkupTextLiteral - [2..4)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80397. + OpenAngle;[<];
  80398. + Text;[p];
  80399. + MarkupMinimizedTagHelperAttribute - [4..17)::13 - bound-string - Minimized - Bound - [ bound-string]
  80400. + MarkupTextLiteral - [4..5)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80401. + Whitespace;[ ];
  80402. + MarkupTextLiteral - [5..17)::12 - [bound-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80403. + Text;[bound-string];
  80404. + MarkupTextLiteral - [17..18)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  80405. + CloseAngle;[>];
  80406. + MarkupTagHelperEndTag - [18..22)::4
  80407. + MarkupTextLiteral - [18..22)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  80408. + OpenAngle;[<];
  80409. + ForwardSlash;[/];
  80410. + Text;[p];
  80411. + CloseAngle;[>];
  80412. + CSharpStatementLiteral - [22..22)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  80413. + Marker;[];
  80414. + RazorMetaCode - [22..23)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80415. + RightBrace;[}];
  80416. + MarkupTextLiteral - [23..23)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80417. + Marker;[];
  80418. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block20.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block20.stree.txt
  80419. index 54ecd334514..cf15a91cbb2 100644
  80420. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block20.stree.txt
  80421. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block20.stree.txt
  80422. @@ -1,21 +1,47 @@
  80423. -Markup block - Gen<None> - 41 - (0:0,0)
  80424. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  80425. - SyntaxKind.Unknown;[];
  80426. - Statement block - Gen<None> - 41 - (0:0,0)
  80427. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  80428. - SyntaxKind.Transition;[@];
  80429. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  80430. - SyntaxKind.LeftBrace;[{];
  80431. - Markup block - Gen<None> - 38 - (2:0,2)
  80432. - Tag block - Gen<TagHelper> - 38 - (2:0,2) - input - InputTagHelper1 - InputTagHelper3
  80433. - SelfClosing - <input unbound-required class='btn' />
  80434. - unbound-required - Minimized
  80435. - class - SingleQuotes
  80436. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (33:0,33) - Tokens:1
  80437. - SyntaxKind.Text;[btn];
  80438. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (40:0,40) - Tokens:1
  80439. - SyntaxKind.Unknown;[];
  80440. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (40:0,40) - Tokens:1
  80441. - SyntaxKind.RightBrace;[}];
  80442. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (41:0,41) - Tokens:1
  80443. - SyntaxKind.Unknown;[];
  80444. +RazorDocument - [0..41)::41 - [@{<input unbound-required class='btn' />}]
  80445. + MarkupBlock - [0..41)::41
  80446. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80447. + Marker;[];
  80448. + CSharpCodeBlock - [0..41)::41
  80449. + CSharpStatement - [0..41)::41
  80450. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80451. + Transition;[@];
  80452. + CSharpStatementBody - [1..41)::40
  80453. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80454. + LeftBrace;[{];
  80455. + CSharpCodeBlock - [2..40)::38
  80456. + MarkupBlock - [2..40)::38
  80457. + MarkupTagHelperElement - [2..40)::38 - input[SelfClosing] - InputTagHelper1 - InputTagHelper3
  80458. + MarkupTagHelperStartTag - [2..40)::38
  80459. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80460. + OpenAngle;[<];
  80461. + Text;[input];
  80462. + MarkupMinimizedTagHelperAttribute - [8..25)::17 - unbound-required - Minimized - Unbound - [ unbound-required]
  80463. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80464. + Whitespace;[ ];
  80465. + MarkupTextLiteral - [9..25)::16 - [unbound-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80466. + Text;[unbound-required];
  80467. + MarkupTagHelperAttribute - [25..37)::12 - class - SingleQuotes - Unbound - [ class='btn']
  80468. + MarkupTextLiteral - [25..26)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80469. + Whitespace;[ ];
  80470. + MarkupTextLiteral - [26..31)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80471. + Text;[class];
  80472. + Equals;[=];
  80473. + MarkupTextLiteral - [32..33)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  80474. + SingleQuote;['];
  80475. + MarkupTagHelperAttributeValue - [33..36)::3
  80476. + MarkupLiteralAttributeValue - [33..36)::3 - [btn]
  80477. + MarkupTextLiteral - [33..36)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80478. + Text;[btn];
  80479. + MarkupTextLiteral - [36..37)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  80480. + SingleQuote;['];
  80481. + MarkupTextLiteral - [37..40)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  80482. + Whitespace;[ ];
  80483. + ForwardSlash;[/];
  80484. + CloseAngle;[>];
  80485. + CSharpStatementLiteral - [40..40)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  80486. + Marker;[];
  80487. + RazorMetaCode - [40..41)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80488. + RightBrace;[}];
  80489. + MarkupTextLiteral - [41..41)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80490. + Marker;[];
  80491. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block21.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block21.stree.txt
  80492. index 5bfdedbbfe6..f437ef0425a 100644
  80493. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block21.stree.txt
  80494. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block21.stree.txt
  80495. @@ -1,21 +1,51 @@
  80496. -Markup block - Gen<None> - 35 - (0:0,0)
  80497. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  80498. - SyntaxKind.Unknown;[];
  80499. - Statement block - Gen<None> - 35 - (0:0,0)
  80500. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  80501. - SyntaxKind.Transition;[@];
  80502. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  80503. - SyntaxKind.LeftBrace;[{];
  80504. - Markup block - Gen<None> - 32 - (2:0,2)
  80505. - Tag block - Gen<TagHelper> - 32 - (2:0,2) - p - PTagHelper
  80506. - StartTagAndEndTag - <p bound-string class='btn'> ... </p>
  80507. - bound-string - Minimized
  80508. - class - SingleQuotes
  80509. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:1
  80510. - SyntaxKind.Text;[btn];
  80511. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (34:0,34) - Tokens:1
  80512. - SyntaxKind.Unknown;[];
  80513. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (34:0,34) - Tokens:1
  80514. - SyntaxKind.RightBrace;[}];
  80515. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (35:0,35) - Tokens:1
  80516. - SyntaxKind.Unknown;[];
  80517. +RazorDocument - [0..35)::35 - [@{<p bound-string class='btn'></p>}]
  80518. + MarkupBlock - [0..35)::35
  80519. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80520. + Marker;[];
  80521. + CSharpCodeBlock - [0..35)::35
  80522. + CSharpStatement - [0..35)::35
  80523. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80524. + Transition;[@];
  80525. + CSharpStatementBody - [1..35)::34
  80526. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80527. + LeftBrace;[{];
  80528. + CSharpCodeBlock - [2..34)::32
  80529. + MarkupBlock - [2..34)::32
  80530. + MarkupTagHelperElement - [2..34)::32 - p[StartTagAndEndTag] - PTagHelper
  80531. + MarkupTagHelperStartTag - [2..30)::28
  80532. + MarkupTextLiteral - [2..4)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80533. + OpenAngle;[<];
  80534. + Text;[p];
  80535. + MarkupMinimizedTagHelperAttribute - [4..17)::13 - bound-string - Minimized - Bound - [ bound-string]
  80536. + MarkupTextLiteral - [4..5)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80537. + Whitespace;[ ];
  80538. + MarkupTextLiteral - [5..17)::12 - [bound-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80539. + Text;[bound-string];
  80540. + MarkupTagHelperAttribute - [17..29)::12 - class - SingleQuotes - Unbound - [ class='btn']
  80541. + MarkupTextLiteral - [17..18)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80542. + Whitespace;[ ];
  80543. + MarkupTextLiteral - [18..23)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80544. + Text;[class];
  80545. + Equals;[=];
  80546. + MarkupTextLiteral - [24..25)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  80547. + SingleQuote;['];
  80548. + MarkupTagHelperAttributeValue - [25..28)::3
  80549. + MarkupLiteralAttributeValue - [25..28)::3 - [btn]
  80550. + MarkupTextLiteral - [25..28)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80551. + Text;[btn];
  80552. + MarkupTextLiteral - [28..29)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  80553. + SingleQuote;['];
  80554. + MarkupTextLiteral - [29..30)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  80555. + CloseAngle;[>];
  80556. + MarkupTagHelperEndTag - [30..34)::4
  80557. + MarkupTextLiteral - [30..34)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  80558. + OpenAngle;[<];
  80559. + ForwardSlash;[/];
  80560. + Text;[p];
  80561. + CloseAngle;[>];
  80562. + CSharpStatementLiteral - [34..34)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  80563. + Marker;[];
  80564. + RazorMetaCode - [34..35)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80565. + RightBrace;[}];
  80566. + MarkupTextLiteral - [35..35)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80567. + Marker;[];
  80568. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block22.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block22.stree.txt
  80569. index 5ff02d74d94..9725f0e4ccd 100644
  80570. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block22.stree.txt
  80571. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block22.stree.txt
  80572. @@ -1,21 +1,47 @@
  80573. -Markup block - Gen<None> - 41 - (0:0,0)
  80574. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  80575. - SyntaxKind.Unknown;[];
  80576. - Statement block - Gen<None> - 41 - (0:0,0)
  80577. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  80578. - SyntaxKind.Transition;[@];
  80579. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  80580. - SyntaxKind.LeftBrace;[{];
  80581. - Markup block - Gen<None> - 38 - (2:0,2)
  80582. - Tag block - Gen<TagHelper> - 38 - (2:0,2) - input - InputTagHelper1 - InputTagHelper3
  80583. - SelfClosing - <input class='btn' unbound-required />
  80584. - class - SingleQuotes
  80585. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  80586. - SyntaxKind.Text;[btn];
  80587. - unbound-required - Minimized
  80588. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (40:0,40) - Tokens:1
  80589. - SyntaxKind.Unknown;[];
  80590. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (40:0,40) - Tokens:1
  80591. - SyntaxKind.RightBrace;[}];
  80592. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (41:0,41) - Tokens:1
  80593. - SyntaxKind.Unknown;[];
  80594. +RazorDocument - [0..41)::41 - [@{<input class='btn' unbound-required />}]
  80595. + MarkupBlock - [0..41)::41
  80596. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80597. + Marker;[];
  80598. + CSharpCodeBlock - [0..41)::41
  80599. + CSharpStatement - [0..41)::41
  80600. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80601. + Transition;[@];
  80602. + CSharpStatementBody - [1..41)::40
  80603. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80604. + LeftBrace;[{];
  80605. + CSharpCodeBlock - [2..40)::38
  80606. + MarkupBlock - [2..40)::38
  80607. + MarkupTagHelperElement - [2..40)::38 - input[SelfClosing] - InputTagHelper1 - InputTagHelper3
  80608. + MarkupTagHelperStartTag - [2..40)::38
  80609. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80610. + OpenAngle;[<];
  80611. + Text;[input];
  80612. + MarkupTagHelperAttribute - [8..20)::12 - class - SingleQuotes - Unbound - [ class='btn']
  80613. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80614. + Whitespace;[ ];
  80615. + MarkupTextLiteral - [9..14)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80616. + Text;[class];
  80617. + Equals;[=];
  80618. + MarkupTextLiteral - [15..16)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  80619. + SingleQuote;['];
  80620. + MarkupTagHelperAttributeValue - [16..19)::3
  80621. + MarkupLiteralAttributeValue - [16..19)::3 - [btn]
  80622. + MarkupTextLiteral - [16..19)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80623. + Text;[btn];
  80624. + MarkupTextLiteral - [19..20)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  80625. + SingleQuote;['];
  80626. + MarkupMinimizedTagHelperAttribute - [20..37)::17 - unbound-required - Minimized - Unbound - [ unbound-required]
  80627. + MarkupTextLiteral - [20..21)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80628. + Whitespace;[ ];
  80629. + MarkupTextLiteral - [21..37)::16 - [unbound-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80630. + Text;[unbound-required];
  80631. + MarkupTextLiteral - [37..40)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  80632. + Whitespace;[ ];
  80633. + ForwardSlash;[/];
  80634. + CloseAngle;[>];
  80635. + CSharpStatementLiteral - [40..40)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  80636. + Marker;[];
  80637. + RazorMetaCode - [40..41)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80638. + RightBrace;[}];
  80639. + MarkupTextLiteral - [41..41)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80640. + Marker;[];
  80641. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block23.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block23.stree.txt
  80642. index 6229690f366..911f4fc0969 100644
  80643. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block23.stree.txt
  80644. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block23.stree.txt
  80645. @@ -1,21 +1,51 @@
  80646. -Markup block - Gen<None> - 35 - (0:0,0)
  80647. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  80648. - SyntaxKind.Unknown;[];
  80649. - Statement block - Gen<None> - 35 - (0:0,0)
  80650. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  80651. - SyntaxKind.Transition;[@];
  80652. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  80653. - SyntaxKind.LeftBrace;[{];
  80654. - Markup block - Gen<None> - 32 - (2:0,2)
  80655. - Tag block - Gen<TagHelper> - 32 - (2:0,2) - p - PTagHelper
  80656. - StartTagAndEndTag - <p class='btn' bound-string> ... </p>
  80657. - class - SingleQuotes
  80658. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:1
  80659. - SyntaxKind.Text;[btn];
  80660. - bound-string - Minimized
  80661. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (34:0,34) - Tokens:1
  80662. - SyntaxKind.Unknown;[];
  80663. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (34:0,34) - Tokens:1
  80664. - SyntaxKind.RightBrace;[}];
  80665. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (35:0,35) - Tokens:1
  80666. - SyntaxKind.Unknown;[];
  80667. +RazorDocument - [0..35)::35 - [@{<p class='btn' bound-string></p>}]
  80668. + MarkupBlock - [0..35)::35
  80669. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80670. + Marker;[];
  80671. + CSharpCodeBlock - [0..35)::35
  80672. + CSharpStatement - [0..35)::35
  80673. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80674. + Transition;[@];
  80675. + CSharpStatementBody - [1..35)::34
  80676. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80677. + LeftBrace;[{];
  80678. + CSharpCodeBlock - [2..34)::32
  80679. + MarkupBlock - [2..34)::32
  80680. + MarkupTagHelperElement - [2..34)::32 - p[StartTagAndEndTag] - PTagHelper
  80681. + MarkupTagHelperStartTag - [2..30)::28
  80682. + MarkupTextLiteral - [2..4)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80683. + OpenAngle;[<];
  80684. + Text;[p];
  80685. + MarkupTagHelperAttribute - [4..16)::12 - class - SingleQuotes - Unbound - [ class='btn']
  80686. + MarkupTextLiteral - [4..5)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80687. + Whitespace;[ ];
  80688. + MarkupTextLiteral - [5..10)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80689. + Text;[class];
  80690. + Equals;[=];
  80691. + MarkupTextLiteral - [11..12)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  80692. + SingleQuote;['];
  80693. + MarkupTagHelperAttributeValue - [12..15)::3
  80694. + MarkupLiteralAttributeValue - [12..15)::3 - [btn]
  80695. + MarkupTextLiteral - [12..15)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80696. + Text;[btn];
  80697. + MarkupTextLiteral - [15..16)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  80698. + SingleQuote;['];
  80699. + MarkupMinimizedTagHelperAttribute - [16..29)::13 - bound-string - Minimized - Bound - [ bound-string]
  80700. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80701. + Whitespace;[ ];
  80702. + MarkupTextLiteral - [17..29)::12 - [bound-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80703. + Text;[bound-string];
  80704. + MarkupTextLiteral - [29..30)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  80705. + CloseAngle;[>];
  80706. + MarkupTagHelperEndTag - [30..34)::4
  80707. + MarkupTextLiteral - [30..34)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  80708. + OpenAngle;[<];
  80709. + ForwardSlash;[/];
  80710. + Text;[p];
  80711. + CloseAngle;[>];
  80712. + CSharpStatementLiteral - [34..34)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  80713. + Marker;[];
  80714. + RazorMetaCode - [34..35)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80715. + RightBrace;[}];
  80716. + MarkupTextLiteral - [35..35)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80717. + Marker;[];
  80718. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block24.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block24.stree.txt
  80719. index 9eaa5c61758..cf1050092cc 100644
  80720. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block24.stree.txt
  80721. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block24.stree.txt
  80722. @@ -1,21 +1,47 @@
  80723. -Markup block - Gen<None> - 46 - (0:0,0)
  80724. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  80725. - SyntaxKind.Unknown;[];
  80726. - Statement block - Gen<None> - 46 - (0:0,0)
  80727. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  80728. - SyntaxKind.Transition;[@];
  80729. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  80730. - SyntaxKind.LeftBrace;[{];
  80731. - Markup block - Gen<None> - 43 - (2:0,2)
  80732. - Tag block - Gen<TagHelper> - 43 - (2:0,2) - input - InputTagHelper1 - InputTagHelper3
  80733. - SelfClosing - <input bound-required-string class='btn' />
  80734. - bound-required-string - Minimized
  80735. - class - SingleQuotes
  80736. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (38:0,38) - Tokens:1
  80737. - SyntaxKind.Text;[btn];
  80738. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (45:0,45) - Tokens:1
  80739. - SyntaxKind.Unknown;[];
  80740. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (45:0,45) - Tokens:1
  80741. - SyntaxKind.RightBrace;[}];
  80742. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (46:0,46) - Tokens:1
  80743. - SyntaxKind.Unknown;[];
  80744. +RazorDocument - [0..46)::46 - [@{<input bound-required-string class='btn' />}]
  80745. + MarkupBlock - [0..46)::46
  80746. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80747. + Marker;[];
  80748. + CSharpCodeBlock - [0..46)::46
  80749. + CSharpStatement - [0..46)::46
  80750. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80751. + Transition;[@];
  80752. + CSharpStatementBody - [1..46)::45
  80753. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80754. + LeftBrace;[{];
  80755. + CSharpCodeBlock - [2..45)::43
  80756. + MarkupBlock - [2..45)::43
  80757. + MarkupTagHelperElement - [2..45)::43 - input[SelfClosing] - InputTagHelper1 - InputTagHelper3
  80758. + MarkupTagHelperStartTag - [2..45)::43
  80759. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80760. + OpenAngle;[<];
  80761. + Text;[input];
  80762. + MarkupMinimizedTagHelperAttribute - [8..30)::22 - bound-required-string - Minimized - Bound - [ bound-required-string]
  80763. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80764. + Whitespace;[ ];
  80765. + MarkupTextLiteral - [9..30)::21 - [bound-required-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80766. + Text;[bound-required-string];
  80767. + MarkupTagHelperAttribute - [30..42)::12 - class - SingleQuotes - Unbound - [ class='btn']
  80768. + MarkupTextLiteral - [30..31)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80769. + Whitespace;[ ];
  80770. + MarkupTextLiteral - [31..36)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80771. + Text;[class];
  80772. + Equals;[=];
  80773. + MarkupTextLiteral - [37..38)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  80774. + SingleQuote;['];
  80775. + MarkupTagHelperAttributeValue - [38..41)::3
  80776. + MarkupLiteralAttributeValue - [38..41)::3 - [btn]
  80777. + MarkupTextLiteral - [38..41)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80778. + Text;[btn];
  80779. + MarkupTextLiteral - [41..42)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  80780. + SingleQuote;['];
  80781. + MarkupTextLiteral - [42..45)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  80782. + Whitespace;[ ];
  80783. + ForwardSlash;[/];
  80784. + CloseAngle;[>];
  80785. + CSharpStatementLiteral - [45..45)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  80786. + Marker;[];
  80787. + RazorMetaCode - [45..46)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80788. + RightBrace;[}];
  80789. + MarkupTextLiteral - [46..46)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80790. + Marker;[];
  80791. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block25.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block25.stree.txt
  80792. index aa51eb37267..b9e07e1704c 100644
  80793. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block25.stree.txt
  80794. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block25.stree.txt
  80795. @@ -1,21 +1,47 @@
  80796. -Markup block - Gen<None> - 46 - (0:0,0)
  80797. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  80798. - SyntaxKind.Unknown;[];
  80799. - Statement block - Gen<None> - 46 - (0:0,0)
  80800. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  80801. - SyntaxKind.Transition;[@];
  80802. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  80803. - SyntaxKind.LeftBrace;[{];
  80804. - Markup block - Gen<None> - 43 - (2:0,2)
  80805. - Tag block - Gen<TagHelper> - 43 - (2:0,2) - input - InputTagHelper1 - InputTagHelper3
  80806. - SelfClosing - <input class='btn' bound-required-string />
  80807. - class - SingleQuotes
  80808. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  80809. - SyntaxKind.Text;[btn];
  80810. - bound-required-string - Minimized
  80811. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (45:0,45) - Tokens:1
  80812. - SyntaxKind.Unknown;[];
  80813. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (45:0,45) - Tokens:1
  80814. - SyntaxKind.RightBrace;[}];
  80815. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (46:0,46) - Tokens:1
  80816. - SyntaxKind.Unknown;[];
  80817. +RazorDocument - [0..46)::46 - [@{<input class='btn' bound-required-string />}]
  80818. + MarkupBlock - [0..46)::46
  80819. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80820. + Marker;[];
  80821. + CSharpCodeBlock - [0..46)::46
  80822. + CSharpStatement - [0..46)::46
  80823. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80824. + Transition;[@];
  80825. + CSharpStatementBody - [1..46)::45
  80826. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80827. + LeftBrace;[{];
  80828. + CSharpCodeBlock - [2..45)::43
  80829. + MarkupBlock - [2..45)::43
  80830. + MarkupTagHelperElement - [2..45)::43 - input[SelfClosing] - InputTagHelper1 - InputTagHelper3
  80831. + MarkupTagHelperStartTag - [2..45)::43
  80832. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80833. + OpenAngle;[<];
  80834. + Text;[input];
  80835. + MarkupTagHelperAttribute - [8..20)::12 - class - SingleQuotes - Unbound - [ class='btn']
  80836. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80837. + Whitespace;[ ];
  80838. + MarkupTextLiteral - [9..14)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80839. + Text;[class];
  80840. + Equals;[=];
  80841. + MarkupTextLiteral - [15..16)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  80842. + SingleQuote;['];
  80843. + MarkupTagHelperAttributeValue - [16..19)::3
  80844. + MarkupLiteralAttributeValue - [16..19)::3 - [btn]
  80845. + MarkupTextLiteral - [16..19)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80846. + Text;[btn];
  80847. + MarkupTextLiteral - [19..20)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  80848. + SingleQuote;['];
  80849. + MarkupMinimizedTagHelperAttribute - [20..42)::22 - bound-required-string - Minimized - Bound - [ bound-required-string]
  80850. + MarkupTextLiteral - [20..21)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80851. + Whitespace;[ ];
  80852. + MarkupTextLiteral - [21..42)::21 - [bound-required-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80853. + Text;[bound-required-string];
  80854. + MarkupTextLiteral - [42..45)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  80855. + Whitespace;[ ];
  80856. + ForwardSlash;[/];
  80857. + CloseAngle;[>];
  80858. + CSharpStatementLiteral - [45..45)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  80859. + Marker;[];
  80860. + RazorMetaCode - [45..46)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80861. + RightBrace;[}];
  80862. + MarkupTextLiteral - [46..46)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80863. + Marker;[];
  80864. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block26.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block26.stree.txt
  80865. index c61cca4acbd..90aa657d7b0 100644
  80866. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block26.stree.txt
  80867. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block26.stree.txt
  80868. @@ -1,21 +1,47 @@
  80869. -Markup block - Gen<None> - 43 - (0:0,0)
  80870. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  80871. - SyntaxKind.Unknown;[];
  80872. - Statement block - Gen<None> - 43 - (0:0,0)
  80873. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  80874. - SyntaxKind.Transition;[@];
  80875. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  80876. - SyntaxKind.LeftBrace;[{];
  80877. - Markup block - Gen<None> - 40 - (2:0,2)
  80878. - Tag block - Gen<TagHelper> - 40 - (2:0,2) - input - InputTagHelper2 - InputTagHelper3
  80879. - SelfClosing - <input bound-required-int class='btn' />
  80880. - bound-required-int - Minimized
  80881. - class - SingleQuotes
  80882. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (35:0,35) - Tokens:1
  80883. - SyntaxKind.Text;[btn];
  80884. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (42:0,42) - Tokens:1
  80885. - SyntaxKind.Unknown;[];
  80886. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (42:0,42) - Tokens:1
  80887. - SyntaxKind.RightBrace;[}];
  80888. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (43:0,43) - Tokens:1
  80889. - SyntaxKind.Unknown;[];
  80890. +RazorDocument - [0..43)::43 - [@{<input bound-required-int class='btn' />}]
  80891. + MarkupBlock - [0..43)::43
  80892. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80893. + Marker;[];
  80894. + CSharpCodeBlock - [0..43)::43
  80895. + CSharpStatement - [0..43)::43
  80896. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80897. + Transition;[@];
  80898. + CSharpStatementBody - [1..43)::42
  80899. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80900. + LeftBrace;[{];
  80901. + CSharpCodeBlock - [2..42)::40
  80902. + MarkupBlock - [2..42)::40
  80903. + MarkupTagHelperElement - [2..42)::40 - input[SelfClosing] - InputTagHelper2 - InputTagHelper3
  80904. + MarkupTagHelperStartTag - [2..42)::40
  80905. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80906. + OpenAngle;[<];
  80907. + Text;[input];
  80908. + MarkupMinimizedTagHelperAttribute - [8..27)::19 - bound-required-int - Minimized - Bound - [ bound-required-int]
  80909. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80910. + Whitespace;[ ];
  80911. + MarkupTextLiteral - [9..27)::18 - [bound-required-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80912. + Text;[bound-required-int];
  80913. + MarkupTagHelperAttribute - [27..39)::12 - class - SingleQuotes - Unbound - [ class='btn']
  80914. + MarkupTextLiteral - [27..28)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80915. + Whitespace;[ ];
  80916. + MarkupTextLiteral - [28..33)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80917. + Text;[class];
  80918. + Equals;[=];
  80919. + MarkupTextLiteral - [34..35)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  80920. + SingleQuote;['];
  80921. + MarkupTagHelperAttributeValue - [35..38)::3
  80922. + MarkupLiteralAttributeValue - [35..38)::3 - [btn]
  80923. + MarkupTextLiteral - [35..38)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80924. + Text;[btn];
  80925. + MarkupTextLiteral - [38..39)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  80926. + SingleQuote;['];
  80927. + MarkupTextLiteral - [39..42)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  80928. + Whitespace;[ ];
  80929. + ForwardSlash;[/];
  80930. + CloseAngle;[>];
  80931. + CSharpStatementLiteral - [42..42)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  80932. + Marker;[];
  80933. + RazorMetaCode - [42..43)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80934. + RightBrace;[}];
  80935. + MarkupTextLiteral - [43..43)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80936. + Marker;[];
  80937. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block27.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block27.stree.txt
  80938. index 728b38445c6..3fe735e343a 100644
  80939. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block27.stree.txt
  80940. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block27.stree.txt
  80941. @@ -1,21 +1,51 @@
  80942. -Markup block - Gen<None> - 32 - (0:0,0)
  80943. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  80944. - SyntaxKind.Unknown;[];
  80945. - Statement block - Gen<None> - 32 - (0:0,0)
  80946. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  80947. - SyntaxKind.Transition;[@];
  80948. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  80949. - SyntaxKind.LeftBrace;[{];
  80950. - Markup block - Gen<None> - 29 - (2:0,2)
  80951. - Tag block - Gen<TagHelper> - 29 - (2:0,2) - p - PTagHelper
  80952. - StartTagAndEndTag - <p bound-int class='btn'> ... </p>
  80953. - bound-int - Minimized
  80954. - class - SingleQuotes
  80955. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:1
  80956. - SyntaxKind.Text;[btn];
  80957. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (31:0,31) - Tokens:1
  80958. - SyntaxKind.Unknown;[];
  80959. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (31:0,31) - Tokens:1
  80960. - SyntaxKind.RightBrace;[}];
  80961. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (32:0,32) - Tokens:1
  80962. - SyntaxKind.Unknown;[];
  80963. +RazorDocument - [0..32)::32 - [@{<p bound-int class='btn'></p>}]
  80964. + MarkupBlock - [0..32)::32
  80965. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80966. + Marker;[];
  80967. + CSharpCodeBlock - [0..32)::32
  80968. + CSharpStatement - [0..32)::32
  80969. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80970. + Transition;[@];
  80971. + CSharpStatementBody - [1..32)::31
  80972. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  80973. + LeftBrace;[{];
  80974. + CSharpCodeBlock - [2..31)::29
  80975. + MarkupBlock - [2..31)::29
  80976. + MarkupTagHelperElement - [2..31)::29 - p[StartTagAndEndTag] - PTagHelper
  80977. + MarkupTagHelperStartTag - [2..27)::25
  80978. + MarkupTextLiteral - [2..4)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80979. + OpenAngle;[<];
  80980. + Text;[p];
  80981. + MarkupMinimizedTagHelperAttribute - [4..14)::10 - bound-int - Minimized - Bound - [ bound-int]
  80982. + MarkupTextLiteral - [4..5)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80983. + Whitespace;[ ];
  80984. + MarkupTextLiteral - [5..14)::9 - [bound-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80985. + Text;[bound-int];
  80986. + MarkupTagHelperAttribute - [14..26)::12 - class - SingleQuotes - Unbound - [ class='btn']
  80987. + MarkupTextLiteral - [14..15)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80988. + Whitespace;[ ];
  80989. + MarkupTextLiteral - [15..20)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80990. + Text;[class];
  80991. + Equals;[=];
  80992. + MarkupTextLiteral - [21..22)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  80993. + SingleQuote;['];
  80994. + MarkupTagHelperAttributeValue - [22..25)::3
  80995. + MarkupLiteralAttributeValue - [22..25)::3 - [btn]
  80996. + MarkupTextLiteral - [22..25)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  80997. + Text;[btn];
  80998. + MarkupTextLiteral - [25..26)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  80999. + SingleQuote;['];
  81000. + MarkupTextLiteral - [26..27)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  81001. + CloseAngle;[>];
  81002. + MarkupTagHelperEndTag - [27..31)::4
  81003. + MarkupTextLiteral - [27..31)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  81004. + OpenAngle;[<];
  81005. + ForwardSlash;[/];
  81006. + Text;[p];
  81007. + CloseAngle;[>];
  81008. + CSharpStatementLiteral - [31..31)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  81009. + Marker;[];
  81010. + RazorMetaCode - [31..32)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81011. + RightBrace;[}];
  81012. + MarkupTextLiteral - [32..32)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81013. + Marker;[];
  81014. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block28.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block28.stree.txt
  81015. index 0fa49e81895..666f88ea0f4 100644
  81016. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block28.stree.txt
  81017. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block28.stree.txt
  81018. @@ -1,21 +1,47 @@
  81019. -Markup block - Gen<None> - 43 - (0:0,0)
  81020. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  81021. - SyntaxKind.Unknown;[];
  81022. - Statement block - Gen<None> - 43 - (0:0,0)
  81023. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  81024. - SyntaxKind.Transition;[@];
  81025. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  81026. - SyntaxKind.LeftBrace;[{];
  81027. - Markup block - Gen<None> - 40 - (2:0,2)
  81028. - Tag block - Gen<TagHelper> - 40 - (2:0,2) - input - InputTagHelper2 - InputTagHelper3
  81029. - SelfClosing - <input class='btn' bound-required-int />
  81030. - class - SingleQuotes
  81031. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  81032. - SyntaxKind.Text;[btn];
  81033. - bound-required-int - Minimized
  81034. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (42:0,42) - Tokens:1
  81035. - SyntaxKind.Unknown;[];
  81036. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (42:0,42) - Tokens:1
  81037. - SyntaxKind.RightBrace;[}];
  81038. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (43:0,43) - Tokens:1
  81039. - SyntaxKind.Unknown;[];
  81040. +RazorDocument - [0..43)::43 - [@{<input class='btn' bound-required-int />}]
  81041. + MarkupBlock - [0..43)::43
  81042. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81043. + Marker;[];
  81044. + CSharpCodeBlock - [0..43)::43
  81045. + CSharpStatement - [0..43)::43
  81046. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81047. + Transition;[@];
  81048. + CSharpStatementBody - [1..43)::42
  81049. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81050. + LeftBrace;[{];
  81051. + CSharpCodeBlock - [2..42)::40
  81052. + MarkupBlock - [2..42)::40
  81053. + MarkupTagHelperElement - [2..42)::40 - input[SelfClosing] - InputTagHelper2 - InputTagHelper3
  81054. + MarkupTagHelperStartTag - [2..42)::40
  81055. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81056. + OpenAngle;[<];
  81057. + Text;[input];
  81058. + MarkupTagHelperAttribute - [8..20)::12 - class - SingleQuotes - Unbound - [ class='btn']
  81059. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81060. + Whitespace;[ ];
  81061. + MarkupTextLiteral - [9..14)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81062. + Text;[class];
  81063. + Equals;[=];
  81064. + MarkupTextLiteral - [15..16)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  81065. + SingleQuote;['];
  81066. + MarkupTagHelperAttributeValue - [16..19)::3
  81067. + MarkupLiteralAttributeValue - [16..19)::3 - [btn]
  81068. + MarkupTextLiteral - [16..19)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81069. + Text;[btn];
  81070. + MarkupTextLiteral - [19..20)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  81071. + SingleQuote;['];
  81072. + MarkupMinimizedTagHelperAttribute - [20..39)::19 - bound-required-int - Minimized - Bound - [ bound-required-int]
  81073. + MarkupTextLiteral - [20..21)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81074. + Whitespace;[ ];
  81075. + MarkupTextLiteral - [21..39)::18 - [bound-required-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81076. + Text;[bound-required-int];
  81077. + MarkupTextLiteral - [39..42)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  81078. + Whitespace;[ ];
  81079. + ForwardSlash;[/];
  81080. + CloseAngle;[>];
  81081. + CSharpStatementLiteral - [42..42)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  81082. + Marker;[];
  81083. + RazorMetaCode - [42..43)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81084. + RightBrace;[}];
  81085. + MarkupTextLiteral - [43..43)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81086. + Marker;[];
  81087. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block29.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block29.stree.txt
  81088. index 7a41ff45038..d32d0789f9c 100644
  81089. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block29.stree.txt
  81090. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block29.stree.txt
  81091. @@ -1,21 +1,51 @@
  81092. -Markup block - Gen<None> - 32 - (0:0,0)
  81093. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  81094. - SyntaxKind.Unknown;[];
  81095. - Statement block - Gen<None> - 32 - (0:0,0)
  81096. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  81097. - SyntaxKind.Transition;[@];
  81098. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  81099. - SyntaxKind.LeftBrace;[{];
  81100. - Markup block - Gen<None> - 29 - (2:0,2)
  81101. - Tag block - Gen<TagHelper> - 29 - (2:0,2) - p - PTagHelper
  81102. - StartTagAndEndTag - <p class='btn' bound-int> ... </p>
  81103. - class - SingleQuotes
  81104. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:1
  81105. - SyntaxKind.Text;[btn];
  81106. - bound-int - Minimized
  81107. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (31:0,31) - Tokens:1
  81108. - SyntaxKind.Unknown;[];
  81109. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (31:0,31) - Tokens:1
  81110. - SyntaxKind.RightBrace;[}];
  81111. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (32:0,32) - Tokens:1
  81112. - SyntaxKind.Unknown;[];
  81113. +RazorDocument - [0..32)::32 - [@{<p class='btn' bound-int></p>}]
  81114. + MarkupBlock - [0..32)::32
  81115. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81116. + Marker;[];
  81117. + CSharpCodeBlock - [0..32)::32
  81118. + CSharpStatement - [0..32)::32
  81119. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81120. + Transition;[@];
  81121. + CSharpStatementBody - [1..32)::31
  81122. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81123. + LeftBrace;[{];
  81124. + CSharpCodeBlock - [2..31)::29
  81125. + MarkupBlock - [2..31)::29
  81126. + MarkupTagHelperElement - [2..31)::29 - p[StartTagAndEndTag] - PTagHelper
  81127. + MarkupTagHelperStartTag - [2..27)::25
  81128. + MarkupTextLiteral - [2..4)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81129. + OpenAngle;[<];
  81130. + Text;[p];
  81131. + MarkupTagHelperAttribute - [4..16)::12 - class - SingleQuotes - Unbound - [ class='btn']
  81132. + MarkupTextLiteral - [4..5)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81133. + Whitespace;[ ];
  81134. + MarkupTextLiteral - [5..10)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81135. + Text;[class];
  81136. + Equals;[=];
  81137. + MarkupTextLiteral - [11..12)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  81138. + SingleQuote;['];
  81139. + MarkupTagHelperAttributeValue - [12..15)::3
  81140. + MarkupLiteralAttributeValue - [12..15)::3 - [btn]
  81141. + MarkupTextLiteral - [12..15)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81142. + Text;[btn];
  81143. + MarkupTextLiteral - [15..16)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  81144. + SingleQuote;['];
  81145. + MarkupMinimizedTagHelperAttribute - [16..26)::10 - bound-int - Minimized - Bound - [ bound-int]
  81146. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81147. + Whitespace;[ ];
  81148. + MarkupTextLiteral - [17..26)::9 - [bound-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81149. + Text;[bound-int];
  81150. + MarkupTextLiteral - [26..27)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  81151. + CloseAngle;[>];
  81152. + MarkupTagHelperEndTag - [27..31)::4
  81153. + MarkupTextLiteral - [27..31)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  81154. + OpenAngle;[<];
  81155. + ForwardSlash;[/];
  81156. + Text;[p];
  81157. + CloseAngle;[>];
  81158. + CSharpStatementLiteral - [31..31)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  81159. + Marker;[];
  81160. + RazorMetaCode - [31..32)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81161. + RightBrace;[}];
  81162. + MarkupTextLiteral - [32..32)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81163. + Marker;[];
  81164. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block3.stree.txt
  81165. index c7eb6d6cbf5..21d1fe017f4 100644
  81166. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block3.stree.txt
  81167. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block3.stree.txt
  81168. @@ -1,18 +1,33 @@
  81169. -Markup block - Gen<None> - 34 - (0:0,0)
  81170. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  81171. - SyntaxKind.Unknown;[];
  81172. - Statement block - Gen<None> - 34 - (0:0,0)
  81173. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  81174. - SyntaxKind.Transition;[@];
  81175. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  81176. - SyntaxKind.LeftBrace;[{];
  81177. - Markup block - Gen<None> - 31 - (2:0,2)
  81178. - Tag block - Gen<TagHelper> - 31 - (2:0,2) - input - InputTagHelper1 - InputTagHelper3
  81179. - SelfClosing - <input bound-required-string />
  81180. - bound-required-string - Minimized
  81181. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (33:0,33) - Tokens:1
  81182. - SyntaxKind.Unknown;[];
  81183. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (33:0,33) - Tokens:1
  81184. - SyntaxKind.RightBrace;[}];
  81185. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (34:0,34) - Tokens:1
  81186. - SyntaxKind.Unknown;[];
  81187. +RazorDocument - [0..34)::34 - [@{<input bound-required-string />}]
  81188. + MarkupBlock - [0..34)::34
  81189. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81190. + Marker;[];
  81191. + CSharpCodeBlock - [0..34)::34
  81192. + CSharpStatement - [0..34)::34
  81193. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81194. + Transition;[@];
  81195. + CSharpStatementBody - [1..34)::33
  81196. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81197. + LeftBrace;[{];
  81198. + CSharpCodeBlock - [2..33)::31
  81199. + MarkupBlock - [2..33)::31
  81200. + MarkupTagHelperElement - [2..33)::31 - input[SelfClosing] - InputTagHelper1 - InputTagHelper3
  81201. + MarkupTagHelperStartTag - [2..33)::31
  81202. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81203. + OpenAngle;[<];
  81204. + Text;[input];
  81205. + MarkupMinimizedTagHelperAttribute - [8..30)::22 - bound-required-string - Minimized - Bound - [ bound-required-string]
  81206. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81207. + Whitespace;[ ];
  81208. + MarkupTextLiteral - [9..30)::21 - [bound-required-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81209. + Text;[bound-required-string];
  81210. + MarkupTextLiteral - [30..33)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  81211. + Whitespace;[ ];
  81212. + ForwardSlash;[/];
  81213. + CloseAngle;[>];
  81214. + CSharpStatementLiteral - [33..33)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  81215. + Marker;[];
  81216. + RazorMetaCode - [33..34)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81217. + RightBrace;[}];
  81218. + MarkupTextLiteral - [34..34)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81219. + Marker;[];
  81220. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block30.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block30.stree.txt
  81221. index 199aecdb5e2..32c3b9f29b5 100644
  81222. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block30.stree.txt
  81223. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block30.stree.txt
  81224. @@ -1,34 +1,66 @@
  81225. -Markup block - Gen<None> - 57 - (0:0,0)
  81226. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  81227. - SyntaxKind.Unknown;[];
  81228. - Statement block - Gen<None> - 57 - (0:0,0)
  81229. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  81230. - SyntaxKind.Transition;[@];
  81231. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  81232. - SyntaxKind.LeftBrace;[{];
  81233. - Markup block - Gen<None> - 54 - (2:0,2)
  81234. - Tag block - Gen<TagHelper> - 54 - (2:0,2) - input - InputTagHelper2 - InputTagHelper3
  81235. - SelfClosing - <input class='@DateTime.Now + 1' bound-required-int />
  81236. - class - SingleQuotes
  81237. - Markup block - Gen<None> - 17 - (16:0,16)
  81238. - Markup block - Gen<DynAttr:@(16:0,16)> - 13 - (16:0,16)
  81239. - Expression block - Gen<Expr> - 13 - (16:0,16)
  81240. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  81241. - SyntaxKind.Transition;[@];
  81242. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (17:0,17) - Tokens:3
  81243. - SyntaxKind.Identifier;[DateTime];
  81244. - SyntaxKind.Dot;[.];
  81245. - SyntaxKind.Identifier;[Now];
  81246. - Markup span - Gen<LitAttr: @(29:0,29)> - [ +] - SpanEditHandler;Accepts:Any - (29:0,29) - Tokens:2
  81247. - SyntaxKind.Whitespace;[ ];
  81248. - SyntaxKind.Text;[+];
  81249. - Markup span - Gen<LitAttr: @(31:0,31)> - [ 1] - SpanEditHandler;Accepts:Any - (31:0,31) - Tokens:2
  81250. - SyntaxKind.Whitespace;[ ];
  81251. - SyntaxKind.Text;[1];
  81252. - bound-required-int - Minimized
  81253. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (56:0,56) - Tokens:1
  81254. - SyntaxKind.Unknown;[];
  81255. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (56:0,56) - Tokens:1
  81256. - SyntaxKind.RightBrace;[}];
  81257. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (57:0,57) - Tokens:1
  81258. - SyntaxKind.Unknown;[];
  81259. +RazorDocument - [0..57)::57 - [@{<input class='@DateTime.Now + 1' bound-required-int />}]
  81260. + MarkupBlock - [0..57)::57
  81261. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81262. + Marker;[];
  81263. + CSharpCodeBlock - [0..57)::57
  81264. + CSharpStatement - [0..57)::57
  81265. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81266. + Transition;[@];
  81267. + CSharpStatementBody - [1..57)::56
  81268. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81269. + LeftBrace;[{];
  81270. + CSharpCodeBlock - [2..56)::54
  81271. + MarkupBlock - [2..56)::54
  81272. + MarkupTagHelperElement - [2..56)::54 - input[SelfClosing] - InputTagHelper2 - InputTagHelper3
  81273. + MarkupTagHelperStartTag - [2..56)::54
  81274. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81275. + OpenAngle;[<];
  81276. + Text;[input];
  81277. + MarkupTagHelperAttribute - [8..34)::26 - class - SingleQuotes - Unbound - [ class='@DateTime.Now + 1']
  81278. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81279. + Whitespace;[ ];
  81280. + MarkupTextLiteral - [9..14)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81281. + Text;[class];
  81282. + Equals;[=];
  81283. + MarkupTextLiteral - [15..16)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  81284. + SingleQuote;['];
  81285. + MarkupTagHelperAttributeValue - [16..33)::17
  81286. + MarkupDynamicAttributeValue - [16..29)::13 - [@DateTime.Now]
  81287. + GenericBlock - [16..29)::13
  81288. + CSharpCodeBlock - [16..29)::13
  81289. + CSharpImplicitExpression - [16..29)::13
  81290. + CSharpTransition - [16..17)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81291. + Transition;[@];
  81292. + CSharpImplicitExpressionBody - [17..29)::12
  81293. + CSharpCodeBlock - [17..29)::12
  81294. + CSharpExpressionLiteral - [17..29)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  81295. + Identifier;[DateTime];
  81296. + Dot;[.];
  81297. + Identifier;[Now];
  81298. + MarkupLiteralAttributeValue - [29..31)::2 - [ +]
  81299. + MarkupTextLiteral - [29..30)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81300. + Whitespace;[ ];
  81301. + MarkupTextLiteral - [30..31)::1 - [+] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81302. + Text;[+];
  81303. + MarkupLiteralAttributeValue - [31..33)::2 - [ 1]
  81304. + MarkupTextLiteral - [31..32)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81305. + Whitespace;[ ];
  81306. + MarkupTextLiteral - [32..33)::1 - [1] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81307. + Text;[1];
  81308. + MarkupTextLiteral - [33..34)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  81309. + SingleQuote;['];
  81310. + MarkupMinimizedTagHelperAttribute - [34..53)::19 - bound-required-int - Minimized - Bound - [ bound-required-int]
  81311. + MarkupTextLiteral - [34..35)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81312. + Whitespace;[ ];
  81313. + MarkupTextLiteral - [35..53)::18 - [bound-required-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81314. + Text;[bound-required-int];
  81315. + MarkupTextLiteral - [53..56)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  81316. + Whitespace;[ ];
  81317. + ForwardSlash;[/];
  81318. + CloseAngle;[>];
  81319. + CSharpStatementLiteral - [56..56)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  81320. + Marker;[];
  81321. + RazorMetaCode - [56..57)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81322. + RightBrace;[}];
  81323. + MarkupTextLiteral - [57..57)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81324. + Marker;[];
  81325. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block31.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block31.stree.txt
  81326. index 64c741e1ec8..dd5804b070d 100644
  81327. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block31.stree.txt
  81328. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block31.stree.txt
  81329. @@ -1,34 +1,70 @@
  81330. -Markup block - Gen<None> - 46 - (0:0,0)
  81331. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  81332. - SyntaxKind.Unknown;[];
  81333. - Statement block - Gen<None> - 46 - (0:0,0)
  81334. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  81335. - SyntaxKind.Transition;[@];
  81336. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  81337. - SyntaxKind.LeftBrace;[{];
  81338. - Markup block - Gen<None> - 43 - (2:0,2)
  81339. - Tag block - Gen<TagHelper> - 43 - (2:0,2) - p - PTagHelper
  81340. - StartTagAndEndTag - <p class='@DateTime.Now + 1' bound-int> ... </p>
  81341. - class - SingleQuotes
  81342. - Markup block - Gen<None> - 17 - (12:0,12)
  81343. - Markup block - Gen<DynAttr:@(12:0,12)> - 13 - (12:0,12)
  81344. - Expression block - Gen<Expr> - 13 - (12:0,12)
  81345. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:1
  81346. - SyntaxKind.Transition;[@];
  81347. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (13:0,13) - Tokens:3
  81348. - SyntaxKind.Identifier;[DateTime];
  81349. - SyntaxKind.Dot;[.];
  81350. - SyntaxKind.Identifier;[Now];
  81351. - Markup span - Gen<LitAttr: @(25:0,25)> - [ +] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:2
  81352. - SyntaxKind.Whitespace;[ ];
  81353. - SyntaxKind.Text;[+];
  81354. - Markup span - Gen<LitAttr: @(27:0,27)> - [ 1] - SpanEditHandler;Accepts:Any - (27:0,27) - Tokens:2
  81355. - SyntaxKind.Whitespace;[ ];
  81356. - SyntaxKind.Text;[1];
  81357. - bound-int - Minimized
  81358. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (45:0,45) - Tokens:1
  81359. - SyntaxKind.Unknown;[];
  81360. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (45:0,45) - Tokens:1
  81361. - SyntaxKind.RightBrace;[}];
  81362. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (46:0,46) - Tokens:1
  81363. - SyntaxKind.Unknown;[];
  81364. +RazorDocument - [0..46)::46 - [@{<p class='@DateTime.Now + 1' bound-int></p>}]
  81365. + MarkupBlock - [0..46)::46
  81366. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81367. + Marker;[];
  81368. + CSharpCodeBlock - [0..46)::46
  81369. + CSharpStatement - [0..46)::46
  81370. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81371. + Transition;[@];
  81372. + CSharpStatementBody - [1..46)::45
  81373. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81374. + LeftBrace;[{];
  81375. + CSharpCodeBlock - [2..45)::43
  81376. + MarkupBlock - [2..45)::43
  81377. + MarkupTagHelperElement - [2..45)::43 - p[StartTagAndEndTag] - PTagHelper
  81378. + MarkupTagHelperStartTag - [2..41)::39
  81379. + MarkupTextLiteral - [2..4)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81380. + OpenAngle;[<];
  81381. + Text;[p];
  81382. + MarkupTagHelperAttribute - [4..30)::26 - class - SingleQuotes - Unbound - [ class='@DateTime.Now + 1']
  81383. + MarkupTextLiteral - [4..5)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81384. + Whitespace;[ ];
  81385. + MarkupTextLiteral - [5..10)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81386. + Text;[class];
  81387. + Equals;[=];
  81388. + MarkupTextLiteral - [11..12)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  81389. + SingleQuote;['];
  81390. + MarkupTagHelperAttributeValue - [12..29)::17
  81391. + MarkupDynamicAttributeValue - [12..25)::13 - [@DateTime.Now]
  81392. + GenericBlock - [12..25)::13
  81393. + CSharpCodeBlock - [12..25)::13
  81394. + CSharpImplicitExpression - [12..25)::13
  81395. + CSharpTransition - [12..13)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81396. + Transition;[@];
  81397. + CSharpImplicitExpressionBody - [13..25)::12
  81398. + CSharpCodeBlock - [13..25)::12
  81399. + CSharpExpressionLiteral - [13..25)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  81400. + Identifier;[DateTime];
  81401. + Dot;[.];
  81402. + Identifier;[Now];
  81403. + MarkupLiteralAttributeValue - [25..27)::2 - [ +]
  81404. + MarkupTextLiteral - [25..26)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81405. + Whitespace;[ ];
  81406. + MarkupTextLiteral - [26..27)::1 - [+] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81407. + Text;[+];
  81408. + MarkupLiteralAttributeValue - [27..29)::2 - [ 1]
  81409. + MarkupTextLiteral - [27..28)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81410. + Whitespace;[ ];
  81411. + MarkupTextLiteral - [28..29)::1 - [1] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81412. + Text;[1];
  81413. + MarkupTextLiteral - [29..30)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  81414. + SingleQuote;['];
  81415. + MarkupMinimizedTagHelperAttribute - [30..40)::10 - bound-int - Minimized - Bound - [ bound-int]
  81416. + MarkupTextLiteral - [30..31)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81417. + Whitespace;[ ];
  81418. + MarkupTextLiteral - [31..40)::9 - [bound-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81419. + Text;[bound-int];
  81420. + MarkupTextLiteral - [40..41)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  81421. + CloseAngle;[>];
  81422. + MarkupTagHelperEndTag - [41..45)::4
  81423. + MarkupTextLiteral - [41..45)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  81424. + OpenAngle;[<];
  81425. + ForwardSlash;[/];
  81426. + Text;[p];
  81427. + CloseAngle;[>];
  81428. + CSharpStatementLiteral - [45..45)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  81429. + Marker;[];
  81430. + RazorMetaCode - [45..46)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81431. + RightBrace;[}];
  81432. + MarkupTextLiteral - [46..46)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81433. + Marker;[];
  81434. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block32.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block32.stree.txt
  81435. index 07091a45fc3..c36d7d279e5 100644
  81436. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block32.stree.txt
  81437. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block32.stree.txt
  81438. @@ -1,52 +1,109 @@
  81439. -Markup block - Gen<None> - 129 - (0:0,0)
  81440. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  81441. - SyntaxKind.Unknown;[];
  81442. - Statement block - Gen<None> - 129 - (0:0,0)
  81443. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  81444. - SyntaxKind.Transition;[@];
  81445. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  81446. - SyntaxKind.LeftBrace;[{];
  81447. - Markup block - Gen<None> - 126 - (2:0,2)
  81448. - Tag block - Gen<TagHelper> - 126 - (2:0,2) - input - InputTagHelper1 - InputTagHelper2 - InputTagHelper3
  81449. - SelfClosing - <input bound-required-int class='@DateTime.Now + 1' bound-required-string class='@DateTime.Now + 1' unbound-required />
  81450. - bound-required-int - Minimized
  81451. - class - SingleQuotes
  81452. - Markup block - Gen<None> - 17 - (38:0,38)
  81453. - Markup block - Gen<DynAttr:@(38:0,38)> - 13 - (38:0,38)
  81454. - Expression block - Gen<Expr> - 13 - (38:0,38)
  81455. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (38:0,38) - Tokens:1
  81456. - SyntaxKind.Transition;[@];
  81457. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (39:0,39) - Tokens:3
  81458. - SyntaxKind.Identifier;[DateTime];
  81459. - SyntaxKind.Dot;[.];
  81460. - SyntaxKind.Identifier;[Now];
  81461. - Markup span - Gen<LitAttr: @(51:0,51)> - [ +] - SpanEditHandler;Accepts:Any - (51:0,51) - Tokens:2
  81462. - SyntaxKind.Whitespace;[ ];
  81463. - SyntaxKind.Text;[+];
  81464. - Markup span - Gen<LitAttr: @(53:0,53)> - [ 1] - SpanEditHandler;Accepts:Any - (53:0,53) - Tokens:2
  81465. - SyntaxKind.Whitespace;[ ];
  81466. - SyntaxKind.Text;[1];
  81467. - bound-required-string - Minimized
  81468. - class - SingleQuotes
  81469. - Markup block - Gen<None> - 17 - (88:0,88)
  81470. - Markup block - Gen<DynAttr:@(88:0,88)> - 13 - (88:0,88)
  81471. - Expression block - Gen<Expr> - 13 - (88:0,88)
  81472. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (88:0,88) - Tokens:1
  81473. - SyntaxKind.Transition;[@];
  81474. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (89:0,89) - Tokens:3
  81475. - SyntaxKind.Identifier;[DateTime];
  81476. - SyntaxKind.Dot;[.];
  81477. - SyntaxKind.Identifier;[Now];
  81478. - Markup span - Gen<LitAttr: @(101:0,101)> - [ +] - SpanEditHandler;Accepts:Any - (101:0,101) - Tokens:2
  81479. - SyntaxKind.Whitespace;[ ];
  81480. - SyntaxKind.Text;[+];
  81481. - Markup span - Gen<LitAttr: @(103:0,103)> - [ 1] - SpanEditHandler;Accepts:Any - (103:0,103) - Tokens:2
  81482. - SyntaxKind.Whitespace;[ ];
  81483. - SyntaxKind.Text;[1];
  81484. - unbound-required - Minimized
  81485. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (128:0,128) - Tokens:1
  81486. - SyntaxKind.Unknown;[];
  81487. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (128:0,128) - Tokens:1
  81488. - SyntaxKind.RightBrace;[}];
  81489. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (129:0,129) - Tokens:1
  81490. - SyntaxKind.Unknown;[];
  81491. +RazorDocument - [0..129)::129 - [@{<input bound-required-int class='@DateTime.Now + 1' bound-required-string class='@DateTime.Now + 1' unbound-required />}]
  81492. + MarkupBlock - [0..129)::129
  81493. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81494. + Marker;[];
  81495. + CSharpCodeBlock - [0..129)::129
  81496. + CSharpStatement - [0..129)::129
  81497. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81498. + Transition;[@];
  81499. + CSharpStatementBody - [1..129)::128
  81500. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81501. + LeftBrace;[{];
  81502. + CSharpCodeBlock - [2..128)::126
  81503. + MarkupBlock - [2..128)::126
  81504. + MarkupTagHelperElement - [2..128)::126 - input[SelfClosing] - InputTagHelper1 - InputTagHelper2 - InputTagHelper3
  81505. + MarkupTagHelperStartTag - [2..128)::126
  81506. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81507. + OpenAngle;[<];
  81508. + Text;[input];
  81509. + MarkupMinimizedTagHelperAttribute - [8..30)::22 - bound-required-int - Minimized - Bound - [ bound-required-int]
  81510. + MarkupTextLiteral - [8..12)::4 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81511. + Whitespace;[ ];
  81512. + MarkupTextLiteral - [12..30)::18 - [bound-required-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81513. + Text;[bound-required-int];
  81514. + MarkupTagHelperAttribute - [30..56)::26 - class - SingleQuotes - Unbound - [ class='@DateTime.Now + 1']
  81515. + MarkupTextLiteral - [30..31)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81516. + Whitespace;[ ];
  81517. + MarkupTextLiteral - [31..36)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81518. + Text;[class];
  81519. + Equals;[=];
  81520. + MarkupTextLiteral - [37..38)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  81521. + SingleQuote;['];
  81522. + MarkupTagHelperAttributeValue - [38..55)::17
  81523. + MarkupDynamicAttributeValue - [38..51)::13 - [@DateTime.Now]
  81524. + GenericBlock - [38..51)::13
  81525. + CSharpCodeBlock - [38..51)::13
  81526. + CSharpImplicitExpression - [38..51)::13
  81527. + CSharpTransition - [38..39)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81528. + Transition;[@];
  81529. + CSharpImplicitExpressionBody - [39..51)::12
  81530. + CSharpCodeBlock - [39..51)::12
  81531. + CSharpExpressionLiteral - [39..51)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  81532. + Identifier;[DateTime];
  81533. + Dot;[.];
  81534. + Identifier;[Now];
  81535. + MarkupLiteralAttributeValue - [51..53)::2 - [ +]
  81536. + MarkupTextLiteral - [51..52)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81537. + Whitespace;[ ];
  81538. + MarkupTextLiteral - [52..53)::1 - [+] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81539. + Text;[+];
  81540. + MarkupLiteralAttributeValue - [53..55)::2 - [ 1]
  81541. + MarkupTextLiteral - [53..54)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81542. + Whitespace;[ ];
  81543. + MarkupTextLiteral - [54..55)::1 - [1] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81544. + Text;[1];
  81545. + MarkupTextLiteral - [55..56)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  81546. + SingleQuote;['];
  81547. + MarkupMinimizedTagHelperAttribute - [56..80)::24 - bound-required-string - Minimized - Bound - [ bound-required-string]
  81548. + MarkupTextLiteral - [56..59)::3 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81549. + Whitespace;[ ];
  81550. + MarkupTextLiteral - [59..80)::21 - [bound-required-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81551. + Text;[bound-required-string];
  81552. + MarkupTagHelperAttribute - [80..106)::26 - class - SingleQuotes - Unbound - [ class='@DateTime.Now + 1']
  81553. + MarkupTextLiteral - [80..81)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81554. + Whitespace;[ ];
  81555. + MarkupTextLiteral - [81..86)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81556. + Text;[class];
  81557. + Equals;[=];
  81558. + MarkupTextLiteral - [87..88)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  81559. + SingleQuote;['];
  81560. + MarkupTagHelperAttributeValue - [88..105)::17
  81561. + MarkupDynamicAttributeValue - [88..101)::13 - [@DateTime.Now]
  81562. + GenericBlock - [88..101)::13
  81563. + CSharpCodeBlock - [88..101)::13
  81564. + CSharpImplicitExpression - [88..101)::13
  81565. + CSharpTransition - [88..89)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81566. + Transition;[@];
  81567. + CSharpImplicitExpressionBody - [89..101)::12
  81568. + CSharpCodeBlock - [89..101)::12
  81569. + CSharpExpressionLiteral - [89..101)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  81570. + Identifier;[DateTime];
  81571. + Dot;[.];
  81572. + Identifier;[Now];
  81573. + MarkupLiteralAttributeValue - [101..103)::2 - [ +]
  81574. + MarkupTextLiteral - [101..102)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81575. + Whitespace;[ ];
  81576. + MarkupTextLiteral - [102..103)::1 - [+] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81577. + Text;[+];
  81578. + MarkupLiteralAttributeValue - [103..105)::2 - [ 1]
  81579. + MarkupTextLiteral - [103..104)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81580. + Whitespace;[ ];
  81581. + MarkupTextLiteral - [104..105)::1 - [1] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81582. + Text;[1];
  81583. + MarkupTextLiteral - [105..106)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  81584. + SingleQuote;['];
  81585. + MarkupMinimizedTagHelperAttribute - [106..124)::18 - unbound-required - Minimized - Unbound - [ unbound-required]
  81586. + MarkupTextLiteral - [106..108)::2 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81587. + Whitespace;[ ];
  81588. + MarkupTextLiteral - [108..124)::16 - [unbound-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81589. + Text;[unbound-required];
  81590. + MarkupTextLiteral - [124..128)::4 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  81591. + Whitespace;[ ];
  81592. + ForwardSlash;[/];
  81593. + CloseAngle;[>];
  81594. + CSharpStatementLiteral - [128..128)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  81595. + Marker;[];
  81596. + RazorMetaCode - [128..129)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81597. + RightBrace;[}];
  81598. + MarkupTextLiteral - [129..129)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81599. + Marker;[];
  81600. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block33.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block33.stree.txt
  81601. index 1c2fac1f414..68a4e77a482 100644
  81602. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block33.stree.txt
  81603. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block33.stree.txt
  81604. @@ -1,52 +1,113 @@
  81605. -Markup block - Gen<None> - 104 - (0:0,0)
  81606. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  81607. - SyntaxKind.Unknown;[];
  81608. - Statement block - Gen<None> - 104 - (0:0,0)
  81609. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  81610. - SyntaxKind.Transition;[@];
  81611. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  81612. - SyntaxKind.LeftBrace;[{];
  81613. - Markup block - Gen<None> - 101 - (2:0,2)
  81614. - Tag block - Gen<TagHelper> - 101 - (2:0,2) - p - PTagHelper
  81615. - StartTagAndEndTag - <p bound-int class='@DateTime.Now + 1' bound-string class='@DateTime.Now + 1' bound-string> ... </p>
  81616. - bound-int - Minimized
  81617. - class - SingleQuotes
  81618. - Markup block - Gen<None> - 17 - (25:0,25)
  81619. - Markup block - Gen<DynAttr:@(25:0,25)> - 13 - (25:0,25)
  81620. - Expression block - Gen<Expr> - 13 - (25:0,25)
  81621. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (25:0,25) - Tokens:1
  81622. - SyntaxKind.Transition;[@];
  81623. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (26:0,26) - Tokens:3
  81624. - SyntaxKind.Identifier;[DateTime];
  81625. - SyntaxKind.Dot;[.];
  81626. - SyntaxKind.Identifier;[Now];
  81627. - Markup span - Gen<LitAttr: @(38:0,38)> - [ +] - SpanEditHandler;Accepts:Any - (38:0,38) - Tokens:2
  81628. - SyntaxKind.Whitespace;[ ];
  81629. - SyntaxKind.Text;[+];
  81630. - Markup span - Gen<LitAttr: @(40:0,40)> - [ 1] - SpanEditHandler;Accepts:Any - (40:0,40) - Tokens:2
  81631. - SyntaxKind.Whitespace;[ ];
  81632. - SyntaxKind.Text;[1];
  81633. - bound-string - Minimized
  81634. - class - SingleQuotes
  81635. - Markup block - Gen<None> - 17 - (66:0,66)
  81636. - Markup block - Gen<DynAttr:@(66:0,66)> - 13 - (66:0,66)
  81637. - Expression block - Gen<Expr> - 13 - (66:0,66)
  81638. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (66:0,66) - Tokens:1
  81639. - SyntaxKind.Transition;[@];
  81640. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (67:0,67) - Tokens:3
  81641. - SyntaxKind.Identifier;[DateTime];
  81642. - SyntaxKind.Dot;[.];
  81643. - SyntaxKind.Identifier;[Now];
  81644. - Markup span - Gen<LitAttr: @(79:0,79)> - [ +] - SpanEditHandler;Accepts:Any - (79:0,79) - Tokens:2
  81645. - SyntaxKind.Whitespace;[ ];
  81646. - SyntaxKind.Text;[+];
  81647. - Markup span - Gen<LitAttr: @(81:0,81)> - [ 1] - SpanEditHandler;Accepts:Any - (81:0,81) - Tokens:2
  81648. - SyntaxKind.Whitespace;[ ];
  81649. - SyntaxKind.Text;[1];
  81650. - bound-string - Minimized
  81651. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (103:0,103) - Tokens:1
  81652. - SyntaxKind.Unknown;[];
  81653. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (103:0,103) - Tokens:1
  81654. - SyntaxKind.RightBrace;[}];
  81655. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (104:0,104) - Tokens:1
  81656. - SyntaxKind.Unknown;[];
  81657. +RazorDocument - [0..104)::104 - [@{<p bound-int class='@DateTime.Now + 1' bound-string class='@DateTime.Now + 1' bound-string></p>}]
  81658. + MarkupBlock - [0..104)::104
  81659. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81660. + Marker;[];
  81661. + CSharpCodeBlock - [0..104)::104
  81662. + CSharpStatement - [0..104)::104
  81663. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81664. + Transition;[@];
  81665. + CSharpStatementBody - [1..104)::103
  81666. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81667. + LeftBrace;[{];
  81668. + CSharpCodeBlock - [2..103)::101
  81669. + MarkupBlock - [2..103)::101
  81670. + MarkupTagHelperElement - [2..103)::101 - p[StartTagAndEndTag] - PTagHelper
  81671. + MarkupTagHelperStartTag - [2..99)::97
  81672. + MarkupTextLiteral - [2..4)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81673. + OpenAngle;[<];
  81674. + Text;[p];
  81675. + MarkupMinimizedTagHelperAttribute - [4..17)::13 - bound-int - Minimized - Bound - [ bound-int]
  81676. + MarkupTextLiteral - [4..8)::4 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81677. + Whitespace;[ ];
  81678. + MarkupTextLiteral - [8..17)::9 - [bound-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81679. + Text;[bound-int];
  81680. + MarkupTagHelperAttribute - [17..43)::26 - class - SingleQuotes - Unbound - [ class='@DateTime.Now + 1']
  81681. + MarkupTextLiteral - [17..18)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81682. + Whitespace;[ ];
  81683. + MarkupTextLiteral - [18..23)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81684. + Text;[class];
  81685. + Equals;[=];
  81686. + MarkupTextLiteral - [24..25)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  81687. + SingleQuote;['];
  81688. + MarkupTagHelperAttributeValue - [25..42)::17
  81689. + MarkupDynamicAttributeValue - [25..38)::13 - [@DateTime.Now]
  81690. + GenericBlock - [25..38)::13
  81691. + CSharpCodeBlock - [25..38)::13
  81692. + CSharpImplicitExpression - [25..38)::13
  81693. + CSharpTransition - [25..26)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81694. + Transition;[@];
  81695. + CSharpImplicitExpressionBody - [26..38)::12
  81696. + CSharpCodeBlock - [26..38)::12
  81697. + CSharpExpressionLiteral - [26..38)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  81698. + Identifier;[DateTime];
  81699. + Dot;[.];
  81700. + Identifier;[Now];
  81701. + MarkupLiteralAttributeValue - [38..40)::2 - [ +]
  81702. + MarkupTextLiteral - [38..39)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81703. + Whitespace;[ ];
  81704. + MarkupTextLiteral - [39..40)::1 - [+] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81705. + Text;[+];
  81706. + MarkupLiteralAttributeValue - [40..42)::2 - [ 1]
  81707. + MarkupTextLiteral - [40..41)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81708. + Whitespace;[ ];
  81709. + MarkupTextLiteral - [41..42)::1 - [1] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81710. + Text;[1];
  81711. + MarkupTextLiteral - [42..43)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  81712. + SingleQuote;['];
  81713. + MarkupMinimizedTagHelperAttribute - [43..58)::15 - bound-string - Minimized - Bound - [ bound-string]
  81714. + MarkupTextLiteral - [43..46)::3 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81715. + Whitespace;[ ];
  81716. + MarkupTextLiteral - [46..58)::12 - [bound-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81717. + Text;[bound-string];
  81718. + MarkupTagHelperAttribute - [58..84)::26 - class - SingleQuotes - Unbound - [ class='@DateTime.Now + 1']
  81719. + MarkupTextLiteral - [58..59)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81720. + Whitespace;[ ];
  81721. + MarkupTextLiteral - [59..64)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81722. + Text;[class];
  81723. + Equals;[=];
  81724. + MarkupTextLiteral - [65..66)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  81725. + SingleQuote;['];
  81726. + MarkupTagHelperAttributeValue - [66..83)::17
  81727. + MarkupDynamicAttributeValue - [66..79)::13 - [@DateTime.Now]
  81728. + GenericBlock - [66..79)::13
  81729. + CSharpCodeBlock - [66..79)::13
  81730. + CSharpImplicitExpression - [66..79)::13
  81731. + CSharpTransition - [66..67)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81732. + Transition;[@];
  81733. + CSharpImplicitExpressionBody - [67..79)::12
  81734. + CSharpCodeBlock - [67..79)::12
  81735. + CSharpExpressionLiteral - [67..79)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  81736. + Identifier;[DateTime];
  81737. + Dot;[.];
  81738. + Identifier;[Now];
  81739. + MarkupLiteralAttributeValue - [79..81)::2 - [ +]
  81740. + MarkupTextLiteral - [79..80)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81741. + Whitespace;[ ];
  81742. + MarkupTextLiteral - [80..81)::1 - [+] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81743. + Text;[+];
  81744. + MarkupLiteralAttributeValue - [81..83)::2 - [ 1]
  81745. + MarkupTextLiteral - [81..82)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81746. + Whitespace;[ ];
  81747. + MarkupTextLiteral - [82..83)::1 - [1] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81748. + Text;[1];
  81749. + MarkupTextLiteral - [83..84)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  81750. + SingleQuote;['];
  81751. + MarkupMinimizedTagHelperAttribute - [84..98)::14 - bound-string - Minimized - Bound - [ bound-string]
  81752. + MarkupTextLiteral - [84..86)::2 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81753. + Whitespace;[ ];
  81754. + MarkupTextLiteral - [86..98)::12 - [bound-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81755. + Text;[bound-string];
  81756. + MarkupTextLiteral - [98..99)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  81757. + CloseAngle;[>];
  81758. + MarkupTagHelperEndTag - [99..103)::4
  81759. + MarkupTextLiteral - [99..103)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  81760. + OpenAngle;[<];
  81761. + ForwardSlash;[/];
  81762. + Text;[p];
  81763. + CloseAngle;[>];
  81764. + CSharpStatementLiteral - [103..103)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  81765. + Marker;[];
  81766. + RazorMetaCode - [103..104)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81767. + RightBrace;[}];
  81768. + MarkupTextLiteral - [104..104)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81769. + Marker;[];
  81770. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block4.stree.txt
  81771. index 1a9d7da7dc9..15574d2312a 100644
  81772. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block4.stree.txt
  81773. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block4.stree.txt
  81774. @@ -1,18 +1,33 @@
  81775. -Markup block - Gen<None> - 31 - (0:0,0)
  81776. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  81777. - SyntaxKind.Unknown;[];
  81778. - Statement block - Gen<None> - 31 - (0:0,0)
  81779. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  81780. - SyntaxKind.Transition;[@];
  81781. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  81782. - SyntaxKind.LeftBrace;[{];
  81783. - Markup block - Gen<None> - 28 - (2:0,2)
  81784. - Tag block - Gen<TagHelper> - 28 - (2:0,2) - input - InputTagHelper2 - InputTagHelper3
  81785. - SelfClosing - <input bound-required-int />
  81786. - bound-required-int - Minimized
  81787. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (30:0,30) - Tokens:1
  81788. - SyntaxKind.Unknown;[];
  81789. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (30:0,30) - Tokens:1
  81790. - SyntaxKind.RightBrace;[}];
  81791. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (31:0,31) - Tokens:1
  81792. - SyntaxKind.Unknown;[];
  81793. +RazorDocument - [0..31)::31 - [@{<input bound-required-int />}]
  81794. + MarkupBlock - [0..31)::31
  81795. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81796. + Marker;[];
  81797. + CSharpCodeBlock - [0..31)::31
  81798. + CSharpStatement - [0..31)::31
  81799. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81800. + Transition;[@];
  81801. + CSharpStatementBody - [1..31)::30
  81802. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81803. + LeftBrace;[{];
  81804. + CSharpCodeBlock - [2..30)::28
  81805. + MarkupBlock - [2..30)::28
  81806. + MarkupTagHelperElement - [2..30)::28 - input[SelfClosing] - InputTagHelper2 - InputTagHelper3
  81807. + MarkupTagHelperStartTag - [2..30)::28
  81808. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81809. + OpenAngle;[<];
  81810. + Text;[input];
  81811. + MarkupMinimizedTagHelperAttribute - [8..27)::19 - bound-required-int - Minimized - Bound - [ bound-required-int]
  81812. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81813. + Whitespace;[ ];
  81814. + MarkupTextLiteral - [9..27)::18 - [bound-required-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81815. + Text;[bound-required-int];
  81816. + MarkupTextLiteral - [27..30)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  81817. + Whitespace;[ ];
  81818. + ForwardSlash;[/];
  81819. + CloseAngle;[>];
  81820. + CSharpStatementLiteral - [30..30)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  81821. + Marker;[];
  81822. + RazorMetaCode - [30..31)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81823. + RightBrace;[}];
  81824. + MarkupTextLiteral - [31..31)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81825. + Marker;[];
  81826. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block5.stree.txt
  81827. index 59d1be13085..8547da82f9a 100644
  81828. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block5.stree.txt
  81829. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block5.stree.txt
  81830. @@ -1,18 +1,37 @@
  81831. -Markup block - Gen<None> - 20 - (0:0,0)
  81832. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  81833. - SyntaxKind.Unknown;[];
  81834. - Statement block - Gen<None> - 20 - (0:0,0)
  81835. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  81836. - SyntaxKind.Transition;[@];
  81837. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  81838. - SyntaxKind.LeftBrace;[{];
  81839. - Markup block - Gen<None> - 17 - (2:0,2)
  81840. - Tag block - Gen<TagHelper> - 17 - (2:0,2) - p - PTagHelper
  81841. - StartTagAndEndTag - <p bound-int> ... </p>
  81842. - bound-int - Minimized
  81843. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:1
  81844. - SyntaxKind.Unknown;[];
  81845. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (19:0,19) - Tokens:1
  81846. - SyntaxKind.RightBrace;[}];
  81847. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:1
  81848. - SyntaxKind.Unknown;[];
  81849. +RazorDocument - [0..20)::20 - [@{<p bound-int></p>}]
  81850. + MarkupBlock - [0..20)::20
  81851. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81852. + Marker;[];
  81853. + CSharpCodeBlock - [0..20)::20
  81854. + CSharpStatement - [0..20)::20
  81855. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81856. + Transition;[@];
  81857. + CSharpStatementBody - [1..20)::19
  81858. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81859. + LeftBrace;[{];
  81860. + CSharpCodeBlock - [2..19)::17
  81861. + MarkupBlock - [2..19)::17
  81862. + MarkupTagHelperElement - [2..19)::17 - p[StartTagAndEndTag] - PTagHelper
  81863. + MarkupTagHelperStartTag - [2..15)::13
  81864. + MarkupTextLiteral - [2..4)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81865. + OpenAngle;[<];
  81866. + Text;[p];
  81867. + MarkupMinimizedTagHelperAttribute - [4..14)::10 - bound-int - Minimized - Bound - [ bound-int]
  81868. + MarkupTextLiteral - [4..5)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81869. + Whitespace;[ ];
  81870. + MarkupTextLiteral - [5..14)::9 - [bound-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81871. + Text;[bound-int];
  81872. + MarkupTextLiteral - [14..15)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  81873. + CloseAngle;[>];
  81874. + MarkupTagHelperEndTag - [15..19)::4
  81875. + MarkupTextLiteral - [15..19)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  81876. + OpenAngle;[<];
  81877. + ForwardSlash;[/];
  81878. + Text;[p];
  81879. + CloseAngle;[>];
  81880. + CSharpStatementLiteral - [19..19)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  81881. + Marker;[];
  81882. + RazorMetaCode - [19..20)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81883. + RightBrace;[}];
  81884. + MarkupTextLiteral - [20..20)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81885. + Marker;[];
  81886. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block6.stree.txt
  81887. index f879e42b408..7d1690d897f 100644
  81888. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block6.stree.txt
  81889. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block6.stree.txt
  81890. @@ -1,18 +1,32 @@
  81891. -Markup block - Gen<None> - 26 - (0:0,0)
  81892. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  81893. - SyntaxKind.Unknown;[];
  81894. - Statement block - Gen<None> - 26 - (0:0,0)
  81895. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  81896. - SyntaxKind.Transition;[@];
  81897. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  81898. - SyntaxKind.LeftBrace;[{];
  81899. - Markup block - Gen<None> - 23 - (2:0,2)
  81900. - Tag block - Gen<TagHelper> - 23 - (2:0,2) - input - InputTagHelper3
  81901. - SelfClosing - <input int-dictionary/>
  81902. - int-dictionary - Minimized
  81903. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:1
  81904. - SyntaxKind.Unknown;[];
  81905. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (25:0,25) - Tokens:1
  81906. - SyntaxKind.RightBrace;[}];
  81907. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (26:0,26) - Tokens:1
  81908. - SyntaxKind.Unknown;[];
  81909. +RazorDocument - [0..26)::26 - [@{<input int-dictionary/>}]
  81910. + MarkupBlock - [0..26)::26
  81911. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81912. + Marker;[];
  81913. + CSharpCodeBlock - [0..26)::26
  81914. + CSharpStatement - [0..26)::26
  81915. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81916. + Transition;[@];
  81917. + CSharpStatementBody - [1..26)::25
  81918. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81919. + LeftBrace;[{];
  81920. + CSharpCodeBlock - [2..25)::23
  81921. + MarkupBlock - [2..25)::23
  81922. + MarkupTagHelperElement - [2..25)::23 - input[SelfClosing] - InputTagHelper3
  81923. + MarkupTagHelperStartTag - [2..25)::23
  81924. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81925. + OpenAngle;[<];
  81926. + Text;[input];
  81927. + MarkupMinimizedTagHelperAttribute - [8..23)::15 - int-dictionary - Minimized - Bound - [ int-dictionary]
  81928. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81929. + Whitespace;[ ];
  81930. + MarkupTextLiteral - [9..23)::14 - [int-dictionary] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81931. + Text;[int-dictionary];
  81932. + MarkupTextLiteral - [23..25)::2 - [/>] - Gen<Markup> - SpanEditHandler;Accepts:None
  81933. + ForwardSlash;[/];
  81934. + CloseAngle;[>];
  81935. + CSharpStatementLiteral - [25..25)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  81936. + Marker;[];
  81937. + RazorMetaCode - [25..26)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81938. + RightBrace;[}];
  81939. + MarkupTextLiteral - [26..26)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81940. + Marker;[];
  81941. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block7.stree.txt
  81942. index c1ea18d206b..2f52d89c24b 100644
  81943. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block7.stree.txt
  81944. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block7.stree.txt
  81945. @@ -1,18 +1,33 @@
  81946. -Markup block - Gen<None> - 30 - (0:0,0)
  81947. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  81948. - SyntaxKind.Unknown;[];
  81949. - Statement block - Gen<None> - 30 - (0:0,0)
  81950. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  81951. - SyntaxKind.Transition;[@];
  81952. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  81953. - SyntaxKind.LeftBrace;[{];
  81954. - Markup block - Gen<None> - 27 - (2:0,2)
  81955. - Tag block - Gen<TagHelper> - 27 - (2:0,2) - input - InputTagHelper3
  81956. - SelfClosing - <input string-dictionary />
  81957. - string-dictionary - Minimized
  81958. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (29:0,29) - Tokens:1
  81959. - SyntaxKind.Unknown;[];
  81960. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (29:0,29) - Tokens:1
  81961. - SyntaxKind.RightBrace;[}];
  81962. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (30:0,30) - Tokens:1
  81963. - SyntaxKind.Unknown;[];
  81964. +RazorDocument - [0..30)::30 - [@{<input string-dictionary />}]
  81965. + MarkupBlock - [0..30)::30
  81966. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81967. + Marker;[];
  81968. + CSharpCodeBlock - [0..30)::30
  81969. + CSharpStatement - [0..30)::30
  81970. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81971. + Transition;[@];
  81972. + CSharpStatementBody - [1..30)::29
  81973. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81974. + LeftBrace;[{];
  81975. + CSharpCodeBlock - [2..29)::27
  81976. + MarkupBlock - [2..29)::27
  81977. + MarkupTagHelperElement - [2..29)::27 - input[SelfClosing] - InputTagHelper3
  81978. + MarkupTagHelperStartTag - [2..29)::27
  81979. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81980. + OpenAngle;[<];
  81981. + Text;[input];
  81982. + MarkupMinimizedTagHelperAttribute - [8..26)::18 - string-dictionary - Minimized - Bound - [ string-dictionary]
  81983. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81984. + Whitespace;[ ];
  81985. + MarkupTextLiteral - [9..26)::17 - [string-dictionary] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81986. + Text;[string-dictionary];
  81987. + MarkupTextLiteral - [26..29)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  81988. + Whitespace;[ ];
  81989. + ForwardSlash;[/];
  81990. + CloseAngle;[>];
  81991. + CSharpStatementLiteral - [29..29)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  81992. + Marker;[];
  81993. + RazorMetaCode - [29..30)::1 - Gen<None> - SpanEditHandler;Accepts:None
  81994. + RightBrace;[}];
  81995. + MarkupTextLiteral - [30..30)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  81996. + Marker;[];
  81997. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block8.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block8.stree.txt
  81998. index 84b73ec0fda..aa96354dea7 100644
  81999. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block8.stree.txt
  82000. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block8.stree.txt
  82001. @@ -1,18 +1,33 @@
  82002. -Markup block - Gen<None> - 24 - (0:0,0)
  82003. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  82004. - SyntaxKind.Unknown;[];
  82005. - Statement block - Gen<None> - 24 - (0:0,0)
  82006. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  82007. - SyntaxKind.Transition;[@];
  82008. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  82009. - SyntaxKind.LeftBrace;[{];
  82010. - Markup block - Gen<None> - 21 - (2:0,2)
  82011. - Tag block - Gen<TagHelper> - 21 - (2:0,2) - input - InputTagHelper3
  82012. - SelfClosing - <input int-prefix- />
  82013. - int-prefix- - Minimized
  82014. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:1
  82015. - SyntaxKind.Unknown;[];
  82016. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (23:0,23) - Tokens:1
  82017. - SyntaxKind.RightBrace;[}];
  82018. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (24:0,24) - Tokens:1
  82019. - SyntaxKind.Unknown;[];
  82020. +RazorDocument - [0..24)::24 - [@{<input int-prefix- />}]
  82021. + MarkupBlock - [0..24)::24
  82022. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82023. + Marker;[];
  82024. + CSharpCodeBlock - [0..24)::24
  82025. + CSharpStatement - [0..24)::24
  82026. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  82027. + Transition;[@];
  82028. + CSharpStatementBody - [1..24)::23
  82029. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  82030. + LeftBrace;[{];
  82031. + CSharpCodeBlock - [2..23)::21
  82032. + MarkupBlock - [2..23)::21
  82033. + MarkupTagHelperElement - [2..23)::21 - input[SelfClosing] - InputTagHelper3
  82034. + MarkupTagHelperStartTag - [2..23)::21
  82035. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82036. + OpenAngle;[<];
  82037. + Text;[input];
  82038. + MarkupMinimizedTagHelperAttribute - [8..20)::12 - int-prefix- - Minimized - Bound - [ int-prefix-]
  82039. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82040. + Whitespace;[ ];
  82041. + MarkupTextLiteral - [9..20)::11 - [int-prefix-] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82042. + Text;[int-prefix-];
  82043. + MarkupTextLiteral - [20..23)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:None
  82044. + Whitespace;[ ];
  82045. + ForwardSlash;[/];
  82046. + CloseAngle;[>];
  82047. + CSharpStatementLiteral - [23..23)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  82048. + Marker;[];
  82049. + RazorMetaCode - [23..24)::1 - Gen<None> - SpanEditHandler;Accepts:None
  82050. + RightBrace;[}];
  82051. + MarkupTextLiteral - [24..24)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82052. + Marker;[];
  82053. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block9.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block9.stree.txt
  82054. index 5bee7d7fac4..a66614b0ff6 100644
  82055. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block9.stree.txt
  82056. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Block9.stree.txt
  82057. @@ -1,18 +1,32 @@
  82058. -Markup block - Gen<None> - 26 - (0:0,0)
  82059. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  82060. - SyntaxKind.Unknown;[];
  82061. - Statement block - Gen<None> - 26 - (0:0,0)
  82062. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  82063. - SyntaxKind.Transition;[@];
  82064. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  82065. - SyntaxKind.LeftBrace;[{];
  82066. - Markup block - Gen<None> - 23 - (2:0,2)
  82067. - Tag block - Gen<TagHelper> - 23 - (2:0,2) - input - InputTagHelper3
  82068. - SelfClosing - <input string-prefix-/>
  82069. - string-prefix- - Minimized
  82070. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:1
  82071. - SyntaxKind.Unknown;[];
  82072. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (25:0,25) - Tokens:1
  82073. - SyntaxKind.RightBrace;[}];
  82074. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (26:0,26) - Tokens:1
  82075. - SyntaxKind.Unknown;[];
  82076. +RazorDocument - [0..26)::26 - [@{<input string-prefix-/>}]
  82077. + MarkupBlock - [0..26)::26
  82078. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82079. + Marker;[];
  82080. + CSharpCodeBlock - [0..26)::26
  82081. + CSharpStatement - [0..26)::26
  82082. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  82083. + Transition;[@];
  82084. + CSharpStatementBody - [1..26)::25
  82085. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  82086. + LeftBrace;[{];
  82087. + CSharpCodeBlock - [2..25)::23
  82088. + MarkupBlock - [2..25)::23
  82089. + MarkupTagHelperElement - [2..25)::23 - input[SelfClosing] - InputTagHelper3
  82090. + MarkupTagHelperStartTag - [2..25)::23
  82091. + MarkupTextLiteral - [2..8)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82092. + OpenAngle;[<];
  82093. + Text;[input];
  82094. + MarkupMinimizedTagHelperAttribute - [8..23)::15 - string-prefix- - Minimized - Bound - [ string-prefix-]
  82095. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82096. + Whitespace;[ ];
  82097. + MarkupTextLiteral - [9..23)::14 - [string-prefix-] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82098. + Text;[string-prefix-];
  82099. + MarkupTextLiteral - [23..25)::2 - [/>] - Gen<Markup> - SpanEditHandler;Accepts:None
  82100. + ForwardSlash;[/];
  82101. + CloseAngle;[>];
  82102. + CSharpStatementLiteral - [25..25)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  82103. + Marker;[];
  82104. + RazorMetaCode - [25..26)::1 - Gen<None> - SpanEditHandler;Accepts:None
  82105. + RightBrace;[}];
  82106. + MarkupTextLiteral - [26..26)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82107. + Marker;[];
  82108. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document1.stree.txt
  82109. index 8a35bfa8f2c..0c464f72419 100644
  82110. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document1.stree.txt
  82111. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document1.stree.txt
  82112. @@ -1,4 +1,16 @@
  82113. -Markup block - Gen<None> - 26 - (0:0,0)
  82114. - Tag block - Gen<TagHelper> - 26 - (0:0,0) - input - InputTagHelper1 - InputTagHelper3
  82115. - SelfClosing - <input unbound-required />
  82116. - unbound-required - Minimized
  82117. +RazorDocument - [0..26)::26 - [<input unbound-required />]
  82118. + MarkupBlock - [0..26)::26
  82119. + MarkupTagHelperElement - [0..26)::26 - input[SelfClosing] - InputTagHelper1 - InputTagHelper3
  82120. + MarkupTagHelperStartTag - [0..26)::26
  82121. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82122. + OpenAngle;[<];
  82123. + Text;[input];
  82124. + MarkupMinimizedTagHelperAttribute - [6..23)::17 - unbound-required - Minimized - Unbound - [ unbound-required]
  82125. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82126. + Whitespace;[ ];
  82127. + MarkupTextLiteral - [7..23)::16 - [unbound-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82128. + Text;[unbound-required];
  82129. + MarkupTextLiteral - [23..26)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82130. + Whitespace;[ ];
  82131. + ForwardSlash;[/];
  82132. + CloseAngle;[>];
  82133. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document10.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document10.stree.txt
  82134. index 8c636ecf078..eb325261e09 100644
  82135. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document10.stree.txt
  82136. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document10.stree.txt
  82137. @@ -1,4 +1,15 @@
  82138. -Markup block - Gen<None> - 25 - (0:0,0)
  82139. - Tag block - Gen<TagHelper> - 25 - (0:0,0) - input - InputTagHelper3
  82140. - SelfClosing - <input int-prefix-value/>
  82141. - int-prefix-value - Minimized
  82142. +RazorDocument - [0..25)::25 - [<input int-prefix-value/>]
  82143. + MarkupBlock - [0..25)::25
  82144. + MarkupTagHelperElement - [0..25)::25 - input[SelfClosing] - InputTagHelper3
  82145. + MarkupTagHelperStartTag - [0..25)::25
  82146. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82147. + OpenAngle;[<];
  82148. + Text;[input];
  82149. + MarkupMinimizedTagHelperAttribute - [6..23)::17 - int-prefix-value - Minimized - Bound - [ int-prefix-value]
  82150. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82151. + Whitespace;[ ];
  82152. + MarkupTextLiteral - [7..23)::16 - [int-prefix-value] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82153. + Text;[int-prefix-value];
  82154. + MarkupTextLiteral - [23..25)::2 - [/>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82155. + ForwardSlash;[/];
  82156. + CloseAngle;[>];
  82157. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document11.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document11.stree.txt
  82158. index f8f403ef117..74209e50454 100644
  82159. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document11.stree.txt
  82160. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document11.stree.txt
  82161. @@ -1,4 +1,16 @@
  82162. -Markup block - Gen<None> - 29 - (0:0,0)
  82163. - Tag block - Gen<TagHelper> - 29 - (0:0,0) - input - InputTagHelper3
  82164. - SelfClosing - <input string-prefix-value />
  82165. - string-prefix-value - Minimized
  82166. +RazorDocument - [0..29)::29 - [<input string-prefix-value />]
  82167. + MarkupBlock - [0..29)::29
  82168. + MarkupTagHelperElement - [0..29)::29 - input[SelfClosing] - InputTagHelper3
  82169. + MarkupTagHelperStartTag - [0..29)::29
  82170. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82171. + OpenAngle;[<];
  82172. + Text;[input];
  82173. + MarkupMinimizedTagHelperAttribute - [6..26)::20 - string-prefix-value - Minimized - Bound - [ string-prefix-value]
  82174. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82175. + Whitespace;[ ];
  82176. + MarkupTextLiteral - [7..26)::19 - [string-prefix-value] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82177. + Text;[string-prefix-value];
  82178. + MarkupTextLiteral - [26..29)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82179. + Whitespace;[ ];
  82180. + ForwardSlash;[/];
  82181. + CloseAngle;[>];
  82182. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document12.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document12.cspans.txt
  82183. index e69de29bb2d..fd32ae83455 100644
  82184. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document12.cspans.txt
  82185. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document12.cspans.txt
  82186. @@ -0,0 +1 @@
  82187. +Code span at (25:0,25 [0] ) (Accepts:AnyExceptNewline) - Parent: Tag block at (0:0,0 [29] )
  82188. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document12.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document12.stree.txt
  82189. index e5a9fb8e252..61cafbb65f2 100644
  82190. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document12.stree.txt
  82191. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document12.stree.txt
  82192. @@ -1,5 +1,23 @@
  82193. -Markup block - Gen<None> - 29 - (0:0,0)
  82194. - Tag block - Gen<TagHelper> - 29 - (0:0,0) - input - InputTagHelper3
  82195. - SelfClosing - <input int-prefix-value='' />
  82196. - int-prefix-value - SingleQuotes
  82197. - Markup block - Gen<None> - 0 - (0:0,0)
  82198. +RazorDocument - [0..29)::29 - [<input int-prefix-value='' />]
  82199. + MarkupBlock - [0..29)::29
  82200. + MarkupTagHelperElement - [0..29)::29 - input[SelfClosing] - InputTagHelper3
  82201. + MarkupTagHelperStartTag - [0..29)::29
  82202. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82203. + OpenAngle;[<];
  82204. + Text;[input];
  82205. + MarkupTagHelperAttribute - [6..26)::20 - int-prefix-value - SingleQuotes - Bound - [ int-prefix-value='']
  82206. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82207. + Whitespace;[ ];
  82208. + MarkupTextLiteral - [7..23)::16 - [int-prefix-value] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82209. + Text;[int-prefix-value];
  82210. + Equals;[=];
  82211. + MarkupTextLiteral - [24..25)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82212. + SingleQuote;['];
  82213. + MarkupTagHelperAttributeValue - [25..25)::0
  82214. + CSharpExpressionLiteral - [25..25)::0 - [] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  82215. + MarkupTextLiteral - [25..26)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82216. + SingleQuote;['];
  82217. + MarkupTextLiteral - [26..29)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82218. + Whitespace;[ ];
  82219. + ForwardSlash;[/];
  82220. + CloseAngle;[>];
  82221. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document13.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document13.cspans.txt
  82222. index e69de29bb2d..8bfb2008370 100644
  82223. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document13.cspans.txt
  82224. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document13.cspans.txt
  82225. @@ -0,0 +1 @@
  82226. +Markup span at (28:0,28 [0] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [31] )
  82227. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document13.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document13.stree.txt
  82228. index 7f597a2b726..895be9f994e 100644
  82229. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document13.stree.txt
  82230. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document13.stree.txt
  82231. @@ -1,5 +1,22 @@
  82232. -Markup block - Gen<None> - 31 - (0:0,0)
  82233. - Tag block - Gen<TagHelper> - 31 - (0:0,0) - input - InputTagHelper3
  82234. - SelfClosing - <input string-prefix-value=''/>
  82235. - string-prefix-value - SingleQuotes
  82236. - Markup block - Gen<None> - 0 - (0:0,0)
  82237. +RazorDocument - [0..31)::31 - [<input string-prefix-value=''/>]
  82238. + MarkupBlock - [0..31)::31
  82239. + MarkupTagHelperElement - [0..31)::31 - input[SelfClosing] - InputTagHelper3
  82240. + MarkupTagHelperStartTag - [0..31)::31
  82241. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82242. + OpenAngle;[<];
  82243. + Text;[input];
  82244. + MarkupTagHelperAttribute - [6..29)::23 - string-prefix-value - SingleQuotes - Bound - [ string-prefix-value='']
  82245. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82246. + Whitespace;[ ];
  82247. + MarkupTextLiteral - [7..26)::19 - [string-prefix-value] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82248. + Text;[string-prefix-value];
  82249. + Equals;[=];
  82250. + MarkupTextLiteral - [27..28)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82251. + SingleQuote;['];
  82252. + MarkupTagHelperAttributeValue - [28..28)::0
  82253. + MarkupTextLiteral - [28..28)::0 - []
  82254. + MarkupTextLiteral - [28..29)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82255. + SingleQuote;['];
  82256. + MarkupTextLiteral - [29..31)::2 - [/>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82257. + ForwardSlash;[/];
  82258. + CloseAngle;[>];
  82259. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document14.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document14.stree.txt
  82260. index 4226a82db7d..e61b4bc8067 100644
  82261. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document14.stree.txt
  82262. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document14.stree.txt
  82263. @@ -1,6 +1,23 @@
  82264. -Markup block - Gen<None> - 29 - (0:0,0)
  82265. - Tag block - Gen<TagHelper> - 29 - (0:0,0) - input - InputTagHelper3
  82266. - SelfClosing - <input int-prefix-value='3'/>
  82267. - int-prefix-value - SingleQuotes
  82268. - Code span - Gen<Expr> - [3] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (25:0,25) - Tokens:1
  82269. - SyntaxKind.Text;[3];
  82270. +RazorDocument - [0..29)::29 - [<input int-prefix-value='3'/>]
  82271. + MarkupBlock - [0..29)::29
  82272. + MarkupTagHelperElement - [0..29)::29 - input[SelfClosing] - InputTagHelper3
  82273. + MarkupTagHelperStartTag - [0..29)::29
  82274. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82275. + OpenAngle;[<];
  82276. + Text;[input];
  82277. + MarkupTagHelperAttribute - [6..27)::21 - int-prefix-value - SingleQuotes - Bound - [ int-prefix-value='3']
  82278. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82279. + Whitespace;[ ];
  82280. + MarkupTextLiteral - [7..23)::16 - [int-prefix-value] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82281. + Text;[int-prefix-value];
  82282. + Equals;[=];
  82283. + MarkupTextLiteral - [24..25)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82284. + SingleQuote;['];
  82285. + MarkupTagHelperAttributeValue - [25..26)::1
  82286. + CSharpExpressionLiteral - [25..26)::1 - [3] - Gen<None> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  82287. + Text;[3];
  82288. + MarkupTextLiteral - [26..27)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82289. + SingleQuote;['];
  82290. + MarkupTextLiteral - [27..29)::2 - [/>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82291. + ForwardSlash;[/];
  82292. + CloseAngle;[>];
  82293. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document15.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document15.stree.txt
  82294. index f3971cb6fab..24aba9fd43d 100644
  82295. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document15.stree.txt
  82296. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document15.stree.txt
  82297. @@ -1,10 +1,27 @@
  82298. -Markup block - Gen<None> - 43 - (0:0,0)
  82299. - Tag block - Gen<TagHelper> - 43 - (0:0,0) - input - InputTagHelper3
  82300. - SelfClosing - <input string-prefix-value='some string' />
  82301. - string-prefix-value - SingleQuotes
  82302. - Markup block - Gen<None> - 11 - (28:0,28)
  82303. - Markup span - Gen<Markup> - [some] - SpanEditHandler;Accepts:Any - (28:0,28) - Tokens:1
  82304. - SyntaxKind.Text;[some];
  82305. - Markup span - Gen<Markup> - [ string] - SpanEditHandler;Accepts:Any - (32:0,32) - Tokens:2
  82306. - SyntaxKind.Whitespace;[ ];
  82307. - SyntaxKind.Text;[string];
  82308. +RazorDocument - [0..43)::43 - [<input string-prefix-value='some string' />]
  82309. + MarkupBlock - [0..43)::43
  82310. + MarkupTagHelperElement - [0..43)::43 - input[SelfClosing] - InputTagHelper3
  82311. + MarkupTagHelperStartTag - [0..43)::43
  82312. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82313. + OpenAngle;[<];
  82314. + Text;[input];
  82315. + MarkupTagHelperAttribute - [6..40)::34 - string-prefix-value - SingleQuotes - Bound - [ string-prefix-value='some string']
  82316. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82317. + Whitespace;[ ];
  82318. + MarkupTextLiteral - [7..26)::19 - [string-prefix-value] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82319. + Text;[string-prefix-value];
  82320. + Equals;[=];
  82321. + MarkupTextLiteral - [27..28)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82322. + SingleQuote;['];
  82323. + MarkupTagHelperAttributeValue - [28..39)::11
  82324. + MarkupTextLiteral - [28..32)::4 - [some] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82325. + Text;[some];
  82326. + MarkupTextLiteral - [32..39)::7 - [ string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82327. + Whitespace;[ ];
  82328. + Text;[string];
  82329. + MarkupTextLiteral - [39..40)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82330. + SingleQuote;['];
  82331. + MarkupTextLiteral - [40..43)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82332. + Whitespace;[ ];
  82333. + ForwardSlash;[/];
  82334. + CloseAngle;[>];
  82335. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document16.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document16.stree.txt
  82336. index 670480e0018..0b6e2afcbe5 100644
  82337. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document16.stree.txt
  82338. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document16.stree.txt
  82339. @@ -1,5 +1,21 @@
  82340. -Markup block - Gen<None> - 48 - (0:0,0)
  82341. - Tag block - Gen<TagHelper> - 48 - (0:0,0) - input - InputTagHelper1 - InputTagHelper3
  82342. - SelfClosing - <input unbound-required bound-required-string />
  82343. - unbound-required - Minimized
  82344. - bound-required-string - Minimized
  82345. +RazorDocument - [0..48)::48 - [<input unbound-required bound-required-string />]
  82346. + MarkupBlock - [0..48)::48
  82347. + MarkupTagHelperElement - [0..48)::48 - input[SelfClosing] - InputTagHelper1 - InputTagHelper3
  82348. + MarkupTagHelperStartTag - [0..48)::48
  82349. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82350. + OpenAngle;[<];
  82351. + Text;[input];
  82352. + MarkupMinimizedTagHelperAttribute - [6..23)::17 - unbound-required - Minimized - Unbound - [ unbound-required]
  82353. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82354. + Whitespace;[ ];
  82355. + MarkupTextLiteral - [7..23)::16 - [unbound-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82356. + Text;[unbound-required];
  82357. + MarkupMinimizedTagHelperAttribute - [23..45)::22 - bound-required-string - Minimized - Bound - [ bound-required-string]
  82358. + MarkupTextLiteral - [23..24)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82359. + Whitespace;[ ];
  82360. + MarkupTextLiteral - [24..45)::21 - [bound-required-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82361. + Text;[bound-required-string];
  82362. + MarkupTextLiteral - [45..48)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82363. + Whitespace;[ ];
  82364. + ForwardSlash;[/];
  82365. + CloseAngle;[>];
  82366. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document17.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document17.stree.txt
  82367. index f2b82508fc1..721c05474f9 100644
  82368. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document17.stree.txt
  82369. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document17.stree.txt
  82370. @@ -1,5 +1,25 @@
  82371. -Markup block - Gen<None> - 30 - (0:0,0)
  82372. - Tag block - Gen<TagHelper> - 30 - (0:0,0) - p - PTagHelper
  82373. - StartTagAndEndTag - <p bound-int bound-string> ... </p>
  82374. - bound-int - Minimized
  82375. - bound-string - Minimized
  82376. +RazorDocument - [0..30)::30 - [<p bound-int bound-string></p>]
  82377. + MarkupBlock - [0..30)::30
  82378. + MarkupTagHelperElement - [0..30)::30 - p[StartTagAndEndTag] - PTagHelper
  82379. + MarkupTagHelperStartTag - [0..26)::26
  82380. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82381. + OpenAngle;[<];
  82382. + Text;[p];
  82383. + MarkupMinimizedTagHelperAttribute - [2..12)::10 - bound-int - Minimized - Bound - [ bound-int]
  82384. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82385. + Whitespace;[ ];
  82386. + MarkupTextLiteral - [3..12)::9 - [bound-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82387. + Text;[bound-int];
  82388. + MarkupMinimizedTagHelperAttribute - [12..25)::13 - bound-string - Minimized - Bound - [ bound-string]
  82389. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82390. + Whitespace;[ ];
  82391. + MarkupTextLiteral - [13..25)::12 - [bound-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82392. + Text;[bound-string];
  82393. + MarkupTextLiteral - [25..26)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82394. + CloseAngle;[>];
  82395. + MarkupTagHelperEndTag - [26..30)::4
  82396. + MarkupTextLiteral - [26..30)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82397. + OpenAngle;[<];
  82398. + ForwardSlash;[/];
  82399. + Text;[p];
  82400. + CloseAngle;[>];
  82401. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document18.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document18.stree.txt
  82402. index 100a7b39844..289ffb0d02e 100644
  82403. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document18.stree.txt
  82404. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document18.stree.txt
  82405. @@ -1,6 +1,26 @@
  82406. -Markup block - Gen<None> - 67 - (0:0,0)
  82407. - Tag block - Gen<TagHelper> - 67 - (0:0,0) - input - InputTagHelper1 - InputTagHelper2 - InputTagHelper3
  82408. - SelfClosing - <input bound-required-int unbound-required bound-required-string />
  82409. - bound-required-int - Minimized
  82410. - unbound-required - Minimized
  82411. - bound-required-string - Minimized
  82412. +RazorDocument - [0..67)::67 - [<input bound-required-int unbound-required bound-required-string />]
  82413. + MarkupBlock - [0..67)::67
  82414. + MarkupTagHelperElement - [0..67)::67 - input[SelfClosing] - InputTagHelper1 - InputTagHelper2 - InputTagHelper3
  82415. + MarkupTagHelperStartTag - [0..67)::67
  82416. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82417. + OpenAngle;[<];
  82418. + Text;[input];
  82419. + MarkupMinimizedTagHelperAttribute - [6..25)::19 - bound-required-int - Minimized - Bound - [ bound-required-int]
  82420. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82421. + Whitespace;[ ];
  82422. + MarkupTextLiteral - [7..25)::18 - [bound-required-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82423. + Text;[bound-required-int];
  82424. + MarkupMinimizedTagHelperAttribute - [25..42)::17 - unbound-required - Minimized - Unbound - [ unbound-required]
  82425. + MarkupTextLiteral - [25..26)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82426. + Whitespace;[ ];
  82427. + MarkupTextLiteral - [26..42)::16 - [unbound-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82428. + Text;[unbound-required];
  82429. + MarkupMinimizedTagHelperAttribute - [42..64)::22 - bound-required-string - Minimized - Bound - [ bound-required-string]
  82430. + MarkupTextLiteral - [42..43)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82431. + Whitespace;[ ];
  82432. + MarkupTextLiteral - [43..64)::21 - [bound-required-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82433. + Text;[bound-required-string];
  82434. + MarkupTextLiteral - [64..67)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82435. + Whitespace;[ ];
  82436. + ForwardSlash;[/];
  82437. + CloseAngle;[>];
  82438. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document19.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document19.stree.txt
  82439. index a3c21fad15d..eadd688119d 100644
  82440. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document19.stree.txt
  82441. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document19.stree.txt
  82442. @@ -1,6 +1,30 @@
  82443. -Markup block - Gen<None> - 43 - (0:0,0)
  82444. - Tag block - Gen<TagHelper> - 43 - (0:0,0) - p - PTagHelper
  82445. - StartTagAndEndTag - <p bound-int bound-string bound-string> ... </p>
  82446. - bound-int - Minimized
  82447. - bound-string - Minimized
  82448. - bound-string - Minimized
  82449. +RazorDocument - [0..43)::43 - [<p bound-int bound-string bound-string></p>]
  82450. + MarkupBlock - [0..43)::43
  82451. + MarkupTagHelperElement - [0..43)::43 - p[StartTagAndEndTag] - PTagHelper
  82452. + MarkupTagHelperStartTag - [0..39)::39
  82453. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82454. + OpenAngle;[<];
  82455. + Text;[p];
  82456. + MarkupMinimizedTagHelperAttribute - [2..12)::10 - bound-int - Minimized - Bound - [ bound-int]
  82457. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82458. + Whitespace;[ ];
  82459. + MarkupTextLiteral - [3..12)::9 - [bound-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82460. + Text;[bound-int];
  82461. + MarkupMinimizedTagHelperAttribute - [12..25)::13 - bound-string - Minimized - Bound - [ bound-string]
  82462. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82463. + Whitespace;[ ];
  82464. + MarkupTextLiteral - [13..25)::12 - [bound-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82465. + Text;[bound-string];
  82466. + MarkupMinimizedTagHelperAttribute - [25..38)::13 - bound-string - Minimized - Bound - [ bound-string]
  82467. + MarkupTextLiteral - [25..26)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82468. + Whitespace;[ ];
  82469. + MarkupTextLiteral - [26..38)::12 - [bound-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82470. + Text;[bound-string];
  82471. + MarkupTextLiteral - [38..39)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82472. + CloseAngle;[>];
  82473. + MarkupTagHelperEndTag - [39..43)::4
  82474. + MarkupTextLiteral - [39..43)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82475. + OpenAngle;[<];
  82476. + ForwardSlash;[/];
  82477. + Text;[p];
  82478. + CloseAngle;[>];
  82479. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document2.stree.txt
  82480. index 43cbf94537e..b8273f7553f 100644
  82481. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document2.stree.txt
  82482. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document2.stree.txt
  82483. @@ -1,4 +1,20 @@
  82484. -Markup block - Gen<None> - 20 - (0:0,0)
  82485. - Tag block - Gen<TagHelper> - 20 - (0:0,0) - p - PTagHelper
  82486. - StartTagAndEndTag - <p bound-string> ... </p>
  82487. - bound-string - Minimized
  82488. +RazorDocument - [0..20)::20 - [<p bound-string></p>]
  82489. + MarkupBlock - [0..20)::20
  82490. + MarkupTagHelperElement - [0..20)::20 - p[StartTagAndEndTag] - PTagHelper
  82491. + MarkupTagHelperStartTag - [0..16)::16
  82492. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82493. + OpenAngle;[<];
  82494. + Text;[p];
  82495. + MarkupMinimizedTagHelperAttribute - [2..15)::13 - bound-string - Minimized - Bound - [ bound-string]
  82496. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82497. + Whitespace;[ ];
  82498. + MarkupTextLiteral - [3..15)::12 - [bound-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82499. + Text;[bound-string];
  82500. + MarkupTextLiteral - [15..16)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82501. + CloseAngle;[>];
  82502. + MarkupTagHelperEndTag - [16..20)::4
  82503. + MarkupTextLiteral - [16..20)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82504. + OpenAngle;[<];
  82505. + ForwardSlash;[/];
  82506. + Text;[p];
  82507. + CloseAngle;[>];
  82508. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document20.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document20.stree.txt
  82509. index 013582e577c..6260f25bcff 100644
  82510. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document20.stree.txt
  82511. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document20.stree.txt
  82512. @@ -1,7 +1,30 @@
  82513. -Markup block - Gen<None> - 38 - (0:0,0)
  82514. - Tag block - Gen<TagHelper> - 38 - (0:0,0) - input - InputTagHelper1 - InputTagHelper3
  82515. - SelfClosing - <input unbound-required class='btn' />
  82516. - unbound-required - Minimized
  82517. - class - SingleQuotes
  82518. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (31:0,31) - Tokens:1
  82519. - SyntaxKind.Text;[btn];
  82520. +RazorDocument - [0..38)::38 - [<input unbound-required class='btn' />]
  82521. + MarkupBlock - [0..38)::38
  82522. + MarkupTagHelperElement - [0..38)::38 - input[SelfClosing] - InputTagHelper1 - InputTagHelper3
  82523. + MarkupTagHelperStartTag - [0..38)::38
  82524. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82525. + OpenAngle;[<];
  82526. + Text;[input];
  82527. + MarkupMinimizedTagHelperAttribute - [6..23)::17 - unbound-required - Minimized - Unbound - [ unbound-required]
  82528. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82529. + Whitespace;[ ];
  82530. + MarkupTextLiteral - [7..23)::16 - [unbound-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82531. + Text;[unbound-required];
  82532. + MarkupTagHelperAttribute - [23..35)::12 - class - SingleQuotes - Unbound - [ class='btn']
  82533. + MarkupTextLiteral - [23..24)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82534. + Whitespace;[ ];
  82535. + MarkupTextLiteral - [24..29)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82536. + Text;[class];
  82537. + Equals;[=];
  82538. + MarkupTextLiteral - [30..31)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82539. + SingleQuote;['];
  82540. + MarkupTagHelperAttributeValue - [31..34)::3
  82541. + MarkupLiteralAttributeValue - [31..34)::3 - [btn]
  82542. + MarkupTextLiteral - [31..34)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82543. + Text;[btn];
  82544. + MarkupTextLiteral - [34..35)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82545. + SingleQuote;['];
  82546. + MarkupTextLiteral - [35..38)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82547. + Whitespace;[ ];
  82548. + ForwardSlash;[/];
  82549. + CloseAngle;[>];
  82550. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document21.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document21.stree.txt
  82551. index e99feb726f9..bc6bcfe18e6 100644
  82552. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document21.stree.txt
  82553. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document21.stree.txt
  82554. @@ -1,7 +1,34 @@
  82555. -Markup block - Gen<None> - 32 - (0:0,0)
  82556. - Tag block - Gen<TagHelper> - 32 - (0:0,0) - p - PTagHelper
  82557. - StartTagAndEndTag - <p bound-string class='btn'> ... </p>
  82558. - bound-string - Minimized
  82559. - class - SingleQuotes
  82560. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:1
  82561. - SyntaxKind.Text;[btn];
  82562. +RazorDocument - [0..32)::32 - [<p bound-string class='btn'></p>]
  82563. + MarkupBlock - [0..32)::32
  82564. + MarkupTagHelperElement - [0..32)::32 - p[StartTagAndEndTag] - PTagHelper
  82565. + MarkupTagHelperStartTag - [0..28)::28
  82566. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82567. + OpenAngle;[<];
  82568. + Text;[p];
  82569. + MarkupMinimizedTagHelperAttribute - [2..15)::13 - bound-string - Minimized - Bound - [ bound-string]
  82570. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82571. + Whitespace;[ ];
  82572. + MarkupTextLiteral - [3..15)::12 - [bound-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82573. + Text;[bound-string];
  82574. + MarkupTagHelperAttribute - [15..27)::12 - class - SingleQuotes - Unbound - [ class='btn']
  82575. + MarkupTextLiteral - [15..16)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82576. + Whitespace;[ ];
  82577. + MarkupTextLiteral - [16..21)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82578. + Text;[class];
  82579. + Equals;[=];
  82580. + MarkupTextLiteral - [22..23)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82581. + SingleQuote;['];
  82582. + MarkupTagHelperAttributeValue - [23..26)::3
  82583. + MarkupLiteralAttributeValue - [23..26)::3 - [btn]
  82584. + MarkupTextLiteral - [23..26)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82585. + Text;[btn];
  82586. + MarkupTextLiteral - [26..27)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82587. + SingleQuote;['];
  82588. + MarkupTextLiteral - [27..28)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82589. + CloseAngle;[>];
  82590. + MarkupTagHelperEndTag - [28..32)::4
  82591. + MarkupTextLiteral - [28..32)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82592. + OpenAngle;[<];
  82593. + ForwardSlash;[/];
  82594. + Text;[p];
  82595. + CloseAngle;[>];
  82596. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document22.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document22.stree.txt
  82597. index e6e91e96d1a..412a844fc97 100644
  82598. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document22.stree.txt
  82599. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document22.stree.txt
  82600. @@ -1,7 +1,30 @@
  82601. -Markup block - Gen<None> - 38 - (0:0,0)
  82602. - Tag block - Gen<TagHelper> - 38 - (0:0,0) - input - InputTagHelper1 - InputTagHelper3
  82603. - SelfClosing - <input class='btn' unbound-required />
  82604. - class - SingleQuotes
  82605. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  82606. - SyntaxKind.Text;[btn];
  82607. - unbound-required - Minimized
  82608. +RazorDocument - [0..38)::38 - [<input class='btn' unbound-required />]
  82609. + MarkupBlock - [0..38)::38
  82610. + MarkupTagHelperElement - [0..38)::38 - input[SelfClosing] - InputTagHelper1 - InputTagHelper3
  82611. + MarkupTagHelperStartTag - [0..38)::38
  82612. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82613. + OpenAngle;[<];
  82614. + Text;[input];
  82615. + MarkupTagHelperAttribute - [6..18)::12 - class - SingleQuotes - Unbound - [ class='btn']
  82616. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82617. + Whitespace;[ ];
  82618. + MarkupTextLiteral - [7..12)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82619. + Text;[class];
  82620. + Equals;[=];
  82621. + MarkupTextLiteral - [13..14)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82622. + SingleQuote;['];
  82623. + MarkupTagHelperAttributeValue - [14..17)::3
  82624. + MarkupLiteralAttributeValue - [14..17)::3 - [btn]
  82625. + MarkupTextLiteral - [14..17)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82626. + Text;[btn];
  82627. + MarkupTextLiteral - [17..18)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82628. + SingleQuote;['];
  82629. + MarkupMinimizedTagHelperAttribute - [18..35)::17 - unbound-required - Minimized - Unbound - [ unbound-required]
  82630. + MarkupTextLiteral - [18..19)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82631. + Whitespace;[ ];
  82632. + MarkupTextLiteral - [19..35)::16 - [unbound-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82633. + Text;[unbound-required];
  82634. + MarkupTextLiteral - [35..38)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82635. + Whitespace;[ ];
  82636. + ForwardSlash;[/];
  82637. + CloseAngle;[>];
  82638. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document23.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document23.stree.txt
  82639. index 900e86680d0..5e6900b3586 100644
  82640. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document23.stree.txt
  82641. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document23.stree.txt
  82642. @@ -1,7 +1,34 @@
  82643. -Markup block - Gen<None> - 32 - (0:0,0)
  82644. - Tag block - Gen<TagHelper> - 32 - (0:0,0) - p - PTagHelper
  82645. - StartTagAndEndTag - <p class='btn' bound-string> ... </p>
  82646. - class - SingleQuotes
  82647. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  82648. - SyntaxKind.Text;[btn];
  82649. - bound-string - Minimized
  82650. +RazorDocument - [0..32)::32 - [<p class='btn' bound-string></p>]
  82651. + MarkupBlock - [0..32)::32
  82652. + MarkupTagHelperElement - [0..32)::32 - p[StartTagAndEndTag] - PTagHelper
  82653. + MarkupTagHelperStartTag - [0..28)::28
  82654. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82655. + OpenAngle;[<];
  82656. + Text;[p];
  82657. + MarkupTagHelperAttribute - [2..14)::12 - class - SingleQuotes - Unbound - [ class='btn']
  82658. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82659. + Whitespace;[ ];
  82660. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82661. + Text;[class];
  82662. + Equals;[=];
  82663. + MarkupTextLiteral - [9..10)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82664. + SingleQuote;['];
  82665. + MarkupTagHelperAttributeValue - [10..13)::3
  82666. + MarkupLiteralAttributeValue - [10..13)::3 - [btn]
  82667. + MarkupTextLiteral - [10..13)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82668. + Text;[btn];
  82669. + MarkupTextLiteral - [13..14)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82670. + SingleQuote;['];
  82671. + MarkupMinimizedTagHelperAttribute - [14..27)::13 - bound-string - Minimized - Bound - [ bound-string]
  82672. + MarkupTextLiteral - [14..15)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82673. + Whitespace;[ ];
  82674. + MarkupTextLiteral - [15..27)::12 - [bound-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82675. + Text;[bound-string];
  82676. + MarkupTextLiteral - [27..28)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82677. + CloseAngle;[>];
  82678. + MarkupTagHelperEndTag - [28..32)::4
  82679. + MarkupTextLiteral - [28..32)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82680. + OpenAngle;[<];
  82681. + ForwardSlash;[/];
  82682. + Text;[p];
  82683. + CloseAngle;[>];
  82684. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document24.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document24.stree.txt
  82685. index 6f45d0db8cc..56f18db51ba 100644
  82686. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document24.stree.txt
  82687. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document24.stree.txt
  82688. @@ -1,7 +1,30 @@
  82689. -Markup block - Gen<None> - 43 - (0:0,0)
  82690. - Tag block - Gen<TagHelper> - 43 - (0:0,0) - input - InputTagHelper1 - InputTagHelper3
  82691. - SelfClosing - <input bound-required-string class='btn' />
  82692. - bound-required-string - Minimized
  82693. - class - SingleQuotes
  82694. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (36:0,36) - Tokens:1
  82695. - SyntaxKind.Text;[btn];
  82696. +RazorDocument - [0..43)::43 - [<input bound-required-string class='btn' />]
  82697. + MarkupBlock - [0..43)::43
  82698. + MarkupTagHelperElement - [0..43)::43 - input[SelfClosing] - InputTagHelper1 - InputTagHelper3
  82699. + MarkupTagHelperStartTag - [0..43)::43
  82700. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82701. + OpenAngle;[<];
  82702. + Text;[input];
  82703. + MarkupMinimizedTagHelperAttribute - [6..28)::22 - bound-required-string - Minimized - Bound - [ bound-required-string]
  82704. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82705. + Whitespace;[ ];
  82706. + MarkupTextLiteral - [7..28)::21 - [bound-required-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82707. + Text;[bound-required-string];
  82708. + MarkupTagHelperAttribute - [28..40)::12 - class - SingleQuotes - Unbound - [ class='btn']
  82709. + MarkupTextLiteral - [28..29)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82710. + Whitespace;[ ];
  82711. + MarkupTextLiteral - [29..34)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82712. + Text;[class];
  82713. + Equals;[=];
  82714. + MarkupTextLiteral - [35..36)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82715. + SingleQuote;['];
  82716. + MarkupTagHelperAttributeValue - [36..39)::3
  82717. + MarkupLiteralAttributeValue - [36..39)::3 - [btn]
  82718. + MarkupTextLiteral - [36..39)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82719. + Text;[btn];
  82720. + MarkupTextLiteral - [39..40)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82721. + SingleQuote;['];
  82722. + MarkupTextLiteral - [40..43)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82723. + Whitespace;[ ];
  82724. + ForwardSlash;[/];
  82725. + CloseAngle;[>];
  82726. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document25.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document25.stree.txt
  82727. index 0191e171301..8fd68a1de31 100644
  82728. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document25.stree.txt
  82729. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document25.stree.txt
  82730. @@ -1,7 +1,30 @@
  82731. -Markup block - Gen<None> - 43 - (0:0,0)
  82732. - Tag block - Gen<TagHelper> - 43 - (0:0,0) - input - InputTagHelper1 - InputTagHelper3
  82733. - SelfClosing - <input class='btn' bound-required-string />
  82734. - class - SingleQuotes
  82735. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  82736. - SyntaxKind.Text;[btn];
  82737. - bound-required-string - Minimized
  82738. +RazorDocument - [0..43)::43 - [<input class='btn' bound-required-string />]
  82739. + MarkupBlock - [0..43)::43
  82740. + MarkupTagHelperElement - [0..43)::43 - input[SelfClosing] - InputTagHelper1 - InputTagHelper3
  82741. + MarkupTagHelperStartTag - [0..43)::43
  82742. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82743. + OpenAngle;[<];
  82744. + Text;[input];
  82745. + MarkupTagHelperAttribute - [6..18)::12 - class - SingleQuotes - Unbound - [ class='btn']
  82746. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82747. + Whitespace;[ ];
  82748. + MarkupTextLiteral - [7..12)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82749. + Text;[class];
  82750. + Equals;[=];
  82751. + MarkupTextLiteral - [13..14)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82752. + SingleQuote;['];
  82753. + MarkupTagHelperAttributeValue - [14..17)::3
  82754. + MarkupLiteralAttributeValue - [14..17)::3 - [btn]
  82755. + MarkupTextLiteral - [14..17)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82756. + Text;[btn];
  82757. + MarkupTextLiteral - [17..18)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82758. + SingleQuote;['];
  82759. + MarkupMinimizedTagHelperAttribute - [18..40)::22 - bound-required-string - Minimized - Bound - [ bound-required-string]
  82760. + MarkupTextLiteral - [18..19)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82761. + Whitespace;[ ];
  82762. + MarkupTextLiteral - [19..40)::21 - [bound-required-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82763. + Text;[bound-required-string];
  82764. + MarkupTextLiteral - [40..43)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82765. + Whitespace;[ ];
  82766. + ForwardSlash;[/];
  82767. + CloseAngle;[>];
  82768. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document26.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document26.stree.txt
  82769. index de997039770..a34464be07a 100644
  82770. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document26.stree.txt
  82771. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document26.stree.txt
  82772. @@ -1,7 +1,30 @@
  82773. -Markup block - Gen<None> - 40 - (0:0,0)
  82774. - Tag block - Gen<TagHelper> - 40 - (0:0,0) - input - InputTagHelper2 - InputTagHelper3
  82775. - SelfClosing - <input bound-required-int class='btn' />
  82776. - bound-required-int - Minimized
  82777. - class - SingleQuotes
  82778. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (33:0,33) - Tokens:1
  82779. - SyntaxKind.Text;[btn];
  82780. +RazorDocument - [0..40)::40 - [<input bound-required-int class='btn' />]
  82781. + MarkupBlock - [0..40)::40
  82782. + MarkupTagHelperElement - [0..40)::40 - input[SelfClosing] - InputTagHelper2 - InputTagHelper3
  82783. + MarkupTagHelperStartTag - [0..40)::40
  82784. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82785. + OpenAngle;[<];
  82786. + Text;[input];
  82787. + MarkupMinimizedTagHelperAttribute - [6..25)::19 - bound-required-int - Minimized - Bound - [ bound-required-int]
  82788. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82789. + Whitespace;[ ];
  82790. + MarkupTextLiteral - [7..25)::18 - [bound-required-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82791. + Text;[bound-required-int];
  82792. + MarkupTagHelperAttribute - [25..37)::12 - class - SingleQuotes - Unbound - [ class='btn']
  82793. + MarkupTextLiteral - [25..26)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82794. + Whitespace;[ ];
  82795. + MarkupTextLiteral - [26..31)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82796. + Text;[class];
  82797. + Equals;[=];
  82798. + MarkupTextLiteral - [32..33)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82799. + SingleQuote;['];
  82800. + MarkupTagHelperAttributeValue - [33..36)::3
  82801. + MarkupLiteralAttributeValue - [33..36)::3 - [btn]
  82802. + MarkupTextLiteral - [33..36)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82803. + Text;[btn];
  82804. + MarkupTextLiteral - [36..37)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82805. + SingleQuote;['];
  82806. + MarkupTextLiteral - [37..40)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82807. + Whitespace;[ ];
  82808. + ForwardSlash;[/];
  82809. + CloseAngle;[>];
  82810. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document27.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document27.stree.txt
  82811. index 605f4e325ea..512b71f23fe 100644
  82812. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document27.stree.txt
  82813. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document27.stree.txt
  82814. @@ -1,7 +1,34 @@
  82815. -Markup block - Gen<None> - 29 - (0:0,0)
  82816. - Tag block - Gen<TagHelper> - 29 - (0:0,0) - p - PTagHelper
  82817. - StartTagAndEndTag - <p bound-int class='btn'> ... </p>
  82818. - bound-int - Minimized
  82819. - class - SingleQuotes
  82820. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:1
  82821. - SyntaxKind.Text;[btn];
  82822. +RazorDocument - [0..29)::29 - [<p bound-int class='btn'></p>]
  82823. + MarkupBlock - [0..29)::29
  82824. + MarkupTagHelperElement - [0..29)::29 - p[StartTagAndEndTag] - PTagHelper
  82825. + MarkupTagHelperStartTag - [0..25)::25
  82826. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82827. + OpenAngle;[<];
  82828. + Text;[p];
  82829. + MarkupMinimizedTagHelperAttribute - [2..12)::10 - bound-int - Minimized - Bound - [ bound-int]
  82830. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82831. + Whitespace;[ ];
  82832. + MarkupTextLiteral - [3..12)::9 - [bound-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82833. + Text;[bound-int];
  82834. + MarkupTagHelperAttribute - [12..24)::12 - class - SingleQuotes - Unbound - [ class='btn']
  82835. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82836. + Whitespace;[ ];
  82837. + MarkupTextLiteral - [13..18)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82838. + Text;[class];
  82839. + Equals;[=];
  82840. + MarkupTextLiteral - [19..20)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82841. + SingleQuote;['];
  82842. + MarkupTagHelperAttributeValue - [20..23)::3
  82843. + MarkupLiteralAttributeValue - [20..23)::3 - [btn]
  82844. + MarkupTextLiteral - [20..23)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82845. + Text;[btn];
  82846. + MarkupTextLiteral - [23..24)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82847. + SingleQuote;['];
  82848. + MarkupTextLiteral - [24..25)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82849. + CloseAngle;[>];
  82850. + MarkupTagHelperEndTag - [25..29)::4
  82851. + MarkupTextLiteral - [25..29)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82852. + OpenAngle;[<];
  82853. + ForwardSlash;[/];
  82854. + Text;[p];
  82855. + CloseAngle;[>];
  82856. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document28.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document28.stree.txt
  82857. index 762c47e1d3b..6219a249f2b 100644
  82858. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document28.stree.txt
  82859. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document28.stree.txt
  82860. @@ -1,7 +1,30 @@
  82861. -Markup block - Gen<None> - 40 - (0:0,0)
  82862. - Tag block - Gen<TagHelper> - 40 - (0:0,0) - input - InputTagHelper2 - InputTagHelper3
  82863. - SelfClosing - <input class='btn' bound-required-int />
  82864. - class - SingleQuotes
  82865. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  82866. - SyntaxKind.Text;[btn];
  82867. - bound-required-int - Minimized
  82868. +RazorDocument - [0..40)::40 - [<input class='btn' bound-required-int />]
  82869. + MarkupBlock - [0..40)::40
  82870. + MarkupTagHelperElement - [0..40)::40 - input[SelfClosing] - InputTagHelper2 - InputTagHelper3
  82871. + MarkupTagHelperStartTag - [0..40)::40
  82872. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82873. + OpenAngle;[<];
  82874. + Text;[input];
  82875. + MarkupTagHelperAttribute - [6..18)::12 - class - SingleQuotes - Unbound - [ class='btn']
  82876. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82877. + Whitespace;[ ];
  82878. + MarkupTextLiteral - [7..12)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82879. + Text;[class];
  82880. + Equals;[=];
  82881. + MarkupTextLiteral - [13..14)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82882. + SingleQuote;['];
  82883. + MarkupTagHelperAttributeValue - [14..17)::3
  82884. + MarkupLiteralAttributeValue - [14..17)::3 - [btn]
  82885. + MarkupTextLiteral - [14..17)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82886. + Text;[btn];
  82887. + MarkupTextLiteral - [17..18)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82888. + SingleQuote;['];
  82889. + MarkupMinimizedTagHelperAttribute - [18..37)::19 - bound-required-int - Minimized - Bound - [ bound-required-int]
  82890. + MarkupTextLiteral - [18..19)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82891. + Whitespace;[ ];
  82892. + MarkupTextLiteral - [19..37)::18 - [bound-required-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82893. + Text;[bound-required-int];
  82894. + MarkupTextLiteral - [37..40)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82895. + Whitespace;[ ];
  82896. + ForwardSlash;[/];
  82897. + CloseAngle;[>];
  82898. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document29.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document29.stree.txt
  82899. index fbb8c1dc57a..00c2c37baae 100644
  82900. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document29.stree.txt
  82901. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document29.stree.txt
  82902. @@ -1,7 +1,34 @@
  82903. -Markup block - Gen<None> - 29 - (0:0,0)
  82904. - Tag block - Gen<TagHelper> - 29 - (0:0,0) - p - PTagHelper
  82905. - StartTagAndEndTag - <p class='btn' bound-int> ... </p>
  82906. - class - SingleQuotes
  82907. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  82908. - SyntaxKind.Text;[btn];
  82909. - bound-int - Minimized
  82910. +RazorDocument - [0..29)::29 - [<p class='btn' bound-int></p>]
  82911. + MarkupBlock - [0..29)::29
  82912. + MarkupTagHelperElement - [0..29)::29 - p[StartTagAndEndTag] - PTagHelper
  82913. + MarkupTagHelperStartTag - [0..25)::25
  82914. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82915. + OpenAngle;[<];
  82916. + Text;[p];
  82917. + MarkupTagHelperAttribute - [2..14)::12 - class - SingleQuotes - Unbound - [ class='btn']
  82918. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82919. + Whitespace;[ ];
  82920. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82921. + Text;[class];
  82922. + Equals;[=];
  82923. + MarkupTextLiteral - [9..10)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82924. + SingleQuote;['];
  82925. + MarkupTagHelperAttributeValue - [10..13)::3
  82926. + MarkupLiteralAttributeValue - [10..13)::3 - [btn]
  82927. + MarkupTextLiteral - [10..13)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82928. + Text;[btn];
  82929. + MarkupTextLiteral - [13..14)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  82930. + SingleQuote;['];
  82931. + MarkupMinimizedTagHelperAttribute - [14..24)::10 - bound-int - Minimized - Bound - [ bound-int]
  82932. + MarkupTextLiteral - [14..15)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82933. + Whitespace;[ ];
  82934. + MarkupTextLiteral - [15..24)::9 - [bound-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82935. + Text;[bound-int];
  82936. + MarkupTextLiteral - [24..25)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82937. + CloseAngle;[>];
  82938. + MarkupTagHelperEndTag - [25..29)::4
  82939. + MarkupTextLiteral - [25..29)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82940. + OpenAngle;[<];
  82941. + ForwardSlash;[/];
  82942. + Text;[p];
  82943. + CloseAngle;[>];
  82944. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document3.stree.txt
  82945. index 8603a024a56..6b9b8a8977c 100644
  82946. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document3.stree.txt
  82947. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document3.stree.txt
  82948. @@ -1,4 +1,16 @@
  82949. -Markup block - Gen<None> - 31 - (0:0,0)
  82950. - Tag block - Gen<TagHelper> - 31 - (0:0,0) - input - InputTagHelper1 - InputTagHelper3
  82951. - SelfClosing - <input bound-required-string />
  82952. - bound-required-string - Minimized
  82953. +RazorDocument - [0..31)::31 - [<input bound-required-string />]
  82954. + MarkupBlock - [0..31)::31
  82955. + MarkupTagHelperElement - [0..31)::31 - input[SelfClosing] - InputTagHelper1 - InputTagHelper3
  82956. + MarkupTagHelperStartTag - [0..31)::31
  82957. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82958. + OpenAngle;[<];
  82959. + Text;[input];
  82960. + MarkupMinimizedTagHelperAttribute - [6..28)::22 - bound-required-string - Minimized - Bound - [ bound-required-string]
  82961. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82962. + Whitespace;[ ];
  82963. + MarkupTextLiteral - [7..28)::21 - [bound-required-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82964. + Text;[bound-required-string];
  82965. + MarkupTextLiteral - [28..31)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82966. + Whitespace;[ ];
  82967. + ForwardSlash;[/];
  82968. + CloseAngle;[>];
  82969. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document30.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document30.stree.txt
  82970. index 0457882a1d2..a94739906e9 100644
  82971. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document30.stree.txt
  82972. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document30.stree.txt
  82973. @@ -1,20 +1,49 @@
  82974. -Markup block - Gen<None> - 54 - (0:0,0)
  82975. - Tag block - Gen<TagHelper> - 54 - (0:0,0) - input - InputTagHelper2 - InputTagHelper3
  82976. - SelfClosing - <input class='@DateTime.Now + 1' bound-required-int />
  82977. - class - SingleQuotes
  82978. - Markup block - Gen<None> - 17 - (14:0,14)
  82979. - Markup block - Gen<DynAttr:@(14:0,14)> - 13 - (14:0,14)
  82980. - Expression block - Gen<Expr> - 13 - (14:0,14)
  82981. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (14:0,14) - Tokens:1
  82982. - SyntaxKind.Transition;[@];
  82983. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (15:0,15) - Tokens:3
  82984. - SyntaxKind.Identifier;[DateTime];
  82985. - SyntaxKind.Dot;[.];
  82986. - SyntaxKind.Identifier;[Now];
  82987. - Markup span - Gen<LitAttr: @(27:0,27)> - [ +] - SpanEditHandler;Accepts:Any - (27:0,27) - Tokens:2
  82988. - SyntaxKind.Whitespace;[ ];
  82989. - SyntaxKind.Text;[+];
  82990. - Markup span - Gen<LitAttr: @(29:0,29)> - [ 1] - SpanEditHandler;Accepts:Any - (29:0,29) - Tokens:2
  82991. - SyntaxKind.Whitespace;[ ];
  82992. - SyntaxKind.Text;[1];
  82993. - bound-required-int - Minimized
  82994. +RazorDocument - [0..54)::54 - [<input class='@DateTime.Now + 1' bound-required-int />]
  82995. + MarkupBlock - [0..54)::54
  82996. + MarkupTagHelperElement - [0..54)::54 - input[SelfClosing] - InputTagHelper2 - InputTagHelper3
  82997. + MarkupTagHelperStartTag - [0..54)::54
  82998. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  82999. + OpenAngle;[<];
  83000. + Text;[input];
  83001. + MarkupTagHelperAttribute - [6..32)::26 - class - SingleQuotes - Unbound - [ class='@DateTime.Now + 1']
  83002. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83003. + Whitespace;[ ];
  83004. + MarkupTextLiteral - [7..12)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83005. + Text;[class];
  83006. + Equals;[=];
  83007. + MarkupTextLiteral - [13..14)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  83008. + SingleQuote;['];
  83009. + MarkupTagHelperAttributeValue - [14..31)::17
  83010. + MarkupDynamicAttributeValue - [14..27)::13 - [@DateTime.Now]
  83011. + GenericBlock - [14..27)::13
  83012. + CSharpCodeBlock - [14..27)::13
  83013. + CSharpImplicitExpression - [14..27)::13
  83014. + CSharpTransition - [14..15)::1 - Gen<None> - SpanEditHandler;Accepts:None
  83015. + Transition;[@];
  83016. + CSharpImplicitExpressionBody - [15..27)::12
  83017. + CSharpCodeBlock - [15..27)::12
  83018. + CSharpExpressionLiteral - [15..27)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  83019. + Identifier;[DateTime];
  83020. + Dot;[.];
  83021. + Identifier;[Now];
  83022. + MarkupLiteralAttributeValue - [27..29)::2 - [ +]
  83023. + MarkupTextLiteral - [27..28)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83024. + Whitespace;[ ];
  83025. + MarkupTextLiteral - [28..29)::1 - [+] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83026. + Text;[+];
  83027. + MarkupLiteralAttributeValue - [29..31)::2 - [ 1]
  83028. + MarkupTextLiteral - [29..30)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83029. + Whitespace;[ ];
  83030. + MarkupTextLiteral - [30..31)::1 - [1] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83031. + Text;[1];
  83032. + MarkupTextLiteral - [31..32)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  83033. + SingleQuote;['];
  83034. + MarkupMinimizedTagHelperAttribute - [32..51)::19 - bound-required-int - Minimized - Bound - [ bound-required-int]
  83035. + MarkupTextLiteral - [32..33)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83036. + Whitespace;[ ];
  83037. + MarkupTextLiteral - [33..51)::18 - [bound-required-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83038. + Text;[bound-required-int];
  83039. + MarkupTextLiteral - [51..54)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83040. + Whitespace;[ ];
  83041. + ForwardSlash;[/];
  83042. + CloseAngle;[>];
  83043. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document31.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document31.stree.txt
  83044. index e3369ba47b3..c36cc991745 100644
  83045. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document31.stree.txt
  83046. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document31.stree.txt
  83047. @@ -1,20 +1,53 @@
  83048. -Markup block - Gen<None> - 43 - (0:0,0)
  83049. - Tag block - Gen<TagHelper> - 43 - (0:0,0) - p - PTagHelper
  83050. - StartTagAndEndTag - <p class='@DateTime.Now + 1' bound-int> ... </p>
  83051. - class - SingleQuotes
  83052. - Markup block - Gen<None> - 17 - (10:0,10)
  83053. - Markup block - Gen<DynAttr:@(10:0,10)> - 13 - (10:0,10)
  83054. - Expression block - Gen<Expr> - 13 - (10:0,10)
  83055. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  83056. - SyntaxKind.Transition;[@];
  83057. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (11:0,11) - Tokens:3
  83058. - SyntaxKind.Identifier;[DateTime];
  83059. - SyntaxKind.Dot;[.];
  83060. - SyntaxKind.Identifier;[Now];
  83061. - Markup span - Gen<LitAttr: @(23:0,23)> - [ +] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:2
  83062. - SyntaxKind.Whitespace;[ ];
  83063. - SyntaxKind.Text;[+];
  83064. - Markup span - Gen<LitAttr: @(25:0,25)> - [ 1] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:2
  83065. - SyntaxKind.Whitespace;[ ];
  83066. - SyntaxKind.Text;[1];
  83067. - bound-int - Minimized
  83068. +RazorDocument - [0..43)::43 - [<p class='@DateTime.Now + 1' bound-int></p>]
  83069. + MarkupBlock - [0..43)::43
  83070. + MarkupTagHelperElement - [0..43)::43 - p[StartTagAndEndTag] - PTagHelper
  83071. + MarkupTagHelperStartTag - [0..39)::39
  83072. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83073. + OpenAngle;[<];
  83074. + Text;[p];
  83075. + MarkupTagHelperAttribute - [2..28)::26 - class - SingleQuotes - Unbound - [ class='@DateTime.Now + 1']
  83076. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83077. + Whitespace;[ ];
  83078. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83079. + Text;[class];
  83080. + Equals;[=];
  83081. + MarkupTextLiteral - [9..10)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  83082. + SingleQuote;['];
  83083. + MarkupTagHelperAttributeValue - [10..27)::17
  83084. + MarkupDynamicAttributeValue - [10..23)::13 - [@DateTime.Now]
  83085. + GenericBlock - [10..23)::13
  83086. + CSharpCodeBlock - [10..23)::13
  83087. + CSharpImplicitExpression - [10..23)::13
  83088. + CSharpTransition - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  83089. + Transition;[@];
  83090. + CSharpImplicitExpressionBody - [11..23)::12
  83091. + CSharpCodeBlock - [11..23)::12
  83092. + CSharpExpressionLiteral - [11..23)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  83093. + Identifier;[DateTime];
  83094. + Dot;[.];
  83095. + Identifier;[Now];
  83096. + MarkupLiteralAttributeValue - [23..25)::2 - [ +]
  83097. + MarkupTextLiteral - [23..24)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83098. + Whitespace;[ ];
  83099. + MarkupTextLiteral - [24..25)::1 - [+] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83100. + Text;[+];
  83101. + MarkupLiteralAttributeValue - [25..27)::2 - [ 1]
  83102. + MarkupTextLiteral - [25..26)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83103. + Whitespace;[ ];
  83104. + MarkupTextLiteral - [26..27)::1 - [1] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83105. + Text;[1];
  83106. + MarkupTextLiteral - [27..28)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  83107. + SingleQuote;['];
  83108. + MarkupMinimizedTagHelperAttribute - [28..38)::10 - bound-int - Minimized - Bound - [ bound-int]
  83109. + MarkupTextLiteral - [28..29)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83110. + Whitespace;[ ];
  83111. + MarkupTextLiteral - [29..38)::9 - [bound-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83112. + Text;[bound-int];
  83113. + MarkupTextLiteral - [38..39)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83114. + CloseAngle;[>];
  83115. + MarkupTagHelperEndTag - [39..43)::4
  83116. + MarkupTextLiteral - [39..43)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83117. + OpenAngle;[<];
  83118. + ForwardSlash;[/];
  83119. + Text;[p];
  83120. + CloseAngle;[>];
  83121. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document32.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document32.stree.txt
  83122. index d7a15427247..671c6cea10e 100644
  83123. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document32.stree.txt
  83124. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document32.stree.txt
  83125. @@ -1,38 +1,92 @@
  83126. -Markup block - Gen<None> - 126 - (0:0,0)
  83127. - Tag block - Gen<TagHelper> - 126 - (0:0,0) - input - InputTagHelper1 - InputTagHelper2 - InputTagHelper3
  83128. - SelfClosing - <input bound-required-int class='@DateTime.Now + 1' bound-required-string class='@DateTime.Now + 1' unbound-required />
  83129. - bound-required-int - Minimized
  83130. - class - SingleQuotes
  83131. - Markup block - Gen<None> - 17 - (36:0,36)
  83132. - Markup block - Gen<DynAttr:@(36:0,36)> - 13 - (36:0,36)
  83133. - Expression block - Gen<Expr> - 13 - (36:0,36)
  83134. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (36:0,36) - Tokens:1
  83135. - SyntaxKind.Transition;[@];
  83136. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (37:0,37) - Tokens:3
  83137. - SyntaxKind.Identifier;[DateTime];
  83138. - SyntaxKind.Dot;[.];
  83139. - SyntaxKind.Identifier;[Now];
  83140. - Markup span - Gen<LitAttr: @(49:0,49)> - [ +] - SpanEditHandler;Accepts:Any - (49:0,49) - Tokens:2
  83141. - SyntaxKind.Whitespace;[ ];
  83142. - SyntaxKind.Text;[+];
  83143. - Markup span - Gen<LitAttr: @(51:0,51)> - [ 1] - SpanEditHandler;Accepts:Any - (51:0,51) - Tokens:2
  83144. - SyntaxKind.Whitespace;[ ];
  83145. - SyntaxKind.Text;[1];
  83146. - bound-required-string - Minimized
  83147. - class - SingleQuotes
  83148. - Markup block - Gen<None> - 17 - (86:0,86)
  83149. - Markup block - Gen<DynAttr:@(86:0,86)> - 13 - (86:0,86)
  83150. - Expression block - Gen<Expr> - 13 - (86:0,86)
  83151. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (86:0,86) - Tokens:1
  83152. - SyntaxKind.Transition;[@];
  83153. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (87:0,87) - Tokens:3
  83154. - SyntaxKind.Identifier;[DateTime];
  83155. - SyntaxKind.Dot;[.];
  83156. - SyntaxKind.Identifier;[Now];
  83157. - Markup span - Gen<LitAttr: @(99:0,99)> - [ +] - SpanEditHandler;Accepts:Any - (99:0,99) - Tokens:2
  83158. - SyntaxKind.Whitespace;[ ];
  83159. - SyntaxKind.Text;[+];
  83160. - Markup span - Gen<LitAttr: @(101:0,101)> - [ 1] - SpanEditHandler;Accepts:Any - (101:0,101) - Tokens:2
  83161. - SyntaxKind.Whitespace;[ ];
  83162. - SyntaxKind.Text;[1];
  83163. - unbound-required - Minimized
  83164. +RazorDocument - [0..126)::126 - [<input bound-required-int class='@DateTime.Now + 1' bound-required-string class='@DateTime.Now + 1' unbound-required />]
  83165. + MarkupBlock - [0..126)::126
  83166. + MarkupTagHelperElement - [0..126)::126 - input[SelfClosing] - InputTagHelper1 - InputTagHelper2 - InputTagHelper3
  83167. + MarkupTagHelperStartTag - [0..126)::126
  83168. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83169. + OpenAngle;[<];
  83170. + Text;[input];
  83171. + MarkupMinimizedTagHelperAttribute - [6..28)::22 - bound-required-int - Minimized - Bound - [ bound-required-int]
  83172. + MarkupTextLiteral - [6..10)::4 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83173. + Whitespace;[ ];
  83174. + MarkupTextLiteral - [10..28)::18 - [bound-required-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83175. + Text;[bound-required-int];
  83176. + MarkupTagHelperAttribute - [28..54)::26 - class - SingleQuotes - Unbound - [ class='@DateTime.Now + 1']
  83177. + MarkupTextLiteral - [28..29)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83178. + Whitespace;[ ];
  83179. + MarkupTextLiteral - [29..34)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83180. + Text;[class];
  83181. + Equals;[=];
  83182. + MarkupTextLiteral - [35..36)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  83183. + SingleQuote;['];
  83184. + MarkupTagHelperAttributeValue - [36..53)::17
  83185. + MarkupDynamicAttributeValue - [36..49)::13 - [@DateTime.Now]
  83186. + GenericBlock - [36..49)::13
  83187. + CSharpCodeBlock - [36..49)::13
  83188. + CSharpImplicitExpression - [36..49)::13
  83189. + CSharpTransition - [36..37)::1 - Gen<None> - SpanEditHandler;Accepts:None
  83190. + Transition;[@];
  83191. + CSharpImplicitExpressionBody - [37..49)::12
  83192. + CSharpCodeBlock - [37..49)::12
  83193. + CSharpExpressionLiteral - [37..49)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  83194. + Identifier;[DateTime];
  83195. + Dot;[.];
  83196. + Identifier;[Now];
  83197. + MarkupLiteralAttributeValue - [49..51)::2 - [ +]
  83198. + MarkupTextLiteral - [49..50)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83199. + Whitespace;[ ];
  83200. + MarkupTextLiteral - [50..51)::1 - [+] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83201. + Text;[+];
  83202. + MarkupLiteralAttributeValue - [51..53)::2 - [ 1]
  83203. + MarkupTextLiteral - [51..52)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83204. + Whitespace;[ ];
  83205. + MarkupTextLiteral - [52..53)::1 - [1] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83206. + Text;[1];
  83207. + MarkupTextLiteral - [53..54)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  83208. + SingleQuote;['];
  83209. + MarkupMinimizedTagHelperAttribute - [54..78)::24 - bound-required-string - Minimized - Bound - [ bound-required-string]
  83210. + MarkupTextLiteral - [54..57)::3 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83211. + Whitespace;[ ];
  83212. + MarkupTextLiteral - [57..78)::21 - [bound-required-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83213. + Text;[bound-required-string];
  83214. + MarkupTagHelperAttribute - [78..104)::26 - class - SingleQuotes - Unbound - [ class='@DateTime.Now + 1']
  83215. + MarkupTextLiteral - [78..79)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83216. + Whitespace;[ ];
  83217. + MarkupTextLiteral - [79..84)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83218. + Text;[class];
  83219. + Equals;[=];
  83220. + MarkupTextLiteral - [85..86)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  83221. + SingleQuote;['];
  83222. + MarkupTagHelperAttributeValue - [86..103)::17
  83223. + MarkupDynamicAttributeValue - [86..99)::13 - [@DateTime.Now]
  83224. + GenericBlock - [86..99)::13
  83225. + CSharpCodeBlock - [86..99)::13
  83226. + CSharpImplicitExpression - [86..99)::13
  83227. + CSharpTransition - [86..87)::1 - Gen<None> - SpanEditHandler;Accepts:None
  83228. + Transition;[@];
  83229. + CSharpImplicitExpressionBody - [87..99)::12
  83230. + CSharpCodeBlock - [87..99)::12
  83231. + CSharpExpressionLiteral - [87..99)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  83232. + Identifier;[DateTime];
  83233. + Dot;[.];
  83234. + Identifier;[Now];
  83235. + MarkupLiteralAttributeValue - [99..101)::2 - [ +]
  83236. + MarkupTextLiteral - [99..100)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83237. + Whitespace;[ ];
  83238. + MarkupTextLiteral - [100..101)::1 - [+] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83239. + Text;[+];
  83240. + MarkupLiteralAttributeValue - [101..103)::2 - [ 1]
  83241. + MarkupTextLiteral - [101..102)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83242. + Whitespace;[ ];
  83243. + MarkupTextLiteral - [102..103)::1 - [1] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83244. + Text;[1];
  83245. + MarkupTextLiteral - [103..104)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  83246. + SingleQuote;['];
  83247. + MarkupMinimizedTagHelperAttribute - [104..122)::18 - unbound-required - Minimized - Unbound - [ unbound-required]
  83248. + MarkupTextLiteral - [104..106)::2 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83249. + Whitespace;[ ];
  83250. + MarkupTextLiteral - [106..122)::16 - [unbound-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83251. + Text;[unbound-required];
  83252. + MarkupTextLiteral - [122..126)::4 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83253. + Whitespace;[ ];
  83254. + ForwardSlash;[/];
  83255. + CloseAngle;[>];
  83256. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document33.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document33.stree.txt
  83257. index c27595040bb..1e06d3cd057 100644
  83258. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document33.stree.txt
  83259. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document33.stree.txt
  83260. @@ -1,38 +1,96 @@
  83261. -Markup block - Gen<None> - 101 - (0:0,0)
  83262. - Tag block - Gen<TagHelper> - 101 - (0:0,0) - p - PTagHelper
  83263. - StartTagAndEndTag - <p bound-int class='@DateTime.Now + 1' bound-string class='@DateTime.Now + 1' bound-string> ... </p>
  83264. - bound-int - Minimized
  83265. - class - SingleQuotes
  83266. - Markup block - Gen<None> - 17 - (23:0,23)
  83267. - Markup block - Gen<DynAttr:@(23:0,23)> - 13 - (23:0,23)
  83268. - Expression block - Gen<Expr> - 13 - (23:0,23)
  83269. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (23:0,23) - Tokens:1
  83270. - SyntaxKind.Transition;[@];
  83271. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (24:0,24) - Tokens:3
  83272. - SyntaxKind.Identifier;[DateTime];
  83273. - SyntaxKind.Dot;[.];
  83274. - SyntaxKind.Identifier;[Now];
  83275. - Markup span - Gen<LitAttr: @(36:0,36)> - [ +] - SpanEditHandler;Accepts:Any - (36:0,36) - Tokens:2
  83276. - SyntaxKind.Whitespace;[ ];
  83277. - SyntaxKind.Text;[+];
  83278. - Markup span - Gen<LitAttr: @(38:0,38)> - [ 1] - SpanEditHandler;Accepts:Any - (38:0,38) - Tokens:2
  83279. - SyntaxKind.Whitespace;[ ];
  83280. - SyntaxKind.Text;[1];
  83281. - bound-string - Minimized
  83282. - class - SingleQuotes
  83283. - Markup block - Gen<None> - 17 - (64:0,64)
  83284. - Markup block - Gen<DynAttr:@(64:0,64)> - 13 - (64:0,64)
  83285. - Expression block - Gen<Expr> - 13 - (64:0,64)
  83286. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (64:0,64) - Tokens:1
  83287. - SyntaxKind.Transition;[@];
  83288. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (65:0,65) - Tokens:3
  83289. - SyntaxKind.Identifier;[DateTime];
  83290. - SyntaxKind.Dot;[.];
  83291. - SyntaxKind.Identifier;[Now];
  83292. - Markup span - Gen<LitAttr: @(77:0,77)> - [ +] - SpanEditHandler;Accepts:Any - (77:0,77) - Tokens:2
  83293. - SyntaxKind.Whitespace;[ ];
  83294. - SyntaxKind.Text;[+];
  83295. - Markup span - Gen<LitAttr: @(79:0,79)> - [ 1] - SpanEditHandler;Accepts:Any - (79:0,79) - Tokens:2
  83296. - SyntaxKind.Whitespace;[ ];
  83297. - SyntaxKind.Text;[1];
  83298. - bound-string - Minimized
  83299. +RazorDocument - [0..101)::101 - [<p bound-int class='@DateTime.Now + 1' bound-string class='@DateTime.Now + 1' bound-string></p>]
  83300. + MarkupBlock - [0..101)::101
  83301. + MarkupTagHelperElement - [0..101)::101 - p[StartTagAndEndTag] - PTagHelper
  83302. + MarkupTagHelperStartTag - [0..97)::97
  83303. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83304. + OpenAngle;[<];
  83305. + Text;[p];
  83306. + MarkupMinimizedTagHelperAttribute - [2..15)::13 - bound-int - Minimized - Bound - [ bound-int]
  83307. + MarkupTextLiteral - [2..6)::4 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83308. + Whitespace;[ ];
  83309. + MarkupTextLiteral - [6..15)::9 - [bound-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83310. + Text;[bound-int];
  83311. + MarkupTagHelperAttribute - [15..41)::26 - class - SingleQuotes - Unbound - [ class='@DateTime.Now + 1']
  83312. + MarkupTextLiteral - [15..16)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83313. + Whitespace;[ ];
  83314. + MarkupTextLiteral - [16..21)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83315. + Text;[class];
  83316. + Equals;[=];
  83317. + MarkupTextLiteral - [22..23)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  83318. + SingleQuote;['];
  83319. + MarkupTagHelperAttributeValue - [23..40)::17
  83320. + MarkupDynamicAttributeValue - [23..36)::13 - [@DateTime.Now]
  83321. + GenericBlock - [23..36)::13
  83322. + CSharpCodeBlock - [23..36)::13
  83323. + CSharpImplicitExpression - [23..36)::13
  83324. + CSharpTransition - [23..24)::1 - Gen<None> - SpanEditHandler;Accepts:None
  83325. + Transition;[@];
  83326. + CSharpImplicitExpressionBody - [24..36)::12
  83327. + CSharpCodeBlock - [24..36)::12
  83328. + CSharpExpressionLiteral - [24..36)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  83329. + Identifier;[DateTime];
  83330. + Dot;[.];
  83331. + Identifier;[Now];
  83332. + MarkupLiteralAttributeValue - [36..38)::2 - [ +]
  83333. + MarkupTextLiteral - [36..37)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83334. + Whitespace;[ ];
  83335. + MarkupTextLiteral - [37..38)::1 - [+] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83336. + Text;[+];
  83337. + MarkupLiteralAttributeValue - [38..40)::2 - [ 1]
  83338. + MarkupTextLiteral - [38..39)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83339. + Whitespace;[ ];
  83340. + MarkupTextLiteral - [39..40)::1 - [1] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83341. + Text;[1];
  83342. + MarkupTextLiteral - [40..41)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  83343. + SingleQuote;['];
  83344. + MarkupMinimizedTagHelperAttribute - [41..56)::15 - bound-string - Minimized - Bound - [ bound-string]
  83345. + MarkupTextLiteral - [41..44)::3 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83346. + Whitespace;[ ];
  83347. + MarkupTextLiteral - [44..56)::12 - [bound-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83348. + Text;[bound-string];
  83349. + MarkupTagHelperAttribute - [56..82)::26 - class - SingleQuotes - Unbound - [ class='@DateTime.Now + 1']
  83350. + MarkupTextLiteral - [56..57)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83351. + Whitespace;[ ];
  83352. + MarkupTextLiteral - [57..62)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83353. + Text;[class];
  83354. + Equals;[=];
  83355. + MarkupTextLiteral - [63..64)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  83356. + SingleQuote;['];
  83357. + MarkupTagHelperAttributeValue - [64..81)::17
  83358. + MarkupDynamicAttributeValue - [64..77)::13 - [@DateTime.Now]
  83359. + GenericBlock - [64..77)::13
  83360. + CSharpCodeBlock - [64..77)::13
  83361. + CSharpImplicitExpression - [64..77)::13
  83362. + CSharpTransition - [64..65)::1 - Gen<None> - SpanEditHandler;Accepts:None
  83363. + Transition;[@];
  83364. + CSharpImplicitExpressionBody - [65..77)::12
  83365. + CSharpCodeBlock - [65..77)::12
  83366. + CSharpExpressionLiteral - [65..77)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  83367. + Identifier;[DateTime];
  83368. + Dot;[.];
  83369. + Identifier;[Now];
  83370. + MarkupLiteralAttributeValue - [77..79)::2 - [ +]
  83371. + MarkupTextLiteral - [77..78)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83372. + Whitespace;[ ];
  83373. + MarkupTextLiteral - [78..79)::1 - [+] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83374. + Text;[+];
  83375. + MarkupLiteralAttributeValue - [79..81)::2 - [ 1]
  83376. + MarkupTextLiteral - [79..80)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83377. + Whitespace;[ ];
  83378. + MarkupTextLiteral - [80..81)::1 - [1] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83379. + Text;[1];
  83380. + MarkupTextLiteral - [81..82)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  83381. + SingleQuote;['];
  83382. + MarkupMinimizedTagHelperAttribute - [82..96)::14 - bound-string - Minimized - Bound - [ bound-string]
  83383. + MarkupTextLiteral - [82..84)::2 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83384. + Whitespace;[ ];
  83385. + MarkupTextLiteral - [84..96)::12 - [bound-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83386. + Text;[bound-string];
  83387. + MarkupTextLiteral - [96..97)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83388. + CloseAngle;[>];
  83389. + MarkupTagHelperEndTag - [97..101)::4
  83390. + MarkupTextLiteral - [97..101)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83391. + OpenAngle;[<];
  83392. + ForwardSlash;[/];
  83393. + Text;[p];
  83394. + CloseAngle;[>];
  83395. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document4.stree.txt
  83396. index fc50535f188..e0d945f1343 100644
  83397. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document4.stree.txt
  83398. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document4.stree.txt
  83399. @@ -1,4 +1,16 @@
  83400. -Markup block - Gen<None> - 28 - (0:0,0)
  83401. - Tag block - Gen<TagHelper> - 28 - (0:0,0) - input - InputTagHelper2 - InputTagHelper3
  83402. - SelfClosing - <input bound-required-int />
  83403. - bound-required-int - Minimized
  83404. +RazorDocument - [0..28)::28 - [<input bound-required-int />]
  83405. + MarkupBlock - [0..28)::28
  83406. + MarkupTagHelperElement - [0..28)::28 - input[SelfClosing] - InputTagHelper2 - InputTagHelper3
  83407. + MarkupTagHelperStartTag - [0..28)::28
  83408. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83409. + OpenAngle;[<];
  83410. + Text;[input];
  83411. + MarkupMinimizedTagHelperAttribute - [6..25)::19 - bound-required-int - Minimized - Bound - [ bound-required-int]
  83412. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83413. + Whitespace;[ ];
  83414. + MarkupTextLiteral - [7..25)::18 - [bound-required-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83415. + Text;[bound-required-int];
  83416. + MarkupTextLiteral - [25..28)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83417. + Whitespace;[ ];
  83418. + ForwardSlash;[/];
  83419. + CloseAngle;[>];
  83420. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document5.stree.txt
  83421. index 1808af976cf..624fe61ebe6 100644
  83422. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document5.stree.txt
  83423. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document5.stree.txt
  83424. @@ -1,4 +1,20 @@
  83425. -Markup block - Gen<None> - 17 - (0:0,0)
  83426. - Tag block - Gen<TagHelper> - 17 - (0:0,0) - p - PTagHelper
  83427. - StartTagAndEndTag - <p bound-int> ... </p>
  83428. - bound-int - Minimized
  83429. +RazorDocument - [0..17)::17 - [<p bound-int></p>]
  83430. + MarkupBlock - [0..17)::17
  83431. + MarkupTagHelperElement - [0..17)::17 - p[StartTagAndEndTag] - PTagHelper
  83432. + MarkupTagHelperStartTag - [0..13)::13
  83433. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83434. + OpenAngle;[<];
  83435. + Text;[p];
  83436. + MarkupMinimizedTagHelperAttribute - [2..12)::10 - bound-int - Minimized - Bound - [ bound-int]
  83437. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83438. + Whitespace;[ ];
  83439. + MarkupTextLiteral - [3..12)::9 - [bound-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83440. + Text;[bound-int];
  83441. + MarkupTextLiteral - [12..13)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83442. + CloseAngle;[>];
  83443. + MarkupTagHelperEndTag - [13..17)::4
  83444. + MarkupTextLiteral - [13..17)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83445. + OpenAngle;[<];
  83446. + ForwardSlash;[/];
  83447. + Text;[p];
  83448. + CloseAngle;[>];
  83449. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document6.stree.txt
  83450. index 74632783f35..ae93684dd6e 100644
  83451. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document6.stree.txt
  83452. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document6.stree.txt
  83453. @@ -1,4 +1,15 @@
  83454. -Markup block - Gen<None> - 23 - (0:0,0)
  83455. - Tag block - Gen<TagHelper> - 23 - (0:0,0) - input - InputTagHelper3
  83456. - SelfClosing - <input int-dictionary/>
  83457. - int-dictionary - Minimized
  83458. +RazorDocument - [0..23)::23 - [<input int-dictionary/>]
  83459. + MarkupBlock - [0..23)::23
  83460. + MarkupTagHelperElement - [0..23)::23 - input[SelfClosing] - InputTagHelper3
  83461. + MarkupTagHelperStartTag - [0..23)::23
  83462. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83463. + OpenAngle;[<];
  83464. + Text;[input];
  83465. + MarkupMinimizedTagHelperAttribute - [6..21)::15 - int-dictionary - Minimized - Bound - [ int-dictionary]
  83466. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83467. + Whitespace;[ ];
  83468. + MarkupTextLiteral - [7..21)::14 - [int-dictionary] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83469. + Text;[int-dictionary];
  83470. + MarkupTextLiteral - [21..23)::2 - [/>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83471. + ForwardSlash;[/];
  83472. + CloseAngle;[>];
  83473. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document7.stree.txt
  83474. index 938c61a1125..54840502c34 100644
  83475. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document7.stree.txt
  83476. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document7.stree.txt
  83477. @@ -1,4 +1,16 @@
  83478. -Markup block - Gen<None> - 27 - (0:0,0)
  83479. - Tag block - Gen<TagHelper> - 27 - (0:0,0) - input - InputTagHelper3
  83480. - SelfClosing - <input string-dictionary />
  83481. - string-dictionary - Minimized
  83482. +RazorDocument - [0..27)::27 - [<input string-dictionary />]
  83483. + MarkupBlock - [0..27)::27
  83484. + MarkupTagHelperElement - [0..27)::27 - input[SelfClosing] - InputTagHelper3
  83485. + MarkupTagHelperStartTag - [0..27)::27
  83486. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83487. + OpenAngle;[<];
  83488. + Text;[input];
  83489. + MarkupMinimizedTagHelperAttribute - [6..24)::18 - string-dictionary - Minimized - Bound - [ string-dictionary]
  83490. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83491. + Whitespace;[ ];
  83492. + MarkupTextLiteral - [7..24)::17 - [string-dictionary] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83493. + Text;[string-dictionary];
  83494. + MarkupTextLiteral - [24..27)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83495. + Whitespace;[ ];
  83496. + ForwardSlash;[/];
  83497. + CloseAngle;[>];
  83498. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document8.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document8.stree.txt
  83499. index 766a4da8bcb..012bb8c2eee 100644
  83500. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document8.stree.txt
  83501. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document8.stree.txt
  83502. @@ -1,4 +1,16 @@
  83503. -Markup block - Gen<None> - 21 - (0:0,0)
  83504. - Tag block - Gen<TagHelper> - 21 - (0:0,0) - input - InputTagHelper3
  83505. - SelfClosing - <input int-prefix- />
  83506. - int-prefix- - Minimized
  83507. +RazorDocument - [0..21)::21 - [<input int-prefix- />]
  83508. + MarkupBlock - [0..21)::21
  83509. + MarkupTagHelperElement - [0..21)::21 - input[SelfClosing] - InputTagHelper3
  83510. + MarkupTagHelperStartTag - [0..21)::21
  83511. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83512. + OpenAngle;[<];
  83513. + Text;[input];
  83514. + MarkupMinimizedTagHelperAttribute - [6..18)::12 - int-prefix- - Minimized - Bound - [ int-prefix-]
  83515. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83516. + Whitespace;[ ];
  83517. + MarkupTextLiteral - [7..18)::11 - [int-prefix-] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83518. + Text;[int-prefix-];
  83519. + MarkupTextLiteral - [18..21)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83520. + Whitespace;[ ];
  83521. + ForwardSlash;[/];
  83522. + CloseAngle;[>];
  83523. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document9.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document9.stree.txt
  83524. index 65f176bb552..0e590ed9f36 100644
  83525. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document9.stree.txt
  83526. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_Document9.stree.txt
  83527. @@ -1,4 +1,15 @@
  83528. -Markup block - Gen<None> - 23 - (0:0,0)
  83529. - Tag block - Gen<TagHelper> - 23 - (0:0,0) - input - InputTagHelper3
  83530. - SelfClosing - <input string-prefix-/>
  83531. - string-prefix- - Minimized
  83532. +RazorDocument - [0..23)::23 - [<input string-prefix-/>]
  83533. + MarkupBlock - [0..23)::23
  83534. + MarkupTagHelperElement - [0..23)::23 - input[SelfClosing] - InputTagHelper3
  83535. + MarkupTagHelperStartTag - [0..23)::23
  83536. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83537. + OpenAngle;[<];
  83538. + Text;[input];
  83539. + MarkupMinimizedTagHelperAttribute - [6..21)::15 - string-prefix- - Minimized - Bound - [ string-prefix-]
  83540. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83541. + Whitespace;[ ];
  83542. + MarkupTextLiteral - [7..21)::14 - [string-prefix-] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83543. + Text;[string-prefix-];
  83544. + MarkupTextLiteral - [21..23)::2 - [/>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83545. + ForwardSlash;[/];
  83546. + CloseAngle;[>];
  83547. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags1.stree.txt
  83548. index f19a3803baa..331c5156d2a 100644
  83549. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags1.stree.txt
  83550. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags1.stree.txt
  83551. @@ -1,4 +1,12 @@
  83552. -Markup block - Gen<None> - 23 - (0:0,0)
  83553. - Tag block - Gen<TagHelper> - 23 - (0:0,0) - input - InputTagHelper1 - InputTagHelper3
  83554. - StartTagAndEndTag - <input unbound-required
  83555. - unbound-required - Minimized
  83556. +RazorDocument - [0..23)::23 - [<input unbound-required]
  83557. + MarkupBlock - [0..23)::23
  83558. + MarkupTagHelperElement - [0..23)::23 - input[StartTagAndEndTag] - InputTagHelper1 - InputTagHelper3
  83559. + MarkupTagHelperStartTag - [0..23)::23
  83560. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83561. + OpenAngle;[<];
  83562. + Text;[input];
  83563. + MarkupMinimizedTagHelperAttribute - [6..23)::17 - unbound-required - Minimized - Unbound - [ unbound-required]
  83564. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83565. + Whitespace;[ ];
  83566. + MarkupTextLiteral - [7..23)::16 - [unbound-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83567. + Text;[unbound-required];
  83568. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags2.stree.txt
  83569. index 599738b0e87..a2daf7a554d 100644
  83570. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags2.stree.txt
  83571. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags2.stree.txt
  83572. @@ -1,4 +1,12 @@
  83573. -Markup block - Gen<None> - 28 - (0:0,0)
  83574. - Tag block - Gen<TagHelper> - 28 - (0:0,0) - input - InputTagHelper1 - InputTagHelper3
  83575. - StartTagAndEndTag - <input bound-required-string
  83576. - bound-required-string - Minimized
  83577. +RazorDocument - [0..28)::28 - [<input bound-required-string]
  83578. + MarkupBlock - [0..28)::28
  83579. + MarkupTagHelperElement - [0..28)::28 - input[StartTagAndEndTag] - InputTagHelper1 - InputTagHelper3
  83580. + MarkupTagHelperStartTag - [0..28)::28
  83581. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83582. + OpenAngle;[<];
  83583. + Text;[input];
  83584. + MarkupMinimizedTagHelperAttribute - [6..28)::22 - bound-required-string - Minimized - Bound - [ bound-required-string]
  83585. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83586. + Whitespace;[ ];
  83587. + MarkupTextLiteral - [7..28)::21 - [bound-required-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83588. + Text;[bound-required-string];
  83589. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags3.stree.txt
  83590. index 51350e1bd24..4943c90567b 100644
  83591. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags3.stree.txt
  83592. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags3.stree.txt
  83593. @@ -1,4 +1,12 @@
  83594. -Markup block - Gen<None> - 25 - (0:0,0)
  83595. - Tag block - Gen<TagHelper> - 25 - (0:0,0) - input - InputTagHelper2 - InputTagHelper3
  83596. - StartTagAndEndTag - <input bound-required-int
  83597. - bound-required-int - Minimized
  83598. +RazorDocument - [0..25)::25 - [<input bound-required-int]
  83599. + MarkupBlock - [0..25)::25
  83600. + MarkupTagHelperElement - [0..25)::25 - input[StartTagAndEndTag] - InputTagHelper2 - InputTagHelper3
  83601. + MarkupTagHelperStartTag - [0..25)::25
  83602. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83603. + OpenAngle;[<];
  83604. + Text;[input];
  83605. + MarkupMinimizedTagHelperAttribute - [6..25)::19 - bound-required-int - Minimized - Bound - [ bound-required-int]
  83606. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83607. + Whitespace;[ ];
  83608. + MarkupTextLiteral - [7..25)::18 - [bound-required-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83609. + Text;[bound-required-int];
  83610. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags4.stree.txt
  83611. index dd174f8f539..bd5f5d9de6f 100644
  83612. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags4.stree.txt
  83613. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags4.stree.txt
  83614. @@ -1,6 +1,22 @@
  83615. -Markup block - Gen<None> - 64 - (0:0,0)
  83616. - Tag block - Gen<TagHelper> - 64 - (0:0,0) - input - InputTagHelper1 - InputTagHelper2 - InputTagHelper3
  83617. - StartTagAndEndTag - <input bound-required-int unbound-required bound-required-string
  83618. - bound-required-int - Minimized
  83619. - unbound-required - Minimized
  83620. - bound-required-string - Minimized
  83621. +RazorDocument - [0..64)::64 - [<input bound-required-int unbound-required bound-required-string]
  83622. + MarkupBlock - [0..64)::64
  83623. + MarkupTagHelperElement - [0..64)::64 - input[StartTagAndEndTag] - InputTagHelper1 - InputTagHelper2 - InputTagHelper3
  83624. + MarkupTagHelperStartTag - [0..64)::64
  83625. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83626. + OpenAngle;[<];
  83627. + Text;[input];
  83628. + MarkupMinimizedTagHelperAttribute - [6..25)::19 - bound-required-int - Minimized - Bound - [ bound-required-int]
  83629. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83630. + Whitespace;[ ];
  83631. + MarkupTextLiteral - [7..25)::18 - [bound-required-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83632. + Text;[bound-required-int];
  83633. + MarkupMinimizedTagHelperAttribute - [25..42)::17 - unbound-required - Minimized - Unbound - [ unbound-required]
  83634. + MarkupTextLiteral - [25..26)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83635. + Whitespace;[ ];
  83636. + MarkupTextLiteral - [26..42)::16 - [unbound-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83637. + Text;[unbound-required];
  83638. + MarkupMinimizedTagHelperAttribute - [42..64)::22 - bound-required-string - Minimized - Bound - [ bound-required-string]
  83639. + MarkupTextLiteral - [42..43)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83640. + Whitespace;[ ];
  83641. + MarkupTextLiteral - [43..64)::21 - [bound-required-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83642. + Text;[bound-required-string];
  83643. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags5.stree.txt
  83644. index bfbc9958be1..c8ba64d9031 100644
  83645. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags5.stree.txt
  83646. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags5.stree.txt
  83647. @@ -1,4 +1,12 @@
  83648. -Markup block - Gen<None> - 15 - (0:0,0)
  83649. - Tag block - Gen<TagHelper> - 15 - (0:0,0) - p - PTagHelper
  83650. - StartTagAndEndTag - <p bound-string
  83651. - bound-string - Minimized
  83652. +RazorDocument - [0..15)::15 - [<p bound-string]
  83653. + MarkupBlock - [0..15)::15
  83654. + MarkupTagHelperElement - [0..15)::15 - p[StartTagAndEndTag] - PTagHelper
  83655. + MarkupTagHelperStartTag - [0..15)::15
  83656. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83657. + OpenAngle;[<];
  83658. + Text;[p];
  83659. + MarkupMinimizedTagHelperAttribute - [2..15)::13 - bound-string - Minimized - Bound - [ bound-string]
  83660. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83661. + Whitespace;[ ];
  83662. + MarkupTextLiteral - [3..15)::12 - [bound-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83663. + Text;[bound-string];
  83664. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags6.stree.txt
  83665. index cf33d9f99a4..b96cd258d22 100644
  83666. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags6.stree.txt
  83667. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags6.stree.txt
  83668. @@ -1,4 +1,12 @@
  83669. -Markup block - Gen<None> - 12 - (0:0,0)
  83670. - Tag block - Gen<TagHelper> - 12 - (0:0,0) - p - PTagHelper
  83671. - StartTagAndEndTag - <p bound-int
  83672. - bound-int - Minimized
  83673. +RazorDocument - [0..12)::12 - [<p bound-int]
  83674. + MarkupBlock - [0..12)::12
  83675. + MarkupTagHelperElement - [0..12)::12 - p[StartTagAndEndTag] - PTagHelper
  83676. + MarkupTagHelperStartTag - [0..12)::12
  83677. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83678. + OpenAngle;[<];
  83679. + Text;[p];
  83680. + MarkupMinimizedTagHelperAttribute - [2..12)::10 - bound-int - Minimized - Bound - [ bound-int]
  83681. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83682. + Whitespace;[ ];
  83683. + MarkupTextLiteral - [3..12)::9 - [bound-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83684. + Text;[bound-int];
  83685. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags7.stree.txt
  83686. index b8bf70c9100..6b54e555faa 100644
  83687. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags7.stree.txt
  83688. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags7.stree.txt
  83689. @@ -1,5 +1,17 @@
  83690. -Markup block - Gen<None> - 25 - (0:0,0)
  83691. - Tag block - Gen<TagHelper> - 25 - (0:0,0) - p - PTagHelper
  83692. - StartTagAndEndTag - <p bound-int bound-string
  83693. - bound-int - Minimized
  83694. - bound-string - Minimized
  83695. +RazorDocument - [0..25)::25 - [<p bound-int bound-string]
  83696. + MarkupBlock - [0..25)::25
  83697. + MarkupTagHelperElement - [0..25)::25 - p[StartTagAndEndTag] - PTagHelper
  83698. + MarkupTagHelperStartTag - [0..25)::25
  83699. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83700. + OpenAngle;[<];
  83701. + Text;[p];
  83702. + MarkupMinimizedTagHelperAttribute - [2..12)::10 - bound-int - Minimized - Bound - [ bound-int]
  83703. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83704. + Whitespace;[ ];
  83705. + MarkupTextLiteral - [3..12)::9 - [bound-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83706. + Text;[bound-int];
  83707. + MarkupMinimizedTagHelperAttribute - [12..25)::13 - bound-string - Minimized - Bound - [ bound-string]
  83708. + MarkupTextLiteral - [12..13)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83709. + Whitespace;[ ];
  83710. + MarkupTextLiteral - [13..25)::12 - [bound-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83711. + Text;[bound-string];
  83712. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags8.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags8.stree.txt
  83713. index 5ea2f5855b5..e623f0ac11a 100644
  83714. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags8.stree.txt
  83715. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedAttributes_PartialTags8.stree.txt
  83716. @@ -1,10 +1,37 @@
  83717. -Markup block - Gen<None> - 89 - (0:0,0)
  83718. - Tag block - Gen<TagHelper> - 89 - (0:0,0) - input - InputTagHelper1 - InputTagHelper2 - InputTagHelper3
  83719. - StartTagAndEndTag - <input bound-required-int unbound-required bound-required-string
  83720. - bound-required-int - Minimized
  83721. - unbound-required - Minimized
  83722. - bound-required-string - Minimized
  83723. - Tag block - Gen<TagHelper> - 25 - (64:0,64) - p - PTagHelper
  83724. - StartTagAndEndTag - <p bound-int bound-string
  83725. - bound-int - Minimized
  83726. - bound-string - Minimized
  83727. +RazorDocument - [0..89)::89 - [<input bound-required-int unbound-required bound-required-string<p bound-int bound-string]
  83728. + MarkupBlock - [0..89)::89
  83729. + MarkupTagHelperElement - [0..89)::89 - input[StartTagAndEndTag] - InputTagHelper1 - InputTagHelper2 - InputTagHelper3
  83730. + MarkupTagHelperStartTag - [0..64)::64
  83731. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83732. + OpenAngle;[<];
  83733. + Text;[input];
  83734. + MarkupMinimizedTagHelperAttribute - [6..25)::19 - bound-required-int - Minimized - Bound - [ bound-required-int]
  83735. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83736. + Whitespace;[ ];
  83737. + MarkupTextLiteral - [7..25)::18 - [bound-required-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83738. + Text;[bound-required-int];
  83739. + MarkupMinimizedTagHelperAttribute - [25..42)::17 - unbound-required - Minimized - Unbound - [ unbound-required]
  83740. + MarkupTextLiteral - [25..26)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83741. + Whitespace;[ ];
  83742. + MarkupTextLiteral - [26..42)::16 - [unbound-required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83743. + Text;[unbound-required];
  83744. + MarkupMinimizedTagHelperAttribute - [42..64)::22 - bound-required-string - Minimized - Bound - [ bound-required-string]
  83745. + MarkupTextLiteral - [42..43)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83746. + Whitespace;[ ];
  83747. + MarkupTextLiteral - [43..64)::21 - [bound-required-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83748. + Text;[bound-required-string];
  83749. + MarkupTagHelperElement - [64..89)::25 - p[StartTagAndEndTag] - PTagHelper
  83750. + MarkupTagHelperStartTag - [64..89)::25
  83751. + MarkupTextLiteral - [64..66)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83752. + OpenAngle;[<];
  83753. + Text;[p];
  83754. + MarkupMinimizedTagHelperAttribute - [66..76)::10 - bound-int - Minimized - Bound - [ bound-int]
  83755. + MarkupTextLiteral - [66..67)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83756. + Whitespace;[ ];
  83757. + MarkupTextLiteral - [67..76)::9 - [bound-int] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83758. + Text;[bound-int];
  83759. + MarkupMinimizedTagHelperAttribute - [76..89)::13 - bound-string - Minimized - Bound - [ bound-string]
  83760. + MarkupTextLiteral - [76..77)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83761. + Whitespace;[ ];
  83762. + MarkupTextLiteral - [77..89)::12 - [bound-string] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83763. + Text;[bound-string];
  83764. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedBooleanBoundAttributes.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedBooleanBoundAttributes.stree.txt
  83765. index 8ff170117e9..1d5ebc5e259 100644
  83766. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedBooleanBoundAttributes.stree.txt
  83767. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperBlockRewriterTest/UnderstandsMinimizedBooleanBoundAttributes.stree.txt
  83768. @@ -1,5 +1,21 @@
  83769. -Markup block - Gen<None> - 37 - (0:0,0)
  83770. - Tag block - Gen<TagHelper> - 37 - (0:0,0) - input - InputTagHelper
  83771. - SelfClosing - <input boundbool boundbooldict-key />
  83772. - boundbool - Minimized
  83773. - boundbooldict-key - Minimized
  83774. +RazorDocument - [0..37)::37 - [<input boundbool boundbooldict-key />]
  83775. + MarkupBlock - [0..37)::37
  83776. + MarkupTagHelperElement - [0..37)::37 - input[SelfClosing] - InputTagHelper
  83777. + MarkupTagHelperStartTag - [0..37)::37
  83778. + MarkupTextLiteral - [0..6)::6 - [<input] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83779. + OpenAngle;[<];
  83780. + Text;[input];
  83781. + MarkupMinimizedTagHelperAttribute - [6..16)::10 - boundbool - Minimized - Bound - [ boundbool]
  83782. + MarkupTextLiteral - [6..7)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83783. + Whitespace;[ ];
  83784. + MarkupTextLiteral - [7..16)::9 - [boundbool] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83785. + Text;[boundbool];
  83786. + MarkupMinimizedTagHelperAttribute - [16..34)::18 - boundbooldict-key - Minimized - Bound - [ boundbooldict-key]
  83787. + MarkupTextLiteral - [16..17)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83788. + Whitespace;[ ];
  83789. + MarkupTextLiteral - [17..34)::17 - [boundbooldict-key] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83790. + Text;[boundbooldict-key];
  83791. + MarkupTextLiteral - [34..37)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83792. + Whitespace;[ ];
  83793. + ForwardSlash;[/];
  83794. + CloseAngle;[>];
  83795. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers1.stree.txt
  83796. index e56537a94bb..be3ea59653a 100644
  83797. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers1.stree.txt
  83798. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers1.stree.txt
  83799. @@ -1,8 +1,9 @@
  83800. -Markup block - Gen<None> - 7 - (0:0,0)
  83801. - Tag block - Gen<None> - 7 - (0:0,0)
  83802. - Markup span - Gen<Markup> - [<th: />] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:5
  83803. - SyntaxKind.OpenAngle;[<];
  83804. - SyntaxKind.Text;[th:];
  83805. - SyntaxKind.Whitespace;[ ];
  83806. - SyntaxKind.ForwardSlash;[/];
  83807. - SyntaxKind.CloseAngle;[>];
  83808. +RazorDocument - [0..7)::7 - [<th: />]
  83809. + MarkupBlock - [0..7)::7
  83810. + MarkupTagBlock - [0..7)::7 - [<th: />]
  83811. + MarkupTextLiteral - [0..7)::7 - [<th: />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83812. + OpenAngle;[<];
  83813. + Text;[th:];
  83814. + Whitespace;[ ];
  83815. + ForwardSlash;[/];
  83816. + CloseAngle;[>];
  83817. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers10.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers10.stree.txt
  83818. index e36b2ff45c5..962cf6cf6f3 100644
  83819. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers10.stree.txt
  83820. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers10.stree.txt
  83821. @@ -1,13 +1,35 @@
  83822. -Markup block - Gen<None> - 47 - (0:0,0)
  83823. - Tag block - Gen<TagHelper> - 47 - (0:0,0) - th:myth - mythTagHelper
  83824. - StartTagAndEndTag - <th:myth class="btn"> ... </th:myth>
  83825. - class - DoubleQuotes
  83826. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  83827. - SyntaxKind.Text;[btn];
  83828. - SyntaxKind.HtmlTextLiteral - [words and spaces] - [21..37) - FullWidth: 16 - Slots: 1
  83829. - SyntaxKind.List - [words and spaces] - [21..37) - FullWidth: 16 - Slots: 5
  83830. - SyntaxKind.Text;[words];
  83831. - SyntaxKind.Whitespace;[ ];
  83832. - SyntaxKind.Text;[and];
  83833. - SyntaxKind.Whitespace;[ ];
  83834. - SyntaxKind.Text;[spaces];
  83835. +RazorDocument - [0..47)::47 - [<th:myth class="btn">words and spaces</th:myth>]
  83836. + MarkupBlock - [0..47)::47
  83837. + MarkupTagHelperElement - [0..47)::47 - th:myth[StartTagAndEndTag] - mythTagHelper
  83838. + MarkupTagHelperStartTag - [0..21)::21
  83839. + MarkupTextLiteral - [0..8)::8 - [<th:myth] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83840. + OpenAngle;[<];
  83841. + Text;[th:myth];
  83842. + MarkupTagHelperAttribute - [8..20)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  83843. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83844. + Whitespace;[ ];
  83845. + MarkupTextLiteral - [9..14)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83846. + Text;[class];
  83847. + Equals;[=];
  83848. + MarkupTextLiteral - [15..16)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  83849. + DoubleQuote;["];
  83850. + MarkupTagHelperAttributeValue - [16..19)::3
  83851. + MarkupLiteralAttributeValue - [16..19)::3 - [btn]
  83852. + MarkupTextLiteral - [16..19)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83853. + Text;[btn];
  83854. + MarkupTextLiteral - [19..20)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  83855. + DoubleQuote;["];
  83856. + MarkupTextLiteral - [20..21)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83857. + CloseAngle;[>];
  83858. + MarkupTextLiteral - [21..37)::16 - [words and spaces] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83859. + Text;[words];
  83860. + Whitespace;[ ];
  83861. + Text;[and];
  83862. + Whitespace;[ ];
  83863. + Text;[spaces];
  83864. + MarkupTagHelperEndTag - [37..47)::10
  83865. + MarkupTextLiteral - [37..47)::10 - [</th:myth>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83866. + OpenAngle;[<];
  83867. + ForwardSlash;[/];
  83868. + Text;[th:myth];
  83869. + CloseAngle;[>];
  83870. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers11.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers11.stree.txt
  83871. index edc4636aa3a..a15006bfd45 100644
  83872. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers11.stree.txt
  83873. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers11.stree.txt
  83874. @@ -1,13 +1,33 @@
  83875. -Markup block - Gen<None> - 34 - (0:0,0)
  83876. - Tag block - Gen<TagHelper> - 34 - (0:0,0) - th:myth2 - mythTagHelper2
  83877. - SelfClosing - <th:myth2 bound="@DateTime.Now" />
  83878. - bound - DoubleQuotes
  83879. - Markup block - Gen<None> - 13 - (17:0,17)
  83880. - Markup block - Gen<None> - 13 - (17:0,17)
  83881. - Expression block - Gen<Expr> - 13 - (17:0,17)
  83882. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (17:0,17) - Tokens:1
  83883. - SyntaxKind.Transition;[@];
  83884. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14 - (18:0,18) - Tokens:3
  83885. - SyntaxKind.Identifier;[DateTime];
  83886. - SyntaxKind.Dot;[.];
  83887. - SyntaxKind.Identifier;[Now];
  83888. +RazorDocument - [0..34)::34 - [<th:myth2 bound="@DateTime.Now" />]
  83889. + MarkupBlock - [0..34)::34
  83890. + MarkupTagHelperElement - [0..34)::34 - th:myth2[SelfClosing] - mythTagHelper2
  83891. + MarkupTagHelperStartTag - [0..34)::34
  83892. + MarkupTextLiteral - [0..9)::9 - [<th:myth2] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83893. + OpenAngle;[<];
  83894. + Text;[th:myth2];
  83895. + MarkupTagHelperAttribute - [9..31)::22 - bound - DoubleQuotes - Bound - [ bound="@DateTime.Now"]
  83896. + MarkupTextLiteral - [9..10)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83897. + Whitespace;[ ];
  83898. + MarkupTextLiteral - [10..15)::5 - [bound] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83899. + Text;[bound];
  83900. + Equals;[=];
  83901. + MarkupTextLiteral - [16..17)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  83902. + DoubleQuote;["];
  83903. + MarkupTagHelperAttributeValue - [17..30)::13
  83904. + MarkupBlock - [17..30)::13
  83905. + CSharpCodeBlock - [17..30)::13
  83906. + CSharpImplicitExpression - [17..30)::13
  83907. + CSharpTransition - [17..18)::1 - Gen<None> - SpanEditHandler;Accepts:None
  83908. + Transition;[@];
  83909. + CSharpImplicitExpressionBody - [18..30)::12
  83910. + CSharpCodeBlock - [18..30)::12
  83911. + CSharpExpressionLiteral - [18..30)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[ATD];K14
  83912. + Identifier;[DateTime];
  83913. + Dot;[.];
  83914. + Identifier;[Now];
  83915. + MarkupTextLiteral - [30..31)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  83916. + DoubleQuote;["];
  83917. + MarkupTextLiteral - [31..34)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83918. + Whitespace;[ ];
  83919. + ForwardSlash;[/];
  83920. + CloseAngle;[>];
  83921. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers2.stree.txt
  83922. index 8f244a61226..5e102b0e0ea 100644
  83923. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers2.stree.txt
  83924. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers2.stree.txt
  83925. @@ -1,19 +1,19 @@
  83926. -Markup block - Gen<None> - 27 - (0:0,0)
  83927. - Tag block - Gen<None> - 5 - (0:0,0)
  83928. - Markup span - Gen<Markup> - [<th:>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  83929. - SyntaxKind.OpenAngle;[<];
  83930. - SyntaxKind.Text;[th:];
  83931. - SyntaxKind.CloseAngle;[>];
  83932. - SyntaxKind.HtmlTextLiteral - [words and spaces] - [5..21) - FullWidth: 16 - Slots: 1
  83933. - SyntaxKind.List - [words and spaces] - [5..21) - FullWidth: 16 - Slots: 5
  83934. - SyntaxKind.Text;[words];
  83935. - SyntaxKind.Whitespace;[ ];
  83936. - SyntaxKind.Text;[and];
  83937. - SyntaxKind.Whitespace;[ ];
  83938. - SyntaxKind.Text;[spaces];
  83939. - Tag block - Gen<None> - 6 - (21:0,21)
  83940. - Markup span - Gen<Markup> - [</th:>] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:4
  83941. - SyntaxKind.OpenAngle;[<];
  83942. - SyntaxKind.ForwardSlash;[/];
  83943. - SyntaxKind.Text;[th:];
  83944. - SyntaxKind.CloseAngle;[>];
  83945. +RazorDocument - [0..27)::27 - [<th:>words and spaces</th:>]
  83946. + MarkupBlock - [0..27)::27
  83947. + MarkupTagBlock - [0..5)::5 - [<th:>]
  83948. + MarkupTextLiteral - [0..5)::5 - [<th:>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83949. + OpenAngle;[<];
  83950. + Text;[th:];
  83951. + CloseAngle;[>];
  83952. + MarkupTextLiteral - [5..21)::16 - [words and spaces] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83953. + Text;[words];
  83954. + Whitespace;[ ];
  83955. + Text;[and];
  83956. + Whitespace;[ ];
  83957. + Text;[spaces];
  83958. + MarkupTagBlock - [21..27)::6 - [</th:>]
  83959. + MarkupTextLiteral - [21..27)::6 - [</th:>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83960. + OpenAngle;[<];
  83961. + ForwardSlash;[/];
  83962. + Text;[th:];
  83963. + CloseAngle;[>];
  83964. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers3.stree.txt
  83965. index 6fa88c654bc..b6594f70062 100644
  83966. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers3.stree.txt
  83967. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers3.stree.txt
  83968. @@ -1,3 +1,10 @@
  83969. -Markup block - Gen<None> - 11 - (0:0,0)
  83970. - Tag block - Gen<TagHelper> - 11 - (0:0,0) - th:myth - mythTagHelper
  83971. - SelfClosing - <th:myth />
  83972. +RazorDocument - [0..11)::11 - [<th:myth />]
  83973. + MarkupBlock - [0..11)::11
  83974. + MarkupTagHelperElement - [0..11)::11 - th:myth[SelfClosing] - mythTagHelper
  83975. + MarkupTagHelperStartTag - [0..11)::11
  83976. + MarkupTextLiteral - [0..11)::11 - [<th:myth />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83977. + OpenAngle;[<];
  83978. + Text;[th:myth];
  83979. + Whitespace;[ ];
  83980. + ForwardSlash;[/];
  83981. + CloseAngle;[>];
  83982. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers4.stree.txt
  83983. index 25308b73be3..b53776a0264 100644
  83984. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers4.stree.txt
  83985. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers4.stree.txt
  83986. @@ -1,3 +1,14 @@
  83987. -Markup block - Gen<None> - 19 - (0:0,0)
  83988. - Tag block - Gen<TagHelper> - 19 - (0:0,0) - th:myth - mythTagHelper
  83989. - StartTagAndEndTag - <th:myth> ... </th:myth>
  83990. +RazorDocument - [0..19)::19 - [<th:myth></th:myth>]
  83991. + MarkupBlock - [0..19)::19
  83992. + MarkupTagHelperElement - [0..19)::19 - th:myth[StartTagAndEndTag] - mythTagHelper
  83993. + MarkupTagHelperStartTag - [0..9)::9
  83994. + MarkupTextLiteral - [0..9)::9 - [<th:myth>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  83995. + OpenAngle;[<];
  83996. + Text;[th:myth];
  83997. + CloseAngle;[>];
  83998. + MarkupTagHelperEndTag - [9..19)::10
  83999. + MarkupTextLiteral - [9..19)::10 - [</th:myth>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84000. + OpenAngle;[<];
  84001. + ForwardSlash;[/];
  84002. + Text;[th:myth];
  84003. + CloseAngle;[>];
  84004. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers5.stree.txt
  84005. index aa47262723d..734aa85116a 100644
  84006. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers5.stree.txt
  84007. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers5.stree.txt
  84008. @@ -1,14 +1,25 @@
  84009. -Markup block - Gen<None> - 40 - (0:0,0)
  84010. - Tag block - Gen<TagHelper> - 40 - (0:0,0) - th:myth - mythTagHelper
  84011. - StartTagAndEndTag - <th:myth> ... </th:myth>
  84012. - Tag block - Gen<None> - 10 - (9:0,9)
  84013. - Markup span - Gen<Markup> - [<th:my2th>] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:3
  84014. - SyntaxKind.OpenAngle;[<];
  84015. - SyntaxKind.Text;[th:my2th];
  84016. - SyntaxKind.CloseAngle;[>];
  84017. - Tag block - Gen<None> - 11 - (19:0,19)
  84018. - Markup span - Gen<Markup> - [</th:my2th>] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:4
  84019. - SyntaxKind.OpenAngle;[<];
  84020. - SyntaxKind.ForwardSlash;[/];
  84021. - SyntaxKind.Text;[th:my2th];
  84022. - SyntaxKind.CloseAngle;[>];
  84023. +RazorDocument - [0..40)::40 - [<th:myth><th:my2th></th:my2th></th:myth>]
  84024. + MarkupBlock - [0..40)::40
  84025. + MarkupTagHelperElement - [0..40)::40 - th:myth[StartTagAndEndTag] - mythTagHelper
  84026. + MarkupTagHelperStartTag - [0..9)::9
  84027. + MarkupTextLiteral - [0..9)::9 - [<th:myth>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84028. + OpenAngle;[<];
  84029. + Text;[th:myth];
  84030. + CloseAngle;[>];
  84031. + MarkupTagBlock - [9..19)::10 - [<th:my2th>]
  84032. + MarkupTextLiteral - [9..19)::10 - [<th:my2th>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84033. + OpenAngle;[<];
  84034. + Text;[th:my2th];
  84035. + CloseAngle;[>];
  84036. + MarkupTagBlock - [19..30)::11 - [</th:my2th>]
  84037. + MarkupTextLiteral - [19..30)::11 - [</th:my2th>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84038. + OpenAngle;[<];
  84039. + ForwardSlash;[/];
  84040. + Text;[th:my2th];
  84041. + CloseAngle;[>];
  84042. + MarkupTagHelperEndTag - [30..40)::10
  84043. + MarkupTextLiteral - [30..40)::10 - [</th:myth>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84044. + OpenAngle;[<];
  84045. + ForwardSlash;[/];
  84046. + Text;[th:myth];
  84047. + CloseAngle;[>];
  84048. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers6.stree.txt
  84049. index 541d6b999a5..9a36af554a7 100644
  84050. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers6.stree.txt
  84051. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers6.stree.txt
  84052. @@ -1,11 +1,12 @@
  84053. -Markup block - Gen<None> - 12 - (0:0,0)
  84054. - Tag block - Gen<None> - 12 - (0:0,0)
  84055. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  84056. - SyntaxKind.OpenAngle;[<];
  84057. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  84058. - SyntaxKind.Bang;[!];
  84059. - Markup span - Gen<Markup> - [th:myth />] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:4
  84060. - SyntaxKind.Text;[th:myth];
  84061. - SyntaxKind.Whitespace;[ ];
  84062. - SyntaxKind.ForwardSlash;[/];
  84063. - SyntaxKind.CloseAngle;[>];
  84064. +RazorDocument - [0..12)::12 - [<!th:myth />]
  84065. + MarkupBlock - [0..12)::12
  84066. + MarkupTagBlock - [0..12)::12 - [<!th:myth />]
  84067. + MarkupTextLiteral - [0..1)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84068. + OpenAngle;[<];
  84069. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84070. + Bang;[!];
  84071. + MarkupTextLiteral - [2..12)::10 - [th:myth />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84072. + Text;[th:myth];
  84073. + Whitespace;[ ];
  84074. + ForwardSlash;[/];
  84075. + CloseAngle;[>];
  84076. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers7.stree.txt
  84077. index e0fd9882b50..29d040629d6 100644
  84078. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers7.stree.txt
  84079. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers7.stree.txt
  84080. @@ -1,18 +1,19 @@
  84081. -Markup block - Gen<None> - 21 - (0:0,0)
  84082. - Tag block - Gen<None> - 10 - (0:0,0)
  84083. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  84084. - SyntaxKind.OpenAngle;[<];
  84085. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  84086. - SyntaxKind.Bang;[!];
  84087. - Markup span - Gen<Markup> - [th:myth>] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:2
  84088. - SyntaxKind.Text;[th:myth];
  84089. - SyntaxKind.CloseAngle;[>];
  84090. - Tag block - Gen<None> - 11 - (10:0,10)
  84091. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:2
  84092. - SyntaxKind.OpenAngle;[<];
  84093. - SyntaxKind.ForwardSlash;[/];
  84094. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:1
  84095. - SyntaxKind.Bang;[!];
  84096. - Markup span - Gen<Markup> - [th:myth>] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:2
  84097. - SyntaxKind.Text;[th:myth];
  84098. - SyntaxKind.CloseAngle;[>];
  84099. +RazorDocument - [0..21)::21 - [<!th:myth></!th:myth>]
  84100. + MarkupBlock - [0..21)::21
  84101. + MarkupTagBlock - [0..10)::10 - [<!th:myth>]
  84102. + MarkupTextLiteral - [0..1)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84103. + OpenAngle;[<];
  84104. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84105. + Bang;[!];
  84106. + MarkupTextLiteral - [2..10)::8 - [th:myth>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84107. + Text;[th:myth];
  84108. + CloseAngle;[>];
  84109. + MarkupTagBlock - [10..21)::11 - [</!th:myth>]
  84110. + MarkupTextLiteral - [10..12)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84111. + OpenAngle;[<];
  84112. + ForwardSlash;[/];
  84113. + RazorMetaCode - [12..13)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84114. + Bang;[!];
  84115. + MarkupTextLiteral - [13..21)::8 - [th:myth>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84116. + Text;[th:myth];
  84117. + CloseAngle;[>];
  84118. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers8.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers8.stree.txt
  84119. index b27544e31ff..838fb64cca3 100644
  84120. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers8.stree.txt
  84121. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers8.stree.txt
  84122. @@ -1,6 +1,25 @@
  84123. -Markup block - Gen<None> - 23 - (0:0,0)
  84124. - Tag block - Gen<TagHelper> - 23 - (0:0,0) - th:myth - mythTagHelper
  84125. - SelfClosing - <th:myth class="btn" />
  84126. - class - DoubleQuotes
  84127. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  84128. - SyntaxKind.Text;[btn];
  84129. +RazorDocument - [0..23)::23 - [<th:myth class="btn" />]
  84130. + MarkupBlock - [0..23)::23
  84131. + MarkupTagHelperElement - [0..23)::23 - th:myth[SelfClosing] - mythTagHelper
  84132. + MarkupTagHelperStartTag - [0..23)::23
  84133. + MarkupTextLiteral - [0..8)::8 - [<th:myth] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84134. + OpenAngle;[<];
  84135. + Text;[th:myth];
  84136. + MarkupTagHelperAttribute - [8..20)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  84137. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84138. + Whitespace;[ ];
  84139. + MarkupTextLiteral - [9..14)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84140. + Text;[class];
  84141. + Equals;[=];
  84142. + MarkupTextLiteral - [15..16)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  84143. + DoubleQuote;["];
  84144. + MarkupTagHelperAttributeValue - [16..19)::3
  84145. + MarkupLiteralAttributeValue - [16..19)::3 - [btn]
  84146. + MarkupTextLiteral - [16..19)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84147. + Text;[btn];
  84148. + MarkupTextLiteral - [19..20)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  84149. + DoubleQuote;["];
  84150. + MarkupTextLiteral - [20..23)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84151. + Whitespace;[ ];
  84152. + ForwardSlash;[/];
  84153. + CloseAngle;[>];
  84154. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers9.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers9.stree.txt
  84155. index c2cc6ba69aa..11055a52cd0 100644
  84156. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers9.stree.txt
  84157. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsPrefixedTagHelpers9.stree.txt
  84158. @@ -1,6 +1,25 @@
  84159. -Markup block - Gen<None> - 24 - (0:0,0)
  84160. - Tag block - Gen<TagHelper> - 24 - (0:0,0) - th:myth2 - mythTagHelper2
  84161. - SelfClosing - <th:myth2 class="btn" />
  84162. - class - DoubleQuotes
  84163. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:1
  84164. - SyntaxKind.Text;[btn];
  84165. +RazorDocument - [0..24)::24 - [<th:myth2 class="btn" />]
  84166. + MarkupBlock - [0..24)::24
  84167. + MarkupTagHelperElement - [0..24)::24 - th:myth2[SelfClosing] - mythTagHelper2
  84168. + MarkupTagHelperStartTag - [0..24)::24
  84169. + MarkupTextLiteral - [0..9)::9 - [<th:myth2] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84170. + OpenAngle;[<];
  84171. + Text;[th:myth2];
  84172. + MarkupTagHelperAttribute - [9..21)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  84173. + MarkupTextLiteral - [9..10)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84174. + Whitespace;[ ];
  84175. + MarkupTextLiteral - [10..15)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84176. + Text;[class];
  84177. + Equals;[=];
  84178. + MarkupTextLiteral - [16..17)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  84179. + DoubleQuote;["];
  84180. + MarkupTagHelperAttributeValue - [17..20)::3
  84181. + MarkupLiteralAttributeValue - [17..20)::3 - [btn]
  84182. + MarkupTextLiteral - [17..20)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84183. + Text;[btn];
  84184. + MarkupTextLiteral - [20..21)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  84185. + DoubleQuote;["];
  84186. + MarkupTextLiteral - [21..24)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84187. + Whitespace;[ ];
  84188. + ForwardSlash;[/];
  84189. + CloseAngle;[>];
  84190. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsRazorCommentsAsChildren.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsRazorCommentsAsChildren.stree.txt
  84191. index 06caab940cf..c9fe5d35d75 100644
  84192. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsRazorCommentsAsChildren.stree.txt
  84193. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsRazorCommentsAsChildren.stree.txt
  84194. @@ -1,27 +1,33 @@
  84195. -Markup block - Gen<None> - 26 - (0:0,0)
  84196. - Tag block - Gen<TagHelper> - 26 - (0:0,0) - p - PTagHelper
  84197. - StartTagAndEndTag - <p> ... </p>
  84198. - Tag block - Gen<None> - 3 - (3:0,3)
  84199. - Markup span - Gen<Markup> - [<b>] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:3
  84200. - SyntaxKind.OpenAngle;[<];
  84201. - SyntaxKind.Text;[b];
  84202. - SyntaxKind.CloseAngle;[>];
  84203. - SyntaxKind.HtmlTextLiteral - [asdf] - [6..10) - FullWidth: 4 - Slots: 1
  84204. - SyntaxKind.Text;[asdf];
  84205. - Tag block - Gen<None> - 4 - (10:0,10)
  84206. - Markup span - Gen<Markup> - [</b>] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:4
  84207. - SyntaxKind.OpenAngle;[<];
  84208. - SyntaxKind.ForwardSlash;[/];
  84209. - SyntaxKind.Text;[b];
  84210. - SyntaxKind.CloseAngle;[>];
  84211. - Comment block - Gen<RazorComment> - 8 - (14:0,14)
  84212. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (14:0,14) - Tokens:1
  84213. - SyntaxKind.RazorCommentTransition;[@];
  84214. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:1
  84215. - SyntaxKind.RazorCommentStar;[*];
  84216. - Comment span - Gen<None> - [asdf] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  84217. - SyntaxKind.RazorCommentLiteral;[asdf];
  84218. - MetaCode span - Gen<None> - [*] - SpanEditHandler;Accepts:None - (20:0,20) - Tokens:1
  84219. - SyntaxKind.RazorCommentStar;[*];
  84220. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:1
  84221. - SyntaxKind.RazorCommentTransition;[@];
  84222. +RazorDocument - [0..26)::26 - [<p><b>asdf</b>@*asdf*@</p>]
  84223. + MarkupBlock - [0..26)::26
  84224. + MarkupTagHelperElement - [0..26)::26 - p[StartTagAndEndTag] - PTagHelper
  84225. + MarkupTagHelperStartTag - [0..3)::3
  84226. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84227. + OpenAngle;[<];
  84228. + Text;[p];
  84229. + CloseAngle;[>];
  84230. + MarkupTagBlock - [3..6)::3 - [<b>]
  84231. + MarkupTextLiteral - [3..6)::3 - [<b>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84232. + OpenAngle;[<];
  84233. + Text;[b];
  84234. + CloseAngle;[>];
  84235. + MarkupTextLiteral - [6..10)::4 - [asdf] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84236. + Text;[asdf];
  84237. + MarkupTagBlock - [10..14)::4 - [</b>]
  84238. + MarkupTextLiteral - [10..14)::4 - [</b>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84239. + OpenAngle;[<];
  84240. + ForwardSlash;[/];
  84241. + Text;[b];
  84242. + CloseAngle;[>];
  84243. + RazorComment - [14..22)::8
  84244. + RazorCommentTransition;[@];
  84245. + RazorCommentStar;[*];
  84246. + RazorCommentLiteral;[asdf];
  84247. + RazorCommentStar;[*];
  84248. + RazorCommentTransition;[@];
  84249. + MarkupTagHelperEndTag - [22..26)::4
  84250. + MarkupTextLiteral - [22..26)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84251. + OpenAngle;[<];
  84252. + ForwardSlash;[/];
  84253. + Text;[p];
  84254. + CloseAngle;[>];
  84255. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsRazorMarkupInHtmlComment.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsRazorMarkupInHtmlComment.stree.txt
  84256. index b1006157b69..113f4d15348 100644
  84257. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsRazorMarkupInHtmlComment.stree.txt
  84258. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsRazorMarkupInHtmlComment.stree.txt
  84259. @@ -1,32 +1,46 @@
  84260. -Markup block - Gen<None> - 37 - (0:0,0)
  84261. - Tag block - Gen<TagHelper> - 37 - (0:0,0) - p - PTagHelper
  84262. - StartTagAndEndTag - <p> ... </p>
  84263. - Tag block - Gen<None> - 3 - (3:0,3)
  84264. - Markup span - Gen<Markup> - [<b>] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:3
  84265. - SyntaxKind.OpenAngle;[<];
  84266. - SyntaxKind.Text;[b];
  84267. - SyntaxKind.CloseAngle;[>];
  84268. - SyntaxKind.HtmlTextLiteral - [asdf] - [6..10) - FullWidth: 4 - Slots: 1
  84269. - SyntaxKind.Text;[asdf];
  84270. - Tag block - Gen<None> - 4 - (10:0,10)
  84271. - Markup span - Gen<Markup> - [</b>] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:4
  84272. - SyntaxKind.OpenAngle;[<];
  84273. - SyntaxKind.ForwardSlash;[/];
  84274. - SyntaxKind.Text;[b];
  84275. - SyntaxKind.CloseAngle;[>];
  84276. - HtmlComment block - Gen<None> - 19 - (14:0,14)
  84277. - Markup span - Gen<Markup> - [<!--] - SpanEditHandler;Accepts:None - (14:0,14) - Tokens:3
  84278. - SyntaxKind.OpenAngle;[<];
  84279. - SyntaxKind.Bang;[!];
  84280. - SyntaxKind.DoubleHyphen;[--];
  84281. - Markup span - Gen<Markup> - [Hello ] - SpanEditHandler;Accepts:Whitespace - (18:0,18) - Tokens:2
  84282. - SyntaxKind.Text;[Hello];
  84283. - SyntaxKind.Whitespace;[ ];
  84284. - Expression block - Gen<Expr> - 6 - (24:0,24)
  84285. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (24:0,24) - Tokens:1
  84286. - SyntaxKind.Transition;[@];
  84287. - Code span - Gen<Expr> - [World] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (25:0,25) - Tokens:1
  84288. - SyntaxKind.Identifier;[World];
  84289. - Markup span - Gen<Markup> - [-->] - SpanEditHandler;Accepts:None - (30:0,30) - Tokens:2
  84290. - SyntaxKind.DoubleHyphen;[--];
  84291. - SyntaxKind.CloseAngle;[>];
  84292. +RazorDocument - [0..37)::37 - [<p><b>asdf</b><!--Hello @World--></p>]
  84293. + MarkupBlock - [0..37)::37
  84294. + MarkupTagHelperElement - [0..37)::37 - p[StartTagAndEndTag] - PTagHelper
  84295. + MarkupTagHelperStartTag - [0..3)::3
  84296. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84297. + OpenAngle;[<];
  84298. + Text;[p];
  84299. + CloseAngle;[>];
  84300. + MarkupTagBlock - [3..6)::3 - [<b>]
  84301. + MarkupTextLiteral - [3..6)::3 - [<b>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84302. + OpenAngle;[<];
  84303. + Text;[b];
  84304. + CloseAngle;[>];
  84305. + MarkupTextLiteral - [6..10)::4 - [asdf] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84306. + Text;[asdf];
  84307. + MarkupTagBlock - [10..14)::4 - [</b>]
  84308. + MarkupTextLiteral - [10..14)::4 - [</b>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84309. + OpenAngle;[<];
  84310. + ForwardSlash;[/];
  84311. + Text;[b];
  84312. + CloseAngle;[>];
  84313. + MarkupCommentBlock - [14..33)::19
  84314. + MarkupTextLiteral - [14..18)::4 - [<!--] - Gen<Markup> - SpanEditHandler;Accepts:None
  84315. + OpenAngle;[<];
  84316. + Bang;[!];
  84317. + DoubleHyphen;[--];
  84318. + MarkupTextLiteral - [18..24)::6 - [Hello ] - Gen<Markup> - SpanEditHandler;Accepts:Whitespace
  84319. + Text;[Hello];
  84320. + Whitespace;[ ];
  84321. + CSharpCodeBlock - [24..30)::6
  84322. + CSharpImplicitExpression - [24..30)::6
  84323. + CSharpTransition - [24..25)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84324. + Transition;[@];
  84325. + CSharpImplicitExpressionBody - [25..30)::5
  84326. + CSharpCodeBlock - [25..30)::5
  84327. + CSharpExpressionLiteral - [25..30)::5 - [World] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  84328. + Identifier;[World];
  84329. + MarkupTextLiteral - [30..33)::3 - [-->] - Gen<Markup> - SpanEditHandler;Accepts:None
  84330. + DoubleHyphen;[--];
  84331. + CloseAngle;[>];
  84332. + MarkupTagHelperEndTag - [33..37)::4
  84333. + MarkupTextLiteral - [33..37)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84334. + OpenAngle;[<];
  84335. + ForwardSlash;[/];
  84336. + Text;[p];
  84337. + CloseAngle;[>];
  84338. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsSimpleHtmlCommentsAsChildren.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsSimpleHtmlCommentsAsChildren.stree.txt
  84339. index 41643cef901..b74bc809e29 100644
  84340. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsSimpleHtmlCommentsAsChildren.stree.txt
  84341. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsSimpleHtmlCommentsAsChildren.stree.txt
  84342. @@ -1,28 +1,39 @@
  84343. -Markup block - Gen<None> - 36 - (0:0,0)
  84344. - Tag block - Gen<TagHelper> - 36 - (0:0,0) - p - PTagHelper
  84345. - StartTagAndEndTag - <p> ... </p>
  84346. - Tag block - Gen<None> - 3 - (3:0,3)
  84347. - Markup span - Gen<Markup> - [<b>] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:3
  84348. - SyntaxKind.OpenAngle;[<];
  84349. - SyntaxKind.Text;[b];
  84350. - SyntaxKind.CloseAngle;[>];
  84351. - SyntaxKind.HtmlTextLiteral - [asdf] - [6..10) - FullWidth: 4 - Slots: 1
  84352. - SyntaxKind.Text;[asdf];
  84353. - Tag block - Gen<None> - 4 - (10:0,10)
  84354. - Markup span - Gen<Markup> - [</b>] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:4
  84355. - SyntaxKind.OpenAngle;[<];
  84356. - SyntaxKind.ForwardSlash;[/];
  84357. - SyntaxKind.Text;[b];
  84358. - SyntaxKind.CloseAngle;[>];
  84359. - HtmlComment block - Gen<None> - 18 - (14:0,14)
  84360. - Markup span - Gen<Markup> - [<!--] - SpanEditHandler;Accepts:None - (14:0,14) - Tokens:3
  84361. - SyntaxKind.OpenAngle;[<];
  84362. - SyntaxKind.Bang;[!];
  84363. - SyntaxKind.DoubleHyphen;[--];
  84364. - Markup span - Gen<Markup> - [Hello World] - SpanEditHandler;Accepts:Whitespace - (18:0,18) - Tokens:3
  84365. - SyntaxKind.Text;[Hello];
  84366. - SyntaxKind.Whitespace;[ ];
  84367. - SyntaxKind.Text;[World];
  84368. - Markup span - Gen<Markup> - [-->] - SpanEditHandler;Accepts:None - (29:0,29) - Tokens:2
  84369. - SyntaxKind.DoubleHyphen;[--];
  84370. - SyntaxKind.CloseAngle;[>];
  84371. +RazorDocument - [0..36)::36 - [<p><b>asdf</b><!--Hello World--></p>]
  84372. + MarkupBlock - [0..36)::36
  84373. + MarkupTagHelperElement - [0..36)::36 - p[StartTagAndEndTag] - PTagHelper
  84374. + MarkupTagHelperStartTag - [0..3)::3
  84375. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84376. + OpenAngle;[<];
  84377. + Text;[p];
  84378. + CloseAngle;[>];
  84379. + MarkupTagBlock - [3..6)::3 - [<b>]
  84380. + MarkupTextLiteral - [3..6)::3 - [<b>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84381. + OpenAngle;[<];
  84382. + Text;[b];
  84383. + CloseAngle;[>];
  84384. + MarkupTextLiteral - [6..10)::4 - [asdf] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84385. + Text;[asdf];
  84386. + MarkupTagBlock - [10..14)::4 - [</b>]
  84387. + MarkupTextLiteral - [10..14)::4 - [</b>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84388. + OpenAngle;[<];
  84389. + ForwardSlash;[/];
  84390. + Text;[b];
  84391. + CloseAngle;[>];
  84392. + MarkupCommentBlock - [14..32)::18
  84393. + MarkupTextLiteral - [14..18)::4 - [<!--] - Gen<Markup> - SpanEditHandler;Accepts:None
  84394. + OpenAngle;[<];
  84395. + Bang;[!];
  84396. + DoubleHyphen;[--];
  84397. + MarkupTextLiteral - [18..29)::11 - [Hello World] - Gen<Markup> - SpanEditHandler;Accepts:Whitespace
  84398. + Text;[Hello];
  84399. + Whitespace;[ ];
  84400. + Text;[World];
  84401. + MarkupTextLiteral - [29..32)::3 - [-->] - Gen<Markup> - SpanEditHandler;Accepts:None
  84402. + DoubleHyphen;[--];
  84403. + CloseAngle;[>];
  84404. + MarkupTagHelperEndTag - [32..36)::4
  84405. + MarkupTextLiteral - [32..36)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84406. + OpenAngle;[<];
  84407. + ForwardSlash;[/];
  84408. + Text;[p];
  84409. + CloseAngle;[>];
  84410. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithAttrTextTag1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithAttrTextTag1.stree.txt
  84411. index 7e162564249..1820cae1f69 100644
  84412. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithAttrTextTag1.stree.txt
  84413. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithAttrTextTag1.stree.txt
  84414. @@ -1,30 +1,40 @@
  84415. -Markup block - Gen<None> - 22 - (0:0,0)
  84416. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  84417. - SyntaxKind.Unknown;[];
  84418. - Statement block - Gen<None> - 22 - (0:0,0)
  84419. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  84420. - SyntaxKind.Transition;[@];
  84421. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  84422. - SyntaxKind.LeftBrace;[{];
  84423. - Markup block - Gen<None> - 20 - (2:0,2)
  84424. - Tag block - Gen<None> - 19 - (2:0,2)
  84425. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  84426. - SyntaxKind.OpenAngle;[<];
  84427. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  84428. - SyntaxKind.Bang;[!];
  84429. - Markup span - Gen<Markup> - [text] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  84430. - SyntaxKind.Text;[text];
  84431. - Markup block - Gen<Attr:class, class="@(8:0,8),"@(19:0,19)> - 12 - (8:0,8)
  84432. - Markup span - Gen<None> - [ class="] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:4
  84433. - SyntaxKind.Whitespace;[ ];
  84434. - SyntaxKind.Text;[class];
  84435. - SyntaxKind.Equals;[=];
  84436. - SyntaxKind.DoubleQuote;["];
  84437. - Markup span - Gen<LitAttr:@(16:0,16)> - [btn] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  84438. - SyntaxKind.Text;[btn];
  84439. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:1
  84440. - SyntaxKind.DoubleQuote;["];
  84441. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:None - (20:0,20) - Tokens:1
  84442. - SyntaxKind.CloseAngle;[>];
  84443. - Markup span - Gen<Markup> - [}] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:1
  84444. - SyntaxKind.Text;[}];
  84445. +RazorDocument - [0..22)::22 - [@{<!text class="btn">}]
  84446. + MarkupBlock - [0..22)::22
  84447. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84448. + Marker;[];
  84449. + CSharpCodeBlock - [0..22)::22
  84450. + CSharpStatement - [0..22)::22
  84451. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84452. + Transition;[@];
  84453. + CSharpStatementBody - [1..22)::21
  84454. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84455. + LeftBrace;[{];
  84456. + CSharpCodeBlock - [2..22)::20
  84457. + MarkupBlock - [2..22)::20
  84458. + MarkupTagBlock - [2..21)::19 - [<!text class="btn">]
  84459. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84460. + OpenAngle;[<];
  84461. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84462. + Bang;[!];
  84463. + MarkupTextLiteral - [4..8)::4 - [text] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84464. + Text;[text];
  84465. + MarkupAttributeBlock - [8..20)::12 - [ class="btn"]
  84466. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84467. + Whitespace;[ ];
  84468. + MarkupTextLiteral - [9..14)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84469. + Text;[class];
  84470. + Equals;[=];
  84471. + MarkupTextLiteral - [15..16)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  84472. + DoubleQuote;["];
  84473. + GenericBlock - [16..19)::3
  84474. + MarkupLiteralAttributeValue - [16..19)::3 - [btn]
  84475. + MarkupTextLiteral - [16..19)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84476. + Text;[btn];
  84477. + MarkupTextLiteral - [19..20)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  84478. + DoubleQuote;["];
  84479. + MarkupTextLiteral - [20..21)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  84480. + CloseAngle;[>];
  84481. + MarkupTextLiteral - [21..22)::1 - [}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84482. + Text;[}];
  84483. + RazorMetaCode - [22..22)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  84484. + RightBrace;[<Missing>];
  84485. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithAttrTextTag2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithAttrTextTag2.stree.txt
  84486. index 67597040c20..cbdf9ea7243 100644
  84487. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithAttrTextTag2.stree.txt
  84488. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithAttrTextTag2.stree.txt
  84489. @@ -1,43 +1,51 @@
  84490. -Markup block - Gen<None> - 30 - (0:0,0)
  84491. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  84492. - SyntaxKind.Unknown;[];
  84493. - Statement block - Gen<None> - 30 - (0:0,0)
  84494. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  84495. - SyntaxKind.Transition;[@];
  84496. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  84497. - SyntaxKind.LeftBrace;[{];
  84498. - Markup block - Gen<None> - 27 - (2:0,2)
  84499. - Tag block - Gen<None> - 19 - (2:0,2)
  84500. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  84501. - SyntaxKind.OpenAngle;[<];
  84502. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  84503. - SyntaxKind.Bang;[!];
  84504. - Markup span - Gen<Markup> - [text] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  84505. - SyntaxKind.Text;[text];
  84506. - Markup block - Gen<Attr:class, class="@(8:0,8),"@(19:0,19)> - 12 - (8:0,8)
  84507. - Markup span - Gen<None> - [ class="] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:4
  84508. - SyntaxKind.Whitespace;[ ];
  84509. - SyntaxKind.Text;[class];
  84510. - SyntaxKind.Equals;[=];
  84511. - SyntaxKind.DoubleQuote;["];
  84512. - Markup span - Gen<LitAttr:@(16:0,16)> - [btn] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  84513. - SyntaxKind.Text;[btn];
  84514. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:1
  84515. - SyntaxKind.DoubleQuote;["];
  84516. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:None - (20:0,20) - Tokens:1
  84517. - SyntaxKind.CloseAngle;[>];
  84518. - Tag block - Gen<None> - 8 - (21:0,21)
  84519. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:2
  84520. - SyntaxKind.OpenAngle;[<];
  84521. - SyntaxKind.ForwardSlash;[/];
  84522. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (23:0,23) - Tokens:1
  84523. - SyntaxKind.Bang;[!];
  84524. - Markup span - Gen<Markup> - [text>] - SpanEditHandler;Accepts:None - (24:0,24) - Tokens:2
  84525. - SyntaxKind.Text;[text];
  84526. - SyntaxKind.CloseAngle;[>];
  84527. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (29:0,29) - Tokens:1
  84528. - SyntaxKind.Unknown;[];
  84529. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (29:0,29) - Tokens:1
  84530. - SyntaxKind.RightBrace;[}];
  84531. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (30:0,30) - Tokens:1
  84532. - SyntaxKind.Unknown;[];
  84533. +RazorDocument - [0..30)::30 - [@{<!text class="btn"></!text>}]
  84534. + MarkupBlock - [0..30)::30
  84535. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84536. + Marker;[];
  84537. + CSharpCodeBlock - [0..30)::30
  84538. + CSharpStatement - [0..30)::30
  84539. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84540. + Transition;[@];
  84541. + CSharpStatementBody - [1..30)::29
  84542. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84543. + LeftBrace;[{];
  84544. + CSharpCodeBlock - [2..29)::27
  84545. + MarkupBlock - [2..29)::27
  84546. + MarkupTagBlock - [2..21)::19 - [<!text class="btn">]
  84547. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84548. + OpenAngle;[<];
  84549. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84550. + Bang;[!];
  84551. + MarkupTextLiteral - [4..8)::4 - [text] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84552. + Text;[text];
  84553. + MarkupAttributeBlock - [8..20)::12 - [ class="btn"]
  84554. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84555. + Whitespace;[ ];
  84556. + MarkupTextLiteral - [9..14)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84557. + Text;[class];
  84558. + Equals;[=];
  84559. + MarkupTextLiteral - [15..16)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  84560. + DoubleQuote;["];
  84561. + GenericBlock - [16..19)::3
  84562. + MarkupLiteralAttributeValue - [16..19)::3 - [btn]
  84563. + MarkupTextLiteral - [16..19)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84564. + Text;[btn];
  84565. + MarkupTextLiteral - [19..20)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  84566. + DoubleQuote;["];
  84567. + MarkupTextLiteral - [20..21)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  84568. + CloseAngle;[>];
  84569. + MarkupTagBlock - [21..29)::8 - [</!text>]
  84570. + MarkupTextLiteral - [21..23)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84571. + OpenAngle;[<];
  84572. + ForwardSlash;[/];
  84573. + RazorMetaCode - [23..24)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84574. + Bang;[!];
  84575. + MarkupTextLiteral - [24..29)::5 - [text>] - Gen<Markup> - SpanEditHandler;Accepts:None
  84576. + Text;[text];
  84577. + CloseAngle;[>];
  84578. + CSharpStatementLiteral - [29..29)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  84579. + Marker;[];
  84580. + RazorMetaCode - [29..30)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84581. + RightBrace;[}];
  84582. + MarkupTextLiteral - [30..30)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84583. + Marker;[];
  84584. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithAttrTextTag3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithAttrTextTag3.stree.txt
  84585. index 6468ec90239..9ccfbc30833 100644
  84586. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithAttrTextTag3.stree.txt
  84587. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithAttrTextTag3.stree.txt
  84588. @@ -1,49 +1,57 @@
  84589. -Markup block - Gen<None> - 47 - (0:0,0)
  84590. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  84591. - SyntaxKind.Unknown;[];
  84592. - Statement block - Gen<None> - 47 - (0:0,0)
  84593. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  84594. - SyntaxKind.Transition;[@];
  84595. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  84596. - SyntaxKind.LeftBrace;[{];
  84597. - Markup block - Gen<None> - 44 - (2:0,2)
  84598. - Tag block - Gen<None> - 19 - (2:0,2)
  84599. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  84600. - SyntaxKind.OpenAngle;[<];
  84601. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  84602. - SyntaxKind.Bang;[!];
  84603. - Markup span - Gen<Markup> - [text] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  84604. - SyntaxKind.Text;[text];
  84605. - Markup block - Gen<Attr:class, class="@(8:0,8),"@(19:0,19)> - 12 - (8:0,8)
  84606. - Markup span - Gen<None> - [ class="] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:4
  84607. - SyntaxKind.Whitespace;[ ];
  84608. - SyntaxKind.Text;[class];
  84609. - SyntaxKind.Equals;[=];
  84610. - SyntaxKind.DoubleQuote;["];
  84611. - Markup span - Gen<LitAttr:@(16:0,16)> - [btn] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  84612. - SyntaxKind.Text;[btn];
  84613. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:1
  84614. - SyntaxKind.DoubleQuote;["];
  84615. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:None - (20:0,20) - Tokens:1
  84616. - SyntaxKind.CloseAngle;[>];
  84617. - Markup span - Gen<Markup> - [words with spaces] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:5
  84618. - SyntaxKind.Text;[words];
  84619. - SyntaxKind.Whitespace;[ ];
  84620. - SyntaxKind.Text;[with];
  84621. - SyntaxKind.Whitespace;[ ];
  84622. - SyntaxKind.Text;[spaces];
  84623. - Tag block - Gen<None> - 8 - (38:0,38)
  84624. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (38:0,38) - Tokens:2
  84625. - SyntaxKind.OpenAngle;[<];
  84626. - SyntaxKind.ForwardSlash;[/];
  84627. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (40:0,40) - Tokens:1
  84628. - SyntaxKind.Bang;[!];
  84629. - Markup span - Gen<Markup> - [text>] - SpanEditHandler;Accepts:None - (41:0,41) - Tokens:2
  84630. - SyntaxKind.Text;[text];
  84631. - SyntaxKind.CloseAngle;[>];
  84632. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (46:0,46) - Tokens:1
  84633. - SyntaxKind.Unknown;[];
  84634. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (46:0,46) - Tokens:1
  84635. - SyntaxKind.RightBrace;[}];
  84636. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (47:0,47) - Tokens:1
  84637. - SyntaxKind.Unknown;[];
  84638. +RazorDocument - [0..47)::47 - [@{<!text class="btn">words with spaces</!text>}]
  84639. + MarkupBlock - [0..47)::47
  84640. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84641. + Marker;[];
  84642. + CSharpCodeBlock - [0..47)::47
  84643. + CSharpStatement - [0..47)::47
  84644. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84645. + Transition;[@];
  84646. + CSharpStatementBody - [1..47)::46
  84647. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84648. + LeftBrace;[{];
  84649. + CSharpCodeBlock - [2..46)::44
  84650. + MarkupBlock - [2..46)::44
  84651. + MarkupTagBlock - [2..21)::19 - [<!text class="btn">]
  84652. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84653. + OpenAngle;[<];
  84654. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84655. + Bang;[!];
  84656. + MarkupTextLiteral - [4..8)::4 - [text] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84657. + Text;[text];
  84658. + MarkupAttributeBlock - [8..20)::12 - [ class="btn"]
  84659. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84660. + Whitespace;[ ];
  84661. + MarkupTextLiteral - [9..14)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84662. + Text;[class];
  84663. + Equals;[=];
  84664. + MarkupTextLiteral - [15..16)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  84665. + DoubleQuote;["];
  84666. + GenericBlock - [16..19)::3
  84667. + MarkupLiteralAttributeValue - [16..19)::3 - [btn]
  84668. + MarkupTextLiteral - [16..19)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84669. + Text;[btn];
  84670. + MarkupTextLiteral - [19..20)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  84671. + DoubleQuote;["];
  84672. + MarkupTextLiteral - [20..21)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  84673. + CloseAngle;[>];
  84674. + MarkupTextLiteral - [21..38)::17 - [words with spaces] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84675. + Text;[words];
  84676. + Whitespace;[ ];
  84677. + Text;[with];
  84678. + Whitespace;[ ];
  84679. + Text;[spaces];
  84680. + MarkupTagBlock - [38..46)::8 - [</!text>]
  84681. + MarkupTextLiteral - [38..40)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84682. + OpenAngle;[<];
  84683. + ForwardSlash;[/];
  84684. + RazorMetaCode - [40..41)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84685. + Bang;[!];
  84686. + MarkupTextLiteral - [41..46)::5 - [text>] - Gen<Markup> - SpanEditHandler;Accepts:None
  84687. + Text;[text];
  84688. + CloseAngle;[>];
  84689. + CSharpStatementLiteral - [46..46)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  84690. + Marker;[];
  84691. + RazorMetaCode - [46..47)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84692. + RightBrace;[}];
  84693. + MarkupTextLiteral - [47..47)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84694. + Marker;[];
  84695. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithAttrTextTag4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithAttrTextTag4.stree.txt
  84696. index 7f34c4efde9..fd66721f5ce 100644
  84697. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithAttrTextTag4.stree.txt
  84698. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithAttrTextTag4.stree.txt
  84699. @@ -1,53 +1,66 @@
  84700. -Markup block - Gen<None> - 47 - (0:0,0)
  84701. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  84702. - SyntaxKind.Unknown;[];
  84703. - Statement block - Gen<None> - 47 - (0:0,0)
  84704. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  84705. - SyntaxKind.Transition;[@];
  84706. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  84707. - SyntaxKind.LeftBrace;[{];
  84708. - Markup block - Gen<None> - 44 - (2:0,2)
  84709. - Tag block - Gen<None> - 36 - (2:0,2)
  84710. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  84711. - SyntaxKind.OpenAngle;[<];
  84712. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  84713. - SyntaxKind.Bang;[!];
  84714. - Markup span - Gen<Markup> - [text] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  84715. - SyntaxKind.Text;[text];
  84716. - Markup block - Gen<Attr:class, class='@(8:0,8),'@(25:0,25)> - 18 - (8:0,8)
  84717. - Markup span - Gen<None> - [ class='] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:4
  84718. - SyntaxKind.Whitespace;[ ];
  84719. - SyntaxKind.Text;[class];
  84720. - SyntaxKind.Equals;[=];
  84721. - SyntaxKind.SingleQuote;['];
  84722. - Markup span - Gen<LitAttr:@(16:0,16)> - [btn1] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  84723. - SyntaxKind.Text;[btn1];
  84724. - Markup span - Gen<LitAttr: @(20:0,20)> - [ btn2] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:2
  84725. - SyntaxKind.Whitespace;[ ];
  84726. - SyntaxKind.Text;[btn2];
  84727. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:1
  84728. - SyntaxKind.SingleQuote;['];
  84729. - Markup block - Gen<Attr:class2, class2=@(26:0,26),@(37:0,37)> - 11 - (26:0,26)
  84730. - Markup span - Gen<None> - [ class2=] - SpanEditHandler;Accepts:Any - (26:0,26) - Tokens:3
  84731. - SyntaxKind.Whitespace;[ ];
  84732. - SyntaxKind.Text;[class2];
  84733. - SyntaxKind.Equals;[=];
  84734. - Markup span - Gen<LitAttr:@(34:0,34)> - [btn] - SpanEditHandler;Accepts:Any - (34:0,34) - Tokens:1
  84735. - SyntaxKind.Text;[btn];
  84736. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:None - (37:0,37) - Tokens:1
  84737. - SyntaxKind.CloseAngle;[>];
  84738. - Tag block - Gen<None> - 8 - (38:0,38)
  84739. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (38:0,38) - Tokens:2
  84740. - SyntaxKind.OpenAngle;[<];
  84741. - SyntaxKind.ForwardSlash;[/];
  84742. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (40:0,40) - Tokens:1
  84743. - SyntaxKind.Bang;[!];
  84744. - Markup span - Gen<Markup> - [text>] - SpanEditHandler;Accepts:None - (41:0,41) - Tokens:2
  84745. - SyntaxKind.Text;[text];
  84746. - SyntaxKind.CloseAngle;[>];
  84747. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (46:0,46) - Tokens:1
  84748. - SyntaxKind.Unknown;[];
  84749. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (46:0,46) - Tokens:1
  84750. - SyntaxKind.RightBrace;[}];
  84751. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (47:0,47) - Tokens:1
  84752. - SyntaxKind.Unknown;[];
  84753. +RazorDocument - [0..47)::47 - [@{<!text class='btn1 btn2' class2=btn></!text>}]
  84754. + MarkupBlock - [0..47)::47
  84755. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84756. + Marker;[];
  84757. + CSharpCodeBlock - [0..47)::47
  84758. + CSharpStatement - [0..47)::47
  84759. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84760. + Transition;[@];
  84761. + CSharpStatementBody - [1..47)::46
  84762. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84763. + LeftBrace;[{];
  84764. + CSharpCodeBlock - [2..46)::44
  84765. + MarkupBlock - [2..46)::44
  84766. + MarkupTagBlock - [2..38)::36 - [<!text class='btn1 btn2' class2=btn>]
  84767. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84768. + OpenAngle;[<];
  84769. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84770. + Bang;[!];
  84771. + MarkupTextLiteral - [4..8)::4 - [text] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84772. + Text;[text];
  84773. + MarkupAttributeBlock - [8..26)::18 - [ class='btn1 btn2']
  84774. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84775. + Whitespace;[ ];
  84776. + MarkupTextLiteral - [9..14)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84777. + Text;[class];
  84778. + Equals;[=];
  84779. + MarkupTextLiteral - [15..16)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  84780. + SingleQuote;['];
  84781. + GenericBlock - [16..25)::9
  84782. + MarkupLiteralAttributeValue - [16..20)::4 - [btn1]
  84783. + MarkupTextLiteral - [16..20)::4 - [btn1] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84784. + Text;[btn1];
  84785. + MarkupLiteralAttributeValue - [20..25)::5 - [ btn2]
  84786. + MarkupTextLiteral - [20..21)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84787. + Whitespace;[ ];
  84788. + MarkupTextLiteral - [21..25)::4 - [btn2] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84789. + Text;[btn2];
  84790. + MarkupTextLiteral - [25..26)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  84791. + SingleQuote;['];
  84792. + MarkupAttributeBlock - [26..37)::11 - [ class2=btn]
  84793. + MarkupTextLiteral - [26..27)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84794. + Whitespace;[ ];
  84795. + MarkupTextLiteral - [27..33)::6 - [class2] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84796. + Text;[class2];
  84797. + Equals;[=];
  84798. + GenericBlock - [34..37)::3
  84799. + MarkupLiteralAttributeValue - [34..37)::3 - [btn]
  84800. + MarkupTextLiteral - [34..37)::3 - [btn] - Gen<None> - SpanEditHandler;Accepts:Any
  84801. + Text;[btn];
  84802. + MarkupTextLiteral - [37..38)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  84803. + CloseAngle;[>];
  84804. + MarkupTagBlock - [38..46)::8 - [</!text>]
  84805. + MarkupTextLiteral - [38..40)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84806. + OpenAngle;[<];
  84807. + ForwardSlash;[/];
  84808. + RazorMetaCode - [40..41)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84809. + Bang;[!];
  84810. + MarkupTextLiteral - [41..46)::5 - [text>] - Gen<Markup> - SpanEditHandler;Accepts:None
  84811. + Text;[text];
  84812. + CloseAngle;[>];
  84813. + CSharpStatementLiteral - [46..46)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  84814. + Marker;[];
  84815. + RazorMetaCode - [46..47)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84816. + RightBrace;[}];
  84817. + MarkupTextLiteral - [47..47)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84818. + Marker;[];
  84819. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithAttrTextTag5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithAttrTextTag5.stree.txt
  84820. index 35071254aee..ae63cba1bc7 100644
  84821. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithAttrTextTag5.stree.txt
  84822. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithAttrTextTag5.stree.txt
  84823. @@ -1,56 +1,70 @@
  84824. -Markup block - Gen<None> - 50 - (0:0,0)
  84825. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  84826. - SyntaxKind.Unknown;[];
  84827. - Statement block - Gen<None> - 50 - (0:0,0)
  84828. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  84829. - SyntaxKind.Transition;[@];
  84830. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  84831. - SyntaxKind.LeftBrace;[{];
  84832. - Markup block - Gen<None> - 47 - (2:0,2)
  84833. - Tag block - Gen<None> - 39 - (2:0,2)
  84834. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  84835. - SyntaxKind.OpenAngle;[<];
  84836. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  84837. - SyntaxKind.Bang;[!];
  84838. - Markup span - Gen<Markup> - [text] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  84839. - SyntaxKind.Text;[text];
  84840. - Markup block - Gen<Attr:class, class='@(8:0,8),'@(39:0,39)> - 32 - (8:0,8)
  84841. - Markup span - Gen<None> - [ class='] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:4
  84842. - SyntaxKind.Whitespace;[ ];
  84843. - SyntaxKind.Text;[class];
  84844. - SyntaxKind.Equals;[=];
  84845. - SyntaxKind.SingleQuote;['];
  84846. - Markup span - Gen<LitAttr:@(16:0,16)> - [btn1] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  84847. - SyntaxKind.Text;[btn1];
  84848. - Markup block - Gen<DynAttr: @(20:0,20)> - 14 - (20:0,20)
  84849. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:1
  84850. - SyntaxKind.Whitespace;[ ];
  84851. - Expression block - Gen<Expr> - 13 - (21:0,21)
  84852. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:1
  84853. - SyntaxKind.Transition;[@];
  84854. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (22:0,22) - Tokens:3
  84855. - SyntaxKind.Identifier;[DateTime];
  84856. - SyntaxKind.Dot;[.];
  84857. - SyntaxKind.Identifier;[Now];
  84858. - Markup span - Gen<LitAttr: @(34:0,34)> - [ btn2] - SpanEditHandler;Accepts:Any - (34:0,34) - Tokens:2
  84859. - SyntaxKind.Whitespace;[ ];
  84860. - SyntaxKind.Text;[btn2];
  84861. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (39:0,39) - Tokens:1
  84862. - SyntaxKind.SingleQuote;['];
  84863. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:None - (40:0,40) - Tokens:1
  84864. - SyntaxKind.CloseAngle;[>];
  84865. - Tag block - Gen<None> - 8 - (41:0,41)
  84866. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (41:0,41) - Tokens:2
  84867. - SyntaxKind.OpenAngle;[<];
  84868. - SyntaxKind.ForwardSlash;[/];
  84869. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (43:0,43) - Tokens:1
  84870. - SyntaxKind.Bang;[!];
  84871. - Markup span - Gen<Markup> - [text>] - SpanEditHandler;Accepts:None - (44:0,44) - Tokens:2
  84872. - SyntaxKind.Text;[text];
  84873. - SyntaxKind.CloseAngle;[>];
  84874. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (49:0,49) - Tokens:1
  84875. - SyntaxKind.Unknown;[];
  84876. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (49:0,49) - Tokens:1
  84877. - SyntaxKind.RightBrace;[}];
  84878. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (50:0,50) - Tokens:1
  84879. - SyntaxKind.Unknown;[];
  84880. +RazorDocument - [0..50)::50 - [@{<!text class='btn1 @DateTime.Now btn2'></!text>}]
  84881. + MarkupBlock - [0..50)::50
  84882. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84883. + Marker;[];
  84884. + CSharpCodeBlock - [0..50)::50
  84885. + CSharpStatement - [0..50)::50
  84886. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84887. + Transition;[@];
  84888. + CSharpStatementBody - [1..50)::49
  84889. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84890. + LeftBrace;[{];
  84891. + CSharpCodeBlock - [2..49)::47
  84892. + MarkupBlock - [2..49)::47
  84893. + MarkupTagBlock - [2..41)::39 - [<!text class='btn1 @DateTime.Now btn2'>]
  84894. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84895. + OpenAngle;[<];
  84896. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84897. + Bang;[!];
  84898. + MarkupTextLiteral - [4..8)::4 - [text] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84899. + Text;[text];
  84900. + MarkupAttributeBlock - [8..40)::32 - [ class='btn1 @DateTime.Now btn2']
  84901. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84902. + Whitespace;[ ];
  84903. + MarkupTextLiteral - [9..14)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84904. + Text;[class];
  84905. + Equals;[=];
  84906. + MarkupTextLiteral - [15..16)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  84907. + SingleQuote;['];
  84908. + GenericBlock - [16..39)::23
  84909. + MarkupLiteralAttributeValue - [16..20)::4 - [btn1]
  84910. + MarkupTextLiteral - [16..20)::4 - [btn1] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84911. + Text;[btn1];
  84912. + MarkupDynamicAttributeValue - [20..34)::14 - [ @DateTime.Now]
  84913. + MarkupTextLiteral - [20..21)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84914. + Whitespace;[ ];
  84915. + GenericBlock - [21..34)::13
  84916. + CSharpCodeBlock - [21..34)::13
  84917. + CSharpImplicitExpression - [21..34)::13
  84918. + CSharpTransition - [21..22)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84919. + Transition;[@];
  84920. + CSharpImplicitExpressionBody - [22..34)::12
  84921. + CSharpCodeBlock - [22..34)::12
  84922. + CSharpExpressionLiteral - [22..34)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  84923. + Identifier;[DateTime];
  84924. + Dot;[.];
  84925. + Identifier;[Now];
  84926. + MarkupLiteralAttributeValue - [34..39)::5 - [ btn2]
  84927. + MarkupTextLiteral - [34..35)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84928. + Whitespace;[ ];
  84929. + MarkupTextLiteral - [35..39)::4 - [btn2] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84930. + Text;[btn2];
  84931. + MarkupTextLiteral - [39..40)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  84932. + SingleQuote;['];
  84933. + MarkupTextLiteral - [40..41)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  84934. + CloseAngle;[>];
  84935. + MarkupTagBlock - [41..49)::8 - [</!text>]
  84936. + MarkupTextLiteral - [41..43)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84937. + OpenAngle;[<];
  84938. + ForwardSlash;[/];
  84939. + RazorMetaCode - [43..44)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84940. + Bang;[!];
  84941. + MarkupTextLiteral - [44..49)::5 - [text>] - Gen<Markup> - SpanEditHandler;Accepts:None
  84942. + Text;[text];
  84943. + CloseAngle;[>];
  84944. + CSharpStatementLiteral - [49..49)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  84945. + Marker;[];
  84946. + RazorMetaCode - [49..50)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84947. + RightBrace;[}];
  84948. + MarkupTextLiteral - [50..50)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84949. + Marker;[];
  84950. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag1.stree.txt
  84951. index 2e66d58a5df..e0dba1948ef 100644
  84952. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag1.stree.txt
  84953. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag1.stree.txt
  84954. @@ -1,19 +1,25 @@
  84955. -Markup block - Gen<None> - 10 - (0:0,0)
  84956. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  84957. - SyntaxKind.Unknown;[];
  84958. - Statement block - Gen<None> - 10 - (0:0,0)
  84959. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  84960. - SyntaxKind.Transition;[@];
  84961. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  84962. - SyntaxKind.LeftBrace;[{];
  84963. - Markup block - Gen<None> - 8 - (2:0,2)
  84964. - Tag block - Gen<None> - 7 - (2:0,2)
  84965. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  84966. - SyntaxKind.OpenAngle;[<];
  84967. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  84968. - SyntaxKind.Bang;[!];
  84969. - Markup span - Gen<Markup> - [text>] - SpanEditHandler;Accepts:None - (4:0,4) - Tokens:2
  84970. - SyntaxKind.Text;[text];
  84971. - SyntaxKind.CloseAngle;[>];
  84972. - Markup span - Gen<Markup> - [}] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:1
  84973. - SyntaxKind.Text;[}];
  84974. +RazorDocument - [0..10)::10 - [@{<!text>}]
  84975. + MarkupBlock - [0..10)::10
  84976. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84977. + Marker;[];
  84978. + CSharpCodeBlock - [0..10)::10
  84979. + CSharpStatement - [0..10)::10
  84980. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84981. + Transition;[@];
  84982. + CSharpStatementBody - [1..10)::9
  84983. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84984. + LeftBrace;[{];
  84985. + CSharpCodeBlock - [2..10)::8
  84986. + MarkupBlock - [2..10)::8
  84987. + MarkupTagBlock - [2..9)::7 - [<!text>]
  84988. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84989. + OpenAngle;[<];
  84990. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  84991. + Bang;[!];
  84992. + MarkupTextLiteral - [4..9)::5 - [text>] - Gen<Markup> - SpanEditHandler;Accepts:None
  84993. + Text;[text];
  84994. + CloseAngle;[>];
  84995. + MarkupTextLiteral - [9..10)::1 - [}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  84996. + Text;[}];
  84997. + RazorMetaCode - [10..10)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  84998. + RightBrace;[<Missing>];
  84999. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag2.stree.txt
  85000. index 29bbed7567d..a77624de57e 100644
  85001. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag2.stree.txt
  85002. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag2.stree.txt
  85003. @@ -1,24 +1,28 @@
  85004. -Markup block - Gen<None> - 11 - (0:0,0)
  85005. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  85006. - SyntaxKind.Unknown;[];
  85007. - Statement block - Gen<None> - 11 - (0:0,0)
  85008. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  85009. - SyntaxKind.Transition;[@];
  85010. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  85011. - SyntaxKind.LeftBrace;[{];
  85012. - Markup block - Gen<None> - 8 - (2:0,2)
  85013. - Tag block - Gen<None> - 8 - (2:0,2)
  85014. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:2
  85015. - SyntaxKind.OpenAngle;[<];
  85016. - SyntaxKind.ForwardSlash;[/];
  85017. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (4:0,4) - Tokens:1
  85018. - SyntaxKind.Bang;[!];
  85019. - Markup span - Gen<Markup> - [text>] - SpanEditHandler;Accepts:None - (5:0,5) - Tokens:2
  85020. - SyntaxKind.Text;[text];
  85021. - SyntaxKind.CloseAngle;[>];
  85022. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  85023. - SyntaxKind.Unknown;[];
  85024. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  85025. - SyntaxKind.RightBrace;[}];
  85026. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:1
  85027. - SyntaxKind.Unknown;[];
  85028. +RazorDocument - [0..11)::11 - [@{</!text>}]
  85029. + MarkupBlock - [0..11)::11
  85030. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85031. + Marker;[];
  85032. + CSharpCodeBlock - [0..11)::11
  85033. + CSharpStatement - [0..11)::11
  85034. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85035. + Transition;[@];
  85036. + CSharpStatementBody - [1..11)::10
  85037. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85038. + LeftBrace;[{];
  85039. + CSharpCodeBlock - [2..10)::8
  85040. + MarkupBlock - [2..10)::8
  85041. + MarkupTagBlock - [2..10)::8 - [</!text>]
  85042. + MarkupTextLiteral - [2..4)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85043. + OpenAngle;[<];
  85044. + ForwardSlash;[/];
  85045. + RazorMetaCode - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85046. + Bang;[!];
  85047. + MarkupTextLiteral - [5..10)::5 - [text>] - Gen<Markup> - SpanEditHandler;Accepts:None
  85048. + Text;[text];
  85049. + CloseAngle;[>];
  85050. + CSharpStatementLiteral - [10..10)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  85051. + Marker;[];
  85052. + RazorMetaCode - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85053. + RightBrace;[}];
  85054. + MarkupTextLiteral - [11..11)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85055. + Marker;[];
  85056. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag3.stree.txt
  85057. index 071019f0311..dd4a2f53e83 100644
  85058. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag3.stree.txt
  85059. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag3.stree.txt
  85060. @@ -1,32 +1,36 @@
  85061. -Markup block - Gen<None> - 18 - (0:0,0)
  85062. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  85063. - SyntaxKind.Unknown;[];
  85064. - Statement block - Gen<None> - 18 - (0:0,0)
  85065. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  85066. - SyntaxKind.Transition;[@];
  85067. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  85068. - SyntaxKind.LeftBrace;[{];
  85069. - Markup block - Gen<None> - 15 - (2:0,2)
  85070. - Tag block - Gen<None> - 7 - (2:0,2)
  85071. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  85072. - SyntaxKind.OpenAngle;[<];
  85073. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  85074. - SyntaxKind.Bang;[!];
  85075. - Markup span - Gen<Markup> - [text>] - SpanEditHandler;Accepts:None - (4:0,4) - Tokens:2
  85076. - SyntaxKind.Text;[text];
  85077. - SyntaxKind.CloseAngle;[>];
  85078. - Tag block - Gen<None> - 8 - (9:0,9)
  85079. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:2
  85080. - SyntaxKind.OpenAngle;[<];
  85081. - SyntaxKind.ForwardSlash;[/];
  85082. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (11:0,11) - Tokens:1
  85083. - SyntaxKind.Bang;[!];
  85084. - Markup span - Gen<Markup> - [text>] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:2
  85085. - SyntaxKind.Text;[text];
  85086. - SyntaxKind.CloseAngle;[>];
  85087. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:1
  85088. - SyntaxKind.Unknown;[];
  85089. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (17:0,17) - Tokens:1
  85090. - SyntaxKind.RightBrace;[}];
  85091. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:1
  85092. - SyntaxKind.Unknown;[];
  85093. +RazorDocument - [0..18)::18 - [@{<!text></!text>}]
  85094. + MarkupBlock - [0..18)::18
  85095. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85096. + Marker;[];
  85097. + CSharpCodeBlock - [0..18)::18
  85098. + CSharpStatement - [0..18)::18
  85099. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85100. + Transition;[@];
  85101. + CSharpStatementBody - [1..18)::17
  85102. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85103. + LeftBrace;[{];
  85104. + CSharpCodeBlock - [2..17)::15
  85105. + MarkupBlock - [2..17)::15
  85106. + MarkupTagBlock - [2..9)::7 - [<!text>]
  85107. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85108. + OpenAngle;[<];
  85109. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85110. + Bang;[!];
  85111. + MarkupTextLiteral - [4..9)::5 - [text>] - Gen<Markup> - SpanEditHandler;Accepts:None
  85112. + Text;[text];
  85113. + CloseAngle;[>];
  85114. + MarkupTagBlock - [9..17)::8 - [</!text>]
  85115. + MarkupTextLiteral - [9..11)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85116. + OpenAngle;[<];
  85117. + ForwardSlash;[/];
  85118. + RazorMetaCode - [11..12)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85119. + Bang;[!];
  85120. + MarkupTextLiteral - [12..17)::5 - [text>] - Gen<Markup> - SpanEditHandler;Accepts:None
  85121. + Text;[text];
  85122. + CloseAngle;[>];
  85123. + CSharpStatementLiteral - [17..17)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  85124. + Marker;[];
  85125. + RazorMetaCode - [17..18)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85126. + RightBrace;[}];
  85127. + MarkupTextLiteral - [18..18)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85128. + Marker;[];
  85129. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag4.stree.txt
  85130. index 6af1febb293..76ed69993ae 100644
  85131. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag4.stree.txt
  85132. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag4.stree.txt
  85133. @@ -1,38 +1,42 @@
  85134. -Markup block - Gen<None> - 34 - (0:0,0)
  85135. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  85136. - SyntaxKind.Unknown;[];
  85137. - Statement block - Gen<None> - 34 - (0:0,0)
  85138. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  85139. - SyntaxKind.Transition;[@];
  85140. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  85141. - SyntaxKind.LeftBrace;[{];
  85142. - Markup block - Gen<None> - 31 - (2:0,2)
  85143. - Tag block - Gen<None> - 7 - (2:0,2)
  85144. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  85145. - SyntaxKind.OpenAngle;[<];
  85146. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  85147. - SyntaxKind.Bang;[!];
  85148. - Markup span - Gen<Markup> - [text>] - SpanEditHandler;Accepts:None - (4:0,4) - Tokens:2
  85149. - SyntaxKind.Text;[text];
  85150. - SyntaxKind.CloseAngle;[>];
  85151. - Markup span - Gen<Markup> - [words and spaces] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:5
  85152. - SyntaxKind.Text;[words];
  85153. - SyntaxKind.Whitespace;[ ];
  85154. - SyntaxKind.Text;[and];
  85155. - SyntaxKind.Whitespace;[ ];
  85156. - SyntaxKind.Text;[spaces];
  85157. - Tag block - Gen<None> - 8 - (25:0,25)
  85158. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:2
  85159. - SyntaxKind.OpenAngle;[<];
  85160. - SyntaxKind.ForwardSlash;[/];
  85161. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (27:0,27) - Tokens:1
  85162. - SyntaxKind.Bang;[!];
  85163. - Markup span - Gen<Markup> - [text>] - SpanEditHandler;Accepts:None - (28:0,28) - Tokens:2
  85164. - SyntaxKind.Text;[text];
  85165. - SyntaxKind.CloseAngle;[>];
  85166. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (33:0,33) - Tokens:1
  85167. - SyntaxKind.Unknown;[];
  85168. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (33:0,33) - Tokens:1
  85169. - SyntaxKind.RightBrace;[}];
  85170. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (34:0,34) - Tokens:1
  85171. - SyntaxKind.Unknown;[];
  85172. +RazorDocument - [0..34)::34 - [@{<!text>words and spaces</!text>}]
  85173. + MarkupBlock - [0..34)::34
  85174. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85175. + Marker;[];
  85176. + CSharpCodeBlock - [0..34)::34
  85177. + CSharpStatement - [0..34)::34
  85178. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85179. + Transition;[@];
  85180. + CSharpStatementBody - [1..34)::33
  85181. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85182. + LeftBrace;[{];
  85183. + CSharpCodeBlock - [2..33)::31
  85184. + MarkupBlock - [2..33)::31
  85185. + MarkupTagBlock - [2..9)::7 - [<!text>]
  85186. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85187. + OpenAngle;[<];
  85188. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85189. + Bang;[!];
  85190. + MarkupTextLiteral - [4..9)::5 - [text>] - Gen<Markup> - SpanEditHandler;Accepts:None
  85191. + Text;[text];
  85192. + CloseAngle;[>];
  85193. + MarkupTextLiteral - [9..25)::16 - [words and spaces] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85194. + Text;[words];
  85195. + Whitespace;[ ];
  85196. + Text;[and];
  85197. + Whitespace;[ ];
  85198. + Text;[spaces];
  85199. + MarkupTagBlock - [25..33)::8 - [</!text>]
  85200. + MarkupTextLiteral - [25..27)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85201. + OpenAngle;[<];
  85202. + ForwardSlash;[/];
  85203. + RazorMetaCode - [27..28)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85204. + Bang;[!];
  85205. + MarkupTextLiteral - [28..33)::5 - [text>] - Gen<Markup> - SpanEditHandler;Accepts:None
  85206. + Text;[text];
  85207. + CloseAngle;[>];
  85208. + CSharpStatementLiteral - [33..33)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  85209. + Marker;[];
  85210. + RazorMetaCode - [33..34)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85211. + RightBrace;[}];
  85212. + MarkupTextLiteral - [34..34)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85213. + Marker;[];
  85214. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag5.stree.txt
  85215. index 345239d4ae7..f25f69c1787 100644
  85216. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag5.stree.txt
  85217. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag5.stree.txt
  85218. @@ -1,29 +1,33 @@
  85219. -Markup block - Gen<None> - 17 - (0:0,0)
  85220. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  85221. - SyntaxKind.Unknown;[];
  85222. - Statement block - Gen<None> - 17 - (0:0,0)
  85223. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  85224. - SyntaxKind.Transition;[@];
  85225. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  85226. - SyntaxKind.LeftBrace;[{];
  85227. - Markup block - Gen<None> - 14 - (2:0,2)
  85228. - Tag block - Gen<None> - 7 - (2:0,2)
  85229. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  85230. - SyntaxKind.OpenAngle;[<];
  85231. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  85232. - SyntaxKind.Bang;[!];
  85233. - Markup span - Gen<Markup> - [text>] - SpanEditHandler;Accepts:None - (4:0,4) - Tokens:2
  85234. - SyntaxKind.Text;[text];
  85235. - SyntaxKind.CloseAngle;[>];
  85236. - Tag block - Gen<None> - 7 - (9:0,9)
  85237. - Markup span - Gen<Markup> - [</text>] - SpanEditHandler;Accepts:None - (9:0,9) - Tokens:4
  85238. - SyntaxKind.OpenAngle;[<];
  85239. - SyntaxKind.ForwardSlash;[/];
  85240. - SyntaxKind.Text;[text];
  85241. - SyntaxKind.CloseAngle;[>];
  85242. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  85243. - SyntaxKind.Unknown;[];
  85244. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  85245. - SyntaxKind.RightBrace;[}];
  85246. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:1
  85247. - SyntaxKind.Unknown;[];
  85248. +RazorDocument - [0..17)::17 - [@{<!text></text>}]
  85249. + MarkupBlock - [0..17)::17
  85250. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85251. + Marker;[];
  85252. + CSharpCodeBlock - [0..17)::17
  85253. + CSharpStatement - [0..17)::17
  85254. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85255. + Transition;[@];
  85256. + CSharpStatementBody - [1..17)::16
  85257. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85258. + LeftBrace;[{];
  85259. + CSharpCodeBlock - [2..16)::14
  85260. + MarkupBlock - [2..16)::14
  85261. + MarkupTagBlock - [2..9)::7 - [<!text>]
  85262. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85263. + OpenAngle;[<];
  85264. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85265. + Bang;[!];
  85266. + MarkupTextLiteral - [4..9)::5 - [text>] - Gen<Markup> - SpanEditHandler;Accepts:None
  85267. + Text;[text];
  85268. + CloseAngle;[>];
  85269. + MarkupTagBlock - [9..16)::7 - [</text>]
  85270. + MarkupTextLiteral - [9..16)::7 - [</text>] - Gen<Markup> - SpanEditHandler;Accepts:None
  85271. + OpenAngle;[<];
  85272. + ForwardSlash;[/];
  85273. + Text;[text];
  85274. + CloseAngle;[>];
  85275. + CSharpStatementLiteral - [16..16)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  85276. + Marker;[];
  85277. + RazorMetaCode - [16..17)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85278. + RightBrace;[}];
  85279. + MarkupTextLiteral - [17..17)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85280. + Marker;[];
  85281. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag6.stree.txt
  85282. index 90ebfc8d6a6..d1f5b430573 100644
  85283. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag6.stree.txt
  85284. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag6.stree.txt
  85285. @@ -1,29 +1,33 @@
  85286. -Markup block - Gen<None> - 17 - (0:0,0)
  85287. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  85288. - SyntaxKind.Unknown;[];
  85289. - Statement block - Gen<None> - 17 - (0:0,0)
  85290. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  85291. - SyntaxKind.Transition;[@];
  85292. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  85293. - SyntaxKind.LeftBrace;[{];
  85294. - Markup block - Gen<None> - 14 - (2:0,2)
  85295. - Tag block - Gen<None> - 6 - (2:0,2)
  85296. - Transition span - Gen<None> - [<text>] - SpanEditHandler;Accepts:None - (2:0,2) - Tokens:3
  85297. - SyntaxKind.OpenAngle;[<];
  85298. - SyntaxKind.Text;[text];
  85299. - SyntaxKind.CloseAngle;[>];
  85300. - Tag block - Gen<None> - 8 - (8:0,8)
  85301. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:None - (8:0,8) - Tokens:2
  85302. - SyntaxKind.OpenAngle;[<];
  85303. - SyntaxKind.ForwardSlash;[/];
  85304. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  85305. - SyntaxKind.Bang;[!];
  85306. - Markup span - Gen<Markup> - [text>] - SpanEditHandler;Accepts:None - (11:0,11) - Tokens:2
  85307. - SyntaxKind.Text;[text];
  85308. - SyntaxKind.CloseAngle;[>];
  85309. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  85310. - SyntaxKind.Unknown;[];
  85311. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  85312. - SyntaxKind.RightBrace;[}];
  85313. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:1
  85314. - SyntaxKind.Unknown;[];
  85315. +RazorDocument - [0..17)::17 - [@{<text></!text>}]
  85316. + MarkupBlock - [0..17)::17
  85317. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85318. + Marker;[];
  85319. + CSharpCodeBlock - [0..17)::17
  85320. + CSharpStatement - [0..17)::17
  85321. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85322. + Transition;[@];
  85323. + CSharpStatementBody - [1..17)::16
  85324. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85325. + LeftBrace;[{];
  85326. + CSharpCodeBlock - [2..16)::14
  85327. + MarkupBlock - [2..16)::14
  85328. + MarkupTagBlock - [2..8)::6 - [<text>]
  85329. + MarkupTransition - [2..8)::6 - Gen<None> - SpanEditHandler;Accepts:None
  85330. + OpenAngle;[<];
  85331. + Text;[text];
  85332. + CloseAngle;[>];
  85333. + MarkupTagBlock - [8..16)::8 - [</!text>]
  85334. + MarkupTextLiteral - [8..10)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:None
  85335. + OpenAngle;[<];
  85336. + ForwardSlash;[/];
  85337. + RazorMetaCode - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85338. + Bang;[!];
  85339. + MarkupTextLiteral - [11..16)::5 - [text>] - Gen<Markup> - SpanEditHandler;Accepts:None
  85340. + Text;[text];
  85341. + CloseAngle;[>];
  85342. + CSharpStatementLiteral - [16..16)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  85343. + Marker;[];
  85344. + RazorMetaCode - [16..17)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85345. + RightBrace;[}];
  85346. + MarkupTextLiteral - [17..17)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85347. + Marker;[];
  85348. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag7.stree.txt
  85349. index 9feb97f15bc..0a1ea6c2570 100644
  85350. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag7.stree.txt
  85351. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag7.stree.txt
  85352. @@ -1,34 +1,48 @@
  85353. -Markup block - Gen<None> - 31 - (0:0,0)
  85354. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  85355. - SyntaxKind.Unknown;[];
  85356. - Statement block - Gen<None> - 31 - (0:0,0)
  85357. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  85358. - SyntaxKind.Transition;[@];
  85359. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  85360. - SyntaxKind.LeftBrace;[{];
  85361. - Markup block - Gen<None> - 28 - (2:0,2)
  85362. - Tag block - Gen<None> - 7 - (2:0,2)
  85363. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  85364. - SyntaxKind.OpenAngle;[<];
  85365. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  85366. - SyntaxKind.Bang;[!];
  85367. - Markup span - Gen<Markup> - [text>] - SpanEditHandler;Accepts:None - (4:0,4) - Tokens:2
  85368. - SyntaxKind.Text;[text];
  85369. - SyntaxKind.CloseAngle;[>];
  85370. - Tag block - Gen<TagHelper> - 13 - (9:0,9) - text - texttaghelper
  85371. - StartTagAndEndTag - <text> ... </text>
  85372. - Tag block - Gen<None> - 8 - (22:0,22)
  85373. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:2
  85374. - SyntaxKind.OpenAngle;[<];
  85375. - SyntaxKind.ForwardSlash;[/];
  85376. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (24:0,24) - Tokens:1
  85377. - SyntaxKind.Bang;[!];
  85378. - Markup span - Gen<Markup> - [text>] - SpanEditHandler;Accepts:None - (25:0,25) - Tokens:2
  85379. - SyntaxKind.Text;[text];
  85380. - SyntaxKind.CloseAngle;[>];
  85381. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (30:0,30) - Tokens:1
  85382. - SyntaxKind.Unknown;[];
  85383. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (30:0,30) - Tokens:1
  85384. - SyntaxKind.RightBrace;[}];
  85385. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (31:0,31) - Tokens:1
  85386. - SyntaxKind.Unknown;[];
  85387. +RazorDocument - [0..31)::31 - [@{<!text><text></text></!text>}]
  85388. + MarkupBlock - [0..31)::31
  85389. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85390. + Marker;[];
  85391. + CSharpCodeBlock - [0..31)::31
  85392. + CSharpStatement - [0..31)::31
  85393. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85394. + Transition;[@];
  85395. + CSharpStatementBody - [1..31)::30
  85396. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85397. + LeftBrace;[{];
  85398. + CSharpCodeBlock - [2..30)::28
  85399. + MarkupBlock - [2..30)::28
  85400. + MarkupTagBlock - [2..9)::7 - [<!text>]
  85401. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85402. + OpenAngle;[<];
  85403. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85404. + Bang;[!];
  85405. + MarkupTextLiteral - [4..9)::5 - [text>] - Gen<Markup> - SpanEditHandler;Accepts:None
  85406. + Text;[text];
  85407. + CloseAngle;[>];
  85408. + MarkupTagHelperElement - [9..22)::13 - text[StartTagAndEndTag] - texttaghelper
  85409. + MarkupTagHelperStartTag - [9..15)::6
  85410. + MarkupTextLiteral - [9..15)::6 - [<text>] - Gen<Markup> - SpanEditHandler;Accepts:None
  85411. + OpenAngle;[<];
  85412. + Text;[text];
  85413. + CloseAngle;[>];
  85414. + MarkupTagHelperEndTag - [15..22)::7
  85415. + MarkupTextLiteral - [15..22)::7 - [</text>] - Gen<Markup> - SpanEditHandler;Accepts:None
  85416. + OpenAngle;[<];
  85417. + ForwardSlash;[/];
  85418. + Text;[text];
  85419. + CloseAngle;[>];
  85420. + MarkupTagBlock - [22..30)::8 - [</!text>]
  85421. + MarkupTextLiteral - [22..24)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85422. + OpenAngle;[<];
  85423. + ForwardSlash;[/];
  85424. + RazorMetaCode - [24..25)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85425. + Bang;[!];
  85426. + MarkupTextLiteral - [25..30)::5 - [text>] - Gen<Markup> - SpanEditHandler;Accepts:None
  85427. + Text;[text];
  85428. + CloseAngle;[>];
  85429. + CSharpStatementLiteral - [30..30)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  85430. + Marker;[];
  85431. + RazorMetaCode - [30..31)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85432. + RightBrace;[}];
  85433. + MarkupTextLiteral - [31..31)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85434. + Marker;[];
  85435. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag8.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag8.stree.txt
  85436. index 4f4e21ac823..44eb53c5110 100644
  85437. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag8.stree.txt
  85438. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag8.stree.txt
  85439. @@ -1,33 +1,39 @@
  85440. -Markup block - Gen<None> - 24 - (0:0,0)
  85441. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  85442. - SyntaxKind.Unknown;[];
  85443. - Statement block - Gen<None> - 24 - (0:0,0)
  85444. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  85445. - SyntaxKind.Transition;[@];
  85446. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  85447. - SyntaxKind.LeftBrace;[{];
  85448. - Markup block - Gen<None> - 22 - (2:0,2)
  85449. - Tag block - Gen<None> - 6 - (2:0,2)
  85450. - Transition span - Gen<None> - [<text>] - SpanEditHandler;Accepts:None - (2:0,2) - Tokens:3
  85451. - SyntaxKind.OpenAngle;[<];
  85452. - SyntaxKind.Text;[text];
  85453. - SyntaxKind.CloseAngle;[>];
  85454. - Tag block - Gen<None> - 7 - (8:0,8)
  85455. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:None - (8:0,8) - Tokens:1
  85456. - SyntaxKind.OpenAngle;[<];
  85457. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (9:0,9) - Tokens:1
  85458. - SyntaxKind.Bang;[!];
  85459. - Markup span - Gen<Markup> - [text>] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:2
  85460. - SyntaxKind.Text;[text];
  85461. - SyntaxKind.CloseAngle;[>];
  85462. - Tag block - Gen<None> - 8 - (15:0,15)
  85463. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:2
  85464. - SyntaxKind.OpenAngle;[<];
  85465. - SyntaxKind.ForwardSlash;[/];
  85466. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (17:0,17) - Tokens:1
  85467. - SyntaxKind.Bang;[!];
  85468. - Markup span - Gen<Markup> - [text>] - SpanEditHandler;Accepts:None - (18:0,18) - Tokens:2
  85469. - SyntaxKind.Text;[text];
  85470. - SyntaxKind.CloseAngle;[>];
  85471. - Markup span - Gen<Markup> - [}] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:1
  85472. - SyntaxKind.Text;[}];
  85473. +RazorDocument - [0..24)::24 - [@{<text><!text></!text>}]
  85474. + MarkupBlock - [0..24)::24
  85475. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85476. + Marker;[];
  85477. + CSharpCodeBlock - [0..24)::24
  85478. + CSharpStatement - [0..24)::24
  85479. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85480. + Transition;[@];
  85481. + CSharpStatementBody - [1..24)::23
  85482. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85483. + LeftBrace;[{];
  85484. + CSharpCodeBlock - [2..24)::22
  85485. + MarkupBlock - [2..24)::22
  85486. + MarkupTagBlock - [2..8)::6 - [<text>]
  85487. + MarkupTransition - [2..8)::6 - Gen<None> - SpanEditHandler;Accepts:None
  85488. + OpenAngle;[<];
  85489. + Text;[text];
  85490. + CloseAngle;[>];
  85491. + MarkupTagBlock - [8..15)::7 - [<!text>]
  85492. + MarkupTextLiteral - [8..9)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:None
  85493. + OpenAngle;[<];
  85494. + RazorMetaCode - [9..10)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85495. + Bang;[!];
  85496. + MarkupTextLiteral - [10..15)::5 - [text>] - Gen<Markup> - SpanEditHandler;Accepts:None
  85497. + Text;[text];
  85498. + CloseAngle;[>];
  85499. + MarkupTagBlock - [15..23)::8 - [</!text>]
  85500. + MarkupTextLiteral - [15..17)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85501. + OpenAngle;[<];
  85502. + ForwardSlash;[/];
  85503. + RazorMetaCode - [17..18)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85504. + Bang;[!];
  85505. + MarkupTextLiteral - [18..23)::5 - [text>] - Gen<Markup> - SpanEditHandler;Accepts:None
  85506. + Text;[text];
  85507. + CloseAngle;[>];
  85508. + MarkupTextLiteral - [23..24)::1 - [}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85509. + Text;[}];
  85510. + RazorMetaCode - [24..24)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  85511. + RightBrace;[<Missing>];
  85512. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag9.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag9.stree.txt
  85513. index 8f47730c52f..846d0090a99 100644
  85514. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag9.stree.txt
  85515. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTHElementOptForCompleteTextTagInCSharpBlock_WithBlockTextTag9.stree.txt
  85516. @@ -1,39 +1,43 @@
  85517. -Markup block - Gen<None> - 25 - (0:0,0)
  85518. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  85519. - SyntaxKind.Unknown;[];
  85520. - Statement block - Gen<None> - 25 - (0:0,0)
  85521. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  85522. - SyntaxKind.Transition;[@];
  85523. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  85524. - SyntaxKind.LeftBrace;[{];
  85525. - Markup block - Gen<None> - 15 - (2:0,2)
  85526. - Tag block - Gen<None> - 7 - (2:0,2)
  85527. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  85528. - SyntaxKind.OpenAngle;[<];
  85529. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  85530. - SyntaxKind.Bang;[!];
  85531. - Markup span - Gen<Markup> - [text>] - SpanEditHandler;Accepts:None - (4:0,4) - Tokens:2
  85532. - SyntaxKind.Text;[text];
  85533. - SyntaxKind.CloseAngle;[>];
  85534. - Tag block - Gen<None> - 8 - (9:0,9)
  85535. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:2
  85536. - SyntaxKind.OpenAngle;[<];
  85537. - SyntaxKind.ForwardSlash;[/];
  85538. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (11:0,11) - Tokens:1
  85539. - SyntaxKind.Bang;[!];
  85540. - Markup span - Gen<Markup> - [text>] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:2
  85541. - SyntaxKind.Text;[text];
  85542. - SyntaxKind.CloseAngle;[>];
  85543. - Markup block - Gen<None> - 7 - (17:0,17)
  85544. - Tag block - Gen<None> - 7 - (17:0,17)
  85545. - Markup span - Gen<Markup> - [</text>] - SpanEditHandler;Accepts:None - (17:0,17) - Tokens:4
  85546. - SyntaxKind.OpenAngle;[<];
  85547. - SyntaxKind.ForwardSlash;[/];
  85548. - SyntaxKind.Text;[text];
  85549. - SyntaxKind.CloseAngle;[>];
  85550. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (24:0,24) - Tokens:1
  85551. - SyntaxKind.Unknown;[];
  85552. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (24:0,24) - Tokens:1
  85553. - SyntaxKind.RightBrace;[}];
  85554. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:1
  85555. - SyntaxKind.Unknown;[];
  85556. +RazorDocument - [0..25)::25 - [@{<!text></!text></text>}]
  85557. + MarkupBlock - [0..25)::25
  85558. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85559. + Marker;[];
  85560. + CSharpCodeBlock - [0..25)::25
  85561. + CSharpStatement - [0..25)::25
  85562. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85563. + Transition;[@];
  85564. + CSharpStatementBody - [1..25)::24
  85565. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85566. + LeftBrace;[{];
  85567. + CSharpCodeBlock - [2..24)::22
  85568. + MarkupBlock - [2..17)::15
  85569. + MarkupTagBlock - [2..9)::7 - [<!text>]
  85570. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85571. + OpenAngle;[<];
  85572. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85573. + Bang;[!];
  85574. + MarkupTextLiteral - [4..9)::5 - [text>] - Gen<Markup> - SpanEditHandler;Accepts:None
  85575. + Text;[text];
  85576. + CloseAngle;[>];
  85577. + MarkupTagBlock - [9..17)::8 - [</!text>]
  85578. + MarkupTextLiteral - [9..11)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85579. + OpenAngle;[<];
  85580. + ForwardSlash;[/];
  85581. + RazorMetaCode - [11..12)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85582. + Bang;[!];
  85583. + MarkupTextLiteral - [12..17)::5 - [text>] - Gen<Markup> - SpanEditHandler;Accepts:None
  85584. + Text;[text];
  85585. + CloseAngle;[>];
  85586. + MarkupBlock - [17..24)::7
  85587. + MarkupTagBlock - [17..24)::7 - [</text>]
  85588. + MarkupTextLiteral - [17..24)::7 - [</text>] - Gen<Markup> - SpanEditHandler;Accepts:None
  85589. + OpenAngle;[<];
  85590. + ForwardSlash;[/];
  85591. + Text;[text];
  85592. + CloseAngle;[>];
  85593. + CSharpStatementLiteral - [24..24)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  85594. + Marker;[];
  85595. + RazorMetaCode - [24..25)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85596. + RightBrace;[}];
  85597. + MarkupTextLiteral - [25..25)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85598. + Marker;[];
  85599. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML1.stree.txt
  85600. index b852bc30e7c..61c1a03dc41 100644
  85601. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML1.stree.txt
  85602. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML1.stree.txt
  85603. @@ -1,4 +1,5 @@
  85604. -Markup block - Gen<None> - 2 - (0:0,0)
  85605. - Markup span - Gen<Markup> - [<!] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  85606. - SyntaxKind.OpenAngle;[<];
  85607. - SyntaxKind.Bang;[!];
  85608. +RazorDocument - [0..2)::2 - [<!]
  85609. + MarkupBlock - [0..2)::2
  85610. + MarkupTextLiteral - [0..2)::2 - [<!] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85611. + OpenAngle;[<];
  85612. + Bang;[!];
  85613. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML2.stree.txt
  85614. index b95ea2835e6..52d9469e77e 100644
  85615. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML2.stree.txt
  85616. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML2.stree.txt
  85617. @@ -1,8 +1,9 @@
  85618. -Markup block - Gen<None> - 3 - (0:0,0)
  85619. - Tag block - Gen<None> - 3 - (0:0,0)
  85620. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  85621. - SyntaxKind.OpenAngle;[<];
  85622. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  85623. - SyntaxKind.Bang;[!];
  85624. - Markup span - Gen<Markup> - [p] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  85625. - SyntaxKind.Text;[p];
  85626. +RazorDocument - [0..3)::3 - [<!p]
  85627. + MarkupBlock - [0..3)::3
  85628. + MarkupTagBlock - [0..3)::3 - [<!p]
  85629. + MarkupTextLiteral - [0..1)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85630. + OpenAngle;[<];
  85631. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85632. + Bang;[!];
  85633. + MarkupTextLiteral - [2..3)::1 - [p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85634. + Text;[p];
  85635. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML3.stree.txt
  85636. index 6896e103317..3a79c373e3b 100644
  85637. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML3.stree.txt
  85638. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML3.stree.txt
  85639. @@ -1,10 +1,11 @@
  85640. -Markup block - Gen<None> - 5 - (0:0,0)
  85641. - Tag block - Gen<None> - 5 - (0:0,0)
  85642. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  85643. - SyntaxKind.OpenAngle;[<];
  85644. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  85645. - SyntaxKind.Bang;[!];
  85646. - Markup span - Gen<Markup> - [p /] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:3
  85647. - SyntaxKind.Text;[p];
  85648. - SyntaxKind.Whitespace;[ ];
  85649. - SyntaxKind.ForwardSlash;[/];
  85650. +RazorDocument - [0..5)::5 - [<!p /]
  85651. + MarkupBlock - [0..5)::5
  85652. + MarkupTagBlock - [0..5)::5 - [<!p /]
  85653. + MarkupTextLiteral - [0..1)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85654. + OpenAngle;[<];
  85655. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85656. + Bang;[!];
  85657. + MarkupTextLiteral - [2..5)::3 - [p /] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85658. + Text;[p];
  85659. + Whitespace;[ ];
  85660. + ForwardSlash;[/];
  85661. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML4.stree.txt
  85662. index 06ba639ea21..9208c63b1d4 100644
  85663. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML4.stree.txt
  85664. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML4.stree.txt
  85665. @@ -1,13 +1,15 @@
  85666. -Markup block - Gen<None> - 10 - (0:0,0)
  85667. - Tag block - Gen<None> - 10 - (0:0,0)
  85668. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  85669. - SyntaxKind.OpenAngle;[<];
  85670. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  85671. - SyntaxKind.Bang;[!];
  85672. - Markup span - Gen<Markup> - [p] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  85673. - SyntaxKind.Text;[p];
  85674. - Markup block - Gen<Attr:class, class=@(3:0,3),@(10:0,10)> - 7 - (3:0,3)
  85675. - Markup span - Gen<None> - [ class=] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:3
  85676. - SyntaxKind.Whitespace;[ ];
  85677. - SyntaxKind.Text;[class];
  85678. - SyntaxKind.Equals;[=];
  85679. +RazorDocument - [0..10)::10 - [<!p class=]
  85680. + MarkupBlock - [0..10)::10
  85681. + MarkupTagBlock - [0..10)::10 - [<!p class=]
  85682. + MarkupTextLiteral - [0..1)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85683. + OpenAngle;[<];
  85684. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85685. + Bang;[!];
  85686. + MarkupTextLiteral - [2..3)::1 - [p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85687. + Text;[p];
  85688. + MarkupAttributeBlock - [3..10)::7 - [ class=]
  85689. + MarkupTextLiteral - [3..4)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85690. + Whitespace;[ ];
  85691. + MarkupTextLiteral - [4..9)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85692. + Text;[class];
  85693. + Equals;[=];
  85694. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML5.stree.txt
  85695. index 935851bd72b..0d4e13b1883 100644
  85696. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML5.stree.txt
  85697. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML5.stree.txt
  85698. @@ -1,16 +1,21 @@
  85699. -Markup block - Gen<None> - 14 - (0:0,0)
  85700. - Tag block - Gen<None> - 14 - (0:0,0)
  85701. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  85702. - SyntaxKind.OpenAngle;[<];
  85703. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  85704. - SyntaxKind.Bang;[!];
  85705. - Markup span - Gen<Markup> - [p] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  85706. - SyntaxKind.Text;[p];
  85707. - Markup block - Gen<Attr:class, class="@(3:0,3),@(14:0,14)> - 11 - (3:0,3)
  85708. - Markup span - Gen<None> - [ class="] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:4
  85709. - SyntaxKind.Whitespace;[ ];
  85710. - SyntaxKind.Text;[class];
  85711. - SyntaxKind.Equals;[=];
  85712. - SyntaxKind.DoubleQuote;["];
  85713. - Markup span - Gen<LitAttr:@(11:0,11)> - [btn] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:1
  85714. - SyntaxKind.Text;[btn];
  85715. +RazorDocument - [0..14)::14 - [<!p class="btn]
  85716. + MarkupBlock - [0..14)::14
  85717. + MarkupTagBlock - [0..14)::14 - [<!p class="btn]
  85718. + MarkupTextLiteral - [0..1)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85719. + OpenAngle;[<];
  85720. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85721. + Bang;[!];
  85722. + MarkupTextLiteral - [2..3)::1 - [p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85723. + Text;[p];
  85724. + MarkupAttributeBlock - [3..14)::11 - [ class="btn]
  85725. + MarkupTextLiteral - [3..4)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85726. + Whitespace;[ ];
  85727. + MarkupTextLiteral - [4..9)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85728. + Text;[class];
  85729. + Equals;[=];
  85730. + MarkupTextLiteral - [10..11)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  85731. + DoubleQuote;["];
  85732. + GenericBlock - [11..14)::3
  85733. + MarkupLiteralAttributeValue - [11..14)::3 - [btn]
  85734. + MarkupTextLiteral - [11..14)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85735. + Text;[btn];
  85736. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML6.stree.txt
  85737. index ba08d7e8550..4a49cc94740 100644
  85738. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML6.stree.txt
  85739. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML6.stree.txt
  85740. @@ -1,18 +1,23 @@
  85741. -Markup block - Gen<None> - 15 - (0:0,0)
  85742. - Tag block - Gen<None> - 15 - (0:0,0)
  85743. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  85744. - SyntaxKind.OpenAngle;[<];
  85745. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  85746. - SyntaxKind.Bang;[!];
  85747. - Markup span - Gen<Markup> - [p] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  85748. - SyntaxKind.Text;[p];
  85749. - Markup block - Gen<Attr:class, class="@(3:0,3),"@(14:0,14)> - 12 - (3:0,3)
  85750. - Markup span - Gen<None> - [ class="] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:4
  85751. - SyntaxKind.Whitespace;[ ];
  85752. - SyntaxKind.Text;[class];
  85753. - SyntaxKind.Equals;[=];
  85754. - SyntaxKind.DoubleQuote;["];
  85755. - Markup span - Gen<LitAttr:@(11:0,11)> - [btn] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:1
  85756. - SyntaxKind.Text;[btn];
  85757. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  85758. - SyntaxKind.DoubleQuote;["];
  85759. +RazorDocument - [0..15)::15 - [<!p class="btn"]
  85760. + MarkupBlock - [0..15)::15
  85761. + MarkupTagBlock - [0..15)::15 - [<!p class="btn"]
  85762. + MarkupTextLiteral - [0..1)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85763. + OpenAngle;[<];
  85764. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85765. + Bang;[!];
  85766. + MarkupTextLiteral - [2..3)::1 - [p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85767. + Text;[p];
  85768. + MarkupAttributeBlock - [3..15)::12 - [ class="btn"]
  85769. + MarkupTextLiteral - [3..4)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85770. + Whitespace;[ ];
  85771. + MarkupTextLiteral - [4..9)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85772. + Text;[class];
  85773. + Equals;[=];
  85774. + MarkupTextLiteral - [10..11)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  85775. + DoubleQuote;["];
  85776. + GenericBlock - [11..14)::3
  85777. + MarkupLiteralAttributeValue - [11..14)::3 - [btn]
  85778. + MarkupTextLiteral - [11..14)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85779. + Text;[btn];
  85780. + MarkupTextLiteral - [14..15)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  85781. + DoubleQuote;["];
  85782. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML7.stree.txt
  85783. index 0a6811f4ae5..6c37a7d5cdb 100644
  85784. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML7.stree.txt
  85785. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTML7.stree.txt
  85786. @@ -1,21 +1,26 @@
  85787. -Markup block - Gen<None> - 17 - (0:0,0)
  85788. - Tag block - Gen<None> - 17 - (0:0,0)
  85789. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  85790. - SyntaxKind.OpenAngle;[<];
  85791. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  85792. - SyntaxKind.Bang;[!];
  85793. - Markup span - Gen<Markup> - [p] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  85794. - SyntaxKind.Text;[p];
  85795. - Markup block - Gen<Attr:class, class="@(3:0,3),"@(14:0,14)> - 12 - (3:0,3)
  85796. - Markup span - Gen<None> - [ class="] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:4
  85797. - SyntaxKind.Whitespace;[ ];
  85798. - SyntaxKind.Text;[class];
  85799. - SyntaxKind.Equals;[=];
  85800. - SyntaxKind.DoubleQuote;["];
  85801. - Markup span - Gen<LitAttr:@(11:0,11)> - [btn] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:1
  85802. - SyntaxKind.Text;[btn];
  85803. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  85804. - SyntaxKind.DoubleQuote;["];
  85805. - Markup span - Gen<Markup> - [ /] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:2
  85806. - SyntaxKind.Whitespace;[ ];
  85807. - SyntaxKind.ForwardSlash;[/];
  85808. +RazorDocument - [0..17)::17 - [<!p class="btn" /]
  85809. + MarkupBlock - [0..17)::17
  85810. + MarkupTagBlock - [0..17)::17 - [<!p class="btn" /]
  85811. + MarkupTextLiteral - [0..1)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85812. + OpenAngle;[<];
  85813. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85814. + Bang;[!];
  85815. + MarkupTextLiteral - [2..3)::1 - [p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85816. + Text;[p];
  85817. + MarkupAttributeBlock - [3..15)::12 - [ class="btn"]
  85818. + MarkupTextLiteral - [3..4)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85819. + Whitespace;[ ];
  85820. + MarkupTextLiteral - [4..9)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85821. + Text;[class];
  85822. + Equals;[=];
  85823. + MarkupTextLiteral - [10..11)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  85824. + DoubleQuote;["];
  85825. + GenericBlock - [11..14)::3
  85826. + MarkupLiteralAttributeValue - [11..14)::3 - [btn]
  85827. + MarkupTextLiteral - [11..14)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85828. + Text;[btn];
  85829. + MarkupTextLiteral - [14..15)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  85830. + DoubleQuote;["];
  85831. + MarkupTextLiteral - [15..17)::2 - [ /] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85832. + Whitespace;[ ];
  85833. + ForwardSlash;[/];
  85834. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock1.stree.txt
  85835. index db03e13166c..b8d82590bd1 100644
  85836. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock1.stree.txt
  85837. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock1.stree.txt
  85838. @@ -1,16 +1,22 @@
  85839. -Markup block - Gen<None> - 5 - (0:0,0)
  85840. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  85841. - SyntaxKind.Unknown;[];
  85842. - Statement block - Gen<None> - 5 - (0:0,0)
  85843. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  85844. - SyntaxKind.Transition;[@];
  85845. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  85846. - SyntaxKind.LeftBrace;[{];
  85847. - Markup block - Gen<None> - 3 - (2:0,2)
  85848. - Tag block - Gen<None> - 3 - (2:0,2)
  85849. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  85850. - SyntaxKind.OpenAngle;[<];
  85851. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  85852. - SyntaxKind.Bang;[!];
  85853. - Markup span - Gen<Markup> - [}] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  85854. - SyntaxKind.Text;[}];
  85855. +RazorDocument - [0..5)::5 - [@{<!}]
  85856. + MarkupBlock - [0..5)::5
  85857. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85858. + Marker;[];
  85859. + CSharpCodeBlock - [0..5)::5
  85860. + CSharpStatement - [0..5)::5
  85861. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85862. + Transition;[@];
  85863. + CSharpStatementBody - [1..5)::4
  85864. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85865. + LeftBrace;[{];
  85866. + CSharpCodeBlock - [2..5)::3
  85867. + MarkupBlock - [2..5)::3
  85868. + MarkupTagBlock - [2..5)::3 - [<!}]
  85869. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85870. + OpenAngle;[<];
  85871. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85872. + Bang;[!];
  85873. + MarkupTextLiteral - [4..5)::1 - [}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85874. + Text;[}];
  85875. + RazorMetaCode - [5..5)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  85876. + RightBrace;[<Missing>];
  85877. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock2.stree.txt
  85878. index 2778fc41f83..5e474138d3e 100644
  85879. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock2.stree.txt
  85880. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock2.stree.txt
  85881. @@ -1,16 +1,22 @@
  85882. -Markup block - Gen<None> - 6 - (0:0,0)
  85883. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  85884. - SyntaxKind.Unknown;[];
  85885. - Statement block - Gen<None> - 6 - (0:0,0)
  85886. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  85887. - SyntaxKind.Transition;[@];
  85888. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  85889. - SyntaxKind.LeftBrace;[{];
  85890. - Markup block - Gen<None> - 4 - (2:0,2)
  85891. - Tag block - Gen<None> - 4 - (2:0,2)
  85892. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  85893. - SyntaxKind.OpenAngle;[<];
  85894. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  85895. - SyntaxKind.Bang;[!];
  85896. - Markup span - Gen<Markup> - [p}] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  85897. - SyntaxKind.Text;[p}];
  85898. +RazorDocument - [0..6)::6 - [@{<!p}]
  85899. + MarkupBlock - [0..6)::6
  85900. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85901. + Marker;[];
  85902. + CSharpCodeBlock - [0..6)::6
  85903. + CSharpStatement - [0..6)::6
  85904. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85905. + Transition;[@];
  85906. + CSharpStatementBody - [1..6)::5
  85907. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85908. + LeftBrace;[{];
  85909. + CSharpCodeBlock - [2..6)::4
  85910. + MarkupBlock - [2..6)::4
  85911. + MarkupTagBlock - [2..6)::4 - [<!p}]
  85912. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85913. + OpenAngle;[<];
  85914. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85915. + Bang;[!];
  85916. + MarkupTextLiteral - [4..6)::2 - [p}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85917. + Text;[p}];
  85918. + RazorMetaCode - [6..6)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  85919. + RightBrace;[<Missing>];
  85920. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock3.stree.txt
  85921. index 7a92ce2dae7..34a66c67b72 100644
  85922. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock3.stree.txt
  85923. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock3.stree.txt
  85924. @@ -1,21 +1,27 @@
  85925. -Markup block - Gen<None> - 8 - (0:0,0)
  85926. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  85927. - SyntaxKind.Unknown;[];
  85928. - Statement block - Gen<None> - 8 - (0:0,0)
  85929. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  85930. - SyntaxKind.Transition;[@];
  85931. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  85932. - SyntaxKind.LeftBrace;[{];
  85933. - Markup block - Gen<None> - 6 - (2:0,2)
  85934. - Tag block - Gen<None> - 6 - (2:0,2)
  85935. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  85936. - SyntaxKind.OpenAngle;[<];
  85937. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  85938. - SyntaxKind.Bang;[!];
  85939. - Markup span - Gen<Markup> - [p /] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:3
  85940. - SyntaxKind.Text;[p];
  85941. - SyntaxKind.Whitespace;[ ];
  85942. - SyntaxKind.ForwardSlash;[/];
  85943. - Markup block - Gen<None> - 1 - (7:0,7)
  85944. - Markup span - Gen<Markup> - [}] - SpanEditHandler;Accepts:Any - (7:0,7) - Tokens:1
  85945. - SyntaxKind.Text;[}];
  85946. +RazorDocument - [0..8)::8 - [@{<!p /}]
  85947. + MarkupBlock - [0..8)::8
  85948. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85949. + Marker;[];
  85950. + CSharpCodeBlock - [0..8)::8
  85951. + CSharpStatement - [0..8)::8
  85952. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85953. + Transition;[@];
  85954. + CSharpStatementBody - [1..8)::7
  85955. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85956. + LeftBrace;[{];
  85957. + CSharpCodeBlock - [2..8)::6
  85958. + MarkupBlock - [2..8)::6
  85959. + MarkupTagBlock - [2..8)::6 - [<!p /}]
  85960. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85961. + OpenAngle;[<];
  85962. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  85963. + Bang;[!];
  85964. + MarkupTextLiteral - [4..7)::3 - [p /] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85965. + Text;[p];
  85966. + Whitespace;[ ];
  85967. + ForwardSlash;[/];
  85968. + MarkupMinimizedAttributeBlock - [7..8)::1 - [}]
  85969. + MarkupTextLiteral - [7..8)::1 - [}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  85970. + Text;[}];
  85971. + RazorMetaCode - [8..8)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  85972. + RightBrace;[<Missing>];
  85973. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock4.stree.txt
  85974. index 99565cb44ac..b417b1cecca 100644
  85975. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock4.stree.txt
  85976. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock4.stree.txt
  85977. @@ -1,23 +1,32 @@
  85978. -Markup block - Gen<None> - 13 - (0:0,0)
  85979. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  85980. - SyntaxKind.Unknown;[];
  85981. - Statement block - Gen<None> - 13 - (0:0,0)
  85982. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  85983. - SyntaxKind.Transition;[@];
  85984. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  85985. - SyntaxKind.LeftBrace;[{];
  85986. - Markup block - Gen<None> - 11 - (2:0,2)
  85987. - Tag block - Gen<None> - 11 - (2:0,2)
  85988. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  85989. - SyntaxKind.OpenAngle;[<];
  85990. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  85991. - SyntaxKind.Bang;[!];
  85992. - Markup span - Gen<Markup> - [p] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  85993. - SyntaxKind.Text;[p];
  85994. - Markup block - Gen<Attr:class, class=@(5:0,5),@(13:0,13)> - 8 - (5:0,5)
  85995. - Markup span - Gen<None> - [ class=] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:3
  85996. - SyntaxKind.Whitespace;[ ];
  85997. - SyntaxKind.Text;[class];
  85998. - SyntaxKind.Equals;[=];
  85999. - Markup span - Gen<LitAttr:@(12:0,12)> - [}] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:1
  86000. - SyntaxKind.Text;[}];
  86001. +RazorDocument - [0..13)::13 - [@{<!p class=}]
  86002. + MarkupBlock - [0..13)::13
  86003. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86004. + Marker;[];
  86005. + CSharpCodeBlock - [0..13)::13
  86006. + CSharpStatement - [0..13)::13
  86007. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86008. + Transition;[@];
  86009. + CSharpStatementBody - [1..13)::12
  86010. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86011. + LeftBrace;[{];
  86012. + CSharpCodeBlock - [2..13)::11
  86013. + MarkupBlock - [2..13)::11
  86014. + MarkupTagBlock - [2..13)::11 - [<!p class=}]
  86015. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86016. + OpenAngle;[<];
  86017. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86018. + Bang;[!];
  86019. + MarkupTextLiteral - [4..5)::1 - [p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86020. + Text;[p];
  86021. + MarkupAttributeBlock - [5..13)::8 - [ class=}]
  86022. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86023. + Whitespace;[ ];
  86024. + MarkupTextLiteral - [6..11)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86025. + Text;[class];
  86026. + Equals;[=];
  86027. + GenericBlock - [12..13)::1
  86028. + MarkupLiteralAttributeValue - [12..13)::1 - [}]
  86029. + MarkupTextLiteral - [12..13)::1 - [}] - Gen<None> - SpanEditHandler;Accepts:Any
  86030. + Text;[}];
  86031. + RazorMetaCode - [13..13)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  86032. + RightBrace;[<Missing>];
  86033. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock5.stree.txt
  86034. index 8f20babae60..4917b1deeea 100644
  86035. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock5.stree.txt
  86036. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock5.stree.txt
  86037. @@ -1,24 +1,34 @@
  86038. -Markup block - Gen<None> - 17 - (0:0,0)
  86039. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  86040. - SyntaxKind.Unknown;[];
  86041. - Statement block - Gen<None> - 17 - (0:0,0)
  86042. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  86043. - SyntaxKind.Transition;[@];
  86044. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  86045. - SyntaxKind.LeftBrace;[{];
  86046. - Markup block - Gen<None> - 15 - (2:0,2)
  86047. - Tag block - Gen<None> - 15 - (2:0,2)
  86048. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  86049. - SyntaxKind.OpenAngle;[<];
  86050. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  86051. - SyntaxKind.Bang;[!];
  86052. - Markup span - Gen<Markup> - [p] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  86053. - SyntaxKind.Text;[p];
  86054. - Markup block - Gen<Attr:class, class="@(5:0,5),@(17:0,17)> - 12 - (5:0,5)
  86055. - Markup span - Gen<None> - [ class="] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:4
  86056. - SyntaxKind.Whitespace;[ ];
  86057. - SyntaxKind.Text;[class];
  86058. - SyntaxKind.Equals;[=];
  86059. - SyntaxKind.DoubleQuote;["];
  86060. - Markup span - Gen<LitAttr:@(13:0,13)> - [btn}] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:1
  86061. - SyntaxKind.Text;[btn}];
  86062. +RazorDocument - [0..17)::17 - [@{<!p class="btn}]
  86063. + MarkupBlock - [0..17)::17
  86064. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86065. + Marker;[];
  86066. + CSharpCodeBlock - [0..17)::17
  86067. + CSharpStatement - [0..17)::17
  86068. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86069. + Transition;[@];
  86070. + CSharpStatementBody - [1..17)::16
  86071. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86072. + LeftBrace;[{];
  86073. + CSharpCodeBlock - [2..17)::15
  86074. + MarkupBlock - [2..17)::15
  86075. + MarkupTagBlock - [2..17)::15 - [<!p class="btn}]
  86076. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86077. + OpenAngle;[<];
  86078. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86079. + Bang;[!];
  86080. + MarkupTextLiteral - [4..5)::1 - [p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86081. + Text;[p];
  86082. + MarkupAttributeBlock - [5..17)::12 - [ class="btn}]
  86083. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86084. + Whitespace;[ ];
  86085. + MarkupTextLiteral - [6..11)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86086. + Text;[class];
  86087. + Equals;[=];
  86088. + MarkupTextLiteral - [12..13)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  86089. + DoubleQuote;["];
  86090. + GenericBlock - [13..17)::4
  86091. + MarkupLiteralAttributeValue - [13..17)::4 - [btn}]
  86092. + MarkupTextLiteral - [13..17)::4 - [btn}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86093. + Text;[btn}];
  86094. + RazorMetaCode - [17..17)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  86095. + RightBrace;[<Missing>];
  86096. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock6.stree.txt
  86097. index 01ab2a14839..65b84da2ec9 100644
  86098. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock6.stree.txt
  86099. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock6.stree.txt
  86100. @@ -1,31 +1,42 @@
  86101. -Markup block - Gen<None> - 19 - (0:0,0)
  86102. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  86103. - SyntaxKind.Unknown;[];
  86104. - Statement block - Gen<None> - 19 - (0:0,0)
  86105. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  86106. - SyntaxKind.Transition;[@];
  86107. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  86108. - SyntaxKind.LeftBrace;[{];
  86109. - Markup block - Gen<None> - 17 - (2:0,2)
  86110. - Tag block - Gen<None> - 17 - (2:0,2)
  86111. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  86112. - SyntaxKind.OpenAngle;[<];
  86113. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  86114. - SyntaxKind.Bang;[!];
  86115. - Markup span - Gen<Markup> - [p] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  86116. - SyntaxKind.Text;[p];
  86117. - Markup block - Gen<Attr:class, class="@(5:0,5),@(19:0,19)> - 14 - (5:0,5)
  86118. - Markup span - Gen<None> - [ class="] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:4
  86119. - SyntaxKind.Whitespace;[ ];
  86120. - SyntaxKind.Text;[class];
  86121. - SyntaxKind.Equals;[=];
  86122. - SyntaxKind.DoubleQuote;["];
  86123. - Markup span - Gen<LitAttr:@(13:0,13)> - [btn] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:1
  86124. - SyntaxKind.Text;[btn];
  86125. - Markup block - Gen<None> - 2 - (16:0,16)
  86126. - Markup span - Gen<LitAttr:@(16:0,16)> - [@] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  86127. - SyntaxKind.Transition;[@];
  86128. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (17:0,17) - Tokens:1
  86129. - SyntaxKind.Transition;[@];
  86130. - Markup span - Gen<LitAttr:@(18:0,18)> - [}] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:1
  86131. - SyntaxKind.Text;[}];
  86132. +RazorDocument - [0..19)::19 - [@{<!p class="btn@@}]
  86133. + MarkupBlock - [0..19)::19
  86134. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86135. + Marker;[];
  86136. + CSharpCodeBlock - [0..19)::19
  86137. + CSharpStatement - [0..19)::19
  86138. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86139. + Transition;[@];
  86140. + CSharpStatementBody - [1..19)::18
  86141. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86142. + LeftBrace;[{];
  86143. + CSharpCodeBlock - [2..19)::17
  86144. + MarkupBlock - [2..19)::17
  86145. + MarkupTagBlock - [2..19)::17 - [<!p class="btn@@}]
  86146. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86147. + OpenAngle;[<];
  86148. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86149. + Bang;[!];
  86150. + MarkupTextLiteral - [4..5)::1 - [p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86151. + Text;[p];
  86152. + MarkupAttributeBlock - [5..19)::14 - [ class="btn@@}]
  86153. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86154. + Whitespace;[ ];
  86155. + MarkupTextLiteral - [6..11)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86156. + Text;[class];
  86157. + Equals;[=];
  86158. + MarkupTextLiteral - [12..13)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  86159. + DoubleQuote;["];
  86160. + GenericBlock - [13..19)::6
  86161. + MarkupLiteralAttributeValue - [13..16)::3 - [btn]
  86162. + MarkupTextLiteral - [13..16)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86163. + Text;[btn];
  86164. + MarkupBlock - [16..18)::2
  86165. + MarkupTextLiteral - [16..17)::1 - [@] - Gen<LitAttr:@(16:0,16)> - SpanEditHandler;Accepts:None
  86166. + Transition;[@];
  86167. + MarkupEphemeralTextLiteral - [17..18)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  86168. + Transition;[@];
  86169. + MarkupLiteralAttributeValue - [18..19)::1 - [}]
  86170. + MarkupTextLiteral - [18..19)::1 - [}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86171. + Text;[}];
  86172. + RazorMetaCode - [19..19)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  86173. + RightBrace;[<Missing>];
  86174. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock7.stree.txt
  86175. index 6ffeaac8117..c3e2ac96b5e 100644
  86176. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock7.stree.txt
  86177. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock7.stree.txt
  86178. @@ -1,29 +1,39 @@
  86179. -Markup block - Gen<None> - 18 - (0:0,0)
  86180. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  86181. - SyntaxKind.Unknown;[];
  86182. - Statement block - Gen<None> - 18 - (0:0,0)
  86183. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  86184. - SyntaxKind.Transition;[@];
  86185. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  86186. - SyntaxKind.LeftBrace;[{];
  86187. - Markup block - Gen<None> - 16 - (2:0,2)
  86188. - Tag block - Gen<None> - 16 - (2:0,2)
  86189. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  86190. - SyntaxKind.OpenAngle;[<];
  86191. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  86192. - SyntaxKind.Bang;[!];
  86193. - Markup span - Gen<Markup> - [p] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  86194. - SyntaxKind.Text;[p];
  86195. - Markup block - Gen<Attr:class, class="@(5:0,5),"@(16:0,16)> - 12 - (5:0,5)
  86196. - Markup span - Gen<None> - [ class="] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:4
  86197. - SyntaxKind.Whitespace;[ ];
  86198. - SyntaxKind.Text;[class];
  86199. - SyntaxKind.Equals;[=];
  86200. - SyntaxKind.DoubleQuote;["];
  86201. - Markup span - Gen<LitAttr:@(13:0,13)> - [btn] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:1
  86202. - SyntaxKind.Text;[btn];
  86203. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  86204. - SyntaxKind.DoubleQuote;["];
  86205. - Markup block - Gen<None> - 1 - (17:0,17)
  86206. - Markup span - Gen<Markup> - [}] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:1
  86207. - SyntaxKind.Text;[}];
  86208. +RazorDocument - [0..18)::18 - [@{<!p class="btn"}]
  86209. + MarkupBlock - [0..18)::18
  86210. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86211. + Marker;[];
  86212. + CSharpCodeBlock - [0..18)::18
  86213. + CSharpStatement - [0..18)::18
  86214. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86215. + Transition;[@];
  86216. + CSharpStatementBody - [1..18)::17
  86217. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86218. + LeftBrace;[{];
  86219. + CSharpCodeBlock - [2..18)::16
  86220. + MarkupBlock - [2..18)::16
  86221. + MarkupTagBlock - [2..18)::16 - [<!p class="btn"}]
  86222. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86223. + OpenAngle;[<];
  86224. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86225. + Bang;[!];
  86226. + MarkupTextLiteral - [4..5)::1 - [p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86227. + Text;[p];
  86228. + MarkupAttributeBlock - [5..17)::12 - [ class="btn"]
  86229. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86230. + Whitespace;[ ];
  86231. + MarkupTextLiteral - [6..11)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86232. + Text;[class];
  86233. + Equals;[=];
  86234. + MarkupTextLiteral - [12..13)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  86235. + DoubleQuote;["];
  86236. + GenericBlock - [13..16)::3
  86237. + MarkupLiteralAttributeValue - [13..16)::3 - [btn]
  86238. + MarkupTextLiteral - [13..16)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86239. + Text;[btn];
  86240. + MarkupTextLiteral - [16..17)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  86241. + DoubleQuote;["];
  86242. + MarkupMinimizedAttributeBlock - [17..18)::1 - [}]
  86243. + MarkupTextLiteral - [17..18)::1 - [}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86244. + Text;[}];
  86245. + RazorMetaCode - [18..18)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  86246. + RightBrace;[<Missing>];
  86247. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock8.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock8.stree.txt
  86248. index 71a957170ed..26ffe4ab64b 100644
  86249. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock8.stree.txt
  86250. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteHTMLInCSharpBlock8.stree.txt
  86251. @@ -1,32 +1,42 @@
  86252. -Markup block - Gen<None> - 20 - (0:0,0)
  86253. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  86254. - SyntaxKind.Unknown;[];
  86255. - Statement block - Gen<None> - 20 - (0:0,0)
  86256. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  86257. - SyntaxKind.Transition;[@];
  86258. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  86259. - SyntaxKind.LeftBrace;[{];
  86260. - Markup block - Gen<None> - 18 - (2:0,2)
  86261. - Tag block - Gen<None> - 18 - (2:0,2)
  86262. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  86263. - SyntaxKind.OpenAngle;[<];
  86264. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  86265. - SyntaxKind.Bang;[!];
  86266. - Markup span - Gen<Markup> - [p] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  86267. - SyntaxKind.Text;[p];
  86268. - Markup block - Gen<Attr:class, class="@(5:0,5),"@(16:0,16)> - 12 - (5:0,5)
  86269. - Markup span - Gen<None> - [ class="] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:4
  86270. - SyntaxKind.Whitespace;[ ];
  86271. - SyntaxKind.Text;[class];
  86272. - SyntaxKind.Equals;[=];
  86273. - SyntaxKind.DoubleQuote;["];
  86274. - Markup span - Gen<LitAttr:@(13:0,13)> - [btn] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:1
  86275. - SyntaxKind.Text;[btn];
  86276. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  86277. - SyntaxKind.DoubleQuote;["];
  86278. - Markup span - Gen<Markup> - [ /] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:2
  86279. - SyntaxKind.Whitespace;[ ];
  86280. - SyntaxKind.ForwardSlash;[/];
  86281. - Markup block - Gen<None> - 1 - (19:0,19)
  86282. - Markup span - Gen<Markup> - [}] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:1
  86283. - SyntaxKind.Text;[}];
  86284. +RazorDocument - [0..20)::20 - [@{<!p class="btn" /}]
  86285. + MarkupBlock - [0..20)::20
  86286. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86287. + Marker;[];
  86288. + CSharpCodeBlock - [0..20)::20
  86289. + CSharpStatement - [0..20)::20
  86290. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86291. + Transition;[@];
  86292. + CSharpStatementBody - [1..20)::19
  86293. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86294. + LeftBrace;[{];
  86295. + CSharpCodeBlock - [2..20)::18
  86296. + MarkupBlock - [2..20)::18
  86297. + MarkupTagBlock - [2..20)::18 - [<!p class="btn" /}]
  86298. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86299. + OpenAngle;[<];
  86300. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86301. + Bang;[!];
  86302. + MarkupTextLiteral - [4..5)::1 - [p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86303. + Text;[p];
  86304. + MarkupAttributeBlock - [5..17)::12 - [ class="btn"]
  86305. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86306. + Whitespace;[ ];
  86307. + MarkupTextLiteral - [6..11)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86308. + Text;[class];
  86309. + Equals;[=];
  86310. + MarkupTextLiteral - [12..13)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  86311. + DoubleQuote;["];
  86312. + GenericBlock - [13..16)::3
  86313. + MarkupLiteralAttributeValue - [13..16)::3 - [btn]
  86314. + MarkupTextLiteral - [13..16)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86315. + Text;[btn];
  86316. + MarkupTextLiteral - [16..17)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  86317. + DoubleQuote;["];
  86318. + MarkupTextLiteral - [17..19)::2 - [ /] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86319. + Whitespace;[ ];
  86320. + ForwardSlash;[/];
  86321. + MarkupMinimizedAttributeBlock - [19..20)::1 - [}]
  86322. + MarkupTextLiteral - [19..20)::1 - [}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86323. + Text;[}];
  86324. + RazorMetaCode - [20..20)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  86325. + RightBrace;[<Missing>];
  86326. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteTextTagInCSharpBlock1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteTextTagInCSharpBlock1.stree.txt
  86327. index 4361281bb1f..bdbf9331b48 100644
  86328. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteTextTagInCSharpBlock1.stree.txt
  86329. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteTextTagInCSharpBlock1.stree.txt
  86330. @@ -1,16 +1,22 @@
  86331. -Markup block - Gen<None> - 9 - (0:0,0)
  86332. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  86333. - SyntaxKind.Unknown;[];
  86334. - Statement block - Gen<None> - 9 - (0:0,0)
  86335. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  86336. - SyntaxKind.Transition;[@];
  86337. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  86338. - SyntaxKind.LeftBrace;[{];
  86339. - Markup block - Gen<None> - 7 - (2:0,2)
  86340. - Tag block - Gen<None> - 7 - (2:0,2)
  86341. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  86342. - SyntaxKind.OpenAngle;[<];
  86343. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  86344. - SyntaxKind.Bang;[!];
  86345. - Markup span - Gen<Markup> - [text}] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  86346. - SyntaxKind.Text;[text}];
  86347. +RazorDocument - [0..9)::9 - [@{<!text}]
  86348. + MarkupBlock - [0..9)::9
  86349. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86350. + Marker;[];
  86351. + CSharpCodeBlock - [0..9)::9
  86352. + CSharpStatement - [0..9)::9
  86353. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86354. + Transition;[@];
  86355. + CSharpStatementBody - [1..9)::8
  86356. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86357. + LeftBrace;[{];
  86358. + CSharpCodeBlock - [2..9)::7
  86359. + MarkupBlock - [2..9)::7
  86360. + MarkupTagBlock - [2..9)::7 - [<!text}]
  86361. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86362. + OpenAngle;[<];
  86363. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86364. + Bang;[!];
  86365. + MarkupTextLiteral - [4..9)::5 - [text}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86366. + Text;[text}];
  86367. + RazorMetaCode - [9..9)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  86368. + RightBrace;[<Missing>];
  86369. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteTextTagInCSharpBlock2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteTextTagInCSharpBlock2.stree.txt
  86370. index 38179386c71..97ba0757a26 100644
  86371. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteTextTagInCSharpBlock2.stree.txt
  86372. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteTextTagInCSharpBlock2.stree.txt
  86373. @@ -1,21 +1,27 @@
  86374. -Markup block - Gen<None> - 11 - (0:0,0)
  86375. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  86376. - SyntaxKind.Unknown;[];
  86377. - Statement block - Gen<None> - 11 - (0:0,0)
  86378. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  86379. - SyntaxKind.Transition;[@];
  86380. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  86381. - SyntaxKind.LeftBrace;[{];
  86382. - Markup block - Gen<None> - 9 - (2:0,2)
  86383. - Tag block - Gen<None> - 9 - (2:0,2)
  86384. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  86385. - SyntaxKind.OpenAngle;[<];
  86386. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  86387. - SyntaxKind.Bang;[!];
  86388. - Markup span - Gen<Markup> - [text /] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:3
  86389. - SyntaxKind.Text;[text];
  86390. - SyntaxKind.Whitespace;[ ];
  86391. - SyntaxKind.ForwardSlash;[/];
  86392. - Markup block - Gen<None> - 1 - (10:0,10)
  86393. - Markup span - Gen<Markup> - [}] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  86394. - SyntaxKind.Text;[}];
  86395. +RazorDocument - [0..11)::11 - [@{<!text /}]
  86396. + MarkupBlock - [0..11)::11
  86397. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86398. + Marker;[];
  86399. + CSharpCodeBlock - [0..11)::11
  86400. + CSharpStatement - [0..11)::11
  86401. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86402. + Transition;[@];
  86403. + CSharpStatementBody - [1..11)::10
  86404. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86405. + LeftBrace;[{];
  86406. + CSharpCodeBlock - [2..11)::9
  86407. + MarkupBlock - [2..11)::9
  86408. + MarkupTagBlock - [2..11)::9 - [<!text /}]
  86409. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86410. + OpenAngle;[<];
  86411. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86412. + Bang;[!];
  86413. + MarkupTextLiteral - [4..10)::6 - [text /] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86414. + Text;[text];
  86415. + Whitespace;[ ];
  86416. + ForwardSlash;[/];
  86417. + MarkupMinimizedAttributeBlock - [10..11)::1 - [}]
  86418. + MarkupTextLiteral - [10..11)::1 - [}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86419. + Text;[}];
  86420. + RazorMetaCode - [11..11)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  86421. + RightBrace;[<Missing>];
  86422. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteTextTagInCSharpBlock3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteTextTagInCSharpBlock3.stree.txt
  86423. index d04369b66bf..331006644dc 100644
  86424. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteTextTagInCSharpBlock3.stree.txt
  86425. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteTextTagInCSharpBlock3.stree.txt
  86426. @@ -1,23 +1,32 @@
  86427. -Markup block - Gen<None> - 16 - (0:0,0)
  86428. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  86429. - SyntaxKind.Unknown;[];
  86430. - Statement block - Gen<None> - 16 - (0:0,0)
  86431. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  86432. - SyntaxKind.Transition;[@];
  86433. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  86434. - SyntaxKind.LeftBrace;[{];
  86435. - Markup block - Gen<None> - 14 - (2:0,2)
  86436. - Tag block - Gen<None> - 14 - (2:0,2)
  86437. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  86438. - SyntaxKind.OpenAngle;[<];
  86439. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  86440. - SyntaxKind.Bang;[!];
  86441. - Markup span - Gen<Markup> - [text] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  86442. - SyntaxKind.Text;[text];
  86443. - Markup block - Gen<Attr:class, class=@(8:0,8),@(16:0,16)> - 8 - (8:0,8)
  86444. - Markup span - Gen<None> - [ class=] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:3
  86445. - SyntaxKind.Whitespace;[ ];
  86446. - SyntaxKind.Text;[class];
  86447. - SyntaxKind.Equals;[=];
  86448. - Markup span - Gen<LitAttr:@(15:0,15)> - [}] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:1
  86449. - SyntaxKind.Text;[}];
  86450. +RazorDocument - [0..16)::16 - [@{<!text class=}]
  86451. + MarkupBlock - [0..16)::16
  86452. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86453. + Marker;[];
  86454. + CSharpCodeBlock - [0..16)::16
  86455. + CSharpStatement - [0..16)::16
  86456. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86457. + Transition;[@];
  86458. + CSharpStatementBody - [1..16)::15
  86459. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86460. + LeftBrace;[{];
  86461. + CSharpCodeBlock - [2..16)::14
  86462. + MarkupBlock - [2..16)::14
  86463. + MarkupTagBlock - [2..16)::14 - [<!text class=}]
  86464. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86465. + OpenAngle;[<];
  86466. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86467. + Bang;[!];
  86468. + MarkupTextLiteral - [4..8)::4 - [text] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86469. + Text;[text];
  86470. + MarkupAttributeBlock - [8..16)::8 - [ class=}]
  86471. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86472. + Whitespace;[ ];
  86473. + MarkupTextLiteral - [9..14)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86474. + Text;[class];
  86475. + Equals;[=];
  86476. + GenericBlock - [15..16)::1
  86477. + MarkupLiteralAttributeValue - [15..16)::1 - [}]
  86478. + MarkupTextLiteral - [15..16)::1 - [}] - Gen<None> - SpanEditHandler;Accepts:Any
  86479. + Text;[}];
  86480. + RazorMetaCode - [16..16)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  86481. + RightBrace;[<Missing>];
  86482. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteTextTagInCSharpBlock4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteTextTagInCSharpBlock4.stree.txt
  86483. index a21322e32f4..cfb0682b6f2 100644
  86484. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteTextTagInCSharpBlock4.stree.txt
  86485. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteTextTagInCSharpBlock4.stree.txt
  86486. @@ -1,24 +1,34 @@
  86487. -Markup block - Gen<None> - 20 - (0:0,0)
  86488. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  86489. - SyntaxKind.Unknown;[];
  86490. - Statement block - Gen<None> - 20 - (0:0,0)
  86491. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  86492. - SyntaxKind.Transition;[@];
  86493. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  86494. - SyntaxKind.LeftBrace;[{];
  86495. - Markup block - Gen<None> - 18 - (2:0,2)
  86496. - Tag block - Gen<None> - 18 - (2:0,2)
  86497. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  86498. - SyntaxKind.OpenAngle;[<];
  86499. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  86500. - SyntaxKind.Bang;[!];
  86501. - Markup span - Gen<Markup> - [text] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  86502. - SyntaxKind.Text;[text];
  86503. - Markup block - Gen<Attr:class, class="@(8:0,8),@(20:0,20)> - 12 - (8:0,8)
  86504. - Markup span - Gen<None> - [ class="] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:4
  86505. - SyntaxKind.Whitespace;[ ];
  86506. - SyntaxKind.Text;[class];
  86507. - SyntaxKind.Equals;[=];
  86508. - SyntaxKind.DoubleQuote;["];
  86509. - Markup span - Gen<LitAttr:@(16:0,16)> - [btn}] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  86510. - SyntaxKind.Text;[btn}];
  86511. +RazorDocument - [0..20)::20 - [@{<!text class="btn}]
  86512. + MarkupBlock - [0..20)::20
  86513. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86514. + Marker;[];
  86515. + CSharpCodeBlock - [0..20)::20
  86516. + CSharpStatement - [0..20)::20
  86517. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86518. + Transition;[@];
  86519. + CSharpStatementBody - [1..20)::19
  86520. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86521. + LeftBrace;[{];
  86522. + CSharpCodeBlock - [2..20)::18
  86523. + MarkupBlock - [2..20)::18
  86524. + MarkupTagBlock - [2..20)::18 - [<!text class="btn}]
  86525. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86526. + OpenAngle;[<];
  86527. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86528. + Bang;[!];
  86529. + MarkupTextLiteral - [4..8)::4 - [text] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86530. + Text;[text];
  86531. + MarkupAttributeBlock - [8..20)::12 - [ class="btn}]
  86532. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86533. + Whitespace;[ ];
  86534. + MarkupTextLiteral - [9..14)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86535. + Text;[class];
  86536. + Equals;[=];
  86537. + MarkupTextLiteral - [15..16)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  86538. + DoubleQuote;["];
  86539. + GenericBlock - [16..20)::4
  86540. + MarkupLiteralAttributeValue - [16..20)::4 - [btn}]
  86541. + MarkupTextLiteral - [16..20)::4 - [btn}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86542. + Text;[btn}];
  86543. + RazorMetaCode - [20..20)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  86544. + RightBrace;[<Missing>];
  86545. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteTextTagInCSharpBlock5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteTextTagInCSharpBlock5.stree.txt
  86546. index f4490f882e2..72c4f51c255 100644
  86547. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteTextTagInCSharpBlock5.stree.txt
  86548. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteTextTagInCSharpBlock5.stree.txt
  86549. @@ -1,29 +1,39 @@
  86550. -Markup block - Gen<None> - 21 - (0:0,0)
  86551. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  86552. - SyntaxKind.Unknown;[];
  86553. - Statement block - Gen<None> - 21 - (0:0,0)
  86554. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  86555. - SyntaxKind.Transition;[@];
  86556. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  86557. - SyntaxKind.LeftBrace;[{];
  86558. - Markup block - Gen<None> - 19 - (2:0,2)
  86559. - Tag block - Gen<None> - 19 - (2:0,2)
  86560. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  86561. - SyntaxKind.OpenAngle;[<];
  86562. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  86563. - SyntaxKind.Bang;[!];
  86564. - Markup span - Gen<Markup> - [text] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  86565. - SyntaxKind.Text;[text];
  86566. - Markup block - Gen<Attr:class, class="@(8:0,8),"@(19:0,19)> - 12 - (8:0,8)
  86567. - Markup span - Gen<None> - [ class="] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:4
  86568. - SyntaxKind.Whitespace;[ ];
  86569. - SyntaxKind.Text;[class];
  86570. - SyntaxKind.Equals;[=];
  86571. - SyntaxKind.DoubleQuote;["];
  86572. - Markup span - Gen<LitAttr:@(16:0,16)> - [btn] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  86573. - SyntaxKind.Text;[btn];
  86574. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:1
  86575. - SyntaxKind.DoubleQuote;["];
  86576. - Markup block - Gen<None> - 1 - (20:0,20)
  86577. - Markup span - Gen<Markup> - [}] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:1
  86578. - SyntaxKind.Text;[}];
  86579. +RazorDocument - [0..21)::21 - [@{<!text class="btn"}]
  86580. + MarkupBlock - [0..21)::21
  86581. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86582. + Marker;[];
  86583. + CSharpCodeBlock - [0..21)::21
  86584. + CSharpStatement - [0..21)::21
  86585. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86586. + Transition;[@];
  86587. + CSharpStatementBody - [1..21)::20
  86588. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86589. + LeftBrace;[{];
  86590. + CSharpCodeBlock - [2..21)::19
  86591. + MarkupBlock - [2..21)::19
  86592. + MarkupTagBlock - [2..21)::19 - [<!text class="btn"}]
  86593. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86594. + OpenAngle;[<];
  86595. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86596. + Bang;[!];
  86597. + MarkupTextLiteral - [4..8)::4 - [text] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86598. + Text;[text];
  86599. + MarkupAttributeBlock - [8..20)::12 - [ class="btn"]
  86600. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86601. + Whitespace;[ ];
  86602. + MarkupTextLiteral - [9..14)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86603. + Text;[class];
  86604. + Equals;[=];
  86605. + MarkupTextLiteral - [15..16)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  86606. + DoubleQuote;["];
  86607. + GenericBlock - [16..19)::3
  86608. + MarkupLiteralAttributeValue - [16..19)::3 - [btn]
  86609. + MarkupTextLiteral - [16..19)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86610. + Text;[btn];
  86611. + MarkupTextLiteral - [19..20)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  86612. + DoubleQuote;["];
  86613. + MarkupMinimizedAttributeBlock - [20..21)::1 - [}]
  86614. + MarkupTextLiteral - [20..21)::1 - [}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86615. + Text;[}];
  86616. + RazorMetaCode - [21..21)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  86617. + RightBrace;[<Missing>];
  86618. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteTextTagInCSharpBlock6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteTextTagInCSharpBlock6.stree.txt
  86619. index 21a5461c456..35141aa0967 100644
  86620. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteTextTagInCSharpBlock6.stree.txt
  86621. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptForIncompleteTextTagInCSharpBlock6.stree.txt
  86622. @@ -1,32 +1,42 @@
  86623. -Markup block - Gen<None> - 23 - (0:0,0)
  86624. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  86625. - SyntaxKind.Unknown;[];
  86626. - Statement block - Gen<None> - 23 - (0:0,0)
  86627. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  86628. - SyntaxKind.Transition;[@];
  86629. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  86630. - SyntaxKind.LeftBrace;[{];
  86631. - Markup block - Gen<None> - 21 - (2:0,2)
  86632. - Tag block - Gen<None> - 21 - (2:0,2)
  86633. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  86634. - SyntaxKind.OpenAngle;[<];
  86635. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  86636. - SyntaxKind.Bang;[!];
  86637. - Markup span - Gen<Markup> - [text] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  86638. - SyntaxKind.Text;[text];
  86639. - Markup block - Gen<Attr:class, class="@(8:0,8),"@(19:0,19)> - 12 - (8:0,8)
  86640. - Markup span - Gen<None> - [ class="] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:4
  86641. - SyntaxKind.Whitespace;[ ];
  86642. - SyntaxKind.Text;[class];
  86643. - SyntaxKind.Equals;[=];
  86644. - SyntaxKind.DoubleQuote;["];
  86645. - Markup span - Gen<LitAttr:@(16:0,16)> - [btn] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  86646. - SyntaxKind.Text;[btn];
  86647. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:1
  86648. - SyntaxKind.DoubleQuote;["];
  86649. - Markup span - Gen<Markup> - [ /] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:2
  86650. - SyntaxKind.Whitespace;[ ];
  86651. - SyntaxKind.ForwardSlash;[/];
  86652. - Markup block - Gen<None> - 1 - (22:0,22)
  86653. - Markup span - Gen<Markup> - [}] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:1
  86654. - SyntaxKind.Text;[}];
  86655. +RazorDocument - [0..23)::23 - [@{<!text class="btn" /}]
  86656. + MarkupBlock - [0..23)::23
  86657. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86658. + Marker;[];
  86659. + CSharpCodeBlock - [0..23)::23
  86660. + CSharpStatement - [0..23)::23
  86661. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86662. + Transition;[@];
  86663. + CSharpStatementBody - [1..23)::22
  86664. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86665. + LeftBrace;[{];
  86666. + CSharpCodeBlock - [2..23)::21
  86667. + MarkupBlock - [2..23)::21
  86668. + MarkupTagBlock - [2..23)::21 - [<!text class="btn" /}]
  86669. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86670. + OpenAngle;[<];
  86671. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86672. + Bang;[!];
  86673. + MarkupTextLiteral - [4..8)::4 - [text] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86674. + Text;[text];
  86675. + MarkupAttributeBlock - [8..20)::12 - [ class="btn"]
  86676. + MarkupTextLiteral - [8..9)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86677. + Whitespace;[ ];
  86678. + MarkupTextLiteral - [9..14)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86679. + Text;[class];
  86680. + Equals;[=];
  86681. + MarkupTextLiteral - [15..16)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  86682. + DoubleQuote;["];
  86683. + GenericBlock - [16..19)::3
  86684. + MarkupLiteralAttributeValue - [16..19)::3 - [btn]
  86685. + MarkupTextLiteral - [16..19)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86686. + Text;[btn];
  86687. + MarkupTextLiteral - [19..20)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  86688. + DoubleQuote;["];
  86689. + MarkupTextLiteral - [20..22)::2 - [ /] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86690. + Whitespace;[ ];
  86691. + ForwardSlash;[/];
  86692. + MarkupMinimizedAttributeBlock - [22..23)::1 - [}]
  86693. + MarkupTextLiteral - [22..23)::1 - [}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86694. + Text;[}];
  86695. + RazorMetaCode - [23..23)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  86696. + RightBrace;[<Missing>];
  86697. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithAttributeData1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithAttributeData1.stree.txt
  86698. index cb43adda876..726257ea8e4 100644
  86699. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithAttributeData1.stree.txt
  86700. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithAttributeData1.stree.txt
  86701. @@ -1,30 +1,40 @@
  86702. -Markup block - Gen<None> - 19 - (0:0,0)
  86703. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  86704. - SyntaxKind.Unknown;[];
  86705. - Statement block - Gen<None> - 19 - (0:0,0)
  86706. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  86707. - SyntaxKind.Transition;[@];
  86708. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  86709. - SyntaxKind.LeftBrace;[{];
  86710. - Markup block - Gen<None> - 17 - (2:0,2)
  86711. - Tag block - Gen<None> - 16 - (2:0,2)
  86712. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  86713. - SyntaxKind.OpenAngle;[<];
  86714. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  86715. - SyntaxKind.Bang;[!];
  86716. - Markup span - Gen<Markup> - [p] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  86717. - SyntaxKind.Text;[p];
  86718. - Markup block - Gen<Attr:class, class="@(5:0,5),"@(16:0,16)> - 12 - (5:0,5)
  86719. - Markup span - Gen<None> - [ class="] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:4
  86720. - SyntaxKind.Whitespace;[ ];
  86721. - SyntaxKind.Text;[class];
  86722. - SyntaxKind.Equals;[=];
  86723. - SyntaxKind.DoubleQuote;["];
  86724. - Markup span - Gen<LitAttr:@(13:0,13)> - [btn] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:1
  86725. - SyntaxKind.Text;[btn];
  86726. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  86727. - SyntaxKind.DoubleQuote;["];
  86728. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:None - (17:0,17) - Tokens:1
  86729. - SyntaxKind.CloseAngle;[>];
  86730. - Markup span - Gen<Markup> - [}] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:1
  86731. - SyntaxKind.Text;[}];
  86732. +RazorDocument - [0..19)::19 - [@{<!p class="btn">}]
  86733. + MarkupBlock - [0..19)::19
  86734. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86735. + Marker;[];
  86736. + CSharpCodeBlock - [0..19)::19
  86737. + CSharpStatement - [0..19)::19
  86738. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86739. + Transition;[@];
  86740. + CSharpStatementBody - [1..19)::18
  86741. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86742. + LeftBrace;[{];
  86743. + CSharpCodeBlock - [2..19)::17
  86744. + MarkupBlock - [2..19)::17
  86745. + MarkupTagBlock - [2..18)::16 - [<!p class="btn">]
  86746. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86747. + OpenAngle;[<];
  86748. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86749. + Bang;[!];
  86750. + MarkupTextLiteral - [4..5)::1 - [p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86751. + Text;[p];
  86752. + MarkupAttributeBlock - [5..17)::12 - [ class="btn"]
  86753. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86754. + Whitespace;[ ];
  86755. + MarkupTextLiteral - [6..11)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86756. + Text;[class];
  86757. + Equals;[=];
  86758. + MarkupTextLiteral - [12..13)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  86759. + DoubleQuote;["];
  86760. + GenericBlock - [13..16)::3
  86761. + MarkupLiteralAttributeValue - [13..16)::3 - [btn]
  86762. + MarkupTextLiteral - [13..16)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86763. + Text;[btn];
  86764. + MarkupTextLiteral - [16..17)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  86765. + DoubleQuote;["];
  86766. + MarkupTextLiteral - [17..18)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  86767. + CloseAngle;[>];
  86768. + MarkupTextLiteral - [18..19)::1 - [}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86769. + Text;[}];
  86770. + RazorMetaCode - [19..19)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  86771. + RightBrace;[<Missing>];
  86772. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithAttributeData2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithAttributeData2.stree.txt
  86773. index 5fce9ea8c59..ec8de2b664a 100644
  86774. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithAttributeData2.stree.txt
  86775. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithAttributeData2.stree.txt
  86776. @@ -1,43 +1,51 @@
  86777. -Markup block - Gen<None> - 24 - (0:0,0)
  86778. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  86779. - SyntaxKind.Unknown;[];
  86780. - Statement block - Gen<None> - 24 - (0:0,0)
  86781. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  86782. - SyntaxKind.Transition;[@];
  86783. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  86784. - SyntaxKind.LeftBrace;[{];
  86785. - Markup block - Gen<None> - 21 - (2:0,2)
  86786. - Tag block - Gen<None> - 16 - (2:0,2)
  86787. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  86788. - SyntaxKind.OpenAngle;[<];
  86789. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  86790. - SyntaxKind.Bang;[!];
  86791. - Markup span - Gen<Markup> - [p] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  86792. - SyntaxKind.Text;[p];
  86793. - Markup block - Gen<Attr:class, class="@(5:0,5),"@(16:0,16)> - 12 - (5:0,5)
  86794. - Markup span - Gen<None> - [ class="] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:4
  86795. - SyntaxKind.Whitespace;[ ];
  86796. - SyntaxKind.Text;[class];
  86797. - SyntaxKind.Equals;[=];
  86798. - SyntaxKind.DoubleQuote;["];
  86799. - Markup span - Gen<LitAttr:@(13:0,13)> - [btn] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:1
  86800. - SyntaxKind.Text;[btn];
  86801. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  86802. - SyntaxKind.DoubleQuote;["];
  86803. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:None - (17:0,17) - Tokens:1
  86804. - SyntaxKind.CloseAngle;[>];
  86805. - Tag block - Gen<None> - 5 - (18:0,18)
  86806. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:2
  86807. - SyntaxKind.OpenAngle;[<];
  86808. - SyntaxKind.ForwardSlash;[/];
  86809. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (20:0,20) - Tokens:1
  86810. - SyntaxKind.Bang;[!];
  86811. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:2
  86812. - SyntaxKind.Text;[p];
  86813. - SyntaxKind.CloseAngle;[>];
  86814. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:1
  86815. - SyntaxKind.Unknown;[];
  86816. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (23:0,23) - Tokens:1
  86817. - SyntaxKind.RightBrace;[}];
  86818. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (24:0,24) - Tokens:1
  86819. - SyntaxKind.Unknown;[];
  86820. +RazorDocument - [0..24)::24 - [@{<!p class="btn"></!p>}]
  86821. + MarkupBlock - [0..24)::24
  86822. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86823. + Marker;[];
  86824. + CSharpCodeBlock - [0..24)::24
  86825. + CSharpStatement - [0..24)::24
  86826. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86827. + Transition;[@];
  86828. + CSharpStatementBody - [1..24)::23
  86829. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86830. + LeftBrace;[{];
  86831. + CSharpCodeBlock - [2..23)::21
  86832. + MarkupBlock - [2..23)::21
  86833. + MarkupTagBlock - [2..18)::16 - [<!p class="btn">]
  86834. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86835. + OpenAngle;[<];
  86836. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86837. + Bang;[!];
  86838. + MarkupTextLiteral - [4..5)::1 - [p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86839. + Text;[p];
  86840. + MarkupAttributeBlock - [5..17)::12 - [ class="btn"]
  86841. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86842. + Whitespace;[ ];
  86843. + MarkupTextLiteral - [6..11)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86844. + Text;[class];
  86845. + Equals;[=];
  86846. + MarkupTextLiteral - [12..13)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  86847. + DoubleQuote;["];
  86848. + GenericBlock - [13..16)::3
  86849. + MarkupLiteralAttributeValue - [13..16)::3 - [btn]
  86850. + MarkupTextLiteral - [13..16)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86851. + Text;[btn];
  86852. + MarkupTextLiteral - [16..17)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  86853. + DoubleQuote;["];
  86854. + MarkupTextLiteral - [17..18)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  86855. + CloseAngle;[>];
  86856. + MarkupTagBlock - [18..23)::5 - [</!p>]
  86857. + MarkupTextLiteral - [18..20)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86858. + OpenAngle;[<];
  86859. + ForwardSlash;[/];
  86860. + RazorMetaCode - [20..21)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86861. + Bang;[!];
  86862. + MarkupTextLiteral - [21..23)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  86863. + Text;[p];
  86864. + CloseAngle;[>];
  86865. + CSharpStatementLiteral - [23..23)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  86866. + Marker;[];
  86867. + RazorMetaCode - [23..24)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86868. + RightBrace;[}];
  86869. + MarkupTextLiteral - [24..24)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86870. + Marker;[];
  86871. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithAttributeData3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithAttributeData3.stree.txt
  86872. index f29b08f8904..70c21e5b7fc 100644
  86873. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithAttributeData3.stree.txt
  86874. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithAttributeData3.stree.txt
  86875. @@ -1,49 +1,57 @@
  86876. -Markup block - Gen<None> - 41 - (0:0,0)
  86877. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  86878. - SyntaxKind.Unknown;[];
  86879. - Statement block - Gen<None> - 41 - (0:0,0)
  86880. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  86881. - SyntaxKind.Transition;[@];
  86882. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  86883. - SyntaxKind.LeftBrace;[{];
  86884. - Markup block - Gen<None> - 38 - (2:0,2)
  86885. - Tag block - Gen<None> - 16 - (2:0,2)
  86886. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  86887. - SyntaxKind.OpenAngle;[<];
  86888. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  86889. - SyntaxKind.Bang;[!];
  86890. - Markup span - Gen<Markup> - [p] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  86891. - SyntaxKind.Text;[p];
  86892. - Markup block - Gen<Attr:class, class="@(5:0,5),"@(16:0,16)> - 12 - (5:0,5)
  86893. - Markup span - Gen<None> - [ class="] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:4
  86894. - SyntaxKind.Whitespace;[ ];
  86895. - SyntaxKind.Text;[class];
  86896. - SyntaxKind.Equals;[=];
  86897. - SyntaxKind.DoubleQuote;["];
  86898. - Markup span - Gen<LitAttr:@(13:0,13)> - [btn] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:1
  86899. - SyntaxKind.Text;[btn];
  86900. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  86901. - SyntaxKind.DoubleQuote;["];
  86902. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:None - (17:0,17) - Tokens:1
  86903. - SyntaxKind.CloseAngle;[>];
  86904. - Markup span - Gen<Markup> - [words with spaces] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:5
  86905. - SyntaxKind.Text;[words];
  86906. - SyntaxKind.Whitespace;[ ];
  86907. - SyntaxKind.Text;[with];
  86908. - SyntaxKind.Whitespace;[ ];
  86909. - SyntaxKind.Text;[spaces];
  86910. - Tag block - Gen<None> - 5 - (35:0,35)
  86911. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (35:0,35) - Tokens:2
  86912. - SyntaxKind.OpenAngle;[<];
  86913. - SyntaxKind.ForwardSlash;[/];
  86914. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (37:0,37) - Tokens:1
  86915. - SyntaxKind.Bang;[!];
  86916. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:None - (38:0,38) - Tokens:2
  86917. - SyntaxKind.Text;[p];
  86918. - SyntaxKind.CloseAngle;[>];
  86919. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (40:0,40) - Tokens:1
  86920. - SyntaxKind.Unknown;[];
  86921. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (40:0,40) - Tokens:1
  86922. - SyntaxKind.RightBrace;[}];
  86923. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (41:0,41) - Tokens:1
  86924. - SyntaxKind.Unknown;[];
  86925. +RazorDocument - [0..41)::41 - [@{<!p class="btn">words with spaces</!p>}]
  86926. + MarkupBlock - [0..41)::41
  86927. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86928. + Marker;[];
  86929. + CSharpCodeBlock - [0..41)::41
  86930. + CSharpStatement - [0..41)::41
  86931. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86932. + Transition;[@];
  86933. + CSharpStatementBody - [1..41)::40
  86934. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86935. + LeftBrace;[{];
  86936. + CSharpCodeBlock - [2..40)::38
  86937. + MarkupBlock - [2..40)::38
  86938. + MarkupTagBlock - [2..18)::16 - [<!p class="btn">]
  86939. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86940. + OpenAngle;[<];
  86941. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86942. + Bang;[!];
  86943. + MarkupTextLiteral - [4..5)::1 - [p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86944. + Text;[p];
  86945. + MarkupAttributeBlock - [5..17)::12 - [ class="btn"]
  86946. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86947. + Whitespace;[ ];
  86948. + MarkupTextLiteral - [6..11)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86949. + Text;[class];
  86950. + Equals;[=];
  86951. + MarkupTextLiteral - [12..13)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  86952. + DoubleQuote;["];
  86953. + GenericBlock - [13..16)::3
  86954. + MarkupLiteralAttributeValue - [13..16)::3 - [btn]
  86955. + MarkupTextLiteral - [13..16)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86956. + Text;[btn];
  86957. + MarkupTextLiteral - [16..17)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  86958. + DoubleQuote;["];
  86959. + MarkupTextLiteral - [17..18)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  86960. + CloseAngle;[>];
  86961. + MarkupTextLiteral - [18..35)::17 - [words with spaces] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86962. + Text;[words];
  86963. + Whitespace;[ ];
  86964. + Text;[with];
  86965. + Whitespace;[ ];
  86966. + Text;[spaces];
  86967. + MarkupTagBlock - [35..40)::5 - [</!p>]
  86968. + MarkupTextLiteral - [35..37)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86969. + OpenAngle;[<];
  86970. + ForwardSlash;[/];
  86971. + RazorMetaCode - [37..38)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86972. + Bang;[!];
  86973. + MarkupTextLiteral - [38..40)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  86974. + Text;[p];
  86975. + CloseAngle;[>];
  86976. + CSharpStatementLiteral - [40..40)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  86977. + Marker;[];
  86978. + RazorMetaCode - [40..41)::1 - Gen<None> - SpanEditHandler;Accepts:None
  86979. + RightBrace;[}];
  86980. + MarkupTextLiteral - [41..41)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  86981. + Marker;[];
  86982. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithAttributeData4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithAttributeData4.stree.txt
  86983. index 1bf92e47d84..daf37304237 100644
  86984. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithAttributeData4.stree.txt
  86985. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithAttributeData4.stree.txt
  86986. @@ -1,53 +1,66 @@
  86987. -Markup block - Gen<None> - 41 - (0:0,0)
  86988. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  86989. - SyntaxKind.Unknown;[];
  86990. - Statement block - Gen<None> - 41 - (0:0,0)
  86991. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  86992. - SyntaxKind.Transition;[@];
  86993. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  86994. - SyntaxKind.LeftBrace;[{];
  86995. - Markup block - Gen<None> - 38 - (2:0,2)
  86996. - Tag block - Gen<None> - 33 - (2:0,2)
  86997. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  86998. - SyntaxKind.OpenAngle;[<];
  86999. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  87000. - SyntaxKind.Bang;[!];
  87001. - Markup span - Gen<Markup> - [p] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  87002. - SyntaxKind.Text;[p];
  87003. - Markup block - Gen<Attr:class, class='@(5:0,5),'@(22:0,22)> - 18 - (5:0,5)
  87004. - Markup span - Gen<None> - [ class='] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:4
  87005. - SyntaxKind.Whitespace;[ ];
  87006. - SyntaxKind.Text;[class];
  87007. - SyntaxKind.Equals;[=];
  87008. - SyntaxKind.SingleQuote;['];
  87009. - Markup span - Gen<LitAttr:@(13:0,13)> - [btn1] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:1
  87010. - SyntaxKind.Text;[btn1];
  87011. - Markup span - Gen<LitAttr: @(17:0,17)> - [ btn2] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:2
  87012. - SyntaxKind.Whitespace;[ ];
  87013. - SyntaxKind.Text;[btn2];
  87014. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:1
  87015. - SyntaxKind.SingleQuote;['];
  87016. - Markup block - Gen<Attr:class2, class2=@(23:0,23),@(34:0,34)> - 11 - (23:0,23)
  87017. - Markup span - Gen<None> - [ class2=] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:3
  87018. - SyntaxKind.Whitespace;[ ];
  87019. - SyntaxKind.Text;[class2];
  87020. - SyntaxKind.Equals;[=];
  87021. - Markup span - Gen<LitAttr:@(31:0,31)> - [btn] - SpanEditHandler;Accepts:Any - (31:0,31) - Tokens:1
  87022. - SyntaxKind.Text;[btn];
  87023. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:None - (34:0,34) - Tokens:1
  87024. - SyntaxKind.CloseAngle;[>];
  87025. - Tag block - Gen<None> - 5 - (35:0,35)
  87026. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (35:0,35) - Tokens:2
  87027. - SyntaxKind.OpenAngle;[<];
  87028. - SyntaxKind.ForwardSlash;[/];
  87029. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (37:0,37) - Tokens:1
  87030. - SyntaxKind.Bang;[!];
  87031. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:None - (38:0,38) - Tokens:2
  87032. - SyntaxKind.Text;[p];
  87033. - SyntaxKind.CloseAngle;[>];
  87034. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (40:0,40) - Tokens:1
  87035. - SyntaxKind.Unknown;[];
  87036. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (40:0,40) - Tokens:1
  87037. - SyntaxKind.RightBrace;[}];
  87038. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (41:0,41) - Tokens:1
  87039. - SyntaxKind.Unknown;[];
  87040. +RazorDocument - [0..41)::41 - [@{<!p class='btn1 btn2' class2=btn></!p>}]
  87041. + MarkupBlock - [0..41)::41
  87042. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87043. + Marker;[];
  87044. + CSharpCodeBlock - [0..41)::41
  87045. + CSharpStatement - [0..41)::41
  87046. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87047. + Transition;[@];
  87048. + CSharpStatementBody - [1..41)::40
  87049. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87050. + LeftBrace;[{];
  87051. + CSharpCodeBlock - [2..40)::38
  87052. + MarkupBlock - [2..40)::38
  87053. + MarkupTagBlock - [2..35)::33 - [<!p class='btn1 btn2' class2=btn>]
  87054. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87055. + OpenAngle;[<];
  87056. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87057. + Bang;[!];
  87058. + MarkupTextLiteral - [4..5)::1 - [p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87059. + Text;[p];
  87060. + MarkupAttributeBlock - [5..23)::18 - [ class='btn1 btn2']
  87061. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87062. + Whitespace;[ ];
  87063. + MarkupTextLiteral - [6..11)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87064. + Text;[class];
  87065. + Equals;[=];
  87066. + MarkupTextLiteral - [12..13)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  87067. + SingleQuote;['];
  87068. + GenericBlock - [13..22)::9
  87069. + MarkupLiteralAttributeValue - [13..17)::4 - [btn1]
  87070. + MarkupTextLiteral - [13..17)::4 - [btn1] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87071. + Text;[btn1];
  87072. + MarkupLiteralAttributeValue - [17..22)::5 - [ btn2]
  87073. + MarkupTextLiteral - [17..18)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87074. + Whitespace;[ ];
  87075. + MarkupTextLiteral - [18..22)::4 - [btn2] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87076. + Text;[btn2];
  87077. + MarkupTextLiteral - [22..23)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  87078. + SingleQuote;['];
  87079. + MarkupAttributeBlock - [23..34)::11 - [ class2=btn]
  87080. + MarkupTextLiteral - [23..24)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87081. + Whitespace;[ ];
  87082. + MarkupTextLiteral - [24..30)::6 - [class2] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87083. + Text;[class2];
  87084. + Equals;[=];
  87085. + GenericBlock - [31..34)::3
  87086. + MarkupLiteralAttributeValue - [31..34)::3 - [btn]
  87087. + MarkupTextLiteral - [31..34)::3 - [btn] - Gen<None> - SpanEditHandler;Accepts:Any
  87088. + Text;[btn];
  87089. + MarkupTextLiteral - [34..35)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87090. + CloseAngle;[>];
  87091. + MarkupTagBlock - [35..40)::5 - [</!p>]
  87092. + MarkupTextLiteral - [35..37)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87093. + OpenAngle;[<];
  87094. + ForwardSlash;[/];
  87095. + RazorMetaCode - [37..38)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87096. + Bang;[!];
  87097. + MarkupTextLiteral - [38..40)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87098. + Text;[p];
  87099. + CloseAngle;[>];
  87100. + CSharpStatementLiteral - [40..40)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  87101. + Marker;[];
  87102. + RazorMetaCode - [40..41)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87103. + RightBrace;[}];
  87104. + MarkupTextLiteral - [41..41)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87105. + Marker;[];
  87106. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithAttributeData5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithAttributeData5.stree.txt
  87107. index 21f9fa95b2a..025747eb001 100644
  87108. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithAttributeData5.stree.txt
  87109. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithAttributeData5.stree.txt
  87110. @@ -1,56 +1,70 @@
  87111. -Markup block - Gen<None> - 44 - (0:0,0)
  87112. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  87113. - SyntaxKind.Unknown;[];
  87114. - Statement block - Gen<None> - 44 - (0:0,0)
  87115. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  87116. - SyntaxKind.Transition;[@];
  87117. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  87118. - SyntaxKind.LeftBrace;[{];
  87119. - Markup block - Gen<None> - 41 - (2:0,2)
  87120. - Tag block - Gen<None> - 36 - (2:0,2)
  87121. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  87122. - SyntaxKind.OpenAngle;[<];
  87123. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  87124. - SyntaxKind.Bang;[!];
  87125. - Markup span - Gen<Markup> - [p] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  87126. - SyntaxKind.Text;[p];
  87127. - Markup block - Gen<Attr:class, class='@(5:0,5),'@(36:0,36)> - 32 - (5:0,5)
  87128. - Markup span - Gen<None> - [ class='] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:4
  87129. - SyntaxKind.Whitespace;[ ];
  87130. - SyntaxKind.Text;[class];
  87131. - SyntaxKind.Equals;[=];
  87132. - SyntaxKind.SingleQuote;['];
  87133. - Markup span - Gen<LitAttr:@(13:0,13)> - [btn1] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:1
  87134. - SyntaxKind.Text;[btn1];
  87135. - Markup block - Gen<DynAttr: @(17:0,17)> - 14 - (17:0,17)
  87136. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:1
  87137. - SyntaxKind.Whitespace;[ ];
  87138. - Expression block - Gen<Expr> - 13 - (18:0,18)
  87139. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (18:0,18) - Tokens:1
  87140. - SyntaxKind.Transition;[@];
  87141. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (19:0,19) - Tokens:3
  87142. - SyntaxKind.Identifier;[DateTime];
  87143. - SyntaxKind.Dot;[.];
  87144. - SyntaxKind.Identifier;[Now];
  87145. - Markup span - Gen<LitAttr: @(31:0,31)> - [ btn2] - SpanEditHandler;Accepts:Any - (31:0,31) - Tokens:2
  87146. - SyntaxKind.Whitespace;[ ];
  87147. - SyntaxKind.Text;[btn2];
  87148. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (36:0,36) - Tokens:1
  87149. - SyntaxKind.SingleQuote;['];
  87150. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:None - (37:0,37) - Tokens:1
  87151. - SyntaxKind.CloseAngle;[>];
  87152. - Tag block - Gen<None> - 5 - (38:0,38)
  87153. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (38:0,38) - Tokens:2
  87154. - SyntaxKind.OpenAngle;[<];
  87155. - SyntaxKind.ForwardSlash;[/];
  87156. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (40:0,40) - Tokens:1
  87157. - SyntaxKind.Bang;[!];
  87158. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:None - (41:0,41) - Tokens:2
  87159. - SyntaxKind.Text;[p];
  87160. - SyntaxKind.CloseAngle;[>];
  87161. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (43:0,43) - Tokens:1
  87162. - SyntaxKind.Unknown;[];
  87163. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (43:0,43) - Tokens:1
  87164. - SyntaxKind.RightBrace;[}];
  87165. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (44:0,44) - Tokens:1
  87166. - SyntaxKind.Unknown;[];
  87167. +RazorDocument - [0..44)::44 - [@{<!p class='btn1 @DateTime.Now btn2'></!p>}]
  87168. + MarkupBlock - [0..44)::44
  87169. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87170. + Marker;[];
  87171. + CSharpCodeBlock - [0..44)::44
  87172. + CSharpStatement - [0..44)::44
  87173. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87174. + Transition;[@];
  87175. + CSharpStatementBody - [1..44)::43
  87176. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87177. + LeftBrace;[{];
  87178. + CSharpCodeBlock - [2..43)::41
  87179. + MarkupBlock - [2..43)::41
  87180. + MarkupTagBlock - [2..38)::36 - [<!p class='btn1 @DateTime.Now btn2'>]
  87181. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87182. + OpenAngle;[<];
  87183. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87184. + Bang;[!];
  87185. + MarkupTextLiteral - [4..5)::1 - [p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87186. + Text;[p];
  87187. + MarkupAttributeBlock - [5..37)::32 - [ class='btn1 @DateTime.Now btn2']
  87188. + MarkupTextLiteral - [5..6)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87189. + Whitespace;[ ];
  87190. + MarkupTextLiteral - [6..11)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87191. + Text;[class];
  87192. + Equals;[=];
  87193. + MarkupTextLiteral - [12..13)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  87194. + SingleQuote;['];
  87195. + GenericBlock - [13..36)::23
  87196. + MarkupLiteralAttributeValue - [13..17)::4 - [btn1]
  87197. + MarkupTextLiteral - [13..17)::4 - [btn1] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87198. + Text;[btn1];
  87199. + MarkupDynamicAttributeValue - [17..31)::14 - [ @DateTime.Now]
  87200. + MarkupTextLiteral - [17..18)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87201. + Whitespace;[ ];
  87202. + GenericBlock - [18..31)::13
  87203. + CSharpCodeBlock - [18..31)::13
  87204. + CSharpImplicitExpression - [18..31)::13
  87205. + CSharpTransition - [18..19)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87206. + Transition;[@];
  87207. + CSharpImplicitExpressionBody - [19..31)::12
  87208. + CSharpCodeBlock - [19..31)::12
  87209. + CSharpExpressionLiteral - [19..31)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  87210. + Identifier;[DateTime];
  87211. + Dot;[.];
  87212. + Identifier;[Now];
  87213. + MarkupLiteralAttributeValue - [31..36)::5 - [ btn2]
  87214. + MarkupTextLiteral - [31..32)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87215. + Whitespace;[ ];
  87216. + MarkupTextLiteral - [32..36)::4 - [btn2] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87217. + Text;[btn2];
  87218. + MarkupTextLiteral - [36..37)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  87219. + SingleQuote;['];
  87220. + MarkupTextLiteral - [37..38)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87221. + CloseAngle;[>];
  87222. + MarkupTagBlock - [38..43)::5 - [</!p>]
  87223. + MarkupTextLiteral - [38..40)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87224. + OpenAngle;[<];
  87225. + ForwardSlash;[/];
  87226. + RazorMetaCode - [40..41)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87227. + Bang;[!];
  87228. + MarkupTextLiteral - [41..43)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87229. + Text;[p];
  87230. + CloseAngle;[>];
  87231. + CSharpStatementLiteral - [43..43)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  87232. + Marker;[];
  87233. + RazorMetaCode - [43..44)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87234. + RightBrace;[}];
  87235. + MarkupTextLiteral - [44..44)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87236. + Marker;[];
  87237. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData1.stree.txt
  87238. index 5fb4942355f..50b192a1b13 100644
  87239. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData1.stree.txt
  87240. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData1.stree.txt
  87241. @@ -1,19 +1,25 @@
  87242. -Markup block - Gen<None> - 7 - (0:0,0)
  87243. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  87244. - SyntaxKind.Unknown;[];
  87245. - Statement block - Gen<None> - 7 - (0:0,0)
  87246. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  87247. - SyntaxKind.Transition;[@];
  87248. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  87249. - SyntaxKind.LeftBrace;[{];
  87250. - Markup block - Gen<None> - 5 - (2:0,2)
  87251. - Tag block - Gen<None> - 4 - (2:0,2)
  87252. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  87253. - SyntaxKind.OpenAngle;[<];
  87254. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  87255. - SyntaxKind.Bang;[!];
  87256. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:None - (4:0,4) - Tokens:2
  87257. - SyntaxKind.Text;[p];
  87258. - SyntaxKind.CloseAngle;[>];
  87259. - Markup span - Gen<Markup> - [}] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:1
  87260. - SyntaxKind.Text;[}];
  87261. +RazorDocument - [0..7)::7 - [@{<!p>}]
  87262. + MarkupBlock - [0..7)::7
  87263. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87264. + Marker;[];
  87265. + CSharpCodeBlock - [0..7)::7
  87266. + CSharpStatement - [0..7)::7
  87267. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87268. + Transition;[@];
  87269. + CSharpStatementBody - [1..7)::6
  87270. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87271. + LeftBrace;[{];
  87272. + CSharpCodeBlock - [2..7)::5
  87273. + MarkupBlock - [2..7)::5
  87274. + MarkupTagBlock - [2..6)::4 - [<!p>]
  87275. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87276. + OpenAngle;[<];
  87277. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87278. + Bang;[!];
  87279. + MarkupTextLiteral - [4..6)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87280. + Text;[p];
  87281. + CloseAngle;[>];
  87282. + MarkupTextLiteral - [6..7)::1 - [}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87283. + Text;[}];
  87284. + RazorMetaCode - [7..7)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  87285. + RightBrace;[<Missing>];
  87286. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData10.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData10.stree.txt
  87287. index af2417dd03d..1618647cbea 100644
  87288. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData10.stree.txt
  87289. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData10.stree.txt
  87290. @@ -1,33 +1,41 @@
  87291. -Markup block - Gen<None> - 25 - (0:0,0)
  87292. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  87293. - SyntaxKind.Unknown;[];
  87294. - Statement block - Gen<None> - 25 - (0:0,0)
  87295. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  87296. - SyntaxKind.Transition;[@];
  87297. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  87298. - SyntaxKind.LeftBrace;[{];
  87299. - Markup block - Gen<None> - 13 - (2:0,2)
  87300. - Tag block - Gen<TagHelper> - 13 - (2:0,2) - strong - strongtaghelper
  87301. - StartTagAndEndTag - <strong>
  87302. - Tag block - Gen<None> - 5 - (10:0,10)
  87303. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:2
  87304. - SyntaxKind.OpenAngle;[<];
  87305. - SyntaxKind.ForwardSlash;[/];
  87306. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:1
  87307. - SyntaxKind.Bang;[!];
  87308. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:2
  87309. - SyntaxKind.Text;[p];
  87310. - SyntaxKind.CloseAngle;[>];
  87311. - Markup block - Gen<None> - 9 - (15:0,15)
  87312. - Tag block - Gen<None> - 9 - (15:0,15)
  87313. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:4
  87314. - SyntaxKind.OpenAngle;[<];
  87315. - SyntaxKind.ForwardSlash;[/];
  87316. - SyntaxKind.Text;[strong];
  87317. - SyntaxKind.CloseAngle;[>];
  87318. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (24:0,24) - Tokens:1
  87319. - SyntaxKind.Unknown;[];
  87320. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (24:0,24) - Tokens:1
  87321. - SyntaxKind.RightBrace;[}];
  87322. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:1
  87323. - SyntaxKind.Unknown;[];
  87324. +RazorDocument - [0..25)::25 - [@{<strong></!p></strong>}]
  87325. + MarkupBlock - [0..25)::25
  87326. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87327. + Marker;[];
  87328. + CSharpCodeBlock - [0..25)::25
  87329. + CSharpStatement - [0..25)::25
  87330. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87331. + Transition;[@];
  87332. + CSharpStatementBody - [1..25)::24
  87333. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87334. + LeftBrace;[{];
  87335. + CSharpCodeBlock - [2..24)::22
  87336. + MarkupBlock - [2..15)::13
  87337. + MarkupTagHelperElement - [2..15)::13 - strong[StartTagAndEndTag] - strongtaghelper
  87338. + MarkupTagHelperStartTag - [2..10)::8
  87339. + MarkupTextLiteral - [2..10)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87340. + OpenAngle;[<];
  87341. + Text;[strong];
  87342. + CloseAngle;[>];
  87343. + MarkupTagBlock - [10..15)::5 - [</!p>]
  87344. + MarkupTextLiteral - [10..12)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87345. + OpenAngle;[<];
  87346. + ForwardSlash;[/];
  87347. + RazorMetaCode - [12..13)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87348. + Bang;[!];
  87349. + MarkupTextLiteral - [13..15)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87350. + Text;[p];
  87351. + CloseAngle;[>];
  87352. + MarkupBlock - [15..24)::9
  87353. + MarkupTagBlock - [15..24)::9 - [</strong>]
  87354. + MarkupTextLiteral - [15..24)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87355. + OpenAngle;[<];
  87356. + ForwardSlash;[/];
  87357. + Text;[strong];
  87358. + CloseAngle;[>];
  87359. + CSharpStatementLiteral - [24..24)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  87360. + Marker;[];
  87361. + RazorMetaCode - [24..25)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87362. + RightBrace;[}];
  87363. + MarkupTextLiteral - [25..25)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87364. + Marker;[];
  87365. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData11.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData11.stree.txt
  87366. index 71809b696f8..687be1c9a87 100644
  87367. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData11.stree.txt
  87368. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData11.stree.txt
  87369. @@ -1,35 +1,49 @@
  87370. -Markup block - Gen<None> - 29 - (0:0,0)
  87371. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  87372. - SyntaxKind.Unknown;[];
  87373. - Statement block - Gen<None> - 29 - (0:0,0)
  87374. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  87375. - SyntaxKind.Transition;[@];
  87376. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  87377. - SyntaxKind.LeftBrace;[{];
  87378. - Markup block - Gen<None> - 17 - (2:0,2)
  87379. - Tag block - Gen<TagHelper> - 17 - (2:0,2) - strong - strongtaghelper
  87380. - StartTagAndEndTag - <strong> ... </strong>
  87381. - Markup block - Gen<None> - 9 - (19:0,19)
  87382. - Tag block - Gen<None> - 4 - (19:0,19)
  87383. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:1
  87384. - SyntaxKind.OpenAngle;[<];
  87385. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (20:0,20) - Tokens:1
  87386. - SyntaxKind.Bang;[!];
  87387. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:None - (21:0,21) - Tokens:2
  87388. - SyntaxKind.Text;[p];
  87389. - SyntaxKind.CloseAngle;[>];
  87390. - Tag block - Gen<None> - 5 - (23:0,23)
  87391. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:2
  87392. - SyntaxKind.OpenAngle;[<];
  87393. - SyntaxKind.ForwardSlash;[/];
  87394. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (25:0,25) - Tokens:1
  87395. - SyntaxKind.Bang;[!];
  87396. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:None - (26:0,26) - Tokens:2
  87397. - SyntaxKind.Text;[p];
  87398. - SyntaxKind.CloseAngle;[>];
  87399. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (28:0,28) - Tokens:1
  87400. - SyntaxKind.Unknown;[];
  87401. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (28:0,28) - Tokens:1
  87402. - SyntaxKind.RightBrace;[}];
  87403. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (29:0,29) - Tokens:1
  87404. - SyntaxKind.Unknown;[];
  87405. +RazorDocument - [0..29)::29 - [@{<strong></strong><!p></!p>}]
  87406. + MarkupBlock - [0..29)::29
  87407. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87408. + Marker;[];
  87409. + CSharpCodeBlock - [0..29)::29
  87410. + CSharpStatement - [0..29)::29
  87411. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87412. + Transition;[@];
  87413. + CSharpStatementBody - [1..29)::28
  87414. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87415. + LeftBrace;[{];
  87416. + CSharpCodeBlock - [2..28)::26
  87417. + MarkupBlock - [2..19)::17
  87418. + MarkupTagHelperElement - [2..19)::17 - strong[StartTagAndEndTag] - strongtaghelper
  87419. + MarkupTagHelperStartTag - [2..10)::8
  87420. + MarkupTextLiteral - [2..10)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87421. + OpenAngle;[<];
  87422. + Text;[strong];
  87423. + CloseAngle;[>];
  87424. + MarkupTagHelperEndTag - [10..19)::9
  87425. + MarkupTextLiteral - [10..19)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87426. + OpenAngle;[<];
  87427. + ForwardSlash;[/];
  87428. + Text;[strong];
  87429. + CloseAngle;[>];
  87430. + MarkupBlock - [19..28)::9
  87431. + MarkupTagBlock - [19..23)::4 - [<!p>]
  87432. + MarkupTextLiteral - [19..20)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87433. + OpenAngle;[<];
  87434. + RazorMetaCode - [20..21)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87435. + Bang;[!];
  87436. + MarkupTextLiteral - [21..23)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87437. + Text;[p];
  87438. + CloseAngle;[>];
  87439. + MarkupTagBlock - [23..28)::5 - [</!p>]
  87440. + MarkupTextLiteral - [23..25)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87441. + OpenAngle;[<];
  87442. + ForwardSlash;[/];
  87443. + RazorMetaCode - [25..26)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87444. + Bang;[!];
  87445. + MarkupTextLiteral - [26..28)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87446. + Text;[p];
  87447. + CloseAngle;[>];
  87448. + CSharpStatementLiteral - [28..28)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  87449. + Marker;[];
  87450. + RazorMetaCode - [28..29)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87451. + RightBrace;[}];
  87452. + MarkupTextLiteral - [29..29)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87453. + Marker;[];
  87454. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData12.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData12.stree.txt
  87455. index 1797510881d..9794d12749f 100644
  87456. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData12.stree.txt
  87457. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData12.stree.txt
  87458. @@ -1,53 +1,65 @@
  87459. -Markup block - Gen<None> - 42 - (0:0,0)
  87460. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  87461. - SyntaxKind.Unknown;[];
  87462. - Statement block - Gen<None> - 42 - (0:0,0)
  87463. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  87464. - SyntaxKind.Transition;[@];
  87465. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  87466. - SyntaxKind.LeftBrace;[{];
  87467. - Markup block - Gen<None> - 21 - (2:0,2)
  87468. - Tag block - Gen<TagHelper> - 21 - (2:0,2) - p - ptaghelper
  87469. - StartTagAndEndTag - <p>
  87470. - Tag block - Gen<TagHelper> - 18 - (5:0,5) - strong - strongtaghelper
  87471. - StartTagAndEndTag - <strong>
  87472. - Tag block - Gen<None> - 10 - (13:0,13)
  87473. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:2
  87474. - SyntaxKind.OpenAngle;[<];
  87475. - SyntaxKind.ForwardSlash;[/];
  87476. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:1
  87477. - SyntaxKind.Bang;[!];
  87478. - Markup span - Gen<Markup> - [strong>] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:2
  87479. - SyntaxKind.Text;[strong];
  87480. - SyntaxKind.CloseAngle;[>];
  87481. - Markup block - Gen<None> - 13 - (23:0,23)
  87482. - Tag block - Gen<None> - 4 - (23:0,23)
  87483. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:1
  87484. - SyntaxKind.OpenAngle;[<];
  87485. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (24:0,24) - Tokens:1
  87486. - SyntaxKind.Bang;[!];
  87487. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:None - (25:0,25) - Tokens:2
  87488. - SyntaxKind.Text;[p];
  87489. - SyntaxKind.CloseAngle;[>];
  87490. - Tag block - Gen<None> - 9 - (27:0,27)
  87491. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:None - (27:0,27) - Tokens:4
  87492. - SyntaxKind.OpenAngle;[<];
  87493. - SyntaxKind.ForwardSlash;[/];
  87494. - SyntaxKind.Text;[strong];
  87495. - SyntaxKind.CloseAngle;[>];
  87496. - Markup block - Gen<None> - 5 - (36:0,36)
  87497. - Tag block - Gen<None> - 5 - (36:0,36)
  87498. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (36:0,36) - Tokens:2
  87499. - SyntaxKind.OpenAngle;[<];
  87500. - SyntaxKind.ForwardSlash;[/];
  87501. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (38:0,38) - Tokens:1
  87502. - SyntaxKind.Bang;[!];
  87503. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:None - (39:0,39) - Tokens:2
  87504. - SyntaxKind.Text;[p];
  87505. - SyntaxKind.CloseAngle;[>];
  87506. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (41:0,41) - Tokens:1
  87507. - SyntaxKind.Unknown;[];
  87508. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (41:0,41) - Tokens:1
  87509. - SyntaxKind.RightBrace;[}];
  87510. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (42:0,42) - Tokens:1
  87511. - SyntaxKind.Unknown;[];
  87512. +RazorDocument - [0..42)::42 - [@{<p><strong></!strong><!p></strong></!p>}]
  87513. + MarkupBlock - [0..42)::42
  87514. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87515. + Marker;[];
  87516. + CSharpCodeBlock - [0..42)::42
  87517. + CSharpStatement - [0..42)::42
  87518. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87519. + Transition;[@];
  87520. + CSharpStatementBody - [1..42)::41
  87521. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87522. + LeftBrace;[{];
  87523. + CSharpCodeBlock - [2..41)::39
  87524. + MarkupBlock - [2..23)::21
  87525. + MarkupTagHelperElement - [2..23)::21 - p[StartTagAndEndTag] - ptaghelper
  87526. + MarkupTagHelperStartTag - [2..5)::3
  87527. + MarkupTextLiteral - [2..5)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87528. + OpenAngle;[<];
  87529. + Text;[p];
  87530. + CloseAngle;[>];
  87531. + MarkupTagHelperElement - [5..23)::18 - strong[StartTagAndEndTag] - strongtaghelper
  87532. + MarkupTagHelperStartTag - [5..13)::8
  87533. + MarkupTextLiteral - [5..13)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87534. + OpenAngle;[<];
  87535. + Text;[strong];
  87536. + CloseAngle;[>];
  87537. + MarkupTagBlock - [13..23)::10 - [</!strong>]
  87538. + MarkupTextLiteral - [13..15)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87539. + OpenAngle;[<];
  87540. + ForwardSlash;[/];
  87541. + RazorMetaCode - [15..16)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87542. + Bang;[!];
  87543. + MarkupTextLiteral - [16..23)::7 - [strong>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87544. + Text;[strong];
  87545. + CloseAngle;[>];
  87546. + MarkupBlock - [23..36)::13
  87547. + MarkupTagBlock - [23..27)::4 - [<!p>]
  87548. + MarkupTextLiteral - [23..24)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87549. + OpenAngle;[<];
  87550. + RazorMetaCode - [24..25)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87551. + Bang;[!];
  87552. + MarkupTextLiteral - [25..27)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87553. + Text;[p];
  87554. + CloseAngle;[>];
  87555. + MarkupTagBlock - [27..36)::9 - [</strong>]
  87556. + MarkupTextLiteral - [27..36)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87557. + OpenAngle;[<];
  87558. + ForwardSlash;[/];
  87559. + Text;[strong];
  87560. + CloseAngle;[>];
  87561. + MarkupBlock - [36..41)::5
  87562. + MarkupTagBlock - [36..41)::5 - [</!p>]
  87563. + MarkupTextLiteral - [36..38)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87564. + OpenAngle;[<];
  87565. + ForwardSlash;[/];
  87566. + RazorMetaCode - [38..39)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87567. + Bang;[!];
  87568. + MarkupTextLiteral - [39..41)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87569. + Text;[p];
  87570. + CloseAngle;[>];
  87571. + CSharpStatementLiteral - [41..41)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  87572. + Marker;[];
  87573. + RazorMetaCode - [41..42)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87574. + RightBrace;[}];
  87575. + MarkupTextLiteral - [42..42)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87576. + Marker;[];
  87577. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData2.stree.txt
  87578. index 8da34473c71..b77794b95ca 100644
  87579. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData2.stree.txt
  87580. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData2.stree.txt
  87581. @@ -1,24 +1,28 @@
  87582. -Markup block - Gen<None> - 8 - (0:0,0)
  87583. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  87584. - SyntaxKind.Unknown;[];
  87585. - Statement block - Gen<None> - 8 - (0:0,0)
  87586. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  87587. - SyntaxKind.Transition;[@];
  87588. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  87589. - SyntaxKind.LeftBrace;[{];
  87590. - Markup block - Gen<None> - 5 - (2:0,2)
  87591. - Tag block - Gen<None> - 5 - (2:0,2)
  87592. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:2
  87593. - SyntaxKind.OpenAngle;[<];
  87594. - SyntaxKind.ForwardSlash;[/];
  87595. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (4:0,4) - Tokens:1
  87596. - SyntaxKind.Bang;[!];
  87597. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:None - (5:0,5) - Tokens:2
  87598. - SyntaxKind.Text;[p];
  87599. - SyntaxKind.CloseAngle;[>];
  87600. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (7:0,7) - Tokens:1
  87601. - SyntaxKind.Unknown;[];
  87602. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (7:0,7) - Tokens:1
  87603. - SyntaxKind.RightBrace;[}];
  87604. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:1
  87605. - SyntaxKind.Unknown;[];
  87606. +RazorDocument - [0..8)::8 - [@{</!p>}]
  87607. + MarkupBlock - [0..8)::8
  87608. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87609. + Marker;[];
  87610. + CSharpCodeBlock - [0..8)::8
  87611. + CSharpStatement - [0..8)::8
  87612. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87613. + Transition;[@];
  87614. + CSharpStatementBody - [1..8)::7
  87615. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87616. + LeftBrace;[{];
  87617. + CSharpCodeBlock - [2..7)::5
  87618. + MarkupBlock - [2..7)::5
  87619. + MarkupTagBlock - [2..7)::5 - [</!p>]
  87620. + MarkupTextLiteral - [2..4)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87621. + OpenAngle;[<];
  87622. + ForwardSlash;[/];
  87623. + RazorMetaCode - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87624. + Bang;[!];
  87625. + MarkupTextLiteral - [5..7)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87626. + Text;[p];
  87627. + CloseAngle;[>];
  87628. + CSharpStatementLiteral - [7..7)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  87629. + Marker;[];
  87630. + RazorMetaCode - [7..8)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87631. + RightBrace;[}];
  87632. + MarkupTextLiteral - [8..8)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87633. + Marker;[];
  87634. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData3.stree.txt
  87635. index 55b5fdda076..c8c84f6492f 100644
  87636. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData3.stree.txt
  87637. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData3.stree.txt
  87638. @@ -1,32 +1,36 @@
  87639. -Markup block - Gen<None> - 12 - (0:0,0)
  87640. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  87641. - SyntaxKind.Unknown;[];
  87642. - Statement block - Gen<None> - 12 - (0:0,0)
  87643. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  87644. - SyntaxKind.Transition;[@];
  87645. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  87646. - SyntaxKind.LeftBrace;[{];
  87647. - Markup block - Gen<None> - 9 - (2:0,2)
  87648. - Tag block - Gen<None> - 4 - (2:0,2)
  87649. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  87650. - SyntaxKind.OpenAngle;[<];
  87651. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  87652. - SyntaxKind.Bang;[!];
  87653. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:None - (4:0,4) - Tokens:2
  87654. - SyntaxKind.Text;[p];
  87655. - SyntaxKind.CloseAngle;[>];
  87656. - Tag block - Gen<None> - 5 - (6:0,6)
  87657. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:2
  87658. - SyntaxKind.OpenAngle;[<];
  87659. - SyntaxKind.ForwardSlash;[/];
  87660. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (8:0,8) - Tokens:1
  87661. - SyntaxKind.Bang;[!];
  87662. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:None - (9:0,9) - Tokens:2
  87663. - SyntaxKind.Text;[p];
  87664. - SyntaxKind.CloseAngle;[>];
  87665. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:1
  87666. - SyntaxKind.Unknown;[];
  87667. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (11:0,11) - Tokens:1
  87668. - SyntaxKind.RightBrace;[}];
  87669. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:1
  87670. - SyntaxKind.Unknown;[];
  87671. +RazorDocument - [0..12)::12 - [@{<!p></!p>}]
  87672. + MarkupBlock - [0..12)::12
  87673. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87674. + Marker;[];
  87675. + CSharpCodeBlock - [0..12)::12
  87676. + CSharpStatement - [0..12)::12
  87677. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87678. + Transition;[@];
  87679. + CSharpStatementBody - [1..12)::11
  87680. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87681. + LeftBrace;[{];
  87682. + CSharpCodeBlock - [2..11)::9
  87683. + MarkupBlock - [2..11)::9
  87684. + MarkupTagBlock - [2..6)::4 - [<!p>]
  87685. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87686. + OpenAngle;[<];
  87687. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87688. + Bang;[!];
  87689. + MarkupTextLiteral - [4..6)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87690. + Text;[p];
  87691. + CloseAngle;[>];
  87692. + MarkupTagBlock - [6..11)::5 - [</!p>]
  87693. + MarkupTextLiteral - [6..8)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87694. + OpenAngle;[<];
  87695. + ForwardSlash;[/];
  87696. + RazorMetaCode - [8..9)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87697. + Bang;[!];
  87698. + MarkupTextLiteral - [9..11)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87699. + Text;[p];
  87700. + CloseAngle;[>];
  87701. + CSharpStatementLiteral - [11..11)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  87702. + Marker;[];
  87703. + RazorMetaCode - [11..12)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87704. + RightBrace;[}];
  87705. + MarkupTextLiteral - [12..12)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87706. + Marker;[];
  87707. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData4.stree.txt
  87708. index 3fc4a59ce8c..bf95348d72b 100644
  87709. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData4.stree.txt
  87710. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData4.stree.txt
  87711. @@ -1,38 +1,42 @@
  87712. -Markup block - Gen<None> - 28 - (0:0,0)
  87713. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  87714. - SyntaxKind.Unknown;[];
  87715. - Statement block - Gen<None> - 28 - (0:0,0)
  87716. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  87717. - SyntaxKind.Transition;[@];
  87718. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  87719. - SyntaxKind.LeftBrace;[{];
  87720. - Markup block - Gen<None> - 25 - (2:0,2)
  87721. - Tag block - Gen<None> - 4 - (2:0,2)
  87722. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  87723. - SyntaxKind.OpenAngle;[<];
  87724. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  87725. - SyntaxKind.Bang;[!];
  87726. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:None - (4:0,4) - Tokens:2
  87727. - SyntaxKind.Text;[p];
  87728. - SyntaxKind.CloseAngle;[>];
  87729. - Markup span - Gen<Markup> - [words and spaces] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:5
  87730. - SyntaxKind.Text;[words];
  87731. - SyntaxKind.Whitespace;[ ];
  87732. - SyntaxKind.Text;[and];
  87733. - SyntaxKind.Whitespace;[ ];
  87734. - SyntaxKind.Text;[spaces];
  87735. - Tag block - Gen<None> - 5 - (22:0,22)
  87736. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:2
  87737. - SyntaxKind.OpenAngle;[<];
  87738. - SyntaxKind.ForwardSlash;[/];
  87739. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (24:0,24) - Tokens:1
  87740. - SyntaxKind.Bang;[!];
  87741. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:None - (25:0,25) - Tokens:2
  87742. - SyntaxKind.Text;[p];
  87743. - SyntaxKind.CloseAngle;[>];
  87744. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (27:0,27) - Tokens:1
  87745. - SyntaxKind.Unknown;[];
  87746. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (27:0,27) - Tokens:1
  87747. - SyntaxKind.RightBrace;[}];
  87748. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (28:0,28) - Tokens:1
  87749. - SyntaxKind.Unknown;[];
  87750. +RazorDocument - [0..28)::28 - [@{<!p>words and spaces</!p>}]
  87751. + MarkupBlock - [0..28)::28
  87752. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87753. + Marker;[];
  87754. + CSharpCodeBlock - [0..28)::28
  87755. + CSharpStatement - [0..28)::28
  87756. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87757. + Transition;[@];
  87758. + CSharpStatementBody - [1..28)::27
  87759. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87760. + LeftBrace;[{];
  87761. + CSharpCodeBlock - [2..27)::25
  87762. + MarkupBlock - [2..27)::25
  87763. + MarkupTagBlock - [2..6)::4 - [<!p>]
  87764. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87765. + OpenAngle;[<];
  87766. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87767. + Bang;[!];
  87768. + MarkupTextLiteral - [4..6)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87769. + Text;[p];
  87770. + CloseAngle;[>];
  87771. + MarkupTextLiteral - [6..22)::16 - [words and spaces] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87772. + Text;[words];
  87773. + Whitespace;[ ];
  87774. + Text;[and];
  87775. + Whitespace;[ ];
  87776. + Text;[spaces];
  87777. + MarkupTagBlock - [22..27)::5 - [</!p>]
  87778. + MarkupTextLiteral - [22..24)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87779. + OpenAngle;[<];
  87780. + ForwardSlash;[/];
  87781. + RazorMetaCode - [24..25)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87782. + Bang;[!];
  87783. + MarkupTextLiteral - [25..27)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87784. + Text;[p];
  87785. + CloseAngle;[>];
  87786. + CSharpStatementLiteral - [27..27)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  87787. + Marker;[];
  87788. + RazorMetaCode - [27..28)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87789. + RightBrace;[}];
  87790. + MarkupTextLiteral - [28..28)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87791. + Marker;[];
  87792. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData5.stree.txt
  87793. index dd067268478..dc8aabd0482 100644
  87794. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData5.stree.txt
  87795. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData5.stree.txt
  87796. @@ -1,29 +1,33 @@
  87797. -Markup block - Gen<None> - 11 - (0:0,0)
  87798. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  87799. - SyntaxKind.Unknown;[];
  87800. - Statement block - Gen<None> - 11 - (0:0,0)
  87801. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  87802. - SyntaxKind.Transition;[@];
  87803. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  87804. - SyntaxKind.LeftBrace;[{];
  87805. - Markup block - Gen<None> - 8 - (2:0,2)
  87806. - Tag block - Gen<None> - 4 - (2:0,2)
  87807. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  87808. - SyntaxKind.OpenAngle;[<];
  87809. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  87810. - SyntaxKind.Bang;[!];
  87811. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:None - (4:0,4) - Tokens:2
  87812. - SyntaxKind.Text;[p];
  87813. - SyntaxKind.CloseAngle;[>];
  87814. - Tag block - Gen<None> - 4 - (6:0,6)
  87815. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (6:0,6) - Tokens:4
  87816. - SyntaxKind.OpenAngle;[<];
  87817. - SyntaxKind.ForwardSlash;[/];
  87818. - SyntaxKind.Text;[p];
  87819. - SyntaxKind.CloseAngle;[>];
  87820. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  87821. - SyntaxKind.Unknown;[];
  87822. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  87823. - SyntaxKind.RightBrace;[}];
  87824. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:1
  87825. - SyntaxKind.Unknown;[];
  87826. +RazorDocument - [0..11)::11 - [@{<!p></p>}]
  87827. + MarkupBlock - [0..11)::11
  87828. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87829. + Marker;[];
  87830. + CSharpCodeBlock - [0..11)::11
  87831. + CSharpStatement - [0..11)::11
  87832. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87833. + Transition;[@];
  87834. + CSharpStatementBody - [1..11)::10
  87835. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87836. + LeftBrace;[{];
  87837. + CSharpCodeBlock - [2..10)::8
  87838. + MarkupBlock - [2..10)::8
  87839. + MarkupTagBlock - [2..6)::4 - [<!p>]
  87840. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87841. + OpenAngle;[<];
  87842. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87843. + Bang;[!];
  87844. + MarkupTextLiteral - [4..6)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87845. + Text;[p];
  87846. + CloseAngle;[>];
  87847. + MarkupTagBlock - [6..10)::4 - [</p>]
  87848. + MarkupTextLiteral - [6..10)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87849. + OpenAngle;[<];
  87850. + ForwardSlash;[/];
  87851. + Text;[p];
  87852. + CloseAngle;[>];
  87853. + CSharpStatementLiteral - [10..10)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  87854. + Marker;[];
  87855. + RazorMetaCode - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87856. + RightBrace;[}];
  87857. + MarkupTextLiteral - [11..11)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87858. + Marker;[];
  87859. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData6.stree.txt
  87860. index 5a7fdfc9a9e..530c8a0c568 100644
  87861. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData6.stree.txt
  87862. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData6.stree.txt
  87863. @@ -1,26 +1,34 @@
  87864. -Markup block - Gen<None> - 11 - (0:0,0)
  87865. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  87866. - SyntaxKind.Unknown;[];
  87867. - Statement block - Gen<None> - 11 - (0:0,0)
  87868. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  87869. - SyntaxKind.Transition;[@];
  87870. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  87871. - SyntaxKind.LeftBrace;[{];
  87872. - Markup block - Gen<None> - 8 - (2:0,2)
  87873. - Tag block - Gen<TagHelper> - 8 - (2:0,2) - p - ptaghelper
  87874. - StartTagAndEndTag - <p>
  87875. - Tag block - Gen<None> - 5 - (5:0,5)
  87876. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:2
  87877. - SyntaxKind.OpenAngle;[<];
  87878. - SyntaxKind.ForwardSlash;[/];
  87879. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (7:0,7) - Tokens:1
  87880. - SyntaxKind.Bang;[!];
  87881. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:None - (8:0,8) - Tokens:2
  87882. - SyntaxKind.Text;[p];
  87883. - SyntaxKind.CloseAngle;[>];
  87884. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  87885. - SyntaxKind.Unknown;[];
  87886. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  87887. - SyntaxKind.RightBrace;[}];
  87888. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:1
  87889. - SyntaxKind.Unknown;[];
  87890. +RazorDocument - [0..11)::11 - [@{<p></!p>}]
  87891. + MarkupBlock - [0..11)::11
  87892. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87893. + Marker;[];
  87894. + CSharpCodeBlock - [0..11)::11
  87895. + CSharpStatement - [0..11)::11
  87896. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87897. + Transition;[@];
  87898. + CSharpStatementBody - [1..11)::10
  87899. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87900. + LeftBrace;[{];
  87901. + CSharpCodeBlock - [2..10)::8
  87902. + MarkupBlock - [2..10)::8
  87903. + MarkupTagHelperElement - [2..10)::8 - p[StartTagAndEndTag] - ptaghelper
  87904. + MarkupTagHelperStartTag - [2..5)::3
  87905. + MarkupTextLiteral - [2..5)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87906. + OpenAngle;[<];
  87907. + Text;[p];
  87908. + CloseAngle;[>];
  87909. + MarkupTagBlock - [5..10)::5 - [</!p>]
  87910. + MarkupTextLiteral - [5..7)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87911. + OpenAngle;[<];
  87912. + ForwardSlash;[/];
  87913. + RazorMetaCode - [7..8)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87914. + Bang;[!];
  87915. + MarkupTextLiteral - [8..10)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87916. + Text;[p];
  87917. + CloseAngle;[>];
  87918. + CSharpStatementLiteral - [10..10)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  87919. + Marker;[];
  87920. + RazorMetaCode - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87921. + RightBrace;[}];
  87922. + MarkupTextLiteral - [11..11)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87923. + Marker;[];
  87924. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData7.stree.txt
  87925. index cbb233dcbe1..c278e58160e 100644
  87926. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData7.stree.txt
  87927. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData7.stree.txt
  87928. @@ -1,34 +1,48 @@
  87929. -Markup block - Gen<None> - 19 - (0:0,0)
  87930. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  87931. - SyntaxKind.Unknown;[];
  87932. - Statement block - Gen<None> - 19 - (0:0,0)
  87933. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  87934. - SyntaxKind.Transition;[@];
  87935. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  87936. - SyntaxKind.LeftBrace;[{];
  87937. - Markup block - Gen<None> - 16 - (2:0,2)
  87938. - Tag block - Gen<TagHelper> - 16 - (2:0,2) - p - ptaghelper
  87939. - StartTagAndEndTag - <p> ... </p>
  87940. - Tag block - Gen<None> - 4 - (5:0,5)
  87941. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:1
  87942. - SyntaxKind.OpenAngle;[<];
  87943. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (6:0,6) - Tokens:1
  87944. - SyntaxKind.Bang;[!];
  87945. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:None - (7:0,7) - Tokens:2
  87946. - SyntaxKind.Text;[p];
  87947. - SyntaxKind.CloseAngle;[>];
  87948. - Tag block - Gen<None> - 5 - (9:0,9)
  87949. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:2
  87950. - SyntaxKind.OpenAngle;[<];
  87951. - SyntaxKind.ForwardSlash;[/];
  87952. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (11:0,11) - Tokens:1
  87953. - SyntaxKind.Bang;[!];
  87954. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:2
  87955. - SyntaxKind.Text;[p];
  87956. - SyntaxKind.CloseAngle;[>];
  87957. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:1
  87958. - SyntaxKind.Unknown;[];
  87959. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (18:0,18) - Tokens:1
  87960. - SyntaxKind.RightBrace;[}];
  87961. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:1
  87962. - SyntaxKind.Unknown;[];
  87963. +RazorDocument - [0..19)::19 - [@{<p><!p></!p></p>}]
  87964. + MarkupBlock - [0..19)::19
  87965. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87966. + Marker;[];
  87967. + CSharpCodeBlock - [0..19)::19
  87968. + CSharpStatement - [0..19)::19
  87969. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87970. + Transition;[@];
  87971. + CSharpStatementBody - [1..19)::18
  87972. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87973. + LeftBrace;[{];
  87974. + CSharpCodeBlock - [2..18)::16
  87975. + MarkupBlock - [2..18)::16
  87976. + MarkupTagHelperElement - [2..18)::16 - p[StartTagAndEndTag] - ptaghelper
  87977. + MarkupTagHelperStartTag - [2..5)::3
  87978. + MarkupTextLiteral - [2..5)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87979. + OpenAngle;[<];
  87980. + Text;[p];
  87981. + CloseAngle;[>];
  87982. + MarkupTagBlock - [5..9)::4 - [<!p>]
  87983. + MarkupTextLiteral - [5..6)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87984. + OpenAngle;[<];
  87985. + RazorMetaCode - [6..7)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87986. + Bang;[!];
  87987. + MarkupTextLiteral - [7..9)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87988. + Text;[p];
  87989. + CloseAngle;[>];
  87990. + MarkupTagBlock - [9..14)::5 - [</!p>]
  87991. + MarkupTextLiteral - [9..11)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  87992. + OpenAngle;[<];
  87993. + ForwardSlash;[/];
  87994. + RazorMetaCode - [11..12)::1 - Gen<None> - SpanEditHandler;Accepts:None
  87995. + Bang;[!];
  87996. + MarkupTextLiteral - [12..14)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  87997. + Text;[p];
  87998. + CloseAngle;[>];
  87999. + MarkupTagHelperEndTag - [14..18)::4
  88000. + MarkupTextLiteral - [14..18)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  88001. + OpenAngle;[<];
  88002. + ForwardSlash;[/];
  88003. + Text;[p];
  88004. + CloseAngle;[>];
  88005. + CSharpStatementLiteral - [18..18)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  88006. + Marker;[];
  88007. + RazorMetaCode - [18..19)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88008. + RightBrace;[}];
  88009. + MarkupTextLiteral - [19..19)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88010. + Marker;[];
  88011. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData8.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData8.stree.txt
  88012. index ccaf54362db..2a1f08d6e9e 100644
  88013. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData8.stree.txt
  88014. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData8.stree.txt
  88015. @@ -1,30 +1,40 @@
  88016. -Markup block - Gen<None> - 15 - (0:0,0)
  88017. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  88018. - SyntaxKind.Unknown;[];
  88019. - Statement block - Gen<None> - 15 - (0:0,0)
  88020. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  88021. - SyntaxKind.Transition;[@];
  88022. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  88023. - SyntaxKind.LeftBrace;[{];
  88024. - Markup block - Gen<None> - 13 - (2:0,2)
  88025. - Tag block - Gen<TagHelper> - 13 - (2:0,2) - p - ptaghelper
  88026. - StartTagAndEndTag - <p>
  88027. - Tag block - Gen<None> - 4 - (5:0,5)
  88028. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:1
  88029. - SyntaxKind.OpenAngle;[<];
  88030. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (6:0,6) - Tokens:1
  88031. - SyntaxKind.Bang;[!];
  88032. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:None - (7:0,7) - Tokens:2
  88033. - SyntaxKind.Text;[p];
  88034. - SyntaxKind.CloseAngle;[>];
  88035. - Tag block - Gen<None> - 5 - (9:0,9)
  88036. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:2
  88037. - SyntaxKind.OpenAngle;[<];
  88038. - SyntaxKind.ForwardSlash;[/];
  88039. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (11:0,11) - Tokens:1
  88040. - SyntaxKind.Bang;[!];
  88041. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:2
  88042. - SyntaxKind.Text;[p];
  88043. - SyntaxKind.CloseAngle;[>];
  88044. - Markup span - Gen<Markup> - [}] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  88045. - SyntaxKind.Text;[}];
  88046. +RazorDocument - [0..15)::15 - [@{<p><!p></!p>}]
  88047. + MarkupBlock - [0..15)::15
  88048. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88049. + Marker;[];
  88050. + CSharpCodeBlock - [0..15)::15
  88051. + CSharpStatement - [0..15)::15
  88052. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88053. + Transition;[@];
  88054. + CSharpStatementBody - [1..15)::14
  88055. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88056. + LeftBrace;[{];
  88057. + CSharpCodeBlock - [2..15)::13
  88058. + MarkupBlock - [2..15)::13
  88059. + MarkupTagHelperElement - [2..15)::13 - p[StartTagAndEndTag] - ptaghelper
  88060. + MarkupTagHelperStartTag - [2..5)::3
  88061. + MarkupTextLiteral - [2..5)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  88062. + OpenAngle;[<];
  88063. + Text;[p];
  88064. + CloseAngle;[>];
  88065. + MarkupTagBlock - [5..9)::4 - [<!p>]
  88066. + MarkupTextLiteral - [5..6)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88067. + OpenAngle;[<];
  88068. + RazorMetaCode - [6..7)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88069. + Bang;[!];
  88070. + MarkupTextLiteral - [7..9)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  88071. + Text;[p];
  88072. + CloseAngle;[>];
  88073. + MarkupTagBlock - [9..14)::5 - [</!p>]
  88074. + MarkupTextLiteral - [9..11)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88075. + OpenAngle;[<];
  88076. + ForwardSlash;[/];
  88077. + RazorMetaCode - [11..12)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88078. + Bang;[!];
  88079. + MarkupTextLiteral - [12..14)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  88080. + Text;[p];
  88081. + CloseAngle;[>];
  88082. + MarkupTextLiteral - [14..15)::1 - [}] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88083. + Text;[}];
  88084. + RazorMetaCode - [15..15)::0 - Gen<None> - SpanEditHandler;Accepts:Any
  88085. + RightBrace;[<Missing>];
  88086. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData9.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData9.stree.txt
  88087. index 869d294fed9..334df5c4659 100644
  88088. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData9.stree.txt
  88089. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutCSharp_WithBlockData9.stree.txt
  88090. @@ -1,39 +1,43 @@
  88091. -Markup block - Gen<None> - 16 - (0:0,0)
  88092. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  88093. - SyntaxKind.Unknown;[];
  88094. - Statement block - Gen<None> - 16 - (0:0,0)
  88095. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  88096. - SyntaxKind.Transition;[@];
  88097. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  88098. - SyntaxKind.LeftBrace;[{];
  88099. - Markup block - Gen<None> - 9 - (2:0,2)
  88100. - Tag block - Gen<None> - 4 - (2:0,2)
  88101. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  88102. - SyntaxKind.OpenAngle;[<];
  88103. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:1
  88104. - SyntaxKind.Bang;[!];
  88105. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:None - (4:0,4) - Tokens:2
  88106. - SyntaxKind.Text;[p];
  88107. - SyntaxKind.CloseAngle;[>];
  88108. - Tag block - Gen<None> - 5 - (6:0,6)
  88109. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:2
  88110. - SyntaxKind.OpenAngle;[<];
  88111. - SyntaxKind.ForwardSlash;[/];
  88112. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (8:0,8) - Tokens:1
  88113. - SyntaxKind.Bang;[!];
  88114. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:None - (9:0,9) - Tokens:2
  88115. - SyntaxKind.Text;[p];
  88116. - SyntaxKind.CloseAngle;[>];
  88117. - Markup block - Gen<None> - 4 - (11:0,11)
  88118. - Tag block - Gen<None> - 4 - (11:0,11)
  88119. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:None - (11:0,11) - Tokens:4
  88120. - SyntaxKind.OpenAngle;[<];
  88121. - SyntaxKind.ForwardSlash;[/];
  88122. - SyntaxKind.Text;[p];
  88123. - SyntaxKind.CloseAngle;[>];
  88124. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:1
  88125. - SyntaxKind.Unknown;[];
  88126. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:1
  88127. - SyntaxKind.RightBrace;[}];
  88128. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  88129. - SyntaxKind.Unknown;[];
  88130. +RazorDocument - [0..16)::16 - [@{<!p></!p></p>}]
  88131. + MarkupBlock - [0..16)::16
  88132. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88133. + Marker;[];
  88134. + CSharpCodeBlock - [0..16)::16
  88135. + CSharpStatement - [0..16)::16
  88136. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88137. + Transition;[@];
  88138. + CSharpStatementBody - [1..16)::15
  88139. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88140. + LeftBrace;[{];
  88141. + CSharpCodeBlock - [2..15)::13
  88142. + MarkupBlock - [2..11)::9
  88143. + MarkupTagBlock - [2..6)::4 - [<!p>]
  88144. + MarkupTextLiteral - [2..3)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88145. + OpenAngle;[<];
  88146. + RazorMetaCode - [3..4)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88147. + Bang;[!];
  88148. + MarkupTextLiteral - [4..6)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  88149. + Text;[p];
  88150. + CloseAngle;[>];
  88151. + MarkupTagBlock - [6..11)::5 - [</!p>]
  88152. + MarkupTextLiteral - [6..8)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88153. + OpenAngle;[<];
  88154. + ForwardSlash;[/];
  88155. + RazorMetaCode - [8..9)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88156. + Bang;[!];
  88157. + MarkupTextLiteral - [9..11)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  88158. + Text;[p];
  88159. + CloseAngle;[>];
  88160. + MarkupBlock - [11..15)::4
  88161. + MarkupTagBlock - [11..15)::4 - [</p>]
  88162. + MarkupTextLiteral - [11..15)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  88163. + OpenAngle;[<];
  88164. + ForwardSlash;[/];
  88165. + Text;[p];
  88166. + CloseAngle;[>];
  88167. + CSharpStatementLiteral - [15..15)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  88168. + Marker;[];
  88169. + RazorMetaCode - [15..16)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88170. + RightBrace;[}];
  88171. + MarkupTextLiteral - [16..16)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88172. + Marker;[];
  88173. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithAttributeData1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithAttributeData1.stree.txt
  88174. index db31725b1d9..7036ebb7e9d 100644
  88175. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithAttributeData1.stree.txt
  88176. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithAttributeData1.stree.txt
  88177. @@ -1,20 +1,25 @@
  88178. -Markup block - Gen<None> - 16 - (0:0,0)
  88179. - Tag block - Gen<None> - 16 - (0:0,0)
  88180. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  88181. - SyntaxKind.OpenAngle;[<];
  88182. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  88183. - SyntaxKind.Bang;[!];
  88184. - Markup span - Gen<Markup> - [p] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  88185. - SyntaxKind.Text;[p];
  88186. - Markup block - Gen<Attr:class, class="@(3:0,3),"@(14:0,14)> - 12 - (3:0,3)
  88187. - Markup span - Gen<None> - [ class="] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:4
  88188. - SyntaxKind.Whitespace;[ ];
  88189. - SyntaxKind.Text;[class];
  88190. - SyntaxKind.Equals;[=];
  88191. - SyntaxKind.DoubleQuote;["];
  88192. - Markup span - Gen<LitAttr:@(11:0,11)> - [btn] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:1
  88193. - SyntaxKind.Text;[btn];
  88194. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  88195. - SyntaxKind.DoubleQuote;["];
  88196. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:1
  88197. - SyntaxKind.CloseAngle;[>];
  88198. +RazorDocument - [0..16)::16 - [<!p class="btn">]
  88199. + MarkupBlock - [0..16)::16
  88200. + MarkupTagBlock - [0..16)::16 - [<!p class="btn">]
  88201. + MarkupTextLiteral - [0..1)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88202. + OpenAngle;[<];
  88203. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88204. + Bang;[!];
  88205. + MarkupTextLiteral - [2..3)::1 - [p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88206. + Text;[p];
  88207. + MarkupAttributeBlock - [3..15)::12 - [ class="btn"]
  88208. + MarkupTextLiteral - [3..4)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88209. + Whitespace;[ ];
  88210. + MarkupTextLiteral - [4..9)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88211. + Text;[class];
  88212. + Equals;[=];
  88213. + MarkupTextLiteral - [10..11)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  88214. + DoubleQuote;["];
  88215. + GenericBlock - [11..14)::3
  88216. + MarkupLiteralAttributeValue - [11..14)::3 - [btn]
  88217. + MarkupTextLiteral - [11..14)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88218. + Text;[btn];
  88219. + MarkupTextLiteral - [14..15)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  88220. + DoubleQuote;["];
  88221. + MarkupTextLiteral - [15..16)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88222. + CloseAngle;[>];
  88223. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithAttributeData2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithAttributeData2.stree.txt
  88224. index 7e4a5606814..c7c25082ea8 100644
  88225. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithAttributeData2.stree.txt
  88226. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithAttributeData2.stree.txt
  88227. @@ -1,29 +1,34 @@
  88228. -Markup block - Gen<None> - 21 - (0:0,0)
  88229. - Tag block - Gen<None> - 16 - (0:0,0)
  88230. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  88231. - SyntaxKind.OpenAngle;[<];
  88232. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  88233. - SyntaxKind.Bang;[!];
  88234. - Markup span - Gen<Markup> - [p] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  88235. - SyntaxKind.Text;[p];
  88236. - Markup block - Gen<Attr:class, class="@(3:0,3),"@(14:0,14)> - 12 - (3:0,3)
  88237. - Markup span - Gen<None> - [ class="] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:4
  88238. - SyntaxKind.Whitespace;[ ];
  88239. - SyntaxKind.Text;[class];
  88240. - SyntaxKind.Equals;[=];
  88241. - SyntaxKind.DoubleQuote;["];
  88242. - Markup span - Gen<LitAttr:@(11:0,11)> - [btn] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:1
  88243. - SyntaxKind.Text;[btn];
  88244. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  88245. - SyntaxKind.DoubleQuote;["];
  88246. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:1
  88247. - SyntaxKind.CloseAngle;[>];
  88248. - Tag block - Gen<None> - 5 - (16:0,16)
  88249. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:2
  88250. - SyntaxKind.OpenAngle;[<];
  88251. - SyntaxKind.ForwardSlash;[/];
  88252. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (18:0,18) - Tokens:1
  88253. - SyntaxKind.Bang;[!];
  88254. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:2
  88255. - SyntaxKind.Text;[p];
  88256. - SyntaxKind.CloseAngle;[>];
  88257. +RazorDocument - [0..21)::21 - [<!p class="btn"></!p>]
  88258. + MarkupBlock - [0..21)::21
  88259. + MarkupTagBlock - [0..16)::16 - [<!p class="btn">]
  88260. + MarkupTextLiteral - [0..1)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88261. + OpenAngle;[<];
  88262. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88263. + Bang;[!];
  88264. + MarkupTextLiteral - [2..3)::1 - [p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88265. + Text;[p];
  88266. + MarkupAttributeBlock - [3..15)::12 - [ class="btn"]
  88267. + MarkupTextLiteral - [3..4)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88268. + Whitespace;[ ];
  88269. + MarkupTextLiteral - [4..9)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88270. + Text;[class];
  88271. + Equals;[=];
  88272. + MarkupTextLiteral - [10..11)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  88273. + DoubleQuote;["];
  88274. + GenericBlock - [11..14)::3
  88275. + MarkupLiteralAttributeValue - [11..14)::3 - [btn]
  88276. + MarkupTextLiteral - [11..14)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88277. + Text;[btn];
  88278. + MarkupTextLiteral - [14..15)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  88279. + DoubleQuote;["];
  88280. + MarkupTextLiteral - [15..16)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88281. + CloseAngle;[>];
  88282. + MarkupTagBlock - [16..21)::5 - [</!p>]
  88283. + MarkupTextLiteral - [16..18)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88284. + OpenAngle;[<];
  88285. + ForwardSlash;[/];
  88286. + RazorMetaCode - [18..19)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88287. + Bang;[!];
  88288. + MarkupTextLiteral - [19..21)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88289. + Text;[p];
  88290. + CloseAngle;[>];
  88291. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithAttributeData3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithAttributeData3.stree.txt
  88292. index 1287d44715c..b9a298b12dc 100644
  88293. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithAttributeData3.stree.txt
  88294. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithAttributeData3.stree.txt
  88295. @@ -1,36 +1,40 @@
  88296. -Markup block - Gen<None> - 37 - (0:0,0)
  88297. - Tag block - Gen<None> - 16 - (0:0,0)
  88298. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  88299. - SyntaxKind.OpenAngle;[<];
  88300. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  88301. - SyntaxKind.Bang;[!];
  88302. - Markup span - Gen<Markup> - [p] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  88303. - SyntaxKind.Text;[p];
  88304. - Markup block - Gen<Attr:class, class="@(3:0,3),"@(14:0,14)> - 12 - (3:0,3)
  88305. - Markup span - Gen<None> - [ class="] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:4
  88306. - SyntaxKind.Whitespace;[ ];
  88307. - SyntaxKind.Text;[class];
  88308. - SyntaxKind.Equals;[=];
  88309. - SyntaxKind.DoubleQuote;["];
  88310. - Markup span - Gen<LitAttr:@(11:0,11)> - [btn] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:1
  88311. - SyntaxKind.Text;[btn];
  88312. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  88313. - SyntaxKind.DoubleQuote;["];
  88314. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:1
  88315. - SyntaxKind.CloseAngle;[>];
  88316. - SyntaxKind.HtmlTextLiteral - [words and spaces] - [16..32) - FullWidth: 16 - Slots: 1
  88317. - SyntaxKind.List - [words and spaces] - [16..32) - FullWidth: 16 - Slots: 5
  88318. - SyntaxKind.Text;[words];
  88319. - SyntaxKind.Whitespace;[ ];
  88320. - SyntaxKind.Text;[and];
  88321. - SyntaxKind.Whitespace;[ ];
  88322. - SyntaxKind.Text;[spaces];
  88323. - Tag block - Gen<None> - 5 - (32:0,32)
  88324. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (32:0,32) - Tokens:2
  88325. - SyntaxKind.OpenAngle;[<];
  88326. - SyntaxKind.ForwardSlash;[/];
  88327. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (34:0,34) - Tokens:1
  88328. - SyntaxKind.Bang;[!];
  88329. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:Any - (35:0,35) - Tokens:2
  88330. - SyntaxKind.Text;[p];
  88331. - SyntaxKind.CloseAngle;[>];
  88332. +RazorDocument - [0..37)::37 - [<!p class="btn">words and spaces</!p>]
  88333. + MarkupBlock - [0..37)::37
  88334. + MarkupTagBlock - [0..16)::16 - [<!p class="btn">]
  88335. + MarkupTextLiteral - [0..1)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88336. + OpenAngle;[<];
  88337. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88338. + Bang;[!];
  88339. + MarkupTextLiteral - [2..3)::1 - [p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88340. + Text;[p];
  88341. + MarkupAttributeBlock - [3..15)::12 - [ class="btn"]
  88342. + MarkupTextLiteral - [3..4)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88343. + Whitespace;[ ];
  88344. + MarkupTextLiteral - [4..9)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88345. + Text;[class];
  88346. + Equals;[=];
  88347. + MarkupTextLiteral - [10..11)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  88348. + DoubleQuote;["];
  88349. + GenericBlock - [11..14)::3
  88350. + MarkupLiteralAttributeValue - [11..14)::3 - [btn]
  88351. + MarkupTextLiteral - [11..14)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88352. + Text;[btn];
  88353. + MarkupTextLiteral - [14..15)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  88354. + DoubleQuote;["];
  88355. + MarkupTextLiteral - [15..16)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88356. + CloseAngle;[>];
  88357. + MarkupTextLiteral - [16..32)::16 - [words and spaces] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88358. + Text;[words];
  88359. + Whitespace;[ ];
  88360. + Text;[and];
  88361. + Whitespace;[ ];
  88362. + Text;[spaces];
  88363. + MarkupTagBlock - [32..37)::5 - [</!p>]
  88364. + MarkupTextLiteral - [32..34)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88365. + OpenAngle;[<];
  88366. + ForwardSlash;[/];
  88367. + RazorMetaCode - [34..35)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88368. + Bang;[!];
  88369. + MarkupTextLiteral - [35..37)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88370. + Text;[p];
  88371. + CloseAngle;[>];
  88372. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithAttributeData4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithAttributeData4.stree.txt
  88373. index 76659fc91db..d2f267594a7 100644
  88374. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithAttributeData4.stree.txt
  88375. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithAttributeData4.stree.txt
  88376. @@ -1,39 +1,49 @@
  88377. -Markup block - Gen<None> - 38 - (0:0,0)
  88378. - Tag block - Gen<None> - 33 - (0:0,0)
  88379. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  88380. - SyntaxKind.OpenAngle;[<];
  88381. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  88382. - SyntaxKind.Bang;[!];
  88383. - Markup span - Gen<Markup> - [p] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  88384. - SyntaxKind.Text;[p];
  88385. - Markup block - Gen<Attr:class, class='@(3:0,3),'@(20:0,20)> - 18 - (3:0,3)
  88386. - Markup span - Gen<None> - [ class='] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:4
  88387. - SyntaxKind.Whitespace;[ ];
  88388. - SyntaxKind.Text;[class];
  88389. - SyntaxKind.Equals;[=];
  88390. - SyntaxKind.SingleQuote;['];
  88391. - Markup span - Gen<LitAttr:@(11:0,11)> - [btn1] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:1
  88392. - SyntaxKind.Text;[btn1];
  88393. - Markup span - Gen<LitAttr: @(15:0,15)> - [ btn2] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:2
  88394. - SyntaxKind.Whitespace;[ ];
  88395. - SyntaxKind.Text;[btn2];
  88396. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:1
  88397. - SyntaxKind.SingleQuote;['];
  88398. - Markup block - Gen<Attr:class2, class2=@(21:0,21),@(32:0,32)> - 11 - (21:0,21)
  88399. - Markup span - Gen<None> - [ class2=] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:3
  88400. - SyntaxKind.Whitespace;[ ];
  88401. - SyntaxKind.Text;[class2];
  88402. - SyntaxKind.Equals;[=];
  88403. - Markup span - Gen<LitAttr:@(29:0,29)> - [btn] - SpanEditHandler;Accepts:Any - (29:0,29) - Tokens:1
  88404. - SyntaxKind.Text;[btn];
  88405. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (32:0,32) - Tokens:1
  88406. - SyntaxKind.CloseAngle;[>];
  88407. - Tag block - Gen<None> - 5 - (33:0,33)
  88408. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (33:0,33) - Tokens:2
  88409. - SyntaxKind.OpenAngle;[<];
  88410. - SyntaxKind.ForwardSlash;[/];
  88411. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (35:0,35) - Tokens:1
  88412. - SyntaxKind.Bang;[!];
  88413. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:Any - (36:0,36) - Tokens:2
  88414. - SyntaxKind.Text;[p];
  88415. - SyntaxKind.CloseAngle;[>];
  88416. +RazorDocument - [0..38)::38 - [<!p class='btn1 btn2' class2=btn></!p>]
  88417. + MarkupBlock - [0..38)::38
  88418. + MarkupTagBlock - [0..33)::33 - [<!p class='btn1 btn2' class2=btn>]
  88419. + MarkupTextLiteral - [0..1)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88420. + OpenAngle;[<];
  88421. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88422. + Bang;[!];
  88423. + MarkupTextLiteral - [2..3)::1 - [p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88424. + Text;[p];
  88425. + MarkupAttributeBlock - [3..21)::18 - [ class='btn1 btn2']
  88426. + MarkupTextLiteral - [3..4)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88427. + Whitespace;[ ];
  88428. + MarkupTextLiteral - [4..9)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88429. + Text;[class];
  88430. + Equals;[=];
  88431. + MarkupTextLiteral - [10..11)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  88432. + SingleQuote;['];
  88433. + GenericBlock - [11..20)::9
  88434. + MarkupLiteralAttributeValue - [11..15)::4 - [btn1]
  88435. + MarkupTextLiteral - [11..15)::4 - [btn1] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88436. + Text;[btn1];
  88437. + MarkupLiteralAttributeValue - [15..20)::5 - [ btn2]
  88438. + MarkupTextLiteral - [15..16)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88439. + Whitespace;[ ];
  88440. + MarkupTextLiteral - [16..20)::4 - [btn2] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88441. + Text;[btn2];
  88442. + MarkupTextLiteral - [20..21)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  88443. + SingleQuote;['];
  88444. + MarkupAttributeBlock - [21..32)::11 - [ class2=btn]
  88445. + MarkupTextLiteral - [21..22)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88446. + Whitespace;[ ];
  88447. + MarkupTextLiteral - [22..28)::6 - [class2] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88448. + Text;[class2];
  88449. + Equals;[=];
  88450. + GenericBlock - [29..32)::3
  88451. + MarkupLiteralAttributeValue - [29..32)::3 - [btn]
  88452. + MarkupTextLiteral - [29..32)::3 - [btn] - Gen<None> - SpanEditHandler;Accepts:Any
  88453. + Text;[btn];
  88454. + MarkupTextLiteral - [32..33)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88455. + CloseAngle;[>];
  88456. + MarkupTagBlock - [33..38)::5 - [</!p>]
  88457. + MarkupTextLiteral - [33..35)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88458. + OpenAngle;[<];
  88459. + ForwardSlash;[/];
  88460. + RazorMetaCode - [35..36)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88461. + Bang;[!];
  88462. + MarkupTextLiteral - [36..38)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88463. + Text;[p];
  88464. + CloseAngle;[>];
  88465. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithAttributeData5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithAttributeData5.stree.txt
  88466. index 984a6d0f79f..b3856ca506f 100644
  88467. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithAttributeData5.stree.txt
  88468. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithAttributeData5.stree.txt
  88469. @@ -1,42 +1,53 @@
  88470. -Markup block - Gen<None> - 41 - (0:0,0)
  88471. - Tag block - Gen<None> - 36 - (0:0,0)
  88472. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  88473. - SyntaxKind.OpenAngle;[<];
  88474. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  88475. - SyntaxKind.Bang;[!];
  88476. - Markup span - Gen<Markup> - [p] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:1
  88477. - SyntaxKind.Text;[p];
  88478. - Markup block - Gen<Attr:class, class='@(3:0,3),'@(34:0,34)> - 32 - (3:0,3)
  88479. - Markup span - Gen<None> - [ class='] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:4
  88480. - SyntaxKind.Whitespace;[ ];
  88481. - SyntaxKind.Text;[class];
  88482. - SyntaxKind.Equals;[=];
  88483. - SyntaxKind.SingleQuote;['];
  88484. - Markup span - Gen<LitAttr:@(11:0,11)> - [btn1] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:1
  88485. - SyntaxKind.Text;[btn1];
  88486. - Markup block - Gen<DynAttr: @(15:0,15)> - 14 - (15:0,15)
  88487. - Markup span - Gen<None> - [ ] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:1
  88488. - SyntaxKind.Whitespace;[ ];
  88489. - Expression block - Gen<Expr> - 13 - (16:0,16)
  88490. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  88491. - SyntaxKind.Transition;[@];
  88492. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (17:0,17) - Tokens:3
  88493. - SyntaxKind.Identifier;[DateTime];
  88494. - SyntaxKind.Dot;[.];
  88495. - SyntaxKind.Identifier;[Now];
  88496. - Markup span - Gen<LitAttr: @(29:0,29)> - [ btn2] - SpanEditHandler;Accepts:Any - (29:0,29) - Tokens:2
  88497. - SyntaxKind.Whitespace;[ ];
  88498. - SyntaxKind.Text;[btn2];
  88499. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (34:0,34) - Tokens:1
  88500. - SyntaxKind.SingleQuote;['];
  88501. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (35:0,35) - Tokens:1
  88502. - SyntaxKind.CloseAngle;[>];
  88503. - Tag block - Gen<None> - 5 - (36:0,36)
  88504. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (36:0,36) - Tokens:2
  88505. - SyntaxKind.OpenAngle;[<];
  88506. - SyntaxKind.ForwardSlash;[/];
  88507. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (38:0,38) - Tokens:1
  88508. - SyntaxKind.Bang;[!];
  88509. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:Any - (39:0,39) - Tokens:2
  88510. - SyntaxKind.Text;[p];
  88511. - SyntaxKind.CloseAngle;[>];
  88512. +RazorDocument - [0..41)::41 - [<!p class='btn1 @DateTime.Now btn2'></!p>]
  88513. + MarkupBlock - [0..41)::41
  88514. + MarkupTagBlock - [0..36)::36 - [<!p class='btn1 @DateTime.Now btn2'>]
  88515. + MarkupTextLiteral - [0..1)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88516. + OpenAngle;[<];
  88517. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88518. + Bang;[!];
  88519. + MarkupTextLiteral - [2..3)::1 - [p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88520. + Text;[p];
  88521. + MarkupAttributeBlock - [3..35)::32 - [ class='btn1 @DateTime.Now btn2']
  88522. + MarkupTextLiteral - [3..4)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88523. + Whitespace;[ ];
  88524. + MarkupTextLiteral - [4..9)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88525. + Text;[class];
  88526. + Equals;[=];
  88527. + MarkupTextLiteral - [10..11)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  88528. + SingleQuote;['];
  88529. + GenericBlock - [11..34)::23
  88530. + MarkupLiteralAttributeValue - [11..15)::4 - [btn1]
  88531. + MarkupTextLiteral - [11..15)::4 - [btn1] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88532. + Text;[btn1];
  88533. + MarkupDynamicAttributeValue - [15..29)::14 - [ @DateTime.Now]
  88534. + MarkupTextLiteral - [15..16)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88535. + Whitespace;[ ];
  88536. + GenericBlock - [16..29)::13
  88537. + CSharpCodeBlock - [16..29)::13
  88538. + CSharpImplicitExpression - [16..29)::13
  88539. + CSharpTransition - [16..17)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88540. + Transition;[@];
  88541. + CSharpImplicitExpressionBody - [17..29)::12
  88542. + CSharpCodeBlock - [17..29)::12
  88543. + CSharpExpressionLiteral - [17..29)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  88544. + Identifier;[DateTime];
  88545. + Dot;[.];
  88546. + Identifier;[Now];
  88547. + MarkupLiteralAttributeValue - [29..34)::5 - [ btn2]
  88548. + MarkupTextLiteral - [29..30)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88549. + Whitespace;[ ];
  88550. + MarkupTextLiteral - [30..34)::4 - [btn2] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88551. + Text;[btn2];
  88552. + MarkupTextLiteral - [34..35)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  88553. + SingleQuote;['];
  88554. + MarkupTextLiteral - [35..36)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88555. + CloseAngle;[>];
  88556. + MarkupTagBlock - [36..41)::5 - [</!p>]
  88557. + MarkupTextLiteral - [36..38)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88558. + OpenAngle;[<];
  88559. + ForwardSlash;[/];
  88560. + RazorMetaCode - [38..39)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88561. + Bang;[!];
  88562. + MarkupTextLiteral - [39..41)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88563. + Text;[p];
  88564. + CloseAngle;[>];
  88565. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData1.stree.txt
  88566. index 1954422f05e..acb1f0a40cf 100644
  88567. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData1.stree.txt
  88568. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData1.stree.txt
  88569. @@ -1,9 +1,10 @@
  88570. -Markup block - Gen<None> - 4 - (0:0,0)
  88571. - Tag block - Gen<None> - 4 - (0:0,0)
  88572. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  88573. - SyntaxKind.OpenAngle;[<];
  88574. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  88575. - SyntaxKind.Bang;[!];
  88576. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:2
  88577. - SyntaxKind.Text;[p];
  88578. - SyntaxKind.CloseAngle;[>];
  88579. +RazorDocument - [0..4)::4 - [<!p>]
  88580. + MarkupBlock - [0..4)::4
  88581. + MarkupTagBlock - [0..4)::4 - [<!p>]
  88582. + MarkupTextLiteral - [0..1)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88583. + OpenAngle;[<];
  88584. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88585. + Bang;[!];
  88586. + MarkupTextLiteral - [2..4)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88587. + Text;[p];
  88588. + CloseAngle;[>];
  88589. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData10.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData10.stree.txt
  88590. index fa747175c2d..37731b8767e 100644
  88591. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData10.stree.txt
  88592. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData10.stree.txt
  88593. @@ -1,12 +1,23 @@
  88594. -Markup block - Gen<None> - 22 - (0:0,0)
  88595. - Tag block - Gen<TagHelper> - 22 - (0:0,0) - strong - strongtaghelper
  88596. - StartTagAndEndTag - <strong> ... </strong>
  88597. - Tag block - Gen<None> - 5 - (8:0,8)
  88598. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:2
  88599. - SyntaxKind.OpenAngle;[<];
  88600. - SyntaxKind.ForwardSlash;[/];
  88601. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  88602. - SyntaxKind.Bang;[!];
  88603. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:2
  88604. - SyntaxKind.Text;[p];
  88605. - SyntaxKind.CloseAngle;[>];
  88606. +RazorDocument - [0..22)::22 - [<strong></!p></strong>]
  88607. + MarkupBlock - [0..22)::22
  88608. + MarkupTagHelperElement - [0..22)::22 - strong[StartTagAndEndTag] - strongtaghelper
  88609. + MarkupTagHelperStartTag - [0..8)::8
  88610. + MarkupTextLiteral - [0..8)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88611. + OpenAngle;[<];
  88612. + Text;[strong];
  88613. + CloseAngle;[>];
  88614. + MarkupTagBlock - [8..13)::5 - [</!p>]
  88615. + MarkupTextLiteral - [8..10)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88616. + OpenAngle;[<];
  88617. + ForwardSlash;[/];
  88618. + RazorMetaCode - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88619. + Bang;[!];
  88620. + MarkupTextLiteral - [11..13)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88621. + Text;[p];
  88622. + CloseAngle;[>];
  88623. + MarkupTagHelperEndTag - [13..22)::9
  88624. + MarkupTextLiteral - [13..22)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88625. + OpenAngle;[<];
  88626. + ForwardSlash;[/];
  88627. + Text;[strong];
  88628. + CloseAngle;[>];
  88629. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData11.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData11.stree.txt
  88630. index c97b9042adf..7852dcdd418 100644
  88631. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData11.stree.txt
  88632. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData11.stree.txt
  88633. @@ -1,20 +1,31 @@
  88634. -Markup block - Gen<None> - 26 - (0:0,0)
  88635. - Tag block - Gen<TagHelper> - 17 - (0:0,0) - strong - strongtaghelper
  88636. - StartTagAndEndTag - <strong> ... </strong>
  88637. - Tag block - Gen<None> - 4 - (17:0,17)
  88638. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:1
  88639. - SyntaxKind.OpenAngle;[<];
  88640. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (18:0,18) - Tokens:1
  88641. - SyntaxKind.Bang;[!];
  88642. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:2
  88643. - SyntaxKind.Text;[p];
  88644. - SyntaxKind.CloseAngle;[>];
  88645. - Tag block - Gen<None> - 5 - (21:0,21)
  88646. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:2
  88647. - SyntaxKind.OpenAngle;[<];
  88648. - SyntaxKind.ForwardSlash;[/];
  88649. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (23:0,23) - Tokens:1
  88650. - SyntaxKind.Bang;[!];
  88651. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:Any - (24:0,24) - Tokens:2
  88652. - SyntaxKind.Text;[p];
  88653. - SyntaxKind.CloseAngle;[>];
  88654. +RazorDocument - [0..26)::26 - [<strong></strong><!p></!p>]
  88655. + MarkupBlock - [0..26)::26
  88656. + MarkupTagHelperElement - [0..17)::17 - strong[StartTagAndEndTag] - strongtaghelper
  88657. + MarkupTagHelperStartTag - [0..8)::8
  88658. + MarkupTextLiteral - [0..8)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88659. + OpenAngle;[<];
  88660. + Text;[strong];
  88661. + CloseAngle;[>];
  88662. + MarkupTagHelperEndTag - [8..17)::9
  88663. + MarkupTextLiteral - [8..17)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88664. + OpenAngle;[<];
  88665. + ForwardSlash;[/];
  88666. + Text;[strong];
  88667. + CloseAngle;[>];
  88668. + MarkupTagBlock - [17..21)::4 - [<!p>]
  88669. + MarkupTextLiteral - [17..18)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88670. + OpenAngle;[<];
  88671. + RazorMetaCode - [18..19)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88672. + Bang;[!];
  88673. + MarkupTextLiteral - [19..21)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88674. + Text;[p];
  88675. + CloseAngle;[>];
  88676. + MarkupTagBlock - [21..26)::5 - [</!p>]
  88677. + MarkupTextLiteral - [21..23)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88678. + OpenAngle;[<];
  88679. + ForwardSlash;[/];
  88680. + RazorMetaCode - [23..24)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88681. + Bang;[!];
  88682. + MarkupTextLiteral - [24..26)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88683. + Text;[p];
  88684. + CloseAngle;[>];
  88685. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData12.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData12.stree.txt
  88686. index 5496bb002d7..b246c4a31d1 100644
  88687. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData12.stree.txt
  88688. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData12.stree.txt
  88689. @@ -1,31 +1,46 @@
  88690. -Markup block - Gen<None> - 39 - (0:0,0)
  88691. - Tag block - Gen<TagHelper> - 39 - (0:0,0) - p - ptaghelper
  88692. - StartTagAndEndTag - <p>
  88693. - Tag block - Gen<TagHelper> - 31 - (3:0,3) - strong - strongtaghelper
  88694. - StartTagAndEndTag - <strong> ... </strong>
  88695. - Tag block - Gen<None> - 10 - (11:0,11)
  88696. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:2
  88697. - SyntaxKind.OpenAngle;[<];
  88698. - SyntaxKind.ForwardSlash;[/];
  88699. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:1
  88700. - SyntaxKind.Bang;[!];
  88701. - Markup span - Gen<Markup> - [strong>] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:2
  88702. - SyntaxKind.Text;[strong];
  88703. - SyntaxKind.CloseAngle;[>];
  88704. - Tag block - Gen<None> - 4 - (21:0,21)
  88705. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:1
  88706. - SyntaxKind.OpenAngle;[<];
  88707. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (22:0,22) - Tokens:1
  88708. - SyntaxKind.Bang;[!];
  88709. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:2
  88710. - SyntaxKind.Text;[p];
  88711. - SyntaxKind.CloseAngle;[>];
  88712. - Tag block - Gen<None> - 5 - (34:0,34)
  88713. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (34:0,34) - Tokens:2
  88714. - SyntaxKind.OpenAngle;[<];
  88715. - SyntaxKind.ForwardSlash;[/];
  88716. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (36:0,36) - Tokens:1
  88717. - SyntaxKind.Bang;[!];
  88718. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:Any - (37:0,37) - Tokens:2
  88719. - SyntaxKind.Text;[p];
  88720. - SyntaxKind.CloseAngle;[>];
  88721. +RazorDocument - [0..39)::39 - [<p><strong></!strong><!p></strong></!p>]
  88722. + MarkupBlock - [0..39)::39
  88723. + MarkupTagHelperElement - [0..39)::39 - p[StartTagAndEndTag] - ptaghelper
  88724. + MarkupTagHelperStartTag - [0..3)::3
  88725. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88726. + OpenAngle;[<];
  88727. + Text;[p];
  88728. + CloseAngle;[>];
  88729. + MarkupTagHelperElement - [3..34)::31 - strong[StartTagAndEndTag] - strongtaghelper
  88730. + MarkupTagHelperStartTag - [3..11)::8
  88731. + MarkupTextLiteral - [3..11)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88732. + OpenAngle;[<];
  88733. + Text;[strong];
  88734. + CloseAngle;[>];
  88735. + MarkupTagBlock - [11..21)::10 - [</!strong>]
  88736. + MarkupTextLiteral - [11..13)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88737. + OpenAngle;[<];
  88738. + ForwardSlash;[/];
  88739. + RazorMetaCode - [13..14)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88740. + Bang;[!];
  88741. + MarkupTextLiteral - [14..21)::7 - [strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88742. + Text;[strong];
  88743. + CloseAngle;[>];
  88744. + MarkupTagBlock - [21..25)::4 - [<!p>]
  88745. + MarkupTextLiteral - [21..22)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88746. + OpenAngle;[<];
  88747. + RazorMetaCode - [22..23)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88748. + Bang;[!];
  88749. + MarkupTextLiteral - [23..25)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88750. + Text;[p];
  88751. + CloseAngle;[>];
  88752. + MarkupTagHelperEndTag - [25..34)::9
  88753. + MarkupTextLiteral - [25..34)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88754. + OpenAngle;[<];
  88755. + ForwardSlash;[/];
  88756. + Text;[strong];
  88757. + CloseAngle;[>];
  88758. + MarkupTagBlock - [34..39)::5 - [</!p>]
  88759. + MarkupTextLiteral - [34..36)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88760. + OpenAngle;[<];
  88761. + ForwardSlash;[/];
  88762. + RazorMetaCode - [36..37)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88763. + Bang;[!];
  88764. + MarkupTextLiteral - [37..39)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88765. + Text;[p];
  88766. + CloseAngle;[>];
  88767. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData2.stree.txt
  88768. index 57b448f2824..504c231e534 100644
  88769. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData2.stree.txt
  88770. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData2.stree.txt
  88771. @@ -1,10 +1,11 @@
  88772. -Markup block - Gen<None> - 5 - (0:0,0)
  88773. - Tag block - Gen<None> - 5 - (0:0,0)
  88774. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  88775. - SyntaxKind.OpenAngle;[<];
  88776. - SyntaxKind.ForwardSlash;[/];
  88777. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (2:0,2) - Tokens:1
  88778. - SyntaxKind.Bang;[!];
  88779. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:2
  88780. - SyntaxKind.Text;[p];
  88781. - SyntaxKind.CloseAngle;[>];
  88782. +RazorDocument - [0..5)::5 - [</!p>]
  88783. + MarkupBlock - [0..5)::5
  88784. + MarkupTagBlock - [0..5)::5 - [</!p>]
  88785. + MarkupTextLiteral - [0..2)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88786. + OpenAngle;[<];
  88787. + ForwardSlash;[/];
  88788. + RazorMetaCode - [2..3)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88789. + Bang;[!];
  88790. + MarkupTextLiteral - [3..5)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88791. + Text;[p];
  88792. + CloseAngle;[>];
  88793. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData3.stree.txt
  88794. index a7ec91ed2d2..c5f2ee2fbfb 100644
  88795. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData3.stree.txt
  88796. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData3.stree.txt
  88797. @@ -1,18 +1,19 @@
  88798. -Markup block - Gen<None> - 9 - (0:0,0)
  88799. - Tag block - Gen<None> - 4 - (0:0,0)
  88800. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  88801. - SyntaxKind.OpenAngle;[<];
  88802. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  88803. - SyntaxKind.Bang;[!];
  88804. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:2
  88805. - SyntaxKind.Text;[p];
  88806. - SyntaxKind.CloseAngle;[>];
  88807. - Tag block - Gen<None> - 5 - (4:0,4)
  88808. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:2
  88809. - SyntaxKind.OpenAngle;[<];
  88810. - SyntaxKind.ForwardSlash;[/];
  88811. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (6:0,6) - Tokens:1
  88812. - SyntaxKind.Bang;[!];
  88813. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:Any - (7:0,7) - Tokens:2
  88814. - SyntaxKind.Text;[p];
  88815. - SyntaxKind.CloseAngle;[>];
  88816. +RazorDocument - [0..9)::9 - [<!p></!p>]
  88817. + MarkupBlock - [0..9)::9
  88818. + MarkupTagBlock - [0..4)::4 - [<!p>]
  88819. + MarkupTextLiteral - [0..1)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88820. + OpenAngle;[<];
  88821. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88822. + Bang;[!];
  88823. + MarkupTextLiteral - [2..4)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88824. + Text;[p];
  88825. + CloseAngle;[>];
  88826. + MarkupTagBlock - [4..9)::5 - [</!p>]
  88827. + MarkupTextLiteral - [4..6)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88828. + OpenAngle;[<];
  88829. + ForwardSlash;[/];
  88830. + RazorMetaCode - [6..7)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88831. + Bang;[!];
  88832. + MarkupTextLiteral - [7..9)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88833. + Text;[p];
  88834. + CloseAngle;[>];
  88835. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData4.stree.txt
  88836. index 9e09446fd32..fe05aa041f0 100644
  88837. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData4.stree.txt
  88838. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData4.stree.txt
  88839. @@ -1,25 +1,25 @@
  88840. -Markup block - Gen<None> - 25 - (0:0,0)
  88841. - Tag block - Gen<None> - 4 - (0:0,0)
  88842. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  88843. - SyntaxKind.OpenAngle;[<];
  88844. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  88845. - SyntaxKind.Bang;[!];
  88846. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:2
  88847. - SyntaxKind.Text;[p];
  88848. - SyntaxKind.CloseAngle;[>];
  88849. - SyntaxKind.HtmlTextLiteral - [words and spaces] - [4..20) - FullWidth: 16 - Slots: 1
  88850. - SyntaxKind.List - [words and spaces] - [4..20) - FullWidth: 16 - Slots: 5
  88851. - SyntaxKind.Text;[words];
  88852. - SyntaxKind.Whitespace;[ ];
  88853. - SyntaxKind.Text;[and];
  88854. - SyntaxKind.Whitespace;[ ];
  88855. - SyntaxKind.Text;[spaces];
  88856. - Tag block - Gen<None> - 5 - (20:0,20)
  88857. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:2
  88858. - SyntaxKind.OpenAngle;[<];
  88859. - SyntaxKind.ForwardSlash;[/];
  88860. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (22:0,22) - Tokens:1
  88861. - SyntaxKind.Bang;[!];
  88862. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:2
  88863. - SyntaxKind.Text;[p];
  88864. - SyntaxKind.CloseAngle;[>];
  88865. +RazorDocument - [0..25)::25 - [<!p>words and spaces</!p>]
  88866. + MarkupBlock - [0..25)::25
  88867. + MarkupTagBlock - [0..4)::4 - [<!p>]
  88868. + MarkupTextLiteral - [0..1)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88869. + OpenAngle;[<];
  88870. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88871. + Bang;[!];
  88872. + MarkupTextLiteral - [2..4)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88873. + Text;[p];
  88874. + CloseAngle;[>];
  88875. + MarkupTextLiteral - [4..20)::16 - [words and spaces] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88876. + Text;[words];
  88877. + Whitespace;[ ];
  88878. + Text;[and];
  88879. + Whitespace;[ ];
  88880. + Text;[spaces];
  88881. + MarkupTagBlock - [20..25)::5 - [</!p>]
  88882. + MarkupTextLiteral - [20..22)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88883. + OpenAngle;[<];
  88884. + ForwardSlash;[/];
  88885. + RazorMetaCode - [22..23)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88886. + Bang;[!];
  88887. + MarkupTextLiteral - [23..25)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88888. + Text;[p];
  88889. + CloseAngle;[>];
  88890. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData5.stree.txt
  88891. index f023d05b946..b2ba2a2b285 100644
  88892. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData5.stree.txt
  88893. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData5.stree.txt
  88894. @@ -1,15 +1,16 @@
  88895. -Markup block - Gen<None> - 8 - (0:0,0)
  88896. - Tag block - Gen<None> - 4 - (0:0,0)
  88897. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  88898. - SyntaxKind.OpenAngle;[<];
  88899. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  88900. - SyntaxKind.Bang;[!];
  88901. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:2
  88902. - SyntaxKind.Text;[p];
  88903. - SyntaxKind.CloseAngle;[>];
  88904. - Tag block - Gen<None> - 4 - (4:0,4)
  88905. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:4
  88906. - SyntaxKind.OpenAngle;[<];
  88907. - SyntaxKind.ForwardSlash;[/];
  88908. - SyntaxKind.Text;[p];
  88909. - SyntaxKind.CloseAngle;[>];
  88910. +RazorDocument - [0..8)::8 - [<!p></p>]
  88911. + MarkupBlock - [0..8)::8
  88912. + MarkupTagBlock - [0..4)::4 - [<!p>]
  88913. + MarkupTextLiteral - [0..1)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88914. + OpenAngle;[<];
  88915. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88916. + Bang;[!];
  88917. + MarkupTextLiteral - [2..4)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88918. + Text;[p];
  88919. + CloseAngle;[>];
  88920. + MarkupTagBlock - [4..8)::4 - [</p>]
  88921. + MarkupTextLiteral - [4..8)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88922. + OpenAngle;[<];
  88923. + ForwardSlash;[/];
  88924. + Text;[p];
  88925. + CloseAngle;[>];
  88926. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData6.stree.txt
  88927. index 3b9cf7813a8..2dd48d43cfc 100644
  88928. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData6.stree.txt
  88929. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData6.stree.txt
  88930. @@ -1,12 +1,17 @@
  88931. -Markup block - Gen<None> - 8 - (0:0,0)
  88932. - Tag block - Gen<TagHelper> - 8 - (0:0,0) - p - ptaghelper
  88933. - StartTagAndEndTag - <p>
  88934. - Tag block - Gen<None> - 5 - (3:0,3)
  88935. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:2
  88936. - SyntaxKind.OpenAngle;[<];
  88937. - SyntaxKind.ForwardSlash;[/];
  88938. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (5:0,5) - Tokens:1
  88939. - SyntaxKind.Bang;[!];
  88940. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:2
  88941. - SyntaxKind.Text;[p];
  88942. - SyntaxKind.CloseAngle;[>];
  88943. +RazorDocument - [0..8)::8 - [<p></!p>]
  88944. + MarkupBlock - [0..8)::8
  88945. + MarkupTagHelperElement - [0..8)::8 - p[StartTagAndEndTag] - ptaghelper
  88946. + MarkupTagHelperStartTag - [0..3)::3
  88947. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88948. + OpenAngle;[<];
  88949. + Text;[p];
  88950. + CloseAngle;[>];
  88951. + MarkupTagBlock - [3..8)::5 - [</!p>]
  88952. + MarkupTextLiteral - [3..5)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88953. + OpenAngle;[<];
  88954. + ForwardSlash;[/];
  88955. + RazorMetaCode - [5..6)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88956. + Bang;[!];
  88957. + MarkupTextLiteral - [6..8)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88958. + Text;[p];
  88959. + CloseAngle;[>];
  88960. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData7.stree.txt
  88961. index 6d70a7544f6..cdd50c02832 100644
  88962. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData7.stree.txt
  88963. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData7.stree.txt
  88964. @@ -1,20 +1,31 @@
  88965. -Markup block - Gen<None> - 16 - (0:0,0)
  88966. - Tag block - Gen<TagHelper> - 16 - (0:0,0) - p - ptaghelper
  88967. - StartTagAndEndTag - <p> ... </p>
  88968. - Tag block - Gen<None> - 4 - (3:0,3)
  88969. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:1
  88970. - SyntaxKind.OpenAngle;[<];
  88971. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (4:0,4) - Tokens:1
  88972. - SyntaxKind.Bang;[!];
  88973. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:2
  88974. - SyntaxKind.Text;[p];
  88975. - SyntaxKind.CloseAngle;[>];
  88976. - Tag block - Gen<None> - 5 - (7:0,7)
  88977. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (7:0,7) - Tokens:2
  88978. - SyntaxKind.OpenAngle;[<];
  88979. - SyntaxKind.ForwardSlash;[/];
  88980. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (9:0,9) - Tokens:1
  88981. - SyntaxKind.Bang;[!];
  88982. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:2
  88983. - SyntaxKind.Text;[p];
  88984. - SyntaxKind.CloseAngle;[>];
  88985. +RazorDocument - [0..16)::16 - [<p><!p></!p></p>]
  88986. + MarkupBlock - [0..16)::16
  88987. + MarkupTagHelperElement - [0..16)::16 - p[StartTagAndEndTag] - ptaghelper
  88988. + MarkupTagHelperStartTag - [0..3)::3
  88989. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88990. + OpenAngle;[<];
  88991. + Text;[p];
  88992. + CloseAngle;[>];
  88993. + MarkupTagBlock - [3..7)::4 - [<!p>]
  88994. + MarkupTextLiteral - [3..4)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88995. + OpenAngle;[<];
  88996. + RazorMetaCode - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  88997. + Bang;[!];
  88998. + MarkupTextLiteral - [5..7)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  88999. + Text;[p];
  89000. + CloseAngle;[>];
  89001. + MarkupTagBlock - [7..12)::5 - [</!p>]
  89002. + MarkupTextLiteral - [7..9)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89003. + OpenAngle;[<];
  89004. + ForwardSlash;[/];
  89005. + RazorMetaCode - [9..10)::1 - Gen<None> - SpanEditHandler;Accepts:None
  89006. + Bang;[!];
  89007. + MarkupTextLiteral - [10..12)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89008. + Text;[p];
  89009. + CloseAngle;[>];
  89010. + MarkupTagHelperEndTag - [12..16)::4
  89011. + MarkupTextLiteral - [12..16)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89012. + OpenAngle;[<];
  89013. + ForwardSlash;[/];
  89014. + Text;[p];
  89015. + CloseAngle;[>];
  89016. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData8.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData8.stree.txt
  89017. index fa672e3eacc..187d7fbe981 100644
  89018. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData8.stree.txt
  89019. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData8.stree.txt
  89020. @@ -1,20 +1,25 @@
  89021. -Markup block - Gen<None> - 12 - (0:0,0)
  89022. - Tag block - Gen<TagHelper> - 12 - (0:0,0) - p - ptaghelper
  89023. - StartTagAndEndTag - <p>
  89024. - Tag block - Gen<None> - 4 - (3:0,3)
  89025. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:1
  89026. - SyntaxKind.OpenAngle;[<];
  89027. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (4:0,4) - Tokens:1
  89028. - SyntaxKind.Bang;[!];
  89029. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:2
  89030. - SyntaxKind.Text;[p];
  89031. - SyntaxKind.CloseAngle;[>];
  89032. - Tag block - Gen<None> - 5 - (7:0,7)
  89033. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (7:0,7) - Tokens:2
  89034. - SyntaxKind.OpenAngle;[<];
  89035. - SyntaxKind.ForwardSlash;[/];
  89036. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (9:0,9) - Tokens:1
  89037. - SyntaxKind.Bang;[!];
  89038. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:2
  89039. - SyntaxKind.Text;[p];
  89040. - SyntaxKind.CloseAngle;[>];
  89041. +RazorDocument - [0..12)::12 - [<p><!p></!p>]
  89042. + MarkupBlock - [0..12)::12
  89043. + MarkupTagHelperElement - [0..12)::12 - p[StartTagAndEndTag] - ptaghelper
  89044. + MarkupTagHelperStartTag - [0..3)::3
  89045. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89046. + OpenAngle;[<];
  89047. + Text;[p];
  89048. + CloseAngle;[>];
  89049. + MarkupTagBlock - [3..7)::4 - [<!p>]
  89050. + MarkupTextLiteral - [3..4)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89051. + OpenAngle;[<];
  89052. + RazorMetaCode - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  89053. + Bang;[!];
  89054. + MarkupTextLiteral - [5..7)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89055. + Text;[p];
  89056. + CloseAngle;[>];
  89057. + MarkupTagBlock - [7..12)::5 - [</!p>]
  89058. + MarkupTextLiteral - [7..9)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89059. + OpenAngle;[<];
  89060. + ForwardSlash;[/];
  89061. + RazorMetaCode - [9..10)::1 - Gen<None> - SpanEditHandler;Accepts:None
  89062. + Bang;[!];
  89063. + MarkupTextLiteral - [10..12)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89064. + Text;[p];
  89065. + CloseAngle;[>];
  89066. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData9.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData9.stree.txt
  89067. index aa0b8186ece..06cd6f93341 100644
  89068. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData9.stree.txt
  89069. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/AllowsTagHelperElementOptOutHTML_WithBlockData9.stree.txt
  89070. @@ -1,24 +1,25 @@
  89071. -Markup block - Gen<None> - 13 - (0:0,0)
  89072. - Tag block - Gen<None> - 4 - (0:0,0)
  89073. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  89074. - SyntaxKind.OpenAngle;[<];
  89075. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  89076. - SyntaxKind.Bang;[!];
  89077. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:Any - (2:0,2) - Tokens:2
  89078. - SyntaxKind.Text;[p];
  89079. - SyntaxKind.CloseAngle;[>];
  89080. - Tag block - Gen<None> - 5 - (4:0,4)
  89081. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:2
  89082. - SyntaxKind.OpenAngle;[<];
  89083. - SyntaxKind.ForwardSlash;[/];
  89084. - MetaCode span - Gen<None> - [!] - SpanEditHandler;Accepts:None - (6:0,6) - Tokens:1
  89085. - SyntaxKind.Bang;[!];
  89086. - Markup span - Gen<Markup> - [p>] - SpanEditHandler;Accepts:Any - (7:0,7) - Tokens:2
  89087. - SyntaxKind.Text;[p];
  89088. - SyntaxKind.CloseAngle;[>];
  89089. - Tag block - Gen<None> - 4 - (9:0,9)
  89090. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (9:0,9) - Tokens:4
  89091. - SyntaxKind.OpenAngle;[<];
  89092. - SyntaxKind.ForwardSlash;[/];
  89093. - SyntaxKind.Text;[p];
  89094. - SyntaxKind.CloseAngle;[>];
  89095. +RazorDocument - [0..13)::13 - [<!p></!p></p>]
  89096. + MarkupBlock - [0..13)::13
  89097. + MarkupTagBlock - [0..4)::4 - [<!p>]
  89098. + MarkupTextLiteral - [0..1)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89099. + OpenAngle;[<];
  89100. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  89101. + Bang;[!];
  89102. + MarkupTextLiteral - [2..4)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89103. + Text;[p];
  89104. + CloseAngle;[>];
  89105. + MarkupTagBlock - [4..9)::5 - [</!p>]
  89106. + MarkupTextLiteral - [4..6)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89107. + OpenAngle;[<];
  89108. + ForwardSlash;[/];
  89109. + RazorMetaCode - [6..7)::1 - Gen<None> - SpanEditHandler;Accepts:None
  89110. + Bang;[!];
  89111. + MarkupTextLiteral - [7..9)::2 - [p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89112. + Text;[p];
  89113. + CloseAngle;[>];
  89114. + MarkupTagBlock - [9..13)::4 - [</p>]
  89115. + MarkupTextLiteral - [9..13)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89116. + OpenAngle;[<];
  89117. + ForwardSlash;[/];
  89118. + Text;[p];
  89119. + CloseAngle;[>];
  89120. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/CanHandleInvalidChildrenWithWhitespace.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/CanHandleInvalidChildrenWithWhitespace.stree.txt
  89121. index f6b6472589e..af792a8cc40 100644
  89122. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/CanHandleInvalidChildrenWithWhitespace.stree.txt
  89123. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/CanHandleInvalidChildrenWithWhitespace.stree.txt
  89124. @@ -1,27 +1,36 @@
  89125. -Markup block - Gen<None> - 53 - (0:0,0)
  89126. - Tag block - Gen<TagHelper> - 53 - (0:0,0) - p - PTagHelper
  89127. - StartTagAndEndTag - <p> ... </p>
  89128. - SyntaxKind.HtmlTextLiteral - [LF ] - [3..9) - FullWidth: 6 - Slots: 1
  89129. - SyntaxKind.List - [LF ] - [3..9) - FullWidth: 6 - Slots: 2
  89130. - SyntaxKind.NewLine;[LF];
  89131. - SyntaxKind.Whitespace;[ ];
  89132. - Tag block - Gen<None> - 8 - (9:1,4)
  89133. - Markup span - Gen<Markup> - [<strong>] - SpanEditHandler;Accepts:Any - (9:1,4) - Tokens:3
  89134. - SyntaxKind.OpenAngle;[<];
  89135. - SyntaxKind.Text;[strong];
  89136. - SyntaxKind.CloseAngle;[>];
  89137. - SyntaxKind.HtmlTextLiteral - [LF HelloLF ] - [17..38) - FullWidth: 21 - Slots: 1
  89138. - SyntaxKind.List - [LF HelloLF ] - [17..38) - FullWidth: 21 - Slots: 5
  89139. - SyntaxKind.NewLine;[LF];
  89140. - SyntaxKind.Whitespace;[ ];
  89141. - SyntaxKind.Text;[Hello];
  89142. - SyntaxKind.NewLine;[LF];
  89143. - SyntaxKind.Whitespace;[ ];
  89144. - Tag block - Gen<None> - 9 - (38:3,4)
  89145. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (38:3,4) - Tokens:4
  89146. - SyntaxKind.OpenAngle;[<];
  89147. - SyntaxKind.ForwardSlash;[/];
  89148. - SyntaxKind.Text;[strong];
  89149. - SyntaxKind.CloseAngle;[>];
  89150. - SyntaxKind.HtmlTextLiteral - [LF] - [47..49) - FullWidth: 2 - Slots: 1
  89151. - SyntaxKind.NewLine;[LF];
  89152. +RazorDocument - [0..53)::53 - [<p>LF <strong>LF HelloLF </strong>LF</p>]
  89153. + MarkupBlock - [0..53)::53
  89154. + MarkupTagHelperElement - [0..53)::53 - p[StartTagAndEndTag] - PTagHelper
  89155. + MarkupTagHelperStartTag - [0..3)::3
  89156. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89157. + OpenAngle;[<];
  89158. + Text;[p];
  89159. + CloseAngle;[>];
  89160. + MarkupTextLiteral - [3..9)::6 - [LF ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89161. + NewLine;[LF];
  89162. + Whitespace;[ ];
  89163. + MarkupTagBlock - [9..17)::8 - [<strong>]
  89164. + MarkupTextLiteral - [9..17)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89165. + OpenAngle;[<];
  89166. + Text;[strong];
  89167. + CloseAngle;[>];
  89168. + MarkupTextLiteral - [17..38)::21 - [LF HelloLF ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89169. + NewLine;[LF];
  89170. + Whitespace;[ ];
  89171. + Text;[Hello];
  89172. + NewLine;[LF];
  89173. + Whitespace;[ ];
  89174. + MarkupTagBlock - [38..47)::9 - [</strong>]
  89175. + MarkupTextLiteral - [38..47)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89176. + OpenAngle;[<];
  89177. + ForwardSlash;[/];
  89178. + Text;[strong];
  89179. + CloseAngle;[>];
  89180. + MarkupTextLiteral - [47..49)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89181. + NewLine;[LF];
  89182. + MarkupTagHelperEndTag - [49..53)::4
  89183. + MarkupTextLiteral - [49..53)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89184. + OpenAngle;[<];
  89185. + ForwardSlash;[/];
  89186. + Text;[p];
  89187. + CloseAngle;[>];
  89188. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/CanHandleMultipleTagHelpersWithAllowedChildren.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/CanHandleMultipleTagHelpersWithAllowedChildren.stree.txt
  89189. index 895fbe36161..2fa4f737af2 100644
  89190. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/CanHandleMultipleTagHelpersWithAllowedChildren.stree.txt
  89191. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/CanHandleMultipleTagHelpersWithAllowedChildren.stree.txt
  89192. @@ -1,12 +1,36 @@
  89193. -Markup block - Gen<None> - 39 - (0:0,0)
  89194. - Tag block - Gen<TagHelper> - 39 - (0:0,0) - p - PTagHelper1 - PTagHelper2
  89195. - StartTagAndEndTag - <p> ... </p>
  89196. - Tag block - Gen<TagHelper> - 28 - (3:0,3) - strong - StrongTagHelper
  89197. - StartTagAndEndTag - <strong> ... </strong>
  89198. - SyntaxKind.HtmlTextLiteral - [Hello World] - [11..22) - FullWidth: 11 - Slots: 1
  89199. - SyntaxKind.List - [Hello World] - [11..22) - FullWidth: 11 - Slots: 3
  89200. - SyntaxKind.Text;[Hello];
  89201. - SyntaxKind.Whitespace;[ ];
  89202. - SyntaxKind.Text;[World];
  89203. - Tag block - Gen<TagHelper> - 4 - (31:0,31) - br - BRTagHelper
  89204. - StartTagOnly - <br>
  89205. +RazorDocument - [0..39)::39 - [<p><strong>Hello World</strong><br></p>]
  89206. + MarkupBlock - [0..39)::39
  89207. + MarkupTagHelperElement - [0..39)::39 - p[StartTagAndEndTag] - PTagHelper1 - PTagHelper2
  89208. + MarkupTagHelperStartTag - [0..3)::3
  89209. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89210. + OpenAngle;[<];
  89211. + Text;[p];
  89212. + CloseAngle;[>];
  89213. + MarkupTagHelperElement - [3..31)::28 - strong[StartTagAndEndTag] - StrongTagHelper
  89214. + MarkupTagHelperStartTag - [3..11)::8
  89215. + MarkupTextLiteral - [3..11)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89216. + OpenAngle;[<];
  89217. + Text;[strong];
  89218. + CloseAngle;[>];
  89219. + MarkupTextLiteral - [11..22)::11 - [Hello World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89220. + Text;[Hello];
  89221. + Whitespace;[ ];
  89222. + Text;[World];
  89223. + MarkupTagHelperEndTag - [22..31)::9
  89224. + MarkupTextLiteral - [22..31)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89225. + OpenAngle;[<];
  89226. + ForwardSlash;[/];
  89227. + Text;[strong];
  89228. + CloseAngle;[>];
  89229. + MarkupTagHelperElement - [31..35)::4 - br[StartTagOnly] - BRTagHelper
  89230. + MarkupTagHelperStartTag - [31..35)::4
  89231. + MarkupTextLiteral - [31..35)::4 - [<br>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89232. + OpenAngle;[<];
  89233. + Text;[br];
  89234. + CloseAngle;[>];
  89235. + MarkupTagHelperEndTag - [35..39)::4
  89236. + MarkupTextLiteral - [35..39)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89237. + OpenAngle;[<];
  89238. + ForwardSlash;[/];
  89239. + Text;[p];
  89240. + CloseAngle;[>];
  89241. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/CanHandleMultipleTagHelpersWithAllowedChildren_OneNull.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/CanHandleMultipleTagHelpersWithAllowedChildren_OneNull.stree.txt
  89242. index 895fbe36161..2fa4f737af2 100644
  89243. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/CanHandleMultipleTagHelpersWithAllowedChildren_OneNull.stree.txt
  89244. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/CanHandleMultipleTagHelpersWithAllowedChildren_OneNull.stree.txt
  89245. @@ -1,12 +1,36 @@
  89246. -Markup block - Gen<None> - 39 - (0:0,0)
  89247. - Tag block - Gen<TagHelper> - 39 - (0:0,0) - p - PTagHelper1 - PTagHelper2
  89248. - StartTagAndEndTag - <p> ... </p>
  89249. - Tag block - Gen<TagHelper> - 28 - (3:0,3) - strong - StrongTagHelper
  89250. - StartTagAndEndTag - <strong> ... </strong>
  89251. - SyntaxKind.HtmlTextLiteral - [Hello World] - [11..22) - FullWidth: 11 - Slots: 1
  89252. - SyntaxKind.List - [Hello World] - [11..22) - FullWidth: 11 - Slots: 3
  89253. - SyntaxKind.Text;[Hello];
  89254. - SyntaxKind.Whitespace;[ ];
  89255. - SyntaxKind.Text;[World];
  89256. - Tag block - Gen<TagHelper> - 4 - (31:0,31) - br - BRTagHelper
  89257. - StartTagOnly - <br>
  89258. +RazorDocument - [0..39)::39 - [<p><strong>Hello World</strong><br></p>]
  89259. + MarkupBlock - [0..39)::39
  89260. + MarkupTagHelperElement - [0..39)::39 - p[StartTagAndEndTag] - PTagHelper1 - PTagHelper2
  89261. + MarkupTagHelperStartTag - [0..3)::3
  89262. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89263. + OpenAngle;[<];
  89264. + Text;[p];
  89265. + CloseAngle;[>];
  89266. + MarkupTagHelperElement - [3..31)::28 - strong[StartTagAndEndTag] - StrongTagHelper
  89267. + MarkupTagHelperStartTag - [3..11)::8
  89268. + MarkupTextLiteral - [3..11)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89269. + OpenAngle;[<];
  89270. + Text;[strong];
  89271. + CloseAngle;[>];
  89272. + MarkupTextLiteral - [11..22)::11 - [Hello World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89273. + Text;[Hello];
  89274. + Whitespace;[ ];
  89275. + Text;[World];
  89276. + MarkupTagHelperEndTag - [22..31)::9
  89277. + MarkupTextLiteral - [22..31)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89278. + OpenAngle;[<];
  89279. + ForwardSlash;[/];
  89280. + Text;[strong];
  89281. + CloseAngle;[>];
  89282. + MarkupTagHelperElement - [31..35)::4 - br[StartTagOnly] - BRTagHelper
  89283. + MarkupTagHelperStartTag - [31..35)::4
  89284. + MarkupTextLiteral - [31..35)::4 - [<br>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89285. + OpenAngle;[<];
  89286. + Text;[br];
  89287. + CloseAngle;[>];
  89288. + MarkupTagHelperEndTag - [35..39)::4
  89289. + MarkupTextLiteral - [35..39)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89290. + OpenAngle;[<];
  89291. + ForwardSlash;[/];
  89292. + Text;[p];
  89293. + CloseAngle;[>];
  89294. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/CanHandleStartTagOnlyTagTagMode.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/CanHandleStartTagOnlyTagTagMode.stree.txt
  89295. index 64f951bb831..764c76b22e2 100644
  89296. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/CanHandleStartTagOnlyTagTagMode.stree.txt
  89297. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/CanHandleStartTagOnlyTagTagMode.stree.txt
  89298. @@ -1,3 +1,8 @@
  89299. -Markup block - Gen<None> - 7 - (0:0,0)
  89300. - Tag block - Gen<TagHelper> - 7 - (0:0,0) - input - InputTagHelper
  89301. - StartTagOnly - <input>
  89302. +RazorDocument - [0..7)::7 - [<input>]
  89303. + MarkupBlock - [0..7)::7
  89304. + MarkupTagHelperElement - [0..7)::7 - input[StartTagOnly] - InputTagHelper
  89305. + MarkupTagHelperStartTag - [0..7)::7
  89306. + MarkupTextLiteral - [0..7)::7 - [<input>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89307. + OpenAngle;[<];
  89308. + Text;[input];
  89309. + CloseAngle;[>];
  89310. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/CreatesErrorForInconsistentTagStructures.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/CreatesErrorForInconsistentTagStructures.stree.txt
  89311. index ce48d34623b..f75dab8e9ac 100644
  89312. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/CreatesErrorForInconsistentTagStructures.stree.txt
  89313. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/CreatesErrorForInconsistentTagStructures.stree.txt
  89314. @@ -1,3 +1,8 @@
  89315. -Markup block - Gen<None> - 7 - (0:0,0)
  89316. - Tag block - Gen<TagHelper> - 7 - (0:0,0) - input - InputTagHelper1 - InputTagHelper2
  89317. - StartTagOnly - <input>
  89318. +RazorDocument - [0..7)::7 - [<input>]
  89319. + MarkupBlock - [0..7)::7
  89320. + MarkupTagHelperElement - [0..7)::7 - input[StartTagOnly] - InputTagHelper1 - InputTagHelper2
  89321. + MarkupTagHelperStartTag - [0..7)::7
  89322. + MarkupTextLiteral - [0..7)::7 - [<input>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89323. + OpenAngle;[<];
  89324. + Text;[input];
  89325. + CloseAngle;[>];
  89326. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/CreatesErrorForWithoutEndTagTagStructureForEndTags.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/CreatesErrorForWithoutEndTagTagStructureForEndTags.stree.txt
  89327. index ccdf6fa946d..bbad7a51ed4 100644
  89328. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/CreatesErrorForWithoutEndTagTagStructureForEndTags.stree.txt
  89329. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/CreatesErrorForWithoutEndTagTagStructureForEndTags.stree.txt
  89330. @@ -1,7 +1,8 @@
  89331. -Markup block - Gen<None> - 8 - (0:0,0)
  89332. - Tag block - Gen<None> - 8 - (0:0,0)
  89333. - Markup span - Gen<Markup> - [</input>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:4
  89334. - SyntaxKind.OpenAngle;[<];
  89335. - SyntaxKind.ForwardSlash;[/];
  89336. - SyntaxKind.Text;[input];
  89337. - SyntaxKind.CloseAngle;[>];
  89338. +RazorDocument - [0..8)::8 - [</input>]
  89339. + MarkupBlock - [0..8)::8
  89340. + MarkupTagBlock - [0..8)::8 - [</input>]
  89341. + MarkupTextLiteral - [0..8)::8 - [</input>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89342. + OpenAngle;[<];
  89343. + ForwardSlash;[/];
  89344. + Text;[input];
  89345. + CloseAngle;[>];
  89346. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers1.diag.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers1.diag.txt
  89347. new file mode 100644
  89348. index 00000000000..67536937c3f
  89349. --- /dev/null
  89350. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers1.diag.txt
  89351. @@ -0,0 +1,5 @@
  89352. +(0,0): Error RZ3008: Tag helpers cannot target tag name '!--' because it contains a '!' character.
  89353. +(0,0): Error RZ3008: Tag helpers cannot target tag name '?xml' because it contains a '?' character.
  89354. +(0,0): Error RZ3008: Tag helpers cannot target tag name '![CDATA[' because it contains a '!' character.
  89355. +(0,0): Error RZ3008: Tag helpers cannot target tag name '![CDATA[' because it contains a '[' character.
  89356. +(0,0): Error RZ3008: Tag helpers cannot target tag name '!DOCTYPE' because it contains a '!' character.
  89357. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers1.stree.txt
  89358. index fbadbcc6d83..1d82e5c9d26 100644
  89359. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers1.stree.txt
  89360. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers1.stree.txt
  89361. @@ -1,26 +1,27 @@
  89362. -Markup block - Gen<None> - 31 - (0:0,0)
  89363. - Tag block - Gen<None> - 5 - (0:0,0)
  89364. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  89365. - SyntaxKind.OpenAngle;[<];
  89366. - SyntaxKind.Text;[foo];
  89367. - SyntaxKind.CloseAngle;[>];
  89368. - HtmlComment block - Gen<None> - 20 - (5:0,5)
  89369. - Markup span - Gen<Markup> - [<!--] - SpanEditHandler;Accepts:None - (5:0,5) - Tokens:3
  89370. - SyntaxKind.OpenAngle;[<];
  89371. - SyntaxKind.Bang;[!];
  89372. - SyntaxKind.DoubleHyphen;[--];
  89373. - Markup span - Gen<Markup> - [ Hello World ] - SpanEditHandler;Accepts:Whitespace - (9:0,9) - Tokens:5
  89374. - SyntaxKind.Whitespace;[ ];
  89375. - SyntaxKind.Text;[Hello];
  89376. - SyntaxKind.Whitespace;[ ];
  89377. - SyntaxKind.Text;[World];
  89378. - SyntaxKind.Whitespace;[ ];
  89379. - Markup span - Gen<Markup> - [-->] - SpanEditHandler;Accepts:None - (22:0,22) - Tokens:2
  89380. - SyntaxKind.DoubleHyphen;[--];
  89381. - SyntaxKind.CloseAngle;[>];
  89382. - Tag block - Gen<None> - 6 - (25:0,25)
  89383. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:4
  89384. - SyntaxKind.OpenAngle;[<];
  89385. - SyntaxKind.ForwardSlash;[/];
  89386. - SyntaxKind.Text;[foo];
  89387. - SyntaxKind.CloseAngle;[>];
  89388. +RazorDocument - [0..31)::31 - [<foo><!-- Hello World --></foo>]
  89389. + MarkupBlock - [0..31)::31
  89390. + MarkupTagBlock - [0..5)::5 - [<foo>]
  89391. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89392. + OpenAngle;[<];
  89393. + Text;[foo];
  89394. + CloseAngle;[>];
  89395. + MarkupCommentBlock - [5..25)::20
  89396. + MarkupTextLiteral - [5..9)::4 - [<!--] - Gen<Markup> - SpanEditHandler;Accepts:None
  89397. + OpenAngle;[<];
  89398. + Bang;[!];
  89399. + DoubleHyphen;[--];
  89400. + MarkupTextLiteral - [9..22)::13 - [ Hello World ] - Gen<Markup> - SpanEditHandler;Accepts:Whitespace
  89401. + Whitespace;[ ];
  89402. + Text;[Hello];
  89403. + Whitespace;[ ];
  89404. + Text;[World];
  89405. + Whitespace;[ ];
  89406. + MarkupTextLiteral - [22..25)::3 - [-->] - Gen<Markup> - SpanEditHandler;Accepts:None
  89407. + DoubleHyphen;[--];
  89408. + CloseAngle;[>];
  89409. + MarkupTagBlock - [25..31)::6 - [</foo>]
  89410. + MarkupTextLiteral - [25..31)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89411. + OpenAngle;[<];
  89412. + ForwardSlash;[/];
  89413. + Text;[foo];
  89414. + CloseAngle;[>];
  89415. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers2.diag.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers2.diag.txt
  89416. new file mode 100644
  89417. index 00000000000..67536937c3f
  89418. --- /dev/null
  89419. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers2.diag.txt
  89420. @@ -0,0 +1,5 @@
  89421. +(0,0): Error RZ3008: Tag helpers cannot target tag name '!--' because it contains a '!' character.
  89422. +(0,0): Error RZ3008: Tag helpers cannot target tag name '?xml' because it contains a '?' character.
  89423. +(0,0): Error RZ3008: Tag helpers cannot target tag name '![CDATA[' because it contains a '!' character.
  89424. +(0,0): Error RZ3008: Tag helpers cannot target tag name '![CDATA[' because it contains a '[' character.
  89425. +(0,0): Error RZ3008: Tag helpers cannot target tag name '!DOCTYPE' because it contains a '!' character.
  89426. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers2.stree.txt
  89427. index 96ad08ee150..6435e3cddfa 100644
  89428. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers2.stree.txt
  89429. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers2.stree.txt
  89430. @@ -1,29 +1,33 @@
  89431. -Markup block - Gen<None> - 24 - (0:0,0)
  89432. - Tag block - Gen<None> - 5 - (0:0,0)
  89433. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  89434. - SyntaxKind.OpenAngle;[<];
  89435. - SyntaxKind.Text;[foo];
  89436. - SyntaxKind.CloseAngle;[>];
  89437. - HtmlComment block - Gen<None> - 13 - (5:0,5)
  89438. - Markup span - Gen<Markup> - [<!--] - SpanEditHandler;Accepts:None - (5:0,5) - Tokens:3
  89439. - SyntaxKind.OpenAngle;[<];
  89440. - SyntaxKind.Bang;[!];
  89441. - SyntaxKind.DoubleHyphen;[--];
  89442. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Whitespace - (9:0,9) - Tokens:1
  89443. - SyntaxKind.Whitespace;[ ];
  89444. - Expression block - Gen<Expr> - 4 - (10:0,10)
  89445. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  89446. - SyntaxKind.Transition;[@];
  89447. - Code span - Gen<Expr> - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (11:0,11) - Tokens:1
  89448. - SyntaxKind.Identifier;[foo];
  89449. - Markup span - Gen<Markup> - [ ] - SpanEditHandler;Accepts:Whitespace - (14:0,14) - Tokens:1
  89450. - SyntaxKind.Whitespace;[ ];
  89451. - Markup span - Gen<Markup> - [-->] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:2
  89452. - SyntaxKind.DoubleHyphen;[--];
  89453. - SyntaxKind.CloseAngle;[>];
  89454. - Tag block - Gen<None> - 6 - (18:0,18)
  89455. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:4
  89456. - SyntaxKind.OpenAngle;[<];
  89457. - SyntaxKind.ForwardSlash;[/];
  89458. - SyntaxKind.Text;[foo];
  89459. - SyntaxKind.CloseAngle;[>];
  89460. +RazorDocument - [0..24)::24 - [<foo><!-- @foo --></foo>]
  89461. + MarkupBlock - [0..24)::24
  89462. + MarkupTagBlock - [0..5)::5 - [<foo>]
  89463. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89464. + OpenAngle;[<];
  89465. + Text;[foo];
  89466. + CloseAngle;[>];
  89467. + MarkupCommentBlock - [5..18)::13
  89468. + MarkupTextLiteral - [5..9)::4 - [<!--] - Gen<Markup> - SpanEditHandler;Accepts:None
  89469. + OpenAngle;[<];
  89470. + Bang;[!];
  89471. + DoubleHyphen;[--];
  89472. + MarkupTextLiteral - [9..10)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Whitespace
  89473. + Whitespace;[ ];
  89474. + CSharpCodeBlock - [10..14)::4
  89475. + CSharpImplicitExpression - [10..14)::4
  89476. + CSharpTransition - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  89477. + Transition;[@];
  89478. + CSharpImplicitExpressionBody - [11..14)::3
  89479. + CSharpCodeBlock - [11..14)::3
  89480. + CSharpExpressionLiteral - [11..14)::3 - [foo] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  89481. + Identifier;[foo];
  89482. + MarkupTextLiteral - [14..15)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Whitespace
  89483. + Whitespace;[ ];
  89484. + MarkupTextLiteral - [15..18)::3 - [-->] - Gen<Markup> - SpanEditHandler;Accepts:None
  89485. + DoubleHyphen;[--];
  89486. + CloseAngle;[>];
  89487. + MarkupTagBlock - [18..24)::6 - [</foo>]
  89488. + MarkupTextLiteral - [18..24)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89489. + OpenAngle;[<];
  89490. + ForwardSlash;[/];
  89491. + Text;[foo];
  89492. + CloseAngle;[>];
  89493. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers3.diag.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers3.diag.txt
  89494. new file mode 100644
  89495. index 00000000000..67536937c3f
  89496. --- /dev/null
  89497. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers3.diag.txt
  89498. @@ -0,0 +1,5 @@
  89499. +(0,0): Error RZ3008: Tag helpers cannot target tag name '!--' because it contains a '!' character.
  89500. +(0,0): Error RZ3008: Tag helpers cannot target tag name '?xml' because it contains a '?' character.
  89501. +(0,0): Error RZ3008: Tag helpers cannot target tag name '![CDATA[' because it contains a '!' character.
  89502. +(0,0): Error RZ3008: Tag helpers cannot target tag name '![CDATA[' because it contains a '[' character.
  89503. +(0,0): Error RZ3008: Tag helpers cannot target tag name '!DOCTYPE' because it contains a '!' character.
  89504. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers3.stree.txt
  89505. index a8c8955b7fc..a435551c46f 100644
  89506. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers3.stree.txt
  89507. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers3.stree.txt
  89508. @@ -1,24 +1,24 @@
  89509. -Markup block - Gen<None> - 31 - (0:0,0)
  89510. - Tag block - Gen<None> - 5 - (0:0,0)
  89511. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  89512. - SyntaxKind.OpenAngle;[<];
  89513. - SyntaxKind.Text;[foo];
  89514. - SyntaxKind.CloseAngle;[>];
  89515. - SyntaxKind.HtmlTextLiteral - [<?xml Hello World ?>] - [5..25) - FullWidth: 20 - Slots: 1
  89516. - SyntaxKind.List - [<?xml Hello World ?>] - [5..25) - FullWidth: 20 - Slots: 10
  89517. - SyntaxKind.OpenAngle;[<];
  89518. - SyntaxKind.QuestionMark;[?];
  89519. - SyntaxKind.Text;[xml];
  89520. - SyntaxKind.Whitespace;[ ];
  89521. - SyntaxKind.Text;[Hello];
  89522. - SyntaxKind.Whitespace;[ ];
  89523. - SyntaxKind.Text;[World];
  89524. - SyntaxKind.Whitespace;[ ];
  89525. - SyntaxKind.QuestionMark;[?];
  89526. - SyntaxKind.CloseAngle;[>];
  89527. - Tag block - Gen<None> - 6 - (25:0,25)
  89528. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:4
  89529. - SyntaxKind.OpenAngle;[<];
  89530. - SyntaxKind.ForwardSlash;[/];
  89531. - SyntaxKind.Text;[foo];
  89532. - SyntaxKind.CloseAngle;[>];
  89533. +RazorDocument - [0..31)::31 - [<foo><?xml Hello World ?></foo>]
  89534. + MarkupBlock - [0..31)::31
  89535. + MarkupTagBlock - [0..5)::5 - [<foo>]
  89536. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89537. + OpenAngle;[<];
  89538. + Text;[foo];
  89539. + CloseAngle;[>];
  89540. + MarkupTextLiteral - [5..25)::20 - [<?xml Hello World ?>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89541. + OpenAngle;[<];
  89542. + QuestionMark;[?];
  89543. + Text;[xml];
  89544. + Whitespace;[ ];
  89545. + Text;[Hello];
  89546. + Whitespace;[ ];
  89547. + Text;[World];
  89548. + Whitespace;[ ];
  89549. + QuestionMark;[?];
  89550. + CloseAngle;[>];
  89551. + MarkupTagBlock - [25..31)::6 - [</foo>]
  89552. + MarkupTextLiteral - [25..31)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89553. + OpenAngle;[<];
  89554. + ForwardSlash;[/];
  89555. + Text;[foo];
  89556. + CloseAngle;[>];
  89557. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers4.diag.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers4.diag.txt
  89558. new file mode 100644
  89559. index 00000000000..67536937c3f
  89560. --- /dev/null
  89561. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers4.diag.txt
  89562. @@ -0,0 +1,5 @@
  89563. +(0,0): Error RZ3008: Tag helpers cannot target tag name '!--' because it contains a '!' character.
  89564. +(0,0): Error RZ3008: Tag helpers cannot target tag name '?xml' because it contains a '?' character.
  89565. +(0,0): Error RZ3008: Tag helpers cannot target tag name '![CDATA[' because it contains a '!' character.
  89566. +(0,0): Error RZ3008: Tag helpers cannot target tag name '![CDATA[' because it contains a '[' character.
  89567. +(0,0): Error RZ3008: Tag helpers cannot target tag name '!DOCTYPE' because it contains a '!' character.
  89568. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers4.stree.txt
  89569. index 23207701ddd..8aa9f08484a 100644
  89570. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers4.stree.txt
  89571. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers4.stree.txt
  89572. @@ -1,27 +1,30 @@
  89573. -Markup block - Gen<None> - 24 - (0:0,0)
  89574. - Tag block - Gen<None> - 5 - (0:0,0)
  89575. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  89576. - SyntaxKind.OpenAngle;[<];
  89577. - SyntaxKind.Text;[foo];
  89578. - SyntaxKind.CloseAngle;[>];
  89579. - Markup span - Gen<Markup> - [<?xml ] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:4
  89580. - SyntaxKind.OpenAngle;[<];
  89581. - SyntaxKind.QuestionMark;[?];
  89582. - SyntaxKind.Text;[xml];
  89583. - SyntaxKind.Whitespace;[ ];
  89584. - Expression block - Gen<Expr> - 4 - (11:0,11)
  89585. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (11:0,11) - Tokens:1
  89586. - SyntaxKind.Transition;[@];
  89587. - Code span - Gen<Expr> - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (12:0,12) - Tokens:1
  89588. - SyntaxKind.Identifier;[foo];
  89589. - SyntaxKind.HtmlTextLiteral - [ ?>] - [15..18) - FullWidth: 3 - Slots: 1
  89590. - SyntaxKind.List - [ ?>] - [15..18) - FullWidth: 3 - Slots: 3
  89591. - SyntaxKind.Whitespace;[ ];
  89592. - SyntaxKind.QuestionMark;[?];
  89593. - SyntaxKind.CloseAngle;[>];
  89594. - Tag block - Gen<None> - 6 - (18:0,18)
  89595. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:4
  89596. - SyntaxKind.OpenAngle;[<];
  89597. - SyntaxKind.ForwardSlash;[/];
  89598. - SyntaxKind.Text;[foo];
  89599. - SyntaxKind.CloseAngle;[>];
  89600. +RazorDocument - [0..24)::24 - [<foo><?xml @foo ?></foo>]
  89601. + MarkupBlock - [0..24)::24
  89602. + MarkupTagBlock - [0..5)::5 - [<foo>]
  89603. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89604. + OpenAngle;[<];
  89605. + Text;[foo];
  89606. + CloseAngle;[>];
  89607. + MarkupTextLiteral - [5..11)::6 - [<?xml ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89608. + OpenAngle;[<];
  89609. + QuestionMark;[?];
  89610. + Text;[xml];
  89611. + Whitespace;[ ];
  89612. + CSharpCodeBlock - [11..15)::4
  89613. + CSharpImplicitExpression - [11..15)::4
  89614. + CSharpTransition - [11..12)::1 - Gen<None> - SpanEditHandler;Accepts:None
  89615. + Transition;[@];
  89616. + CSharpImplicitExpressionBody - [12..15)::3
  89617. + CSharpCodeBlock - [12..15)::3
  89618. + CSharpExpressionLiteral - [12..15)::3 - [foo] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  89619. + Identifier;[foo];
  89620. + MarkupTextLiteral - [15..18)::3 - [ ?>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89621. + Whitespace;[ ];
  89622. + QuestionMark;[?];
  89623. + CloseAngle;[>];
  89624. + MarkupTagBlock - [18..24)::6 - [</foo>]
  89625. + MarkupTextLiteral - [18..24)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89626. + OpenAngle;[<];
  89627. + ForwardSlash;[/];
  89628. + Text;[foo];
  89629. + CloseAngle;[>];
  89630. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers5.diag.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers5.diag.txt
  89631. new file mode 100644
  89632. index 00000000000..67536937c3f
  89633. --- /dev/null
  89634. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers5.diag.txt
  89635. @@ -0,0 +1,5 @@
  89636. +(0,0): Error RZ3008: Tag helpers cannot target tag name '!--' because it contains a '!' character.
  89637. +(0,0): Error RZ3008: Tag helpers cannot target tag name '?xml' because it contains a '?' character.
  89638. +(0,0): Error RZ3008: Tag helpers cannot target tag name '![CDATA[' because it contains a '!' character.
  89639. +(0,0): Error RZ3008: Tag helpers cannot target tag name '![CDATA[' because it contains a '[' character.
  89640. +(0,0): Error RZ3008: Tag helpers cannot target tag name '!DOCTYPE' because it contains a '!' character.
  89641. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers5.stree.txt
  89642. index 639e17fa3a4..bb000ad7fc5 100644
  89643. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers5.stree.txt
  89644. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers5.stree.txt
  89645. @@ -1,26 +1,29 @@
  89646. -Markup block - Gen<None> - 27 - (0:0,0)
  89647. - Tag block - Gen<None> - 5 - (0:0,0)
  89648. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  89649. - SyntaxKind.OpenAngle;[<];
  89650. - SyntaxKind.Text;[foo];
  89651. - SyntaxKind.CloseAngle;[>];
  89652. - Markup span - Gen<Markup> - [<!DOCTYPE ] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:4
  89653. - SyntaxKind.OpenAngle;[<];
  89654. - SyntaxKind.Bang;[!];
  89655. - SyntaxKind.Text;[DOCTYPE];
  89656. - SyntaxKind.Whitespace;[ ];
  89657. - Expression block - Gen<Expr> - 4 - (15:0,15)
  89658. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:1
  89659. - SyntaxKind.Transition;[@];
  89660. - Code span - Gen<Expr> - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (16:0,16) - Tokens:1
  89661. - SyntaxKind.Identifier;[foo];
  89662. - SyntaxKind.HtmlTextLiteral - [ >] - [19..21) - FullWidth: 2 - Slots: 1
  89663. - SyntaxKind.List - [ >] - [19..21) - FullWidth: 2 - Slots: 2
  89664. - SyntaxKind.Whitespace;[ ];
  89665. - SyntaxKind.CloseAngle;[>];
  89666. - Tag block - Gen<None> - 6 - (21:0,21)
  89667. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:4
  89668. - SyntaxKind.OpenAngle;[<];
  89669. - SyntaxKind.ForwardSlash;[/];
  89670. - SyntaxKind.Text;[foo];
  89671. - SyntaxKind.CloseAngle;[>];
  89672. +RazorDocument - [0..27)::27 - [<foo><!DOCTYPE @foo ></foo>]
  89673. + MarkupBlock - [0..27)::27
  89674. + MarkupTagBlock - [0..5)::5 - [<foo>]
  89675. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89676. + OpenAngle;[<];
  89677. + Text;[foo];
  89678. + CloseAngle;[>];
  89679. + MarkupTextLiteral - [5..15)::10 - [<!DOCTYPE ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89680. + OpenAngle;[<];
  89681. + Bang;[!];
  89682. + Text;[DOCTYPE];
  89683. + Whitespace;[ ];
  89684. + CSharpCodeBlock - [15..19)::4
  89685. + CSharpImplicitExpression - [15..19)::4
  89686. + CSharpTransition - [15..16)::1 - Gen<None> - SpanEditHandler;Accepts:None
  89687. + Transition;[@];
  89688. + CSharpImplicitExpressionBody - [16..19)::3
  89689. + CSharpCodeBlock - [16..19)::3
  89690. + CSharpExpressionLiteral - [16..19)::3 - [foo] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  89691. + Identifier;[foo];
  89692. + MarkupTextLiteral - [19..21)::2 - [ >] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89693. + Whitespace;[ ];
  89694. + CloseAngle;[>];
  89695. + MarkupTagBlock - [21..27)::6 - [</foo>]
  89696. + MarkupTextLiteral - [21..27)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89697. + OpenAngle;[<];
  89698. + ForwardSlash;[/];
  89699. + Text;[foo];
  89700. + CloseAngle;[>];
  89701. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers6.diag.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers6.diag.txt
  89702. new file mode 100644
  89703. index 00000000000..67536937c3f
  89704. --- /dev/null
  89705. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers6.diag.txt
  89706. @@ -0,0 +1,5 @@
  89707. +(0,0): Error RZ3008: Tag helpers cannot target tag name '!--' because it contains a '!' character.
  89708. +(0,0): Error RZ3008: Tag helpers cannot target tag name '?xml' because it contains a '?' character.
  89709. +(0,0): Error RZ3008: Tag helpers cannot target tag name '![CDATA[' because it contains a '!' character.
  89710. +(0,0): Error RZ3008: Tag helpers cannot target tag name '![CDATA[' because it contains a '[' character.
  89711. +(0,0): Error RZ3008: Tag helpers cannot target tag name '!DOCTYPE' because it contains a '!' character.
  89712. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers6.stree.txt
  89713. index 4e9a913468c..f2dffdde66e 100644
  89714. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers6.stree.txt
  89715. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers6.stree.txt
  89716. @@ -1,25 +1,25 @@
  89717. -Markup block - Gen<None> - 36 - (0:0,0)
  89718. - Tag block - Gen<None> - 5 - (0:0,0)
  89719. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  89720. - SyntaxKind.OpenAngle;[<];
  89721. - SyntaxKind.Text;[foo];
  89722. - SyntaxKind.CloseAngle;[>];
  89723. - SyntaxKind.HtmlTextLiteral - [<!DOCTYPE hello="world" >] - [5..30) - FullWidth: 25 - Slots: 1
  89724. - SyntaxKind.List - [<!DOCTYPE hello="world" >] - [5..30) - FullWidth: 25 - Slots: 11
  89725. - SyntaxKind.OpenAngle;[<];
  89726. - SyntaxKind.Bang;[!];
  89727. - SyntaxKind.Text;[DOCTYPE];
  89728. - SyntaxKind.Whitespace;[ ];
  89729. - SyntaxKind.Text;[hello];
  89730. - SyntaxKind.Equals;[=];
  89731. - SyntaxKind.DoubleQuote;["];
  89732. - SyntaxKind.Text;[world];
  89733. - SyntaxKind.DoubleQuote;["];
  89734. - SyntaxKind.Whitespace;[ ];
  89735. - SyntaxKind.CloseAngle;[>];
  89736. - Tag block - Gen<None> - 6 - (30:0,30)
  89737. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:Any - (30:0,30) - Tokens:4
  89738. - SyntaxKind.OpenAngle;[<];
  89739. - SyntaxKind.ForwardSlash;[/];
  89740. - SyntaxKind.Text;[foo];
  89741. - SyntaxKind.CloseAngle;[>];
  89742. +RazorDocument - [0..36)::36 - [<foo><!DOCTYPE hello="world" ></foo>]
  89743. + MarkupBlock - [0..36)::36
  89744. + MarkupTagBlock - [0..5)::5 - [<foo>]
  89745. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89746. + OpenAngle;[<];
  89747. + Text;[foo];
  89748. + CloseAngle;[>];
  89749. + MarkupTextLiteral - [5..30)::25 - [<!DOCTYPE hello="world" >] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89750. + OpenAngle;[<];
  89751. + Bang;[!];
  89752. + Text;[DOCTYPE];
  89753. + Whitespace;[ ];
  89754. + Text;[hello];
  89755. + Equals;[=];
  89756. + DoubleQuote;["];
  89757. + Text;[world];
  89758. + DoubleQuote;["];
  89759. + Whitespace;[ ];
  89760. + CloseAngle;[>];
  89761. + MarkupTagBlock - [30..36)::6 - [</foo>]
  89762. + MarkupTextLiteral - [30..36)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89763. + OpenAngle;[<];
  89764. + ForwardSlash;[/];
  89765. + Text;[foo];
  89766. + CloseAngle;[>];
  89767. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers7.diag.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers7.diag.txt
  89768. new file mode 100644
  89769. index 00000000000..67536937c3f
  89770. --- /dev/null
  89771. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers7.diag.txt
  89772. @@ -0,0 +1,5 @@
  89773. +(0,0): Error RZ3008: Tag helpers cannot target tag name '!--' because it contains a '!' character.
  89774. +(0,0): Error RZ3008: Tag helpers cannot target tag name '?xml' because it contains a '?' character.
  89775. +(0,0): Error RZ3008: Tag helpers cannot target tag name '![CDATA[' because it contains a '!' character.
  89776. +(0,0): Error RZ3008: Tag helpers cannot target tag name '![CDATA[' because it contains a '[' character.
  89777. +(0,0): Error RZ3008: Tag helpers cannot target tag name '!DOCTYPE' because it contains a '!' character.
  89778. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers7.stree.txt
  89779. index 429c94278d1..23a73af555a 100644
  89780. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers7.stree.txt
  89781. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers7.stree.txt
  89782. @@ -1,27 +1,27 @@
  89783. -Markup block - Gen<None> - 36 - (0:0,0)
  89784. - Tag block - Gen<None> - 5 - (0:0,0)
  89785. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  89786. - SyntaxKind.OpenAngle;[<];
  89787. - SyntaxKind.Text;[foo];
  89788. - SyntaxKind.CloseAngle;[>];
  89789. - SyntaxKind.HtmlTextLiteral - [<![CDATA[ Hello World ]]>] - [5..30) - FullWidth: 25 - Slots: 1
  89790. - SyntaxKind.List - [<![CDATA[ Hello World ]]>] - [5..30) - FullWidth: 25 - Slots: 13
  89791. - SyntaxKind.OpenAngle;[<];
  89792. - SyntaxKind.Bang;[!];
  89793. - SyntaxKind.LeftBracket;[[];
  89794. - SyntaxKind.Text;[CDATA];
  89795. - SyntaxKind.LeftBracket;[[];
  89796. - SyntaxKind.Whitespace;[ ];
  89797. - SyntaxKind.Text;[Hello];
  89798. - SyntaxKind.Whitespace;[ ];
  89799. - SyntaxKind.Text;[World];
  89800. - SyntaxKind.Whitespace;[ ];
  89801. - SyntaxKind.RightBracket;[]];
  89802. - SyntaxKind.RightBracket;[]];
  89803. - SyntaxKind.CloseAngle;[>];
  89804. - Tag block - Gen<None> - 6 - (30:0,30)
  89805. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:Any - (30:0,30) - Tokens:4
  89806. - SyntaxKind.OpenAngle;[<];
  89807. - SyntaxKind.ForwardSlash;[/];
  89808. - SyntaxKind.Text;[foo];
  89809. - SyntaxKind.CloseAngle;[>];
  89810. +RazorDocument - [0..36)::36 - [<foo><![CDATA[ Hello World ]]></foo>]
  89811. + MarkupBlock - [0..36)::36
  89812. + MarkupTagBlock - [0..5)::5 - [<foo>]
  89813. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89814. + OpenAngle;[<];
  89815. + Text;[foo];
  89816. + CloseAngle;[>];
  89817. + MarkupTextLiteral - [5..30)::25 - [<![CDATA[ Hello World ]]>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89818. + OpenAngle;[<];
  89819. + Bang;[!];
  89820. + LeftBracket;[[];
  89821. + Text;[CDATA];
  89822. + LeftBracket;[[];
  89823. + Whitespace;[ ];
  89824. + Text;[Hello];
  89825. + Whitespace;[ ];
  89826. + Text;[World];
  89827. + Whitespace;[ ];
  89828. + RightBracket;[]];
  89829. + RightBracket;[]];
  89830. + CloseAngle;[>];
  89831. + MarkupTagBlock - [30..36)::6 - [</foo>]
  89832. + MarkupTextLiteral - [30..36)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89833. + OpenAngle;[<];
  89834. + ForwardSlash;[/];
  89835. + Text;[foo];
  89836. + CloseAngle;[>];
  89837. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers8.diag.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers8.diag.txt
  89838. new file mode 100644
  89839. index 00000000000..67536937c3f
  89840. --- /dev/null
  89841. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers8.diag.txt
  89842. @@ -0,0 +1,5 @@
  89843. +(0,0): Error RZ3008: Tag helpers cannot target tag name '!--' because it contains a '!' character.
  89844. +(0,0): Error RZ3008: Tag helpers cannot target tag name '?xml' because it contains a '?' character.
  89845. +(0,0): Error RZ3008: Tag helpers cannot target tag name '![CDATA[' because it contains a '!' character.
  89846. +(0,0): Error RZ3008: Tag helpers cannot target tag name '![CDATA[' because it contains a '[' character.
  89847. +(0,0): Error RZ3008: Tag helpers cannot target tag name '!DOCTYPE' because it contains a '!' character.
  89848. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers8.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers8.stree.txt
  89849. index 513b48778d2..bc149d4674a 100644
  89850. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers8.stree.txt
  89851. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteSpecialTagTagHelpers8.stree.txt
  89852. @@ -1,30 +1,33 @@
  89853. -Markup block - Gen<None> - 29 - (0:0,0)
  89854. - Tag block - Gen<None> - 5 - (0:0,0)
  89855. - Markup span - Gen<Markup> - [<foo>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  89856. - SyntaxKind.OpenAngle;[<];
  89857. - SyntaxKind.Text;[foo];
  89858. - SyntaxKind.CloseAngle;[>];
  89859. - Markup span - Gen<Markup> - [<![CDATA[ ] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:6
  89860. - SyntaxKind.OpenAngle;[<];
  89861. - SyntaxKind.Bang;[!];
  89862. - SyntaxKind.LeftBracket;[[];
  89863. - SyntaxKind.Text;[CDATA];
  89864. - SyntaxKind.LeftBracket;[[];
  89865. - SyntaxKind.Whitespace;[ ];
  89866. - Expression block - Gen<Expr> - 4 - (15:0,15)
  89867. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (15:0,15) - Tokens:1
  89868. - SyntaxKind.Transition;[@];
  89869. - Code span - Gen<Expr> - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (16:0,16) - Tokens:1
  89870. - SyntaxKind.Identifier;[foo];
  89871. - SyntaxKind.HtmlTextLiteral - [ ]]>] - [19..23) - FullWidth: 4 - Slots: 1
  89872. - SyntaxKind.List - [ ]]>] - [19..23) - FullWidth: 4 - Slots: 4
  89873. - SyntaxKind.Whitespace;[ ];
  89874. - SyntaxKind.RightBracket;[]];
  89875. - SyntaxKind.RightBracket;[]];
  89876. - SyntaxKind.CloseAngle;[>];
  89877. - Tag block - Gen<None> - 6 - (23:0,23)
  89878. - Markup span - Gen<Markup> - [</foo>] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:4
  89879. - SyntaxKind.OpenAngle;[<];
  89880. - SyntaxKind.ForwardSlash;[/];
  89881. - SyntaxKind.Text;[foo];
  89882. - SyntaxKind.CloseAngle;[>];
  89883. +RazorDocument - [0..29)::29 - [<foo><![CDATA[ @foo ]]></foo>]
  89884. + MarkupBlock - [0..29)::29
  89885. + MarkupTagBlock - [0..5)::5 - [<foo>]
  89886. + MarkupTextLiteral - [0..5)::5 - [<foo>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89887. + OpenAngle;[<];
  89888. + Text;[foo];
  89889. + CloseAngle;[>];
  89890. + MarkupTextLiteral - [5..15)::10 - [<![CDATA[ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89891. + OpenAngle;[<];
  89892. + Bang;[!];
  89893. + LeftBracket;[[];
  89894. + Text;[CDATA];
  89895. + LeftBracket;[[];
  89896. + Whitespace;[ ];
  89897. + CSharpCodeBlock - [15..19)::4
  89898. + CSharpImplicitExpression - [15..19)::4
  89899. + CSharpTransition - [15..16)::1 - Gen<None> - SpanEditHandler;Accepts:None
  89900. + Transition;[@];
  89901. + CSharpImplicitExpressionBody - [16..19)::3
  89902. + CSharpCodeBlock - [16..19)::3
  89903. + CSharpExpressionLiteral - [16..19)::3 - [foo] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  89904. + Identifier;[foo];
  89905. + MarkupTextLiteral - [19..23)::4 - [ ]]>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89906. + Whitespace;[ ];
  89907. + RightBracket;[]];
  89908. + RightBracket;[]];
  89909. + CloseAngle;[>];
  89910. + MarkupTagBlock - [23..29)::6 - [</foo>]
  89911. + MarkupTextLiteral - [23..29)::6 - [</foo>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89912. + OpenAngle;[<];
  89913. + ForwardSlash;[/];
  89914. + Text;[foo];
  89915. + CloseAngle;[>];
  89916. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteTextTagTransitionTagHelpers1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteTextTagTransitionTagHelpers1.stree.txt
  89917. index 36c3ee79ec9..a0890322ffd 100644
  89918. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteTextTagTransitionTagHelpers1.stree.txt
  89919. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteTextTagTransitionTagHelpers1.stree.txt
  89920. @@ -1,8 +1,18 @@
  89921. -Markup block - Gen<None> - 24 - (0:0,0)
  89922. - Tag block - Gen<TagHelper> - 24 - (0:0,0) - text - texttaghelper
  89923. - StartTagAndEndTag - <text> ... </text>
  89924. - SyntaxKind.HtmlTextLiteral - [Hello World] - [6..17) - FullWidth: 11 - Slots: 1
  89925. - SyntaxKind.List - [Hello World] - [6..17) - FullWidth: 11 - Slots: 3
  89926. - SyntaxKind.Text;[Hello];
  89927. - SyntaxKind.Whitespace;[ ];
  89928. - SyntaxKind.Text;[World];
  89929. +RazorDocument - [0..24)::24 - [<text>Hello World</text>]
  89930. + MarkupBlock - [0..24)::24
  89931. + MarkupTagHelperElement - [0..24)::24 - text[StartTagAndEndTag] - texttaghelper
  89932. + MarkupTagHelperStartTag - [0..6)::6
  89933. + MarkupTextLiteral - [0..6)::6 - [<text>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89934. + OpenAngle;[<];
  89935. + Text;[text];
  89936. + CloseAngle;[>];
  89937. + MarkupTextLiteral - [6..17)::11 - [Hello World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89938. + Text;[Hello];
  89939. + Whitespace;[ ];
  89940. + Text;[World];
  89941. + MarkupTagHelperEndTag - [17..24)::7
  89942. + MarkupTextLiteral - [17..24)::7 - [</text>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89943. + OpenAngle;[<];
  89944. + ForwardSlash;[/];
  89945. + Text;[text];
  89946. + CloseAngle;[>];
  89947. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteTextTagTransitionTagHelpers2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteTextTagTransitionTagHelpers2.stree.txt
  89948. index cf9c0f9b262..fcfb244b784 100644
  89949. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteTextTagTransitionTagHelpers2.stree.txt
  89950. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteTextTagTransitionTagHelpers2.stree.txt
  89951. @@ -1,30 +1,34 @@
  89952. -Markup block - Gen<None> - 27 - (0:0,0)
  89953. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  89954. - SyntaxKind.Unknown;[];
  89955. - Statement block - Gen<None> - 27 - (0:0,0)
  89956. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  89957. - SyntaxKind.Transition;[@];
  89958. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  89959. - SyntaxKind.LeftBrace;[{];
  89960. - Markup block - Gen<None> - 24 - (2:0,2)
  89961. - Tag block - Gen<None> - 6 - (2:0,2)
  89962. - Transition span - Gen<None> - [<text>] - SpanEditHandler;Accepts:None - (2:0,2) - Tokens:3
  89963. - SyntaxKind.OpenAngle;[<];
  89964. - SyntaxKind.Text;[text];
  89965. - SyntaxKind.CloseAngle;[>];
  89966. - Markup span - Gen<Markup> - [Hello World] - SpanEditHandler;Accepts:None - (8:0,8) - Tokens:3
  89967. - SyntaxKind.Text;[Hello];
  89968. - SyntaxKind.Whitespace;[ ];
  89969. - SyntaxKind.Text;[World];
  89970. - Tag block - Gen<None> - 7 - (19:0,19)
  89971. - Transition span - Gen<None> - [</text>] - SpanEditHandler;Accepts:None - (19:0,19) - Tokens:4
  89972. - SyntaxKind.OpenAngle;[<];
  89973. - SyntaxKind.ForwardSlash;[/];
  89974. - SyntaxKind.Text;[text];
  89975. - SyntaxKind.CloseAngle;[>];
  89976. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (26:0,26) - Tokens:1
  89977. - SyntaxKind.Unknown;[];
  89978. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (26:0,26) - Tokens:1
  89979. - SyntaxKind.RightBrace;[}];
  89980. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (27:0,27) - Tokens:1
  89981. - SyntaxKind.Unknown;[];
  89982. +RazorDocument - [0..27)::27 - [@{<text>Hello World</text>}]
  89983. + MarkupBlock - [0..27)::27
  89984. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  89985. + Marker;[];
  89986. + CSharpCodeBlock - [0..27)::27
  89987. + CSharpStatement - [0..27)::27
  89988. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  89989. + Transition;[@];
  89990. + CSharpStatementBody - [1..27)::26
  89991. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  89992. + LeftBrace;[{];
  89993. + CSharpCodeBlock - [2..26)::24
  89994. + MarkupBlock - [2..26)::24
  89995. + MarkupTagBlock - [2..8)::6 - [<text>]
  89996. + MarkupTransition - [2..8)::6 - Gen<None> - SpanEditHandler;Accepts:None
  89997. + OpenAngle;[<];
  89998. + Text;[text];
  89999. + CloseAngle;[>];
  90000. + MarkupTextLiteral - [8..19)::11 - [Hello World] - Gen<Markup> - SpanEditHandler;Accepts:None
  90001. + Text;[Hello];
  90002. + Whitespace;[ ];
  90003. + Text;[World];
  90004. + MarkupTagBlock - [19..26)::7 - [</text>]
  90005. + MarkupTransition - [19..26)::7 - Gen<None> - SpanEditHandler;Accepts:None
  90006. + OpenAngle;[<];
  90007. + ForwardSlash;[/];
  90008. + Text;[text];
  90009. + CloseAngle;[>];
  90010. + CSharpStatementLiteral - [26..26)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  90011. + Marker;[];
  90012. + RazorMetaCode - [26..27)::1 - Gen<None> - SpanEditHandler;Accepts:None
  90013. + RightBrace;[}];
  90014. + MarkupTextLiteral - [27..27)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90015. + Marker;[];
  90016. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteTextTagTransitionTagHelpers3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteTextTagTransitionTagHelpers3.stree.txt
  90017. index a579c1c53f8..7287056321b 100644
  90018. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteTextTagTransitionTagHelpers3.stree.txt
  90019. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteTextTagTransitionTagHelpers3.stree.txt
  90020. @@ -1,32 +1,46 @@
  90021. -Markup block - Gen<None> - 34 - (0:0,0)
  90022. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  90023. - SyntaxKind.Unknown;[];
  90024. - Statement block - Gen<None> - 34 - (0:0,0)
  90025. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  90026. - SyntaxKind.Transition;[@];
  90027. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  90028. - SyntaxKind.LeftBrace;[{];
  90029. - Markup block - Gen<None> - 31 - (2:0,2)
  90030. - Tag block - Gen<None> - 6 - (2:0,2)
  90031. - Transition span - Gen<None> - [<text>] - SpanEditHandler;Accepts:None - (2:0,2) - Tokens:3
  90032. - SyntaxKind.OpenAngle;[<];
  90033. - SyntaxKind.Text;[text];
  90034. - SyntaxKind.CloseAngle;[>];
  90035. - Tag block - Gen<TagHelper> - 18 - (8:0,8) - p - ptaghelper
  90036. - StartTagAndEndTag - <p> ... </p>
  90037. - Markup span - Gen<Markup> - [Hello World] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:3
  90038. - SyntaxKind.Text;[Hello];
  90039. - SyntaxKind.Whitespace;[ ];
  90040. - SyntaxKind.Text;[World];
  90041. - Tag block - Gen<None> - 7 - (26:0,26)
  90042. - Transition span - Gen<None> - [</text>] - SpanEditHandler;Accepts:None - (26:0,26) - Tokens:4
  90043. - SyntaxKind.OpenAngle;[<];
  90044. - SyntaxKind.ForwardSlash;[/];
  90045. - SyntaxKind.Text;[text];
  90046. - SyntaxKind.CloseAngle;[>];
  90047. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (33:0,33) - Tokens:1
  90048. - SyntaxKind.Unknown;[];
  90049. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (33:0,33) - Tokens:1
  90050. - SyntaxKind.RightBrace;[}];
  90051. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (34:0,34) - Tokens:1
  90052. - SyntaxKind.Unknown;[];
  90053. +RazorDocument - [0..34)::34 - [@{<text><p>Hello World</p></text>}]
  90054. + MarkupBlock - [0..34)::34
  90055. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90056. + Marker;[];
  90057. + CSharpCodeBlock - [0..34)::34
  90058. + CSharpStatement - [0..34)::34
  90059. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  90060. + Transition;[@];
  90061. + CSharpStatementBody - [1..34)::33
  90062. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  90063. + LeftBrace;[{];
  90064. + CSharpCodeBlock - [2..33)::31
  90065. + MarkupBlock - [2..33)::31
  90066. + MarkupTagBlock - [2..8)::6 - [<text>]
  90067. + MarkupTransition - [2..8)::6 - Gen<None> - SpanEditHandler;Accepts:None
  90068. + OpenAngle;[<];
  90069. + Text;[text];
  90070. + CloseAngle;[>];
  90071. + MarkupTagHelperElement - [8..26)::18 - p[StartTagAndEndTag] - ptaghelper
  90072. + MarkupTagHelperStartTag - [8..11)::3
  90073. + MarkupTextLiteral - [8..11)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  90074. + OpenAngle;[<];
  90075. + Text;[p];
  90076. + CloseAngle;[>];
  90077. + MarkupTextLiteral - [11..22)::11 - [Hello World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90078. + Text;[Hello];
  90079. + Whitespace;[ ];
  90080. + Text;[World];
  90081. + MarkupTagHelperEndTag - [22..26)::4
  90082. + MarkupTextLiteral - [22..26)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  90083. + OpenAngle;[<];
  90084. + ForwardSlash;[/];
  90085. + Text;[p];
  90086. + CloseAngle;[>];
  90087. + MarkupTagBlock - [26..33)::7 - [</text>]
  90088. + MarkupTransition - [26..33)::7 - Gen<None> - SpanEditHandler;Accepts:None
  90089. + OpenAngle;[<];
  90090. + ForwardSlash;[/];
  90091. + Text;[text];
  90092. + CloseAngle;[>];
  90093. + CSharpStatementLiteral - [33..33)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  90094. + Marker;[];
  90095. + RazorMetaCode - [33..34)::1 - Gen<None> - SpanEditHandler;Accepts:None
  90096. + RightBrace;[}];
  90097. + MarkupTextLiteral - [34..34)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90098. + Marker;[];
  90099. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteTextTagTransitionTagHelpers4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteTextTagTransitionTagHelpers4.stree.txt
  90100. index 1a76d36a921..2376ffa0883 100644
  90101. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteTextTagTransitionTagHelpers4.stree.txt
  90102. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotRewriteTextTagTransitionTagHelpers4.stree.txt
  90103. @@ -1,23 +1,47 @@
  90104. -Markup block - Gen<None> - 34 - (0:0,0)
  90105. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  90106. - SyntaxKind.Unknown;[];
  90107. - Statement block - Gen<None> - 34 - (0:0,0)
  90108. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Tokens:1
  90109. - SyntaxKind.Transition;[@];
  90110. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (1:0,1) - Tokens:1
  90111. - SyntaxKind.LeftBrace;[{];
  90112. - Markup block - Gen<None> - 31 - (2:0,2)
  90113. - Tag block - Gen<TagHelper> - 31 - (2:0,2) - p - ptaghelper
  90114. - StartTagAndEndTag - <p> ... </p>
  90115. - Tag block - Gen<TagHelper> - 24 - (5:0,5) - text - texttaghelper
  90116. - StartTagAndEndTag - <text> ... </text>
  90117. - Markup span - Gen<Markup> - [Hello World] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:3
  90118. - SyntaxKind.Text;[Hello];
  90119. - SyntaxKind.Whitespace;[ ];
  90120. - SyntaxKind.Text;[World];
  90121. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (33:0,33) - Tokens:1
  90122. - SyntaxKind.Unknown;[];
  90123. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (33:0,33) - Tokens:1
  90124. - SyntaxKind.RightBrace;[}];
  90125. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (34:0,34) - Tokens:1
  90126. - SyntaxKind.Unknown;[];
  90127. +RazorDocument - [0..34)::34 - [@{<p><text>Hello World</text></p>}]
  90128. + MarkupBlock - [0..34)::34
  90129. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90130. + Marker;[];
  90131. + CSharpCodeBlock - [0..34)::34
  90132. + CSharpStatement - [0..34)::34
  90133. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  90134. + Transition;[@];
  90135. + CSharpStatementBody - [1..34)::33
  90136. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  90137. + LeftBrace;[{];
  90138. + CSharpCodeBlock - [2..33)::31
  90139. + MarkupBlock - [2..33)::31
  90140. + MarkupTagHelperElement - [2..33)::31 - p[StartTagAndEndTag] - ptaghelper
  90141. + MarkupTagHelperStartTag - [2..5)::3
  90142. + MarkupTextLiteral - [2..5)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  90143. + OpenAngle;[<];
  90144. + Text;[p];
  90145. + CloseAngle;[>];
  90146. + MarkupTagHelperElement - [5..29)::24 - text[StartTagAndEndTag] - texttaghelper
  90147. + MarkupTagHelperStartTag - [5..11)::6
  90148. + MarkupTextLiteral - [5..11)::6 - [<text>] - Gen<Markup> - SpanEditHandler;Accepts:None
  90149. + OpenAngle;[<];
  90150. + Text;[text];
  90151. + CloseAngle;[>];
  90152. + MarkupTextLiteral - [11..22)::11 - [Hello World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90153. + Text;[Hello];
  90154. + Whitespace;[ ];
  90155. + Text;[World];
  90156. + MarkupTagHelperEndTag - [22..29)::7
  90157. + MarkupTextLiteral - [22..29)::7 - [</text>] - Gen<Markup> - SpanEditHandler;Accepts:None
  90158. + OpenAngle;[<];
  90159. + ForwardSlash;[/];
  90160. + Text;[text];
  90161. + CloseAngle;[>];
  90162. + MarkupTagHelperEndTag - [29..33)::4
  90163. + MarkupTextLiteral - [29..33)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:None
  90164. + OpenAngle;[<];
  90165. + ForwardSlash;[/];
  90166. + Text;[p];
  90167. + CloseAngle;[>];
  90168. + CSharpStatementLiteral - [33..33)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  90169. + Marker;[];
  90170. + RazorMetaCode - [33..34)::1 - Gen<None> - SpanEditHandler;Accepts:None
  90171. + RightBrace;[}];
  90172. + MarkupTextLiteral - [34..34)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90173. + Marker;[];
  90174. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotUnderstandTagHelpersInInvalidHtmlTypedScriptTags1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotUnderstandTagHelpersInInvalidHtmlTypedScriptTags1.stree.txt
  90175. index 7e9ac9853e4..4fbcbc27ed7 100644
  90176. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotUnderstandTagHelpersInInvalidHtmlTypedScriptTags1.stree.txt
  90177. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotUnderstandTagHelpersInInvalidHtmlTypedScriptTags1.stree.txt
  90178. @@ -1,23 +1,25 @@
  90179. -Markup block - Gen<None> - 31 - (0:0,0)
  90180. - Tag block - Gen<None> - 13 - (0:0,0)
  90181. - Markup span - Gen<Markup> - [<script] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  90182. - SyntaxKind.OpenAngle;[<];
  90183. - SyntaxKind.Text;[script];
  90184. - Markup block - Gen<None> - 5 - (7:0,7)
  90185. - Markup span - Gen<Markup> - [ type] - SpanEditHandler;Accepts:Any - (7:0,7) - Tokens:2
  90186. - SyntaxKind.Whitespace;[ ];
  90187. - SyntaxKind.Text;[type];
  90188. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:1
  90189. - SyntaxKind.CloseAngle;[>];
  90190. - Markup span - Gen<Markup> - [<input />] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:5
  90191. - SyntaxKind.OpenAngle;[<];
  90192. - SyntaxKind.Text;[input];
  90193. - SyntaxKind.Whitespace;[ ];
  90194. - SyntaxKind.ForwardSlash;[/];
  90195. - SyntaxKind.CloseAngle;[>];
  90196. - Tag block - Gen<None> - 9 - (22:0,22)
  90197. - Markup span - Gen<Markup> - [</script>] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:4
  90198. - SyntaxKind.OpenAngle;[<];
  90199. - SyntaxKind.ForwardSlash;[/];
  90200. - SyntaxKind.Text;[script];
  90201. - SyntaxKind.CloseAngle;[>];
  90202. +RazorDocument - [0..31)::31 - [<script type><input /></script>]
  90203. + MarkupBlock - [0..31)::31
  90204. + MarkupTagBlock - [0..13)::13 - [<script type>]
  90205. + MarkupTextLiteral - [0..7)::7 - [<script] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90206. + OpenAngle;[<];
  90207. + Text;[script];
  90208. + MarkupMinimizedAttributeBlock - [7..12)::5 - [ type]
  90209. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90210. + Whitespace;[ ];
  90211. + MarkupTextLiteral - [8..12)::4 - [type] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90212. + Text;[type];
  90213. + MarkupTextLiteral - [12..13)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90214. + CloseAngle;[>];
  90215. + MarkupTextLiteral - [13..22)::9 - [<input />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90216. + OpenAngle;[<];
  90217. + Text;[input];
  90218. + Whitespace;[ ];
  90219. + ForwardSlash;[/];
  90220. + CloseAngle;[>];
  90221. + MarkupTagBlock - [22..31)::9 - [</script>]
  90222. + MarkupTextLiteral - [22..31)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90223. + OpenAngle;[<];
  90224. + ForwardSlash;[/];
  90225. + Text;[script];
  90226. + CloseAngle;[>];
  90227. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotUnderstandTagHelpersInInvalidHtmlTypedScriptTags2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotUnderstandTagHelpersInInvalidHtmlTypedScriptTags2.stree.txt
  90228. index 717a88fcf1e..eeb165528a7 100644
  90229. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotUnderstandTagHelpersInInvalidHtmlTypedScriptTags2.stree.txt
  90230. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotUnderstandTagHelpersInInvalidHtmlTypedScriptTags2.stree.txt
  90231. @@ -1,31 +1,36 @@
  90232. -Markup block - Gen<None> - 44 - (0:0,0)
  90233. - Tag block - Gen<None> - 26 - (0:0,0)
  90234. - Markup span - Gen<Markup> - [<script] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  90235. - SyntaxKind.OpenAngle;[<];
  90236. - SyntaxKind.Text;[script];
  90237. - Markup block - Gen<Attr:types, types='@(7:0,7),'@(24:0,24)> - 18 - (7:0,7)
  90238. - Markup span - Gen<None> - [ types='] - SpanEditHandler;Accepts:Any - (7:0,7) - Tokens:4
  90239. - SyntaxKind.Whitespace;[ ];
  90240. - SyntaxKind.Text;[types];
  90241. - SyntaxKind.Equals;[=];
  90242. - SyntaxKind.SingleQuote;['];
  90243. - Markup span - Gen<LitAttr:@(15:0,15)> - [text/html] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:3
  90244. - SyntaxKind.Text;[text];
  90245. - SyntaxKind.ForwardSlash;[/];
  90246. - SyntaxKind.Text;[html];
  90247. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (24:0,24) - Tokens:1
  90248. - SyntaxKind.SingleQuote;['];
  90249. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:1
  90250. - SyntaxKind.CloseAngle;[>];
  90251. - Markup span - Gen<Markup> - [<input />] - SpanEditHandler;Accepts:Any - (26:0,26) - Tokens:5
  90252. - SyntaxKind.OpenAngle;[<];
  90253. - SyntaxKind.Text;[input];
  90254. - SyntaxKind.Whitespace;[ ];
  90255. - SyntaxKind.ForwardSlash;[/];
  90256. - SyntaxKind.CloseAngle;[>];
  90257. - Tag block - Gen<None> - 9 - (35:0,35)
  90258. - Markup span - Gen<Markup> - [</script>] - SpanEditHandler;Accepts:Any - (35:0,35) - Tokens:4
  90259. - SyntaxKind.OpenAngle;[<];
  90260. - SyntaxKind.ForwardSlash;[/];
  90261. - SyntaxKind.Text;[script];
  90262. - SyntaxKind.CloseAngle;[>];
  90263. +RazorDocument - [0..44)::44 - [<script types='text/html'><input /></script>]
  90264. + MarkupBlock - [0..44)::44
  90265. + MarkupTagBlock - [0..26)::26 - [<script types='text/html'>]
  90266. + MarkupTextLiteral - [0..7)::7 - [<script] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90267. + OpenAngle;[<];
  90268. + Text;[script];
  90269. + MarkupAttributeBlock - [7..25)::18 - [ types='text/html']
  90270. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90271. + Whitespace;[ ];
  90272. + MarkupTextLiteral - [8..13)::5 - [types] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90273. + Text;[types];
  90274. + Equals;[=];
  90275. + MarkupTextLiteral - [14..15)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  90276. + SingleQuote;['];
  90277. + GenericBlock - [15..24)::9
  90278. + MarkupLiteralAttributeValue - [15..24)::9 - [text/html]
  90279. + MarkupTextLiteral - [15..24)::9 - [text/html] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90280. + Text;[text];
  90281. + ForwardSlash;[/];
  90282. + Text;[html];
  90283. + MarkupTextLiteral - [24..25)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  90284. + SingleQuote;['];
  90285. + MarkupTextLiteral - [25..26)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90286. + CloseAngle;[>];
  90287. + MarkupTextLiteral - [26..35)::9 - [<input />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90288. + OpenAngle;[<];
  90289. + Text;[input];
  90290. + Whitespace;[ ];
  90291. + ForwardSlash;[/];
  90292. + CloseAngle;[>];
  90293. + MarkupTagBlock - [35..44)::9 - [</script>]
  90294. + MarkupTextLiteral - [35..44)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90295. + OpenAngle;[<];
  90296. + ForwardSlash;[/];
  90297. + Text;[script];
  90298. + CloseAngle;[>];
  90299. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotUnderstandTagHelpersInInvalidHtmlTypedScriptTags3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotUnderstandTagHelpersInInvalidHtmlTypedScriptTags3.stree.txt
  90300. index 0af4884cfaf..a0644755665 100644
  90301. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotUnderstandTagHelpersInInvalidHtmlTypedScriptTags3.stree.txt
  90302. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotUnderstandTagHelpersInInvalidHtmlTypedScriptTags3.stree.txt
  90303. @@ -1,34 +1,41 @@
  90304. -Markup block - Gen<None> - 51 - (0:0,0)
  90305. - Tag block - Gen<None> - 33 - (0:0,0)
  90306. - Markup span - Gen<Markup> - [<script] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  90307. - SyntaxKind.OpenAngle;[<];
  90308. - SyntaxKind.Text;[script];
  90309. - Markup block - Gen<Attr:type, type='@(7:0,7),'@(31:0,31)> - 25 - (7:0,7)
  90310. - Markup span - Gen<None> - [ type='] - SpanEditHandler;Accepts:Any - (7:0,7) - Tokens:4
  90311. - SyntaxKind.Whitespace;[ ];
  90312. - SyntaxKind.Text;[type];
  90313. - SyntaxKind.Equals;[=];
  90314. - SyntaxKind.SingleQuote;['];
  90315. - Markup span - Gen<LitAttr:@(14:0,14)> - [text/html] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:3
  90316. - SyntaxKind.Text;[text];
  90317. - SyntaxKind.ForwardSlash;[/];
  90318. - SyntaxKind.Text;[html];
  90319. - Markup span - Gen<LitAttr: @(23:0,23)> - [ invalid] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:2
  90320. - SyntaxKind.Whitespace;[ ];
  90321. - SyntaxKind.Text;[invalid];
  90322. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (31:0,31) - Tokens:1
  90323. - SyntaxKind.SingleQuote;['];
  90324. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (32:0,32) - Tokens:1
  90325. - SyntaxKind.CloseAngle;[>];
  90326. - Markup span - Gen<Markup> - [<input />] - SpanEditHandler;Accepts:Any - (33:0,33) - Tokens:5
  90327. - SyntaxKind.OpenAngle;[<];
  90328. - SyntaxKind.Text;[input];
  90329. - SyntaxKind.Whitespace;[ ];
  90330. - SyntaxKind.ForwardSlash;[/];
  90331. - SyntaxKind.CloseAngle;[>];
  90332. - Tag block - Gen<None> - 9 - (42:0,42)
  90333. - Markup span - Gen<Markup> - [</script>] - SpanEditHandler;Accepts:Any - (42:0,42) - Tokens:4
  90334. - SyntaxKind.OpenAngle;[<];
  90335. - SyntaxKind.ForwardSlash;[/];
  90336. - SyntaxKind.Text;[script];
  90337. - SyntaxKind.CloseAngle;[>];
  90338. +RazorDocument - [0..51)::51 - [<script type='text/html invalid'><input /></script>]
  90339. + MarkupBlock - [0..51)::51
  90340. + MarkupTagBlock - [0..33)::33 - [<script type='text/html invalid'>]
  90341. + MarkupTextLiteral - [0..7)::7 - [<script] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90342. + OpenAngle;[<];
  90343. + Text;[script];
  90344. + MarkupAttributeBlock - [7..32)::25 - [ type='text/html invalid']
  90345. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90346. + Whitespace;[ ];
  90347. + MarkupTextLiteral - [8..12)::4 - [type] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90348. + Text;[type];
  90349. + Equals;[=];
  90350. + MarkupTextLiteral - [13..14)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  90351. + SingleQuote;['];
  90352. + GenericBlock - [14..31)::17
  90353. + MarkupLiteralAttributeValue - [14..23)::9 - [text/html]
  90354. + MarkupTextLiteral - [14..23)::9 - [text/html] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90355. + Text;[text];
  90356. + ForwardSlash;[/];
  90357. + Text;[html];
  90358. + MarkupLiteralAttributeValue - [23..31)::8 - [ invalid]
  90359. + MarkupTextLiteral - [23..24)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90360. + Whitespace;[ ];
  90361. + MarkupTextLiteral - [24..31)::7 - [invalid] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90362. + Text;[invalid];
  90363. + MarkupTextLiteral - [31..32)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  90364. + SingleQuote;['];
  90365. + MarkupTextLiteral - [32..33)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90366. + CloseAngle;[>];
  90367. + MarkupTextLiteral - [33..42)::9 - [<input />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90368. + OpenAngle;[<];
  90369. + Text;[input];
  90370. + Whitespace;[ ];
  90371. + ForwardSlash;[/];
  90372. + CloseAngle;[>];
  90373. + MarkupTagBlock - [42..51)::9 - [</script>]
  90374. + MarkupTextLiteral - [42..51)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90375. + OpenAngle;[<];
  90376. + ForwardSlash;[/];
  90377. + Text;[script];
  90378. + CloseAngle;[>];
  90379. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotUnderstandTagHelpersInInvalidHtmlTypedScriptTags4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotUnderstandTagHelpersInInvalidHtmlTypedScriptTags4.stree.txt
  90380. index 497785349ee..50e28a2af11 100644
  90381. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotUnderstandTagHelpersInInvalidHtmlTypedScriptTags4.stree.txt
  90382. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesNotUnderstandTagHelpersInInvalidHtmlTypedScriptTags4.stree.txt
  90383. @@ -1,43 +1,52 @@
  90384. -Markup block - Gen<None> - 60 - (0:0,0)
  90385. - Tag block - Gen<None> - 42 - (0:0,0)
  90386. - Markup span - Gen<Markup> - [<script] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  90387. - SyntaxKind.OpenAngle;[<];
  90388. - SyntaxKind.Text;[script];
  90389. - Markup block - Gen<Attr:type, type='@(7:0,7),'@(23:0,23)> - 17 - (7:0,7)
  90390. - Markup span - Gen<None> - [ type='] - SpanEditHandler;Accepts:Any - (7:0,7) - Tokens:4
  90391. - SyntaxKind.Whitespace;[ ];
  90392. - SyntaxKind.Text;[type];
  90393. - SyntaxKind.Equals;[=];
  90394. - SyntaxKind.SingleQuote;['];
  90395. - Markup span - Gen<LitAttr:@(14:0,14)> - [text/ng-*] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:3
  90396. - SyntaxKind.Text;[text];
  90397. - SyntaxKind.ForwardSlash;[/];
  90398. - SyntaxKind.Text;[ng-*];
  90399. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:1
  90400. - SyntaxKind.SingleQuote;['];
  90401. - Markup block - Gen<Attr:type, type='@(24:0,24),'@(40:0,40)> - 17 - (24:0,24)
  90402. - Markup span - Gen<None> - [ type='] - SpanEditHandler;Accepts:Any - (24:0,24) - Tokens:4
  90403. - SyntaxKind.Whitespace;[ ];
  90404. - SyntaxKind.Text;[type];
  90405. - SyntaxKind.Equals;[=];
  90406. - SyntaxKind.SingleQuote;['];
  90407. - Markup span - Gen<LitAttr:@(31:0,31)> - [text/html] - SpanEditHandler;Accepts:Any - (31:0,31) - Tokens:3
  90408. - SyntaxKind.Text;[text];
  90409. - SyntaxKind.ForwardSlash;[/];
  90410. - SyntaxKind.Text;[html];
  90411. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (40:0,40) - Tokens:1
  90412. - SyntaxKind.SingleQuote;['];
  90413. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (41:0,41) - Tokens:1
  90414. - SyntaxKind.CloseAngle;[>];
  90415. - Markup span - Gen<Markup> - [<input />] - SpanEditHandler;Accepts:Any - (42:0,42) - Tokens:5
  90416. - SyntaxKind.OpenAngle;[<];
  90417. - SyntaxKind.Text;[input];
  90418. - SyntaxKind.Whitespace;[ ];
  90419. - SyntaxKind.ForwardSlash;[/];
  90420. - SyntaxKind.CloseAngle;[>];
  90421. - Tag block - Gen<None> - 9 - (51:0,51)
  90422. - Markup span - Gen<Markup> - [</script>] - SpanEditHandler;Accepts:Any - (51:0,51) - Tokens:4
  90423. - SyntaxKind.OpenAngle;[<];
  90424. - SyntaxKind.ForwardSlash;[/];
  90425. - SyntaxKind.Text;[script];
  90426. - SyntaxKind.CloseAngle;[>];
  90427. +RazorDocument - [0..60)::60 - [<script type='text/ng-*' type='text/html'><input /></script>]
  90428. + MarkupBlock - [0..60)::60
  90429. + MarkupTagBlock - [0..42)::42 - [<script type='text/ng-*' type='text/html'>]
  90430. + MarkupTextLiteral - [0..7)::7 - [<script] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90431. + OpenAngle;[<];
  90432. + Text;[script];
  90433. + MarkupAttributeBlock - [7..24)::17 - [ type='text/ng-*']
  90434. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90435. + Whitespace;[ ];
  90436. + MarkupTextLiteral - [8..12)::4 - [type] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90437. + Text;[type];
  90438. + Equals;[=];
  90439. + MarkupTextLiteral - [13..14)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  90440. + SingleQuote;['];
  90441. + GenericBlock - [14..23)::9
  90442. + MarkupLiteralAttributeValue - [14..23)::9 - [text/ng-*]
  90443. + MarkupTextLiteral - [14..23)::9 - [text/ng-*] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90444. + Text;[text];
  90445. + ForwardSlash;[/];
  90446. + Text;[ng-*];
  90447. + MarkupTextLiteral - [23..24)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  90448. + SingleQuote;['];
  90449. + MarkupAttributeBlock - [24..41)::17 - [ type='text/html']
  90450. + MarkupTextLiteral - [24..25)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90451. + Whitespace;[ ];
  90452. + MarkupTextLiteral - [25..29)::4 - [type] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90453. + Text;[type];
  90454. + Equals;[=];
  90455. + MarkupTextLiteral - [30..31)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  90456. + SingleQuote;['];
  90457. + GenericBlock - [31..40)::9
  90458. + MarkupLiteralAttributeValue - [31..40)::9 - [text/html]
  90459. + MarkupTextLiteral - [31..40)::9 - [text/html] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90460. + Text;[text];
  90461. + ForwardSlash;[/];
  90462. + Text;[html];
  90463. + MarkupTextLiteral - [40..41)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  90464. + SingleQuote;['];
  90465. + MarkupTextLiteral - [41..42)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90466. + CloseAngle;[>];
  90467. + MarkupTextLiteral - [42..51)::9 - [<input />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90468. + OpenAngle;[<];
  90469. + Text;[input];
  90470. + Whitespace;[ ];
  90471. + ForwardSlash;[/];
  90472. + CloseAngle;[>];
  90473. + MarkupTagBlock - [51..60)::9 - [</script>]
  90474. + MarkupTextLiteral - [51..60)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90475. + OpenAngle;[<];
  90476. + ForwardSlash;[/];
  90477. + Text;[script];
  90478. + CloseAngle;[>];
  90479. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesntAllowSimpleHtmlCommentsAsChildrenWhenFeatureFlagIsOff.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesntAllowSimpleHtmlCommentsAsChildrenWhenFeatureFlagIsOff.stree.txt
  90480. index e2345c824de..5aaa74ba02c 100644
  90481. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesntAllowSimpleHtmlCommentsAsChildrenWhenFeatureFlagIsOff.stree.txt
  90482. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/DoesntAllowSimpleHtmlCommentsAsChildrenWhenFeatureFlagIsOff.stree.txt
  90483. @@ -1,13 +1,24 @@
  90484. -Markup block - Gen<None> - 19 - (0:0,0)
  90485. - Tag block - Gen<TagHelper> - 19 - (0:0,0) - p - PTagHelper
  90486. - StartTagAndEndTag - <p> ... </p>
  90487. - HtmlComment block - Gen<None> - 12 - (3:0,3)
  90488. - Markup span - Gen<Markup> - [<!--] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:3
  90489. - SyntaxKind.OpenAngle;[<];
  90490. - SyntaxKind.Bang;[!];
  90491. - SyntaxKind.DoubleHyphen;[--];
  90492. - Markup span - Gen<Markup> - [Hello] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  90493. - SyntaxKind.Text;[Hello];
  90494. - Markup span - Gen<Markup> - [-->] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:2
  90495. - SyntaxKind.DoubleHyphen;[--];
  90496. - SyntaxKind.CloseAngle;[>];
  90497. +RazorDocument - [0..19)::19 - [<p><!--Hello--></p>]
  90498. + MarkupBlock - [0..19)::19
  90499. + MarkupTagHelperElement - [0..19)::19 - p[StartTagAndEndTag] - PTagHelper
  90500. + MarkupTagHelperStartTag - [0..3)::3
  90501. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90502. + OpenAngle;[<];
  90503. + Text;[p];
  90504. + CloseAngle;[>];
  90505. + MarkupCommentBlock - [3..15)::12
  90506. + MarkupTextLiteral - [3..7)::4 - [<!--] - Gen<Markup> - SpanEditHandler;Accepts:None
  90507. + OpenAngle;[<];
  90508. + Bang;[!];
  90509. + DoubleHyphen;[--];
  90510. + MarkupTextLiteral - [7..12)::5 - [Hello] - Gen<Markup> - SpanEditHandler;Accepts:Whitespace
  90511. + Text;[Hello];
  90512. + MarkupTextLiteral - [12..15)::3 - [-->] - Gen<Markup> - SpanEditHandler;Accepts:None
  90513. + DoubleHyphen;[--];
  90514. + CloseAngle;[>];
  90515. + MarkupTagHelperEndTag - [15..19)::4
  90516. + MarkupTextLiteral - [15..19)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90517. + OpenAngle;[<];
  90518. + ForwardSlash;[/];
  90519. + Text;[p];
  90520. + CloseAngle;[>];
  90521. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/FailsForContentWithCommentsAsChildren.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/FailsForContentWithCommentsAsChildren.stree.txt
  90522. index 3a1c9224ad0..783308c6ae7 100644
  90523. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/FailsForContentWithCommentsAsChildren.stree.txt
  90524. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/FailsForContentWithCommentsAsChildren.stree.txt
  90525. @@ -1,25 +1,36 @@
  90526. -Markup block - Gen<None> - 35 - (0:0,0)
  90527. - Tag block - Gen<TagHelper> - 35 - (0:0,0) - p - PTagHelper
  90528. - StartTagAndEndTag - <p> ... </p>
  90529. - HtmlComment block - Gen<None> - 12 - (3:0,3)
  90530. - Markup span - Gen<Markup> - [<!--] - SpanEditHandler;Accepts:None - (3:0,3) - Tokens:3
  90531. - SyntaxKind.OpenAngle;[<];
  90532. - SyntaxKind.Bang;[!];
  90533. - SyntaxKind.DoubleHyphen;[--];
  90534. - Markup span - Gen<Markup> - [Hello] - SpanEditHandler;Accepts:Whitespace - (7:0,7) - Tokens:1
  90535. - SyntaxKind.Text;[Hello];
  90536. - Markup span - Gen<Markup> - [-->] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:2
  90537. - SyntaxKind.DoubleHyphen;[--];
  90538. - SyntaxKind.CloseAngle;[>];
  90539. - Markup span - Gen<Markup> - [asdf] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:1
  90540. - SyntaxKind.Text;[asdf];
  90541. - HtmlComment block - Gen<None> - 12 - (19:0,19)
  90542. - Markup span - Gen<Markup> - [<!--] - SpanEditHandler;Accepts:None - (19:0,19) - Tokens:3
  90543. - SyntaxKind.OpenAngle;[<];
  90544. - SyntaxKind.Bang;[!];
  90545. - SyntaxKind.DoubleHyphen;[--];
  90546. - Markup span - Gen<Markup> - [World] - SpanEditHandler;Accepts:Whitespace - (23:0,23) - Tokens:1
  90547. - SyntaxKind.Text;[World];
  90548. - Markup span - Gen<Markup> - [-->] - SpanEditHandler;Accepts:None - (28:0,28) - Tokens:2
  90549. - SyntaxKind.DoubleHyphen;[--];
  90550. - SyntaxKind.CloseAngle;[>];
  90551. +RazorDocument - [0..35)::35 - [<p><!--Hello-->asdf<!--World--></p>]
  90552. + MarkupBlock - [0..35)::35
  90553. + MarkupTagHelperElement - [0..35)::35 - p[StartTagAndEndTag] - PTagHelper
  90554. + MarkupTagHelperStartTag - [0..3)::3
  90555. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90556. + OpenAngle;[<];
  90557. + Text;[p];
  90558. + CloseAngle;[>];
  90559. + MarkupCommentBlock - [3..15)::12
  90560. + MarkupTextLiteral - [3..7)::4 - [<!--] - Gen<Markup> - SpanEditHandler;Accepts:None
  90561. + OpenAngle;[<];
  90562. + Bang;[!];
  90563. + DoubleHyphen;[--];
  90564. + MarkupTextLiteral - [7..12)::5 - [Hello] - Gen<Markup> - SpanEditHandler;Accepts:Whitespace
  90565. + Text;[Hello];
  90566. + MarkupTextLiteral - [12..15)::3 - [-->] - Gen<Markup> - SpanEditHandler;Accepts:None
  90567. + DoubleHyphen;[--];
  90568. + CloseAngle;[>];
  90569. + MarkupTextLiteral - [15..19)::4 - [asdf] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90570. + Text;[asdf];
  90571. + MarkupCommentBlock - [19..31)::12
  90572. + MarkupTextLiteral - [19..23)::4 - [<!--] - Gen<Markup> - SpanEditHandler;Accepts:None
  90573. + OpenAngle;[<];
  90574. + Bang;[!];
  90575. + DoubleHyphen;[--];
  90576. + MarkupTextLiteral - [23..28)::5 - [World] - Gen<Markup> - SpanEditHandler;Accepts:Whitespace
  90577. + Text;[World];
  90578. + MarkupTextLiteral - [28..31)::3 - [-->] - Gen<Markup> - SpanEditHandler;Accepts:None
  90579. + DoubleHyphen;[--];
  90580. + CloseAngle;[>];
  90581. + MarkupTagHelperEndTag - [31..35)::4
  90582. + MarkupTextLiteral - [31..35)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90583. + OpenAngle;[<];
  90584. + ForwardSlash;[/];
  90585. + Text;[p];
  90586. + CloseAngle;[>];
  90587. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/HandlesMalformedNestedNonTagHelperTags_Correctly.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/HandlesMalformedNestedNonTagHelperTags_Correctly.stree.txt
  90588. index e0cd8955073..8c0e0bf6a99 100644
  90589. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/HandlesMalformedNestedNonTagHelperTags_Correctly.stree.txt
  90590. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/HandlesMalformedNestedNonTagHelperTags_Correctly.stree.txt
  90591. @@ -1,24 +1,28 @@
  90592. -Markup block - Gen<None> - 14 - (0:0,0)
  90593. - Tag block - Gen<None> - 5 - (0:0,0)
  90594. - Markup span - Gen<Markup> - [<div>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  90595. - SyntaxKind.OpenAngle;[<];
  90596. - SyntaxKind.Text;[div];
  90597. - SyntaxKind.CloseAngle;[>];
  90598. - Statement block - Gen<None> - 9 - (5:0,5)
  90599. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (5:0,5) - Tokens:1
  90600. - SyntaxKind.Transition;[@];
  90601. - MetaCode span - Gen<None> - [{] - SpanEditHandler;Accepts:None - (6:0,6) - Tokens:1
  90602. - SyntaxKind.LeftBrace;[{];
  90603. - Markup block - Gen<None> - 6 - (7:0,7)
  90604. - Tag block - Gen<None> - 6 - (7:0,7)
  90605. - Markup span - Gen<Markup> - [</div>] - SpanEditHandler;Accepts:None - (7:0,7) - Tokens:4
  90606. - SyntaxKind.OpenAngle;[<];
  90607. - SyntaxKind.ForwardSlash;[/];
  90608. - SyntaxKind.Text;[div];
  90609. - SyntaxKind.CloseAngle;[>];
  90610. - Code span - Gen<Stmt> - [] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:1
  90611. - SyntaxKind.Unknown;[];
  90612. - MetaCode span - Gen<None> - [}] - SpanEditHandler;Accepts:None - (13:0,13) - Tokens:1
  90613. - SyntaxKind.RightBrace;[}];
  90614. - Markup span - Gen<Markup> - [] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:1
  90615. - SyntaxKind.Unknown;[];
  90616. +RazorDocument - [0..14)::14 - [<div>@{</div>}]
  90617. + MarkupBlock - [0..14)::14
  90618. + MarkupTagBlock - [0..5)::5 - [<div>]
  90619. + MarkupTextLiteral - [0..5)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90620. + OpenAngle;[<];
  90621. + Text;[div];
  90622. + CloseAngle;[>];
  90623. + CSharpCodeBlock - [5..14)::9
  90624. + CSharpStatement - [5..14)::9
  90625. + CSharpTransition - [5..6)::1 - Gen<None> - SpanEditHandler;Accepts:None
  90626. + Transition;[@];
  90627. + CSharpStatementBody - [6..14)::8
  90628. + RazorMetaCode - [6..7)::1 - Gen<None> - SpanEditHandler;Accepts:None
  90629. + LeftBrace;[{];
  90630. + CSharpCodeBlock - [7..13)::6
  90631. + MarkupBlock - [7..13)::6
  90632. + MarkupTagBlock - [7..13)::6 - [</div>]
  90633. + MarkupTextLiteral - [7..13)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:None
  90634. + OpenAngle;[<];
  90635. + ForwardSlash;[/];
  90636. + Text;[div];
  90637. + CloseAngle;[>];
  90638. + CSharpStatementLiteral - [13..13)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  90639. + Marker;[];
  90640. + RazorMetaCode - [13..14)::1 - Gen<None> - SpanEditHandler;Accepts:None
  90641. + RightBrace;[}];
  90642. + MarkupTextLiteral - [14..14)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90643. + Marker;[];
  90644. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/InvalidStructure_UnderstandsTHPrefixAndAllowedChildrenAndRequireParent.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/InvalidStructure_UnderstandsTHPrefixAndAllowedChildrenAndRequireParent.stree.txt
  90645. index 1d0a8487b37..dc6a45ec309 100644
  90646. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/InvalidStructure_UnderstandsTHPrefixAndAllowedChildrenAndRequireParent.stree.txt
  90647. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/InvalidStructure_UnderstandsTHPrefixAndAllowedChildrenAndRequireParent.stree.txt
  90648. @@ -1,9 +1,20 @@
  90649. -Markup block - Gen<None> - 25 - (0:0,0)
  90650. - Tag block - Gen<TagHelper> - 25 - (0:0,0) - th:p - PTagHelper
  90651. - StartTagAndEndTag - <th:p> ... </th:p>
  90652. - Tag block - Gen<None> - 12 - (6:0,6)
  90653. - Markup span - Gen<Markup> - [</th:strong>] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:4
  90654. - SyntaxKind.OpenAngle;[<];
  90655. - SyntaxKind.ForwardSlash;[/];
  90656. - SyntaxKind.Text;[th:strong];
  90657. - SyntaxKind.CloseAngle;[>];
  90658. +RazorDocument - [0..25)::25 - [<th:p></th:strong></th:p>]
  90659. + MarkupBlock - [0..25)::25
  90660. + MarkupTagHelperElement - [0..25)::25 - th:p[StartTagAndEndTag] - PTagHelper
  90661. + MarkupTagHelperStartTag - [0..6)::6
  90662. + MarkupTextLiteral - [0..6)::6 - [<th:p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90663. + OpenAngle;[<];
  90664. + Text;[th:p];
  90665. + CloseAngle;[>];
  90666. + MarkupTagBlock - [6..18)::12 - [</th:strong>]
  90667. + MarkupTextLiteral - [6..18)::12 - [</th:strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90668. + OpenAngle;[<];
  90669. + ForwardSlash;[/];
  90670. + Text;[th:strong];
  90671. + CloseAngle;[>];
  90672. + MarkupTagHelperEndTag - [18..25)::7
  90673. + MarkupTextLiteral - [18..25)::7 - [</th:p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90674. + OpenAngle;[<];
  90675. + ForwardSlash;[/];
  90676. + Text;[th:p];
  90677. + CloseAngle;[>];
  90678. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly1.stree.txt
  90679. index 98ea2b7ecb2..e54b169ecdc 100644
  90680. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly1.stree.txt
  90681. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly1.stree.txt
  90682. @@ -1,17 +1,40 @@
  90683. -Markup block - Gen<None> - 26 - (0:0,0)
  90684. - Tag block - Gen<TagHelper> - 26 - (0:0,0) - p - pTagHelper
  90685. - StartTagAndEndTag - <p class="btn"> ... </p>
  90686. - class - DoubleQuotes
  90687. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  90688. - SyntaxKind.Text;[btn];
  90689. - Tag block - Gen<None> - 3 - (15:0,15)
  90690. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:3
  90691. - SyntaxKind.OpenAngle;[<];
  90692. - SyntaxKind.Text;[p];
  90693. - SyntaxKind.CloseAngle;[>];
  90694. - Tag block - Gen<None> - 4 - (18:0,18)
  90695. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:4
  90696. - SyntaxKind.OpenAngle;[<];
  90697. - SyntaxKind.ForwardSlash;[/];
  90698. - SyntaxKind.Text;[p];
  90699. - SyntaxKind.CloseAngle;[>];
  90700. +RazorDocument - [0..26)::26 - [<p class="btn"><p></p></p>]
  90701. + MarkupBlock - [0..26)::26
  90702. + MarkupTagHelperElement - [0..26)::26 - p[StartTagAndEndTag] - pTagHelper
  90703. + MarkupTagHelperStartTag - [0..15)::15
  90704. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90705. + OpenAngle;[<];
  90706. + Text;[p];
  90707. + MarkupTagHelperAttribute - [2..14)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  90708. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90709. + Whitespace;[ ];
  90710. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90711. + Text;[class];
  90712. + Equals;[=];
  90713. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  90714. + DoubleQuote;["];
  90715. + MarkupTagHelperAttributeValue - [10..13)::3
  90716. + MarkupLiteralAttributeValue - [10..13)::3 - [btn]
  90717. + MarkupTextLiteral - [10..13)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90718. + Text;[btn];
  90719. + MarkupTextLiteral - [13..14)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  90720. + DoubleQuote;["];
  90721. + MarkupTextLiteral - [14..15)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90722. + CloseAngle;[>];
  90723. + MarkupTagBlock - [15..18)::3 - [<p>]
  90724. + MarkupTextLiteral - [15..18)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90725. + OpenAngle;[<];
  90726. + Text;[p];
  90727. + CloseAngle;[>];
  90728. + MarkupTagBlock - [18..22)::4 - [</p>]
  90729. + MarkupTextLiteral - [18..22)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90730. + OpenAngle;[<];
  90731. + ForwardSlash;[/];
  90732. + Text;[p];
  90733. + CloseAngle;[>];
  90734. + MarkupTagHelperEndTag - [22..26)::4
  90735. + MarkupTextLiteral - [22..26)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90736. + OpenAngle;[<];
  90737. + ForwardSlash;[/];
  90738. + Text;[p];
  90739. + CloseAngle;[>];
  90740. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly10.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly10.stree.txt
  90741. index 42120b8e294..738d2bf6923 100644
  90742. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly10.stree.txt
  90743. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly10.stree.txt
  90744. @@ -1,44 +1,89 @@
  90745. -Markup block - Gen<None> - 113 - (0:0,0)
  90746. - Tag block - Gen<TagHelper> - 113 - (0:0,0) - strong - catchAllTagHelper
  90747. - StartTagAndEndTag - <strong catchAll="hi"> ... </strong>
  90748. - catchAll - DoubleQuotes
  90749. - Markup span - Gen<Markup> - [hi] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:1
  90750. - SyntaxKind.Text;[hi];
  90751. - Tag block - Gen<None> - 8 - (22:0,22)
  90752. - Markup span - Gen<Markup> - [<strong>] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:3
  90753. - SyntaxKind.OpenAngle;[<];
  90754. - SyntaxKind.Text;[strong];
  90755. - SyntaxKind.CloseAngle;[>];
  90756. - Tag block - Gen<None> - 8 - (30:0,30)
  90757. - Markup span - Gen<Markup> - [<strong>] - SpanEditHandler;Accepts:Any - (30:0,30) - Tokens:3
  90758. - SyntaxKind.OpenAngle;[<];
  90759. - SyntaxKind.Text;[strong];
  90760. - SyntaxKind.CloseAngle;[>];
  90761. - Tag block - Gen<TagHelper> - 48 - (38:0,38) - strong - catchAllTagHelper
  90762. - StartTagAndEndTag - <strong catchAll="hi"> ... </strong>
  90763. - catchAll - DoubleQuotes
  90764. - Markup span - Gen<Markup> - [hi] - SpanEditHandler;Accepts:Any - (56:0,56) - Tokens:1
  90765. - SyntaxKind.Text;[hi];
  90766. - Tag block - Gen<None> - 8 - (60:0,60)
  90767. - Markup span - Gen<Markup> - [<strong>] - SpanEditHandler;Accepts:Any - (60:0,60) - Tokens:3
  90768. - SyntaxKind.OpenAngle;[<];
  90769. - SyntaxKind.Text;[strong];
  90770. - SyntaxKind.CloseAngle;[>];
  90771. - Tag block - Gen<None> - 9 - (68:0,68)
  90772. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (68:0,68) - Tokens:4
  90773. - SyntaxKind.OpenAngle;[<];
  90774. - SyntaxKind.ForwardSlash;[/];
  90775. - SyntaxKind.Text;[strong];
  90776. - SyntaxKind.CloseAngle;[>];
  90777. - Tag block - Gen<None> - 9 - (86:0,86)
  90778. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (86:0,86) - Tokens:4
  90779. - SyntaxKind.OpenAngle;[<];
  90780. - SyntaxKind.ForwardSlash;[/];
  90781. - SyntaxKind.Text;[strong];
  90782. - SyntaxKind.CloseAngle;[>];
  90783. - Tag block - Gen<None> - 9 - (95:0,95)
  90784. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (95:0,95) - Tokens:4
  90785. - SyntaxKind.OpenAngle;[<];
  90786. - SyntaxKind.ForwardSlash;[/];
  90787. - SyntaxKind.Text;[strong];
  90788. - SyntaxKind.CloseAngle;[>];
  90789. +RazorDocument - [0..113)::113 - [<strong catchAll="hi"><strong><strong><strong catchAll="hi"><strong></strong></strong></strong></strong></strong>]
  90790. + MarkupBlock - [0..113)::113
  90791. + MarkupTagHelperElement - [0..113)::113 - strong[StartTagAndEndTag] - catchAllTagHelper
  90792. + MarkupTagHelperStartTag - [0..22)::22
  90793. + MarkupTextLiteral - [0..7)::7 - [<strong] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90794. + OpenAngle;[<];
  90795. + Text;[strong];
  90796. + MarkupTagHelperAttribute - [7..21)::14 - catchAll - DoubleQuotes - Unbound - [ catchAll="hi"]
  90797. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90798. + Whitespace;[ ];
  90799. + MarkupTextLiteral - [8..16)::8 - [catchAll] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90800. + Text;[catchAll];
  90801. + Equals;[=];
  90802. + MarkupTextLiteral - [17..18)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  90803. + DoubleQuote;["];
  90804. + MarkupTagHelperAttributeValue - [18..20)::2
  90805. + MarkupLiteralAttributeValue - [18..20)::2 - [hi]
  90806. + MarkupTextLiteral - [18..20)::2 - [hi] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90807. + Text;[hi];
  90808. + MarkupTextLiteral - [20..21)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  90809. + DoubleQuote;["];
  90810. + MarkupTextLiteral - [21..22)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90811. + CloseAngle;[>];
  90812. + MarkupTagBlock - [22..30)::8 - [<strong>]
  90813. + MarkupTextLiteral - [22..30)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90814. + OpenAngle;[<];
  90815. + Text;[strong];
  90816. + CloseAngle;[>];
  90817. + MarkupTagBlock - [30..38)::8 - [<strong>]
  90818. + MarkupTextLiteral - [30..38)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90819. + OpenAngle;[<];
  90820. + Text;[strong];
  90821. + CloseAngle;[>];
  90822. + MarkupTagHelperElement - [38..86)::48 - strong[StartTagAndEndTag] - catchAllTagHelper
  90823. + MarkupTagHelperStartTag - [38..60)::22
  90824. + MarkupTextLiteral - [38..45)::7 - [<strong] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90825. + OpenAngle;[<];
  90826. + Text;[strong];
  90827. + MarkupTagHelperAttribute - [45..59)::14 - catchAll - DoubleQuotes - Unbound - [ catchAll="hi"]
  90828. + MarkupTextLiteral - [45..46)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90829. + Whitespace;[ ];
  90830. + MarkupTextLiteral - [46..54)::8 - [catchAll] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90831. + Text;[catchAll];
  90832. + Equals;[=];
  90833. + MarkupTextLiteral - [55..56)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  90834. + DoubleQuote;["];
  90835. + MarkupTagHelperAttributeValue - [56..58)::2
  90836. + MarkupLiteralAttributeValue - [56..58)::2 - [hi]
  90837. + MarkupTextLiteral - [56..58)::2 - [hi] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90838. + Text;[hi];
  90839. + MarkupTextLiteral - [58..59)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  90840. + DoubleQuote;["];
  90841. + MarkupTextLiteral - [59..60)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90842. + CloseAngle;[>];
  90843. + MarkupTagBlock - [60..68)::8 - [<strong>]
  90844. + MarkupTextLiteral - [60..68)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90845. + OpenAngle;[<];
  90846. + Text;[strong];
  90847. + CloseAngle;[>];
  90848. + MarkupTagBlock - [68..77)::9 - [</strong>]
  90849. + MarkupTextLiteral - [68..77)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90850. + OpenAngle;[<];
  90851. + ForwardSlash;[/];
  90852. + Text;[strong];
  90853. + CloseAngle;[>];
  90854. + MarkupTagHelperEndTag - [77..86)::9
  90855. + MarkupTextLiteral - [77..86)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90856. + OpenAngle;[<];
  90857. + ForwardSlash;[/];
  90858. + Text;[strong];
  90859. + CloseAngle;[>];
  90860. + MarkupTagBlock - [86..95)::9 - [</strong>]
  90861. + MarkupTextLiteral - [86..95)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90862. + OpenAngle;[<];
  90863. + ForwardSlash;[/];
  90864. + Text;[strong];
  90865. + CloseAngle;[>];
  90866. + MarkupTagBlock - [95..104)::9 - [</strong>]
  90867. + MarkupTextLiteral - [95..104)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90868. + OpenAngle;[<];
  90869. + ForwardSlash;[/];
  90870. + Text;[strong];
  90871. + CloseAngle;[>];
  90872. + MarkupTagHelperEndTag - [104..113)::9
  90873. + MarkupTextLiteral - [104..113)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90874. + OpenAngle;[<];
  90875. + ForwardSlash;[/];
  90876. + Text;[strong];
  90877. + CloseAngle;[>];
  90878. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly2.stree.txt
  90879. index a64f462a0bc..a6bd0c5f0a2 100644
  90880. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly2.stree.txt
  90881. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly2.stree.txt
  90882. @@ -1,17 +1,40 @@
  90883. -Markup block - Gen<None> - 48 - (0:0,0)
  90884. - Tag block - Gen<TagHelper> - 48 - (0:0,0) - strong - catchAllTagHelper
  90885. - StartTagAndEndTag - <strong catchAll="hi"> ... </strong>
  90886. - catchAll - DoubleQuotes
  90887. - Markup span - Gen<Markup> - [hi] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:1
  90888. - SyntaxKind.Text;[hi];
  90889. - Tag block - Gen<None> - 8 - (22:0,22)
  90890. - Markup span - Gen<Markup> - [<strong>] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:3
  90891. - SyntaxKind.OpenAngle;[<];
  90892. - SyntaxKind.Text;[strong];
  90893. - SyntaxKind.CloseAngle;[>];
  90894. - Tag block - Gen<None> - 9 - (30:0,30)
  90895. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (30:0,30) - Tokens:4
  90896. - SyntaxKind.OpenAngle;[<];
  90897. - SyntaxKind.ForwardSlash;[/];
  90898. - SyntaxKind.Text;[strong];
  90899. - SyntaxKind.CloseAngle;[>];
  90900. +RazorDocument - [0..48)::48 - [<strong catchAll="hi"><strong></strong></strong>]
  90901. + MarkupBlock - [0..48)::48
  90902. + MarkupTagHelperElement - [0..48)::48 - strong[StartTagAndEndTag] - catchAllTagHelper
  90903. + MarkupTagHelperStartTag - [0..22)::22
  90904. + MarkupTextLiteral - [0..7)::7 - [<strong] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90905. + OpenAngle;[<];
  90906. + Text;[strong];
  90907. + MarkupTagHelperAttribute - [7..21)::14 - catchAll - DoubleQuotes - Unbound - [ catchAll="hi"]
  90908. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90909. + Whitespace;[ ];
  90910. + MarkupTextLiteral - [8..16)::8 - [catchAll] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90911. + Text;[catchAll];
  90912. + Equals;[=];
  90913. + MarkupTextLiteral - [17..18)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  90914. + DoubleQuote;["];
  90915. + MarkupTagHelperAttributeValue - [18..20)::2
  90916. + MarkupLiteralAttributeValue - [18..20)::2 - [hi]
  90917. + MarkupTextLiteral - [18..20)::2 - [hi] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90918. + Text;[hi];
  90919. + MarkupTextLiteral - [20..21)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  90920. + DoubleQuote;["];
  90921. + MarkupTextLiteral - [21..22)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90922. + CloseAngle;[>];
  90923. + MarkupTagBlock - [22..30)::8 - [<strong>]
  90924. + MarkupTextLiteral - [22..30)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90925. + OpenAngle;[<];
  90926. + Text;[strong];
  90927. + CloseAngle;[>];
  90928. + MarkupTagBlock - [30..39)::9 - [</strong>]
  90929. + MarkupTextLiteral - [30..39)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90930. + OpenAngle;[<];
  90931. + ForwardSlash;[/];
  90932. + Text;[strong];
  90933. + CloseAngle;[>];
  90934. + MarkupTagHelperEndTag - [39..48)::9
  90935. + MarkupTextLiteral - [39..48)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90936. + OpenAngle;[<];
  90937. + ForwardSlash;[/];
  90938. + Text;[strong];
  90939. + CloseAngle;[>];
  90940. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly3.stree.txt
  90941. index 42c96471944..65212d9fe6c 100644
  90942. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly3.stree.txt
  90943. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly3.stree.txt
  90944. @@ -1,28 +1,51 @@
  90945. -Markup block - Gen<None> - 43 - (0:0,0)
  90946. - Tag block - Gen<TagHelper> - 43 - (0:0,0) - p - pTagHelper
  90947. - StartTagAndEndTag - <p class="btn"> ... </p>
  90948. - class - DoubleQuotes
  90949. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  90950. - SyntaxKind.Text;[btn];
  90951. - Tag block - Gen<None> - 8 - (15:0,15)
  90952. - Markup span - Gen<Markup> - [<strong>] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:3
  90953. - SyntaxKind.OpenAngle;[<];
  90954. - SyntaxKind.Text;[strong];
  90955. - SyntaxKind.CloseAngle;[>];
  90956. - Tag block - Gen<None> - 3 - (23:0,23)
  90957. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:3
  90958. - SyntaxKind.OpenAngle;[<];
  90959. - SyntaxKind.Text;[p];
  90960. - SyntaxKind.CloseAngle;[>];
  90961. - Tag block - Gen<None> - 4 - (26:0,26)
  90962. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (26:0,26) - Tokens:4
  90963. - SyntaxKind.OpenAngle;[<];
  90964. - SyntaxKind.ForwardSlash;[/];
  90965. - SyntaxKind.Text;[p];
  90966. - SyntaxKind.CloseAngle;[>];
  90967. - Tag block - Gen<None> - 9 - (30:0,30)
  90968. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (30:0,30) - Tokens:4
  90969. - SyntaxKind.OpenAngle;[<];
  90970. - SyntaxKind.ForwardSlash;[/];
  90971. - SyntaxKind.Text;[strong];
  90972. - SyntaxKind.CloseAngle;[>];
  90973. +RazorDocument - [0..43)::43 - [<p class="btn"><strong><p></p></strong></p>]
  90974. + MarkupBlock - [0..43)::43
  90975. + MarkupTagHelperElement - [0..43)::43 - p[StartTagAndEndTag] - pTagHelper
  90976. + MarkupTagHelperStartTag - [0..15)::15
  90977. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90978. + OpenAngle;[<];
  90979. + Text;[p];
  90980. + MarkupTagHelperAttribute - [2..14)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  90981. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90982. + Whitespace;[ ];
  90983. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90984. + Text;[class];
  90985. + Equals;[=];
  90986. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  90987. + DoubleQuote;["];
  90988. + MarkupTagHelperAttributeValue - [10..13)::3
  90989. + MarkupLiteralAttributeValue - [10..13)::3 - [btn]
  90990. + MarkupTextLiteral - [10..13)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90991. + Text;[btn];
  90992. + MarkupTextLiteral - [13..14)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  90993. + DoubleQuote;["];
  90994. + MarkupTextLiteral - [14..15)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90995. + CloseAngle;[>];
  90996. + MarkupTagBlock - [15..23)::8 - [<strong>]
  90997. + MarkupTextLiteral - [15..23)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  90998. + OpenAngle;[<];
  90999. + Text;[strong];
  91000. + CloseAngle;[>];
  91001. + MarkupTagBlock - [23..26)::3 - [<p>]
  91002. + MarkupTextLiteral - [23..26)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91003. + OpenAngle;[<];
  91004. + Text;[p];
  91005. + CloseAngle;[>];
  91006. + MarkupTagBlock - [26..30)::4 - [</p>]
  91007. + MarkupTextLiteral - [26..30)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91008. + OpenAngle;[<];
  91009. + ForwardSlash;[/];
  91010. + Text;[p];
  91011. + CloseAngle;[>];
  91012. + MarkupTagBlock - [30..39)::9 - [</strong>]
  91013. + MarkupTextLiteral - [30..39)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91014. + OpenAngle;[<];
  91015. + ForwardSlash;[/];
  91016. + Text;[strong];
  91017. + CloseAngle;[>];
  91018. + MarkupTagHelperEndTag - [39..43)::4
  91019. + MarkupTextLiteral - [39..43)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91020. + OpenAngle;[<];
  91021. + ForwardSlash;[/];
  91022. + Text;[p];
  91023. + CloseAngle;[>];
  91024. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly4.stree.txt
  91025. index 4b53e446447..7dab44ec9cf 100644
  91026. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly4.stree.txt
  91027. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly4.stree.txt
  91028. @@ -1,28 +1,51 @@
  91029. -Markup block - Gen<None> - 55 - (0:0,0)
  91030. - Tag block - Gen<TagHelper> - 55 - (0:0,0) - strong - catchAllTagHelper
  91031. - StartTagAndEndTag - <strong catchAll="hi"> ... </strong>
  91032. - catchAll - DoubleQuotes
  91033. - Markup span - Gen<Markup> - [hi] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:1
  91034. - SyntaxKind.Text;[hi];
  91035. - Tag block - Gen<None> - 3 - (22:0,22)
  91036. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:3
  91037. - SyntaxKind.OpenAngle;[<];
  91038. - SyntaxKind.Text;[p];
  91039. - SyntaxKind.CloseAngle;[>];
  91040. - Tag block - Gen<None> - 8 - (25:0,25)
  91041. - Markup span - Gen<Markup> - [<strong>] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:3
  91042. - SyntaxKind.OpenAngle;[<];
  91043. - SyntaxKind.Text;[strong];
  91044. - SyntaxKind.CloseAngle;[>];
  91045. - Tag block - Gen<None> - 9 - (33:0,33)
  91046. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (33:0,33) - Tokens:4
  91047. - SyntaxKind.OpenAngle;[<];
  91048. - SyntaxKind.ForwardSlash;[/];
  91049. - SyntaxKind.Text;[strong];
  91050. - SyntaxKind.CloseAngle;[>];
  91051. - Tag block - Gen<None> - 4 - (42:0,42)
  91052. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (42:0,42) - Tokens:4
  91053. - SyntaxKind.OpenAngle;[<];
  91054. - SyntaxKind.ForwardSlash;[/];
  91055. - SyntaxKind.Text;[p];
  91056. - SyntaxKind.CloseAngle;[>];
  91057. +RazorDocument - [0..55)::55 - [<strong catchAll="hi"><p><strong></strong></p></strong>]
  91058. + MarkupBlock - [0..55)::55
  91059. + MarkupTagHelperElement - [0..55)::55 - strong[StartTagAndEndTag] - catchAllTagHelper
  91060. + MarkupTagHelperStartTag - [0..22)::22
  91061. + MarkupTextLiteral - [0..7)::7 - [<strong] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91062. + OpenAngle;[<];
  91063. + Text;[strong];
  91064. + MarkupTagHelperAttribute - [7..21)::14 - catchAll - DoubleQuotes - Unbound - [ catchAll="hi"]
  91065. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91066. + Whitespace;[ ];
  91067. + MarkupTextLiteral - [8..16)::8 - [catchAll] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91068. + Text;[catchAll];
  91069. + Equals;[=];
  91070. + MarkupTextLiteral - [17..18)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91071. + DoubleQuote;["];
  91072. + MarkupTagHelperAttributeValue - [18..20)::2
  91073. + MarkupLiteralAttributeValue - [18..20)::2 - [hi]
  91074. + MarkupTextLiteral - [18..20)::2 - [hi] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91075. + Text;[hi];
  91076. + MarkupTextLiteral - [20..21)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91077. + DoubleQuote;["];
  91078. + MarkupTextLiteral - [21..22)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91079. + CloseAngle;[>];
  91080. + MarkupTagBlock - [22..25)::3 - [<p>]
  91081. + MarkupTextLiteral - [22..25)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91082. + OpenAngle;[<];
  91083. + Text;[p];
  91084. + CloseAngle;[>];
  91085. + MarkupTagBlock - [25..33)::8 - [<strong>]
  91086. + MarkupTextLiteral - [25..33)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91087. + OpenAngle;[<];
  91088. + Text;[strong];
  91089. + CloseAngle;[>];
  91090. + MarkupTagBlock - [33..42)::9 - [</strong>]
  91091. + MarkupTextLiteral - [33..42)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91092. + OpenAngle;[<];
  91093. + ForwardSlash;[/];
  91094. + Text;[strong];
  91095. + CloseAngle;[>];
  91096. + MarkupTagBlock - [42..46)::4 - [</p>]
  91097. + MarkupTextLiteral - [42..46)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91098. + OpenAngle;[<];
  91099. + ForwardSlash;[/];
  91100. + Text;[p];
  91101. + CloseAngle;[>];
  91102. + MarkupTagHelperEndTag - [46..55)::9
  91103. + MarkupTextLiteral - [46..55)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91104. + OpenAngle;[<];
  91105. + ForwardSlash;[/];
  91106. + Text;[strong];
  91107. + CloseAngle;[>];
  91108. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly5.stree.txt
  91109. index 2dde3b71699..b9ccf752053 100644
  91110. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly5.stree.txt
  91111. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly5.stree.txt
  91112. @@ -1,22 +1,67 @@
  91113. -Markup block - Gen<None> - 57 - (0:0,0)
  91114. - Tag block - Gen<TagHelper> - 57 - (0:0,0) - p - pTagHelper
  91115. - StartTagAndEndTag - <p class="btn"> ... </p>
  91116. - class - DoubleQuotes
  91117. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  91118. - SyntaxKind.Text;[btn];
  91119. - Tag block - Gen<TagHelper> - 38 - (15:0,15) - strong - catchAllTagHelper
  91120. - StartTagAndEndTag - <strong catchAll="hi"> ... </strong>
  91121. - catchAll - DoubleQuotes
  91122. - Markup span - Gen<Markup> - [hi] - SpanEditHandler;Accepts:Any - (33:0,33) - Tokens:1
  91123. - SyntaxKind.Text;[hi];
  91124. - Tag block - Gen<None> - 3 - (37:0,37)
  91125. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (37:0,37) - Tokens:3
  91126. - SyntaxKind.OpenAngle;[<];
  91127. - SyntaxKind.Text;[p];
  91128. - SyntaxKind.CloseAngle;[>];
  91129. - Tag block - Gen<None> - 4 - (40:0,40)
  91130. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (40:0,40) - Tokens:4
  91131. - SyntaxKind.OpenAngle;[<];
  91132. - SyntaxKind.ForwardSlash;[/];
  91133. - SyntaxKind.Text;[p];
  91134. - SyntaxKind.CloseAngle;[>];
  91135. +RazorDocument - [0..57)::57 - [<p class="btn"><strong catchAll="hi"><p></p></strong></p>]
  91136. + MarkupBlock - [0..57)::57
  91137. + MarkupTagHelperElement - [0..57)::57 - p[StartTagAndEndTag] - pTagHelper
  91138. + MarkupTagHelperStartTag - [0..15)::15
  91139. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91140. + OpenAngle;[<];
  91141. + Text;[p];
  91142. + MarkupTagHelperAttribute - [2..14)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  91143. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91144. + Whitespace;[ ];
  91145. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91146. + Text;[class];
  91147. + Equals;[=];
  91148. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91149. + DoubleQuote;["];
  91150. + MarkupTagHelperAttributeValue - [10..13)::3
  91151. + MarkupLiteralAttributeValue - [10..13)::3 - [btn]
  91152. + MarkupTextLiteral - [10..13)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91153. + Text;[btn];
  91154. + MarkupTextLiteral - [13..14)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91155. + DoubleQuote;["];
  91156. + MarkupTextLiteral - [14..15)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91157. + CloseAngle;[>];
  91158. + MarkupTagHelperElement - [15..53)::38 - strong[StartTagAndEndTag] - catchAllTagHelper
  91159. + MarkupTagHelperStartTag - [15..37)::22
  91160. + MarkupTextLiteral - [15..22)::7 - [<strong] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91161. + OpenAngle;[<];
  91162. + Text;[strong];
  91163. + MarkupTagHelperAttribute - [22..36)::14 - catchAll - DoubleQuotes - Unbound - [ catchAll="hi"]
  91164. + MarkupTextLiteral - [22..23)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91165. + Whitespace;[ ];
  91166. + MarkupTextLiteral - [23..31)::8 - [catchAll] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91167. + Text;[catchAll];
  91168. + Equals;[=];
  91169. + MarkupTextLiteral - [32..33)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91170. + DoubleQuote;["];
  91171. + MarkupTagHelperAttributeValue - [33..35)::2
  91172. + MarkupLiteralAttributeValue - [33..35)::2 - [hi]
  91173. + MarkupTextLiteral - [33..35)::2 - [hi] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91174. + Text;[hi];
  91175. + MarkupTextLiteral - [35..36)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91176. + DoubleQuote;["];
  91177. + MarkupTextLiteral - [36..37)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91178. + CloseAngle;[>];
  91179. + MarkupTagBlock - [37..40)::3 - [<p>]
  91180. + MarkupTextLiteral - [37..40)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91181. + OpenAngle;[<];
  91182. + Text;[p];
  91183. + CloseAngle;[>];
  91184. + MarkupTagBlock - [40..44)::4 - [</p>]
  91185. + MarkupTextLiteral - [40..44)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91186. + OpenAngle;[<];
  91187. + ForwardSlash;[/];
  91188. + Text;[p];
  91189. + CloseAngle;[>];
  91190. + MarkupTagHelperEndTag - [44..53)::9
  91191. + MarkupTextLiteral - [44..53)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91192. + OpenAngle;[<];
  91193. + ForwardSlash;[/];
  91194. + Text;[strong];
  91195. + CloseAngle;[>];
  91196. + MarkupTagHelperEndTag - [53..57)::4
  91197. + MarkupTextLiteral - [53..57)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91198. + OpenAngle;[<];
  91199. + ForwardSlash;[/];
  91200. + Text;[p];
  91201. + CloseAngle;[>];
  91202. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly6.stree.txt
  91203. index 2ffe852d7a3..b0a00277a5b 100644
  91204. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly6.stree.txt
  91205. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly6.stree.txt
  91206. @@ -1,22 +1,67 @@
  91207. -Markup block - Gen<None> - 67 - (0:0,0)
  91208. - Tag block - Gen<TagHelper> - 67 - (0:0,0) - strong - catchAllTagHelper
  91209. - StartTagAndEndTag - <strong catchAll="hi"> ... </strong>
  91210. - catchAll - DoubleQuotes
  91211. - Markup span - Gen<Markup> - [hi] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:1
  91212. - SyntaxKind.Text;[hi];
  91213. - Tag block - Gen<TagHelper> - 36 - (22:0,22) - p - pTagHelper
  91214. - StartTagAndEndTag - <p class="btn"> ... </p>
  91215. - class - DoubleQuotes
  91216. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (32:0,32) - Tokens:1
  91217. - SyntaxKind.Text;[btn];
  91218. - Tag block - Gen<None> - 8 - (37:0,37)
  91219. - Markup span - Gen<Markup> - [<strong>] - SpanEditHandler;Accepts:Any - (37:0,37) - Tokens:3
  91220. - SyntaxKind.OpenAngle;[<];
  91221. - SyntaxKind.Text;[strong];
  91222. - SyntaxKind.CloseAngle;[>];
  91223. - Tag block - Gen<None> - 9 - (45:0,45)
  91224. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (45:0,45) - Tokens:4
  91225. - SyntaxKind.OpenAngle;[<];
  91226. - SyntaxKind.ForwardSlash;[/];
  91227. - SyntaxKind.Text;[strong];
  91228. - SyntaxKind.CloseAngle;[>];
  91229. +RazorDocument - [0..67)::67 - [<strong catchAll="hi"><p class="btn"><strong></strong></p></strong>]
  91230. + MarkupBlock - [0..67)::67
  91231. + MarkupTagHelperElement - [0..67)::67 - strong[StartTagAndEndTag] - catchAllTagHelper
  91232. + MarkupTagHelperStartTag - [0..22)::22
  91233. + MarkupTextLiteral - [0..7)::7 - [<strong] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91234. + OpenAngle;[<];
  91235. + Text;[strong];
  91236. + MarkupTagHelperAttribute - [7..21)::14 - catchAll - DoubleQuotes - Unbound - [ catchAll="hi"]
  91237. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91238. + Whitespace;[ ];
  91239. + MarkupTextLiteral - [8..16)::8 - [catchAll] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91240. + Text;[catchAll];
  91241. + Equals;[=];
  91242. + MarkupTextLiteral - [17..18)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91243. + DoubleQuote;["];
  91244. + MarkupTagHelperAttributeValue - [18..20)::2
  91245. + MarkupLiteralAttributeValue - [18..20)::2 - [hi]
  91246. + MarkupTextLiteral - [18..20)::2 - [hi] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91247. + Text;[hi];
  91248. + MarkupTextLiteral - [20..21)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91249. + DoubleQuote;["];
  91250. + MarkupTextLiteral - [21..22)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91251. + CloseAngle;[>];
  91252. + MarkupTagHelperElement - [22..58)::36 - p[StartTagAndEndTag] - pTagHelper
  91253. + MarkupTagHelperStartTag - [22..37)::15
  91254. + MarkupTextLiteral - [22..24)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91255. + OpenAngle;[<];
  91256. + Text;[p];
  91257. + MarkupTagHelperAttribute - [24..36)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  91258. + MarkupTextLiteral - [24..25)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91259. + Whitespace;[ ];
  91260. + MarkupTextLiteral - [25..30)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91261. + Text;[class];
  91262. + Equals;[=];
  91263. + MarkupTextLiteral - [31..32)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91264. + DoubleQuote;["];
  91265. + MarkupTagHelperAttributeValue - [32..35)::3
  91266. + MarkupLiteralAttributeValue - [32..35)::3 - [btn]
  91267. + MarkupTextLiteral - [32..35)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91268. + Text;[btn];
  91269. + MarkupTextLiteral - [35..36)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91270. + DoubleQuote;["];
  91271. + MarkupTextLiteral - [36..37)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91272. + CloseAngle;[>];
  91273. + MarkupTagBlock - [37..45)::8 - [<strong>]
  91274. + MarkupTextLiteral - [37..45)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91275. + OpenAngle;[<];
  91276. + Text;[strong];
  91277. + CloseAngle;[>];
  91278. + MarkupTagBlock - [45..54)::9 - [</strong>]
  91279. + MarkupTextLiteral - [45..54)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91280. + OpenAngle;[<];
  91281. + ForwardSlash;[/];
  91282. + Text;[strong];
  91283. + CloseAngle;[>];
  91284. + MarkupTagHelperEndTag - [54..58)::4
  91285. + MarkupTextLiteral - [54..58)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91286. + OpenAngle;[<];
  91287. + ForwardSlash;[/];
  91288. + Text;[p];
  91289. + CloseAngle;[>];
  91290. + MarkupTagHelperEndTag - [58..67)::9
  91291. + MarkupTextLiteral - [58..67)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91292. + OpenAngle;[<];
  91293. + ForwardSlash;[/];
  91294. + Text;[strong];
  91295. + CloseAngle;[>];
  91296. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly7.stree.txt
  91297. index 17373b163d0..2488a556b3a 100644
  91298. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly7.stree.txt
  91299. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly7.stree.txt
  91300. @@ -1,22 +1,67 @@
  91301. -Markup block - Gen<None> - 45 - (0:0,0)
  91302. - Tag block - Gen<TagHelper> - 45 - (0:0,0) - p - pTagHelper
  91303. - StartTagAndEndTag - <p class="btn"> ... </p>
  91304. - class - DoubleQuotes
  91305. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  91306. - SyntaxKind.Text;[btn];
  91307. - Tag block - Gen<TagHelper> - 26 - (15:0,15) - p - pTagHelper
  91308. - StartTagAndEndTag - <p class="btn"> ... </p>
  91309. - class - DoubleQuotes
  91310. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:1
  91311. - SyntaxKind.Text;[btn];
  91312. - Tag block - Gen<None> - 3 - (30:0,30)
  91313. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (30:0,30) - Tokens:3
  91314. - SyntaxKind.OpenAngle;[<];
  91315. - SyntaxKind.Text;[p];
  91316. - SyntaxKind.CloseAngle;[>];
  91317. - Tag block - Gen<None> - 4 - (33:0,33)
  91318. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (33:0,33) - Tokens:4
  91319. - SyntaxKind.OpenAngle;[<];
  91320. - SyntaxKind.ForwardSlash;[/];
  91321. - SyntaxKind.Text;[p];
  91322. - SyntaxKind.CloseAngle;[>];
  91323. +RazorDocument - [0..45)::45 - [<p class="btn"><p class="btn"><p></p></p></p>]
  91324. + MarkupBlock - [0..45)::45
  91325. + MarkupTagHelperElement - [0..45)::45 - p[StartTagAndEndTag] - pTagHelper
  91326. + MarkupTagHelperStartTag - [0..15)::15
  91327. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91328. + OpenAngle;[<];
  91329. + Text;[p];
  91330. + MarkupTagHelperAttribute - [2..14)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  91331. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91332. + Whitespace;[ ];
  91333. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91334. + Text;[class];
  91335. + Equals;[=];
  91336. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91337. + DoubleQuote;["];
  91338. + MarkupTagHelperAttributeValue - [10..13)::3
  91339. + MarkupLiteralAttributeValue - [10..13)::3 - [btn]
  91340. + MarkupTextLiteral - [10..13)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91341. + Text;[btn];
  91342. + MarkupTextLiteral - [13..14)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91343. + DoubleQuote;["];
  91344. + MarkupTextLiteral - [14..15)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91345. + CloseAngle;[>];
  91346. + MarkupTagHelperElement - [15..41)::26 - p[StartTagAndEndTag] - pTagHelper
  91347. + MarkupTagHelperStartTag - [15..30)::15
  91348. + MarkupTextLiteral - [15..17)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91349. + OpenAngle;[<];
  91350. + Text;[p];
  91351. + MarkupTagHelperAttribute - [17..29)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  91352. + MarkupTextLiteral - [17..18)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91353. + Whitespace;[ ];
  91354. + MarkupTextLiteral - [18..23)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91355. + Text;[class];
  91356. + Equals;[=];
  91357. + MarkupTextLiteral - [24..25)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91358. + DoubleQuote;["];
  91359. + MarkupTagHelperAttributeValue - [25..28)::3
  91360. + MarkupLiteralAttributeValue - [25..28)::3 - [btn]
  91361. + MarkupTextLiteral - [25..28)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91362. + Text;[btn];
  91363. + MarkupTextLiteral - [28..29)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91364. + DoubleQuote;["];
  91365. + MarkupTextLiteral - [29..30)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91366. + CloseAngle;[>];
  91367. + MarkupTagBlock - [30..33)::3 - [<p>]
  91368. + MarkupTextLiteral - [30..33)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91369. + OpenAngle;[<];
  91370. + Text;[p];
  91371. + CloseAngle;[>];
  91372. + MarkupTagBlock - [33..37)::4 - [</p>]
  91373. + MarkupTextLiteral - [33..37)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91374. + OpenAngle;[<];
  91375. + ForwardSlash;[/];
  91376. + Text;[p];
  91377. + CloseAngle;[>];
  91378. + MarkupTagHelperEndTag - [37..41)::4
  91379. + MarkupTextLiteral - [37..41)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91380. + OpenAngle;[<];
  91381. + ForwardSlash;[/];
  91382. + Text;[p];
  91383. + CloseAngle;[>];
  91384. + MarkupTagHelperEndTag - [41..45)::4
  91385. + MarkupTextLiteral - [41..45)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91386. + OpenAngle;[<];
  91387. + ForwardSlash;[/];
  91388. + Text;[p];
  91389. + CloseAngle;[>];
  91390. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly8.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly8.stree.txt
  91391. index 7408752c472..581ce34688f 100644
  91392. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly8.stree.txt
  91393. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly8.stree.txt
  91394. @@ -1,22 +1,67 @@
  91395. -Markup block - Gen<None> - 79 - (0:0,0)
  91396. - Tag block - Gen<TagHelper> - 79 - (0:0,0) - strong - catchAllTagHelper
  91397. - StartTagAndEndTag - <strong catchAll="hi"> ... </strong>
  91398. - catchAll - DoubleQuotes
  91399. - Markup span - Gen<Markup> - [hi] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:1
  91400. - SyntaxKind.Text;[hi];
  91401. - Tag block - Gen<TagHelper> - 48 - (22:0,22) - strong - catchAllTagHelper
  91402. - StartTagAndEndTag - <strong catchAll="hi"> ... </strong>
  91403. - catchAll - DoubleQuotes
  91404. - Markup span - Gen<Markup> - [hi] - SpanEditHandler;Accepts:Any - (40:0,40) - Tokens:1
  91405. - SyntaxKind.Text;[hi];
  91406. - Tag block - Gen<None> - 8 - (44:0,44)
  91407. - Markup span - Gen<Markup> - [<strong>] - SpanEditHandler;Accepts:Any - (44:0,44) - Tokens:3
  91408. - SyntaxKind.OpenAngle;[<];
  91409. - SyntaxKind.Text;[strong];
  91410. - SyntaxKind.CloseAngle;[>];
  91411. - Tag block - Gen<None> - 9 - (52:0,52)
  91412. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (52:0,52) - Tokens:4
  91413. - SyntaxKind.OpenAngle;[<];
  91414. - SyntaxKind.ForwardSlash;[/];
  91415. - SyntaxKind.Text;[strong];
  91416. - SyntaxKind.CloseAngle;[>];
  91417. +RazorDocument - [0..79)::79 - [<strong catchAll="hi"><strong catchAll="hi"><strong></strong></strong></strong>]
  91418. + MarkupBlock - [0..79)::79
  91419. + MarkupTagHelperElement - [0..79)::79 - strong[StartTagAndEndTag] - catchAllTagHelper
  91420. + MarkupTagHelperStartTag - [0..22)::22
  91421. + MarkupTextLiteral - [0..7)::7 - [<strong] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91422. + OpenAngle;[<];
  91423. + Text;[strong];
  91424. + MarkupTagHelperAttribute - [7..21)::14 - catchAll - DoubleQuotes - Unbound - [ catchAll="hi"]
  91425. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91426. + Whitespace;[ ];
  91427. + MarkupTextLiteral - [8..16)::8 - [catchAll] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91428. + Text;[catchAll];
  91429. + Equals;[=];
  91430. + MarkupTextLiteral - [17..18)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91431. + DoubleQuote;["];
  91432. + MarkupTagHelperAttributeValue - [18..20)::2
  91433. + MarkupLiteralAttributeValue - [18..20)::2 - [hi]
  91434. + MarkupTextLiteral - [18..20)::2 - [hi] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91435. + Text;[hi];
  91436. + MarkupTextLiteral - [20..21)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91437. + DoubleQuote;["];
  91438. + MarkupTextLiteral - [21..22)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91439. + CloseAngle;[>];
  91440. + MarkupTagHelperElement - [22..70)::48 - strong[StartTagAndEndTag] - catchAllTagHelper
  91441. + MarkupTagHelperStartTag - [22..44)::22
  91442. + MarkupTextLiteral - [22..29)::7 - [<strong] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91443. + OpenAngle;[<];
  91444. + Text;[strong];
  91445. + MarkupTagHelperAttribute - [29..43)::14 - catchAll - DoubleQuotes - Unbound - [ catchAll="hi"]
  91446. + MarkupTextLiteral - [29..30)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91447. + Whitespace;[ ];
  91448. + MarkupTextLiteral - [30..38)::8 - [catchAll] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91449. + Text;[catchAll];
  91450. + Equals;[=];
  91451. + MarkupTextLiteral - [39..40)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91452. + DoubleQuote;["];
  91453. + MarkupTagHelperAttributeValue - [40..42)::2
  91454. + MarkupLiteralAttributeValue - [40..42)::2 - [hi]
  91455. + MarkupTextLiteral - [40..42)::2 - [hi] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91456. + Text;[hi];
  91457. + MarkupTextLiteral - [42..43)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91458. + DoubleQuote;["];
  91459. + MarkupTextLiteral - [43..44)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91460. + CloseAngle;[>];
  91461. + MarkupTagBlock - [44..52)::8 - [<strong>]
  91462. + MarkupTextLiteral - [44..52)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91463. + OpenAngle;[<];
  91464. + Text;[strong];
  91465. + CloseAngle;[>];
  91466. + MarkupTagBlock - [52..61)::9 - [</strong>]
  91467. + MarkupTextLiteral - [52..61)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91468. + OpenAngle;[<];
  91469. + ForwardSlash;[/];
  91470. + Text;[strong];
  91471. + CloseAngle;[>];
  91472. + MarkupTagHelperEndTag - [61..70)::9
  91473. + MarkupTextLiteral - [61..70)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91474. + OpenAngle;[<];
  91475. + ForwardSlash;[/];
  91476. + Text;[strong];
  91477. + CloseAngle;[>];
  91478. + MarkupTagHelperEndTag - [70..79)::9
  91479. + MarkupTextLiteral - [70..79)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91480. + OpenAngle;[<];
  91481. + ForwardSlash;[/];
  91482. + Text;[strong];
  91483. + CloseAngle;[>];
  91484. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly9.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly9.stree.txt
  91485. index 56fe5e10329..7a7ed95c396 100644
  91486. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly9.stree.txt
  91487. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NestedRequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly9.stree.txt
  91488. @@ -1,44 +1,89 @@
  91489. -Markup block - Gen<None> - 59 - (0:0,0)
  91490. - Tag block - Gen<TagHelper> - 59 - (0:0,0) - p - pTagHelper
  91491. - StartTagAndEndTag - <p class="btn"> ... </p>
  91492. - class - DoubleQuotes
  91493. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  91494. - SyntaxKind.Text;[btn];
  91495. - Tag block - Gen<None> - 3 - (15:0,15)
  91496. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:3
  91497. - SyntaxKind.OpenAngle;[<];
  91498. - SyntaxKind.Text;[p];
  91499. - SyntaxKind.CloseAngle;[>];
  91500. - Tag block - Gen<None> - 3 - (18:0,18)
  91501. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:3
  91502. - SyntaxKind.OpenAngle;[<];
  91503. - SyntaxKind.Text;[p];
  91504. - SyntaxKind.CloseAngle;[>];
  91505. - Tag block - Gen<TagHelper> - 26 - (21:0,21) - p - pTagHelper
  91506. - StartTagAndEndTag - <p class="btn"> ... </p>
  91507. - class - DoubleQuotes
  91508. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (31:0,31) - Tokens:1
  91509. - SyntaxKind.Text;[btn];
  91510. - Tag block - Gen<None> - 3 - (36:0,36)
  91511. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (36:0,36) - Tokens:3
  91512. - SyntaxKind.OpenAngle;[<];
  91513. - SyntaxKind.Text;[p];
  91514. - SyntaxKind.CloseAngle;[>];
  91515. - Tag block - Gen<None> - 4 - (39:0,39)
  91516. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (39:0,39) - Tokens:4
  91517. - SyntaxKind.OpenAngle;[<];
  91518. - SyntaxKind.ForwardSlash;[/];
  91519. - SyntaxKind.Text;[p];
  91520. - SyntaxKind.CloseAngle;[>];
  91521. - Tag block - Gen<None> - 4 - (47:0,47)
  91522. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (47:0,47) - Tokens:4
  91523. - SyntaxKind.OpenAngle;[<];
  91524. - SyntaxKind.ForwardSlash;[/];
  91525. - SyntaxKind.Text;[p];
  91526. - SyntaxKind.CloseAngle;[>];
  91527. - Tag block - Gen<None> - 4 - (51:0,51)
  91528. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (51:0,51) - Tokens:4
  91529. - SyntaxKind.OpenAngle;[<];
  91530. - SyntaxKind.ForwardSlash;[/];
  91531. - SyntaxKind.Text;[p];
  91532. - SyntaxKind.CloseAngle;[>];
  91533. +RazorDocument - [0..59)::59 - [<p class="btn"><p><p><p class="btn"><p></p></p></p></p></p>]
  91534. + MarkupBlock - [0..59)::59
  91535. + MarkupTagHelperElement - [0..59)::59 - p[StartTagAndEndTag] - pTagHelper
  91536. + MarkupTagHelperStartTag - [0..15)::15
  91537. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91538. + OpenAngle;[<];
  91539. + Text;[p];
  91540. + MarkupTagHelperAttribute - [2..14)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  91541. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91542. + Whitespace;[ ];
  91543. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91544. + Text;[class];
  91545. + Equals;[=];
  91546. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91547. + DoubleQuote;["];
  91548. + MarkupTagHelperAttributeValue - [10..13)::3
  91549. + MarkupLiteralAttributeValue - [10..13)::3 - [btn]
  91550. + MarkupTextLiteral - [10..13)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91551. + Text;[btn];
  91552. + MarkupTextLiteral - [13..14)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91553. + DoubleQuote;["];
  91554. + MarkupTextLiteral - [14..15)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91555. + CloseAngle;[>];
  91556. + MarkupTagBlock - [15..18)::3 - [<p>]
  91557. + MarkupTextLiteral - [15..18)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91558. + OpenAngle;[<];
  91559. + Text;[p];
  91560. + CloseAngle;[>];
  91561. + MarkupTagBlock - [18..21)::3 - [<p>]
  91562. + MarkupTextLiteral - [18..21)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91563. + OpenAngle;[<];
  91564. + Text;[p];
  91565. + CloseAngle;[>];
  91566. + MarkupTagHelperElement - [21..47)::26 - p[StartTagAndEndTag] - pTagHelper
  91567. + MarkupTagHelperStartTag - [21..36)::15
  91568. + MarkupTextLiteral - [21..23)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91569. + OpenAngle;[<];
  91570. + Text;[p];
  91571. + MarkupTagHelperAttribute - [23..35)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  91572. + MarkupTextLiteral - [23..24)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91573. + Whitespace;[ ];
  91574. + MarkupTextLiteral - [24..29)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91575. + Text;[class];
  91576. + Equals;[=];
  91577. + MarkupTextLiteral - [30..31)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91578. + DoubleQuote;["];
  91579. + MarkupTagHelperAttributeValue - [31..34)::3
  91580. + MarkupLiteralAttributeValue - [31..34)::3 - [btn]
  91581. + MarkupTextLiteral - [31..34)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91582. + Text;[btn];
  91583. + MarkupTextLiteral - [34..35)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91584. + DoubleQuote;["];
  91585. + MarkupTextLiteral - [35..36)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91586. + CloseAngle;[>];
  91587. + MarkupTagBlock - [36..39)::3 - [<p>]
  91588. + MarkupTextLiteral - [36..39)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91589. + OpenAngle;[<];
  91590. + Text;[p];
  91591. + CloseAngle;[>];
  91592. + MarkupTagBlock - [39..43)::4 - [</p>]
  91593. + MarkupTextLiteral - [39..43)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91594. + OpenAngle;[<];
  91595. + ForwardSlash;[/];
  91596. + Text;[p];
  91597. + CloseAngle;[>];
  91598. + MarkupTagHelperEndTag - [43..47)::4
  91599. + MarkupTextLiteral - [43..47)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91600. + OpenAngle;[<];
  91601. + ForwardSlash;[/];
  91602. + Text;[p];
  91603. + CloseAngle;[>];
  91604. + MarkupTagBlock - [47..51)::4 - [</p>]
  91605. + MarkupTextLiteral - [47..51)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91606. + OpenAngle;[<];
  91607. + ForwardSlash;[/];
  91608. + Text;[p];
  91609. + CloseAngle;[>];
  91610. + MarkupTagBlock - [51..55)::4 - [</p>]
  91611. + MarkupTextLiteral - [51..55)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91612. + OpenAngle;[<];
  91613. + ForwardSlash;[/];
  91614. + Text;[p];
  91615. + CloseAngle;[>];
  91616. + MarkupTagHelperEndTag - [55..59)::4
  91617. + MarkupTextLiteral - [55..59)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91618. + OpenAngle;[<];
  91619. + ForwardSlash;[/];
  91620. + Text;[p];
  91621. + CloseAngle;[>];
  91622. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NonTagHelperChild_UnderstandsTagHelperPrefixAndAllowedChildren.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NonTagHelperChild_UnderstandsTagHelperPrefixAndAllowedChildren.stree.txt
  91623. index 1323312f76b..fb55ceeabdb 100644
  91624. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NonTagHelperChild_UnderstandsTagHelperPrefixAndAllowedChildren.stree.txt
  91625. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/NonTagHelperChild_UnderstandsTagHelperPrefixAndAllowedChildren.stree.txt
  91626. @@ -1,14 +1,25 @@
  91627. -Markup block - Gen<None> - 30 - (0:0,0)
  91628. - Tag block - Gen<TagHelper> - 30 - (0:0,0) - th:p - PTagHelper
  91629. - StartTagAndEndTag - <th:p> ... </th:p>
  91630. - Tag block - Gen<None> - 8 - (6:0,6)
  91631. - Markup span - Gen<Markup> - [<strong>] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:3
  91632. - SyntaxKind.OpenAngle;[<];
  91633. - SyntaxKind.Text;[strong];
  91634. - SyntaxKind.CloseAngle;[>];
  91635. - Tag block - Gen<None> - 9 - (14:0,14)
  91636. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:4
  91637. - SyntaxKind.OpenAngle;[<];
  91638. - SyntaxKind.ForwardSlash;[/];
  91639. - SyntaxKind.Text;[strong];
  91640. - SyntaxKind.CloseAngle;[>];
  91641. +RazorDocument - [0..30)::30 - [<th:p><strong></strong></th:p>]
  91642. + MarkupBlock - [0..30)::30
  91643. + MarkupTagHelperElement - [0..30)::30 - th:p[StartTagAndEndTag] - PTagHelper
  91644. + MarkupTagHelperStartTag - [0..6)::6
  91645. + MarkupTextLiteral - [0..6)::6 - [<th:p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91646. + OpenAngle;[<];
  91647. + Text;[th:p];
  91648. + CloseAngle;[>];
  91649. + MarkupTagBlock - [6..14)::8 - [<strong>]
  91650. + MarkupTextLiteral - [6..14)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91651. + OpenAngle;[<];
  91652. + Text;[strong];
  91653. + CloseAngle;[>];
  91654. + MarkupTagBlock - [14..23)::9 - [</strong>]
  91655. + MarkupTextLiteral - [14..23)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91656. + OpenAngle;[<];
  91657. + ForwardSlash;[/];
  91658. + Text;[strong];
  91659. + CloseAngle;[>];
  91660. + MarkupTagHelperEndTag - [23..30)::7
  91661. + MarkupTextLiteral - [23..30)::7 - [</th:p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91662. + OpenAngle;[<];
  91663. + ForwardSlash;[/];
  91664. + Text;[th:p];
  91665. + CloseAngle;[>];
  91666. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RecoversWhenRequiredAttributeMismatchAndRestrictedChildren.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RecoversWhenRequiredAttributeMismatchAndRestrictedChildren.stree.txt
  91667. index a2d109fe468..2b838f60ea1 100644
  91668. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RecoversWhenRequiredAttributeMismatchAndRestrictedChildren.stree.txt
  91669. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RecoversWhenRequiredAttributeMismatchAndRestrictedChildren.stree.txt
  91670. @@ -1,15 +1,31 @@
  91671. -Markup block - Gen<None> - 43 - (0:0,0)
  91672. - Tag block - Gen<TagHelper> - 43 - (0:0,0) - strong - StrongTagHelper
  91673. - StartTagAndEndTag - <strong required> ... </strong>
  91674. - required - Minimized
  91675. - Tag block - Gen<None> - 8 - (17:0,17)
  91676. - Markup span - Gen<Markup> - [<strong>] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:3
  91677. - SyntaxKind.OpenAngle;[<];
  91678. - SyntaxKind.Text;[strong];
  91679. - SyntaxKind.CloseAngle;[>];
  91680. - Tag block - Gen<None> - 9 - (25:0,25)
  91681. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:4
  91682. - SyntaxKind.OpenAngle;[<];
  91683. - SyntaxKind.ForwardSlash;[/];
  91684. - SyntaxKind.Text;[strong];
  91685. - SyntaxKind.CloseAngle;[>];
  91686. +RazorDocument - [0..43)::43 - [<strong required><strong></strong></strong>]
  91687. + MarkupBlock - [0..43)::43
  91688. + MarkupTagHelperElement - [0..43)::43 - strong[StartTagAndEndTag] - StrongTagHelper
  91689. + MarkupTagHelperStartTag - [0..17)::17
  91690. + MarkupTextLiteral - [0..7)::7 - [<strong] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91691. + OpenAngle;[<];
  91692. + Text;[strong];
  91693. + MarkupMinimizedTagHelperAttribute - [7..16)::9 - required - Minimized - Unbound - [ required]
  91694. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91695. + Whitespace;[ ];
  91696. + MarkupTextLiteral - [8..16)::8 - [required] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91697. + Text;[required];
  91698. + MarkupTextLiteral - [16..17)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91699. + CloseAngle;[>];
  91700. + MarkupTagBlock - [17..25)::8 - [<strong>]
  91701. + MarkupTextLiteral - [17..25)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91702. + OpenAngle;[<];
  91703. + Text;[strong];
  91704. + CloseAngle;[>];
  91705. + MarkupTagBlock - [25..34)::9 - [</strong>]
  91706. + MarkupTextLiteral - [25..34)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91707. + OpenAngle;[<];
  91708. + ForwardSlash;[/];
  91709. + Text;[strong];
  91710. + CloseAngle;[>];
  91711. + MarkupTagHelperEndTag - [34..43)::9
  91712. + MarkupTextLiteral - [34..43)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91713. + OpenAngle;[<];
  91714. + ForwardSlash;[/];
  91715. + Text;[strong];
  91716. + CloseAngle;[>];
  91717. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly1.stree.txt
  91718. index 596d68d83cd..eab1ac90d69 100644
  91719. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly1.stree.txt
  91720. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly1.stree.txt
  91721. @@ -1,5 +1,6 @@
  91722. -Markup block - Gen<None> - 2 - (0:0,0)
  91723. - Tag block - Gen<None> - 2 - (0:0,0)
  91724. - Markup span - Gen<Markup> - [<p] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  91725. - SyntaxKind.OpenAngle;[<];
  91726. - SyntaxKind.Text;[p];
  91727. +RazorDocument - [0..2)::2 - [<p]
  91728. + MarkupBlock - [0..2)::2
  91729. + MarkupTagBlock - [0..2)::2 - [<p]
  91730. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91731. + OpenAngle;[<];
  91732. + Text;[p];
  91733. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly10.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly10.stree.txt
  91734. index 4d2fec2aa99..798f824dacc 100644
  91735. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly10.stree.txt
  91736. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly10.stree.txt
  91737. @@ -1,9 +1,42 @@
  91738. -Markup block - Gen<None> - 35 - (0:0,0)
  91739. - Tag block - Gen<TagHelper> - 35 - (0:0,0) - p - pTagHelper
  91740. - StartTagAndEndTag - <p notRequired="hi" class="btn" ... </p
  91741. - notRequired - DoubleQuotes
  91742. - Markup span - Gen<Markup> - [hi] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  91743. - SyntaxKind.Text;[hi];
  91744. - class - DoubleQuotes
  91745. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (27:0,27) - Tokens:1
  91746. - SyntaxKind.Text;[btn];
  91747. +RazorDocument - [0..35)::35 - [<p notRequired="hi" class="btn" </p]
  91748. + MarkupBlock - [0..35)::35
  91749. + MarkupTagHelperElement - [0..35)::35 - p[StartTagAndEndTag] - pTagHelper
  91750. + MarkupTagHelperStartTag - [0..32)::32
  91751. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91752. + OpenAngle;[<];
  91753. + Text;[p];
  91754. + MarkupTagHelperAttribute - [2..19)::17 - notRequired - DoubleQuotes - Unbound - [ notRequired="hi"]
  91755. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91756. + Whitespace;[ ];
  91757. + MarkupTextLiteral - [3..14)::11 - [notRequired] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91758. + Text;[notRequired];
  91759. + Equals;[=];
  91760. + MarkupTextLiteral - [15..16)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91761. + DoubleQuote;["];
  91762. + MarkupTagHelperAttributeValue - [16..18)::2
  91763. + MarkupLiteralAttributeValue - [16..18)::2 - [hi]
  91764. + MarkupTextLiteral - [16..18)::2 - [hi] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91765. + Text;[hi];
  91766. + MarkupTextLiteral - [18..19)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91767. + DoubleQuote;["];
  91768. + MarkupTagHelperAttribute - [19..31)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  91769. + MarkupTextLiteral - [19..20)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91770. + Whitespace;[ ];
  91771. + MarkupTextLiteral - [20..25)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91772. + Text;[class];
  91773. + Equals;[=];
  91774. + MarkupTextLiteral - [26..27)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91775. + DoubleQuote;["];
  91776. + MarkupTagHelperAttributeValue - [27..30)::3
  91777. + MarkupLiteralAttributeValue - [27..30)::3 - [btn]
  91778. + MarkupTextLiteral - [27..30)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91779. + Text;[btn];
  91780. + MarkupTextLiteral - [30..31)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91781. + DoubleQuote;["];
  91782. + MarkupTextLiteral - [31..32)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91783. + Whitespace;[ ];
  91784. + MarkupTagHelperEndTag - [32..35)::3
  91785. + MarkupTextLiteral - [32..35)::3 - [</p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91786. + OpenAngle;[<];
  91787. + ForwardSlash;[/];
  91788. + Text;[p];
  91789. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly2.stree.txt
  91790. index 4c1acbe66c8..503cfd3596d 100644
  91791. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly2.stree.txt
  91792. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly2.stree.txt
  91793. @@ -1,6 +1,21 @@
  91794. -Markup block - Gen<None> - 14 - (0:0,0)
  91795. - Tag block - Gen<TagHelper> - 14 - (0:0,0) - p - pTagHelper
  91796. - StartTagAndEndTag - <p class="btn"
  91797. - class - DoubleQuotes
  91798. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  91799. - SyntaxKind.Text;[btn];
  91800. +RazorDocument - [0..14)::14 - [<p class="btn"]
  91801. + MarkupBlock - [0..14)::14
  91802. + MarkupTagHelperElement - [0..14)::14 - p[StartTagAndEndTag] - pTagHelper
  91803. + MarkupTagHelperStartTag - [0..14)::14
  91804. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91805. + OpenAngle;[<];
  91806. + Text;[p];
  91807. + MarkupTagHelperAttribute - [2..14)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  91808. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91809. + Whitespace;[ ];
  91810. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91811. + Text;[class];
  91812. + Equals;[=];
  91813. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91814. + DoubleQuote;["];
  91815. + MarkupTagHelperAttributeValue - [10..13)::3
  91816. + MarkupLiteralAttributeValue - [10..13)::3 - [btn]
  91817. + MarkupTextLiteral - [10..13)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91818. + Text;[btn];
  91819. + MarkupTextLiteral - [13..14)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91820. + DoubleQuote;["];
  91821. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly3.stree.txt
  91822. index 053556f3a1e..fe9f393e938 100644
  91823. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly3.stree.txt
  91824. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly3.stree.txt
  91825. @@ -1,9 +1,35 @@
  91826. -Markup block - Gen<None> - 31 - (0:0,0)
  91827. - Tag block - Gen<TagHelper> - 31 - (0:0,0) - p - pTagHelper
  91828. - StartTagAndEndTag - <p notRequired="hi" class="btn"
  91829. - notRequired - DoubleQuotes
  91830. - Markup span - Gen<Markup> - [hi] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  91831. - SyntaxKind.Text;[hi];
  91832. - class - DoubleQuotes
  91833. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (27:0,27) - Tokens:1
  91834. - SyntaxKind.Text;[btn];
  91835. +RazorDocument - [0..31)::31 - [<p notRequired="hi" class="btn"]
  91836. + MarkupBlock - [0..31)::31
  91837. + MarkupTagHelperElement - [0..31)::31 - p[StartTagAndEndTag] - pTagHelper
  91838. + MarkupTagHelperStartTag - [0..31)::31
  91839. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91840. + OpenAngle;[<];
  91841. + Text;[p];
  91842. + MarkupTagHelperAttribute - [2..19)::17 - notRequired - DoubleQuotes - Unbound - [ notRequired="hi"]
  91843. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91844. + Whitespace;[ ];
  91845. + MarkupTextLiteral - [3..14)::11 - [notRequired] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91846. + Text;[notRequired];
  91847. + Equals;[=];
  91848. + MarkupTextLiteral - [15..16)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91849. + DoubleQuote;["];
  91850. + MarkupTagHelperAttributeValue - [16..18)::2
  91851. + MarkupLiteralAttributeValue - [16..18)::2 - [hi]
  91852. + MarkupTextLiteral - [16..18)::2 - [hi] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91853. + Text;[hi];
  91854. + MarkupTextLiteral - [18..19)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91855. + DoubleQuote;["];
  91856. + MarkupTagHelperAttribute - [19..31)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  91857. + MarkupTextLiteral - [19..20)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91858. + Whitespace;[ ];
  91859. + MarkupTextLiteral - [20..25)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91860. + Text;[class];
  91861. + Equals;[=];
  91862. + MarkupTextLiteral - [26..27)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91863. + DoubleQuote;["];
  91864. + MarkupTagHelperAttributeValue - [27..30)::3
  91865. + MarkupLiteralAttributeValue - [27..30)::3 - [btn]
  91866. + MarkupTextLiteral - [27..30)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91867. + Text;[btn];
  91868. + MarkupTextLiteral - [30..31)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91869. + DoubleQuote;["];
  91870. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly4.stree.txt
  91871. index e8a98d3e324..c5ba6587224 100644
  91872. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly4.stree.txt
  91873. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly4.stree.txt
  91874. @@ -1,11 +1,12 @@
  91875. -Markup block - Gen<None> - 6 - (0:0,0)
  91876. - Tag block - Gen<None> - 3 - (0:0,0)
  91877. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  91878. - SyntaxKind.OpenAngle;[<];
  91879. - SyntaxKind.Text;[p];
  91880. - SyntaxKind.CloseAngle;[>];
  91881. - Tag block - Gen<None> - 3 - (3:0,3)
  91882. - Markup span - Gen<Markup> - [</p] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:3
  91883. - SyntaxKind.OpenAngle;[<];
  91884. - SyntaxKind.ForwardSlash;[/];
  91885. - SyntaxKind.Text;[p];
  91886. +RazorDocument - [0..6)::6 - [<p></p]
  91887. + MarkupBlock - [0..6)::6
  91888. + MarkupTagBlock - [0..3)::3 - [<p>]
  91889. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91890. + OpenAngle;[<];
  91891. + Text;[p];
  91892. + CloseAngle;[>];
  91893. + MarkupTagBlock - [3..6)::3 - [</p]
  91894. + MarkupTextLiteral - [3..6)::3 - [</p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91895. + OpenAngle;[<];
  91896. + ForwardSlash;[/];
  91897. + Text;[p];
  91898. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly5.stree.txt
  91899. index 68684ef959f..79471e24408 100644
  91900. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly5.stree.txt
  91901. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly5.stree.txt
  91902. @@ -1,6 +1,28 @@
  91903. -Markup block - Gen<None> - 18 - (0:0,0)
  91904. - Tag block - Gen<TagHelper> - 18 - (0:0,0) - p - pTagHelper
  91905. - StartTagAndEndTag - <p class="btn"> ... </p
  91906. - class - DoubleQuotes
  91907. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  91908. - SyntaxKind.Text;[btn];
  91909. +RazorDocument - [0..18)::18 - [<p class="btn"></p]
  91910. + MarkupBlock - [0..18)::18
  91911. + MarkupTagHelperElement - [0..18)::18 - p[StartTagAndEndTag] - pTagHelper
  91912. + MarkupTagHelperStartTag - [0..15)::15
  91913. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91914. + OpenAngle;[<];
  91915. + Text;[p];
  91916. + MarkupTagHelperAttribute - [2..14)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  91917. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91918. + Whitespace;[ ];
  91919. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91920. + Text;[class];
  91921. + Equals;[=];
  91922. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91923. + DoubleQuote;["];
  91924. + MarkupTagHelperAttributeValue - [10..13)::3
  91925. + MarkupLiteralAttributeValue - [10..13)::3 - [btn]
  91926. + MarkupTextLiteral - [10..13)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91927. + Text;[btn];
  91928. + MarkupTextLiteral - [13..14)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91929. + DoubleQuote;["];
  91930. + MarkupTextLiteral - [14..15)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91931. + CloseAngle;[>];
  91932. + MarkupTagHelperEndTag - [15..18)::3
  91933. + MarkupTextLiteral - [15..18)::3 - [</p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91934. + OpenAngle;[<];
  91935. + ForwardSlash;[/];
  91936. + Text;[p];
  91937. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly6.stree.txt
  91938. index 0d2c7f935a6..f462c67c7bd 100644
  91939. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly6.stree.txt
  91940. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly6.stree.txt
  91941. @@ -1,9 +1,42 @@
  91942. -Markup block - Gen<None> - 35 - (0:0,0)
  91943. - Tag block - Gen<TagHelper> - 35 - (0:0,0) - p - pTagHelper
  91944. - StartTagAndEndTag - <p notRequired="hi" class="btn"> ... </p
  91945. - notRequired - DoubleQuotes
  91946. - Markup span - Gen<Markup> - [hi] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  91947. - SyntaxKind.Text;[hi];
  91948. - class - DoubleQuotes
  91949. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (27:0,27) - Tokens:1
  91950. - SyntaxKind.Text;[btn];
  91951. +RazorDocument - [0..35)::35 - [<p notRequired="hi" class="btn"></p]
  91952. + MarkupBlock - [0..35)::35
  91953. + MarkupTagHelperElement - [0..35)::35 - p[StartTagAndEndTag] - pTagHelper
  91954. + MarkupTagHelperStartTag - [0..32)::32
  91955. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91956. + OpenAngle;[<];
  91957. + Text;[p];
  91958. + MarkupTagHelperAttribute - [2..19)::17 - notRequired - DoubleQuotes - Unbound - [ notRequired="hi"]
  91959. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91960. + Whitespace;[ ];
  91961. + MarkupTextLiteral - [3..14)::11 - [notRequired] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91962. + Text;[notRequired];
  91963. + Equals;[=];
  91964. + MarkupTextLiteral - [15..16)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91965. + DoubleQuote;["];
  91966. + MarkupTagHelperAttributeValue - [16..18)::2
  91967. + MarkupLiteralAttributeValue - [16..18)::2 - [hi]
  91968. + MarkupTextLiteral - [16..18)::2 - [hi] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91969. + Text;[hi];
  91970. + MarkupTextLiteral - [18..19)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91971. + DoubleQuote;["];
  91972. + MarkupTagHelperAttribute - [19..31)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  91973. + MarkupTextLiteral - [19..20)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91974. + Whitespace;[ ];
  91975. + MarkupTextLiteral - [20..25)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91976. + Text;[class];
  91977. + Equals;[=];
  91978. + MarkupTextLiteral - [26..27)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91979. + DoubleQuote;["];
  91980. + MarkupTagHelperAttributeValue - [27..30)::3
  91981. + MarkupLiteralAttributeValue - [27..30)::3 - [btn]
  91982. + MarkupTextLiteral - [27..30)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91983. + Text;[btn];
  91984. + MarkupTextLiteral - [30..31)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  91985. + DoubleQuote;["];
  91986. + MarkupTextLiteral - [31..32)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91987. + CloseAngle;[>];
  91988. + MarkupTagHelperEndTag - [32..35)::3
  91989. + MarkupTextLiteral - [32..35)::3 - [</p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  91990. + OpenAngle;[<];
  91991. + ForwardSlash;[/];
  91992. + Text;[p];
  91993. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly7.stree.txt
  91994. index ace79e30773..31df0196832 100644
  91995. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly7.stree.txt
  91996. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly7.stree.txt
  91997. @@ -1,11 +1,28 @@
  91998. -Markup block - Gen<None> - 18 - (0:0,0)
  91999. - Tag block - Gen<TagHelper> - 18 - (0:0,0) - p - pTagHelper
  92000. - StartTagAndEndTag - <p class="btn"
  92001. - class - DoubleQuotes
  92002. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  92003. - SyntaxKind.Text;[btn];
  92004. - Tag block - Gen<None> - 3 - (15:0,15)
  92005. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:3
  92006. - SyntaxKind.OpenAngle;[<];
  92007. - SyntaxKind.Text;[p];
  92008. - SyntaxKind.CloseAngle;[>];
  92009. +RazorDocument - [0..18)::18 - [<p class="btn" <p>]
  92010. + MarkupBlock - [0..18)::18
  92011. + MarkupTagHelperElement - [0..18)::18 - p[StartTagAndEndTag] - pTagHelper
  92012. + MarkupTagHelperStartTag - [0..15)::15
  92013. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92014. + OpenAngle;[<];
  92015. + Text;[p];
  92016. + MarkupTagHelperAttribute - [2..14)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  92017. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92018. + Whitespace;[ ];
  92019. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92020. + Text;[class];
  92021. + Equals;[=];
  92022. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92023. + DoubleQuote;["];
  92024. + MarkupTagHelperAttributeValue - [10..13)::3
  92025. + MarkupLiteralAttributeValue - [10..13)::3 - [btn]
  92026. + MarkupTextLiteral - [10..13)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92027. + Text;[btn];
  92028. + MarkupTextLiteral - [13..14)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92029. + DoubleQuote;["];
  92030. + MarkupTextLiteral - [14..15)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92031. + Whitespace;[ ];
  92032. + MarkupTagBlock - [15..18)::3 - [<p>]
  92033. + MarkupTextLiteral - [15..18)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92034. + OpenAngle;[<];
  92035. + Text;[p];
  92036. + CloseAngle;[>];
  92037. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly8.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly8.stree.txt
  92038. index 2cf979b0067..b52a99bf866 100644
  92039. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly8.stree.txt
  92040. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly8.stree.txt
  92041. @@ -1,14 +1,42 @@
  92042. -Markup block - Gen<None> - 35 - (0:0,0)
  92043. - Tag block - Gen<TagHelper> - 35 - (0:0,0) - p - pTagHelper
  92044. - StartTagAndEndTag - <p notRequired="hi" class="btn"
  92045. - notRequired - DoubleQuotes
  92046. - Markup span - Gen<Markup> - [hi] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  92047. - SyntaxKind.Text;[hi];
  92048. - class - DoubleQuotes
  92049. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (27:0,27) - Tokens:1
  92050. - SyntaxKind.Text;[btn];
  92051. - Tag block - Gen<None> - 3 - (32:0,32)
  92052. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (32:0,32) - Tokens:3
  92053. - SyntaxKind.OpenAngle;[<];
  92054. - SyntaxKind.Text;[p];
  92055. - SyntaxKind.CloseAngle;[>];
  92056. +RazorDocument - [0..35)::35 - [<p notRequired="hi" class="btn" <p>]
  92057. + MarkupBlock - [0..35)::35
  92058. + MarkupTagHelperElement - [0..35)::35 - p[StartTagAndEndTag] - pTagHelper
  92059. + MarkupTagHelperStartTag - [0..32)::32
  92060. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92061. + OpenAngle;[<];
  92062. + Text;[p];
  92063. + MarkupTagHelperAttribute - [2..19)::17 - notRequired - DoubleQuotes - Unbound - [ notRequired="hi"]
  92064. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92065. + Whitespace;[ ];
  92066. + MarkupTextLiteral - [3..14)::11 - [notRequired] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92067. + Text;[notRequired];
  92068. + Equals;[=];
  92069. + MarkupTextLiteral - [15..16)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92070. + DoubleQuote;["];
  92071. + MarkupTagHelperAttributeValue - [16..18)::2
  92072. + MarkupLiteralAttributeValue - [16..18)::2 - [hi]
  92073. + MarkupTextLiteral - [16..18)::2 - [hi] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92074. + Text;[hi];
  92075. + MarkupTextLiteral - [18..19)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92076. + DoubleQuote;["];
  92077. + MarkupTagHelperAttribute - [19..31)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  92078. + MarkupTextLiteral - [19..20)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92079. + Whitespace;[ ];
  92080. + MarkupTextLiteral - [20..25)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92081. + Text;[class];
  92082. + Equals;[=];
  92083. + MarkupTextLiteral - [26..27)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92084. + DoubleQuote;["];
  92085. + MarkupTagHelperAttributeValue - [27..30)::3
  92086. + MarkupLiteralAttributeValue - [27..30)::3 - [btn]
  92087. + MarkupTextLiteral - [27..30)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92088. + Text;[btn];
  92089. + MarkupTextLiteral - [30..31)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92090. + DoubleQuote;["];
  92091. + MarkupTextLiteral - [31..32)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92092. + Whitespace;[ ];
  92093. + MarkupTagBlock - [32..35)::3 - [<p>]
  92094. + MarkupTextLiteral - [32..35)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92095. + OpenAngle;[<];
  92096. + Text;[p];
  92097. + CloseAngle;[>];
  92098. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly9.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly9.stree.txt
  92099. index 0fa243a508e..96562113116 100644
  92100. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly9.stree.txt
  92101. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateMalformedTagHelperBlocksCorrectly9.stree.txt
  92102. @@ -1,6 +1,28 @@
  92103. -Markup block - Gen<None> - 18 - (0:0,0)
  92104. - Tag block - Gen<TagHelper> - 18 - (0:0,0) - p - pTagHelper
  92105. - StartTagAndEndTag - <p class="btn" ... </p
  92106. - class - DoubleQuotes
  92107. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  92108. - SyntaxKind.Text;[btn];
  92109. +RazorDocument - [0..18)::18 - [<p class="btn" </p]
  92110. + MarkupBlock - [0..18)::18
  92111. + MarkupTagHelperElement - [0..18)::18 - p[StartTagAndEndTag] - pTagHelper
  92112. + MarkupTagHelperStartTag - [0..15)::15
  92113. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92114. + OpenAngle;[<];
  92115. + Text;[p];
  92116. + MarkupTagHelperAttribute - [2..14)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  92117. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92118. + Whitespace;[ ];
  92119. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92120. + Text;[class];
  92121. + Equals;[=];
  92122. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92123. + DoubleQuote;["];
  92124. + MarkupTagHelperAttributeValue - [10..13)::3
  92125. + MarkupLiteralAttributeValue - [10..13)::3 - [btn]
  92126. + MarkupTextLiteral - [10..13)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92127. + Text;[btn];
  92128. + MarkupTextLiteral - [13..14)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92129. + DoubleQuote;["];
  92130. + MarkupTextLiteral - [14..15)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92131. + Whitespace;[ ];
  92132. + MarkupTagHelperEndTag - [15..18)::3
  92133. + MarkupTextLiteral - [15..18)::3 - [</p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92134. + OpenAngle;[<];
  92135. + ForwardSlash;[/];
  92136. + Text;[p];
  92137. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly1.stree.txt
  92138. index 0b21e2db5fe..113a5935e00 100644
  92139. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly1.stree.txt
  92140. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly1.stree.txt
  92141. @@ -1,8 +1,9 @@
  92142. -Markup block - Gen<None> - 5 - (0:0,0)
  92143. - Tag block - Gen<None> - 5 - (0:0,0)
  92144. - Markup span - Gen<Markup> - [<p />] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:5
  92145. - SyntaxKind.OpenAngle;[<];
  92146. - SyntaxKind.Text;[p];
  92147. - SyntaxKind.Whitespace;[ ];
  92148. - SyntaxKind.ForwardSlash;[/];
  92149. - SyntaxKind.CloseAngle;[>];
  92150. +RazorDocument - [0..5)::5 - [<p />]
  92151. + MarkupBlock - [0..5)::5
  92152. + MarkupTagBlock - [0..5)::5 - [<p />]
  92153. + MarkupTextLiteral - [0..5)::5 - [<p />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92154. + OpenAngle;[<];
  92155. + Text;[p];
  92156. + Whitespace;[ ];
  92157. + ForwardSlash;[/];
  92158. + CloseAngle;[>];
  92159. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly10.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly10.stree.txt
  92160. index 1a20af44f8e..f32b50574ad 100644
  92161. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly10.stree.txt
  92162. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly10.stree.txt
  92163. @@ -1,6 +1,25 @@
  92164. -Markup block - Gen<None> - 24 - (0:0,0)
  92165. - Tag block - Gen<TagHelper> - 24 - (0:0,0) - strong - catchAllTagHelper
  92166. - SelfClosing - <strong catchAll="hi" />
  92167. - catchAll - DoubleQuotes
  92168. - Markup span - Gen<Markup> - [hi] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:1
  92169. - SyntaxKind.Text;[hi];
  92170. +RazorDocument - [0..24)::24 - [<strong catchAll="hi" />]
  92171. + MarkupBlock - [0..24)::24
  92172. + MarkupTagHelperElement - [0..24)::24 - strong[SelfClosing] - catchAllTagHelper
  92173. + MarkupTagHelperStartTag - [0..24)::24
  92174. + MarkupTextLiteral - [0..7)::7 - [<strong] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92175. + OpenAngle;[<];
  92176. + Text;[strong];
  92177. + MarkupTagHelperAttribute - [7..21)::14 - catchAll - DoubleQuotes - Unbound - [ catchAll="hi"]
  92178. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92179. + Whitespace;[ ];
  92180. + MarkupTextLiteral - [8..16)::8 - [catchAll] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92181. + Text;[catchAll];
  92182. + Equals;[=];
  92183. + MarkupTextLiteral - [17..18)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92184. + DoubleQuote;["];
  92185. + MarkupTagHelperAttributeValue - [18..20)::2
  92186. + MarkupLiteralAttributeValue - [18..20)::2 - [hi]
  92187. + MarkupTextLiteral - [18..20)::2 - [hi] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92188. + Text;[hi];
  92189. + MarkupTextLiteral - [20..21)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92190. + DoubleQuote;["];
  92191. + MarkupTextLiteral - [21..24)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92192. + Whitespace;[ ];
  92193. + ForwardSlash;[/];
  92194. + CloseAngle;[>];
  92195. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly11.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly11.stree.txt
  92196. index f26dbbcc7d2..37b1184828f 100644
  92197. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly11.stree.txt
  92198. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly11.stree.txt
  92199. @@ -1,13 +1,34 @@
  92200. -Markup block - Gen<None> - 35 - (0:0,0)
  92201. - Tag block - Gen<TagHelper> - 35 - (0:0,0) - strong - catchAllTagHelper
  92202. - SelfClosing - <strong catchAll="@DateTime.Now" />
  92203. - catchAll - DoubleQuotes
  92204. - Markup block - Gen<None> - 13 - (18:0,18)
  92205. - Markup block - Gen<DynAttr:@(18:0,18)> - 13 - (18:0,18)
  92206. - Expression block - Gen<Expr> - 13 - (18:0,18)
  92207. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (18:0,18) - Tokens:1
  92208. - SyntaxKind.Transition;[@];
  92209. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (19:0,19) - Tokens:3
  92210. - SyntaxKind.Identifier;[DateTime];
  92211. - SyntaxKind.Dot;[.];
  92212. - SyntaxKind.Identifier;[Now];
  92213. +RazorDocument - [0..35)::35 - [<strong catchAll="@DateTime.Now" />]
  92214. + MarkupBlock - [0..35)::35
  92215. + MarkupTagHelperElement - [0..35)::35 - strong[SelfClosing] - catchAllTagHelper
  92216. + MarkupTagHelperStartTag - [0..35)::35
  92217. + MarkupTextLiteral - [0..7)::7 - [<strong] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92218. + OpenAngle;[<];
  92219. + Text;[strong];
  92220. + MarkupTagHelperAttribute - [7..32)::25 - catchAll - DoubleQuotes - Unbound - [ catchAll="@DateTime.Now"]
  92221. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92222. + Whitespace;[ ];
  92223. + MarkupTextLiteral - [8..16)::8 - [catchAll] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92224. + Text;[catchAll];
  92225. + Equals;[=];
  92226. + MarkupTextLiteral - [17..18)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92227. + DoubleQuote;["];
  92228. + MarkupTagHelperAttributeValue - [18..31)::13
  92229. + MarkupDynamicAttributeValue - [18..31)::13 - [@DateTime.Now]
  92230. + GenericBlock - [18..31)::13
  92231. + CSharpCodeBlock - [18..31)::13
  92232. + CSharpImplicitExpression - [18..31)::13
  92233. + CSharpTransition - [18..19)::1 - Gen<None> - SpanEditHandler;Accepts:None
  92234. + Transition;[@];
  92235. + CSharpImplicitExpressionBody - [19..31)::12
  92236. + CSharpCodeBlock - [19..31)::12
  92237. + CSharpExpressionLiteral - [19..31)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  92238. + Identifier;[DateTime];
  92239. + Dot;[.];
  92240. + Identifier;[Now];
  92241. + MarkupTextLiteral - [31..32)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92242. + DoubleQuote;["];
  92243. + MarkupTextLiteral - [32..35)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92244. + Whitespace;[ ];
  92245. + ForwardSlash;[/];
  92246. + CloseAngle;[>];
  92247. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly12.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly12.stree.txt
  92248. index 49fa4a94f91..8f5dcd54c31 100644
  92249. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly12.stree.txt
  92250. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly12.stree.txt
  92251. @@ -1,13 +1,35 @@
  92252. -Markup block - Gen<None> - 47 - (0:0,0)
  92253. - Tag block - Gen<TagHelper> - 47 - (0:0,0) - strong - catchAllTagHelper
  92254. - StartTagAndEndTag - <strong catchAll="hi"> ... </strong>
  92255. - catchAll - DoubleQuotes
  92256. - Markup span - Gen<Markup> - [hi] - SpanEditHandler;Accepts:Any - (18:0,18) - Tokens:1
  92257. - SyntaxKind.Text;[hi];
  92258. - SyntaxKind.HtmlTextLiteral - [words and spaces] - [22..38) - FullWidth: 16 - Slots: 1
  92259. - SyntaxKind.List - [words and spaces] - [22..38) - FullWidth: 16 - Slots: 5
  92260. - SyntaxKind.Text;[words];
  92261. - SyntaxKind.Whitespace;[ ];
  92262. - SyntaxKind.Text;[and];
  92263. - SyntaxKind.Whitespace;[ ];
  92264. - SyntaxKind.Text;[spaces];
  92265. +RazorDocument - [0..47)::47 - [<strong catchAll="hi">words and spaces</strong>]
  92266. + MarkupBlock - [0..47)::47
  92267. + MarkupTagHelperElement - [0..47)::47 - strong[StartTagAndEndTag] - catchAllTagHelper
  92268. + MarkupTagHelperStartTag - [0..22)::22
  92269. + MarkupTextLiteral - [0..7)::7 - [<strong] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92270. + OpenAngle;[<];
  92271. + Text;[strong];
  92272. + MarkupTagHelperAttribute - [7..21)::14 - catchAll - DoubleQuotes - Unbound - [ catchAll="hi"]
  92273. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92274. + Whitespace;[ ];
  92275. + MarkupTextLiteral - [8..16)::8 - [catchAll] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92276. + Text;[catchAll];
  92277. + Equals;[=];
  92278. + MarkupTextLiteral - [17..18)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92279. + DoubleQuote;["];
  92280. + MarkupTagHelperAttributeValue - [18..20)::2
  92281. + MarkupLiteralAttributeValue - [18..20)::2 - [hi]
  92282. + MarkupTextLiteral - [18..20)::2 - [hi] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92283. + Text;[hi];
  92284. + MarkupTextLiteral - [20..21)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92285. + DoubleQuote;["];
  92286. + MarkupTextLiteral - [21..22)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92287. + CloseAngle;[>];
  92288. + MarkupTextLiteral - [22..38)::16 - [words and spaces] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92289. + Text;[words];
  92290. + Whitespace;[ ];
  92291. + Text;[and];
  92292. + Whitespace;[ ];
  92293. + Text;[spaces];
  92294. + MarkupTagHelperEndTag - [38..47)::9
  92295. + MarkupTextLiteral - [38..47)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92296. + OpenAngle;[<];
  92297. + ForwardSlash;[/];
  92298. + Text;[strong];
  92299. + CloseAngle;[>];
  92300. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly13.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly13.stree.txt
  92301. index d57a5fe1908..ecbcdd1d8fd 100644
  92302. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly13.stree.txt
  92303. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly13.stree.txt
  92304. @@ -1,20 +1,44 @@
  92305. -Markup block - Gen<None> - 58 - (0:0,0)
  92306. - Tag block - Gen<TagHelper> - 58 - (0:0,0) - strong - catchAllTagHelper
  92307. - StartTagAndEndTag - <strong catchAll="@DateTime.Now"> ... </strong>
  92308. - catchAll - DoubleQuotes
  92309. - Markup block - Gen<None> - 13 - (18:0,18)
  92310. - Markup block - Gen<DynAttr:@(18:0,18)> - 13 - (18:0,18)
  92311. - Expression block - Gen<Expr> - 13 - (18:0,18)
  92312. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (18:0,18) - Tokens:1
  92313. - SyntaxKind.Transition;[@];
  92314. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (19:0,19) - Tokens:3
  92315. - SyntaxKind.Identifier;[DateTime];
  92316. - SyntaxKind.Dot;[.];
  92317. - SyntaxKind.Identifier;[Now];
  92318. - SyntaxKind.HtmlTextLiteral - [words and spaces] - [33..49) - FullWidth: 16 - Slots: 1
  92319. - SyntaxKind.List - [words and spaces] - [33..49) - FullWidth: 16 - Slots: 5
  92320. - SyntaxKind.Text;[words];
  92321. - SyntaxKind.Whitespace;[ ];
  92322. - SyntaxKind.Text;[and];
  92323. - SyntaxKind.Whitespace;[ ];
  92324. - SyntaxKind.Text;[spaces];
  92325. +RazorDocument - [0..58)::58 - [<strong catchAll="@DateTime.Now">words and spaces</strong>]
  92326. + MarkupBlock - [0..58)::58
  92327. + MarkupTagHelperElement - [0..58)::58 - strong[StartTagAndEndTag] - catchAllTagHelper
  92328. + MarkupTagHelperStartTag - [0..33)::33
  92329. + MarkupTextLiteral - [0..7)::7 - [<strong] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92330. + OpenAngle;[<];
  92331. + Text;[strong];
  92332. + MarkupTagHelperAttribute - [7..32)::25 - catchAll - DoubleQuotes - Unbound - [ catchAll="@DateTime.Now"]
  92333. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92334. + Whitespace;[ ];
  92335. + MarkupTextLiteral - [8..16)::8 - [catchAll] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92336. + Text;[catchAll];
  92337. + Equals;[=];
  92338. + MarkupTextLiteral - [17..18)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92339. + DoubleQuote;["];
  92340. + MarkupTagHelperAttributeValue - [18..31)::13
  92341. + MarkupDynamicAttributeValue - [18..31)::13 - [@DateTime.Now]
  92342. + GenericBlock - [18..31)::13
  92343. + CSharpCodeBlock - [18..31)::13
  92344. + CSharpImplicitExpression - [18..31)::13
  92345. + CSharpTransition - [18..19)::1 - Gen<None> - SpanEditHandler;Accepts:None
  92346. + Transition;[@];
  92347. + CSharpImplicitExpressionBody - [19..31)::12
  92348. + CSharpCodeBlock - [19..31)::12
  92349. + CSharpExpressionLiteral - [19..31)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  92350. + Identifier;[DateTime];
  92351. + Dot;[.];
  92352. + Identifier;[Now];
  92353. + MarkupTextLiteral - [31..32)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92354. + DoubleQuote;["];
  92355. + MarkupTextLiteral - [32..33)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92356. + CloseAngle;[>];
  92357. + MarkupTextLiteral - [33..49)::16 - [words and spaces] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92358. + Text;[words];
  92359. + Whitespace;[ ];
  92360. + Text;[and];
  92361. + Whitespace;[ ];
  92362. + Text;[spaces];
  92363. + MarkupTagHelperEndTag - [49..58)::9
  92364. + MarkupTextLiteral - [49..58)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92365. + OpenAngle;[<];
  92366. + ForwardSlash;[/];
  92367. + Text;[strong];
  92368. + CloseAngle;[>];
  92369. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly14.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly14.stree.txt
  92370. index 1a8f7e684ec..8d64367f851 100644
  92371. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly14.stree.txt
  92372. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly14.stree.txt
  92373. @@ -1,19 +1,24 @@
  92374. -Markup block - Gen<None> - 19 - (0:0,0)
  92375. - Tag block - Gen<None> - 19 - (0:0,0)
  92376. - Markup span - Gen<Markup> - [<div] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  92377. - SyntaxKind.OpenAngle;[<];
  92378. - SyntaxKind.Text;[div];
  92379. - Markup block - Gen<Attr:class, class="@(4:0,4),"@(15:0,15)> - 12 - (4:0,4)
  92380. - Markup span - Gen<None> - [ class="] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:4
  92381. - SyntaxKind.Whitespace;[ ];
  92382. - SyntaxKind.Text;[class];
  92383. - SyntaxKind.Equals;[=];
  92384. - SyntaxKind.DoubleQuote;["];
  92385. - Markup span - Gen<LitAttr:@(12:0,12)> - [btn] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:1
  92386. - SyntaxKind.Text;[btn];
  92387. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:1
  92388. - SyntaxKind.DoubleQuote;["];
  92389. - Markup span - Gen<Markup> - [ />] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:3
  92390. - SyntaxKind.Whitespace;[ ];
  92391. - SyntaxKind.ForwardSlash;[/];
  92392. - SyntaxKind.CloseAngle;[>];
  92393. +RazorDocument - [0..19)::19 - [<div class="btn" />]
  92394. + MarkupBlock - [0..19)::19
  92395. + MarkupTagBlock - [0..19)::19 - [<div class="btn" />]
  92396. + MarkupTextLiteral - [0..4)::4 - [<div] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92397. + OpenAngle;[<];
  92398. + Text;[div];
  92399. + MarkupAttributeBlock - [4..16)::12 - [ class="btn"]
  92400. + MarkupTextLiteral - [4..5)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92401. + Whitespace;[ ];
  92402. + MarkupTextLiteral - [5..10)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92403. + Text;[class];
  92404. + Equals;[=];
  92405. + MarkupTextLiteral - [11..12)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92406. + DoubleQuote;["];
  92407. + GenericBlock - [12..15)::3
  92408. + MarkupLiteralAttributeValue - [12..15)::3 - [btn]
  92409. + MarkupTextLiteral - [12..15)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92410. + Text;[btn];
  92411. + MarkupTextLiteral - [15..16)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92412. + DoubleQuote;["];
  92413. + MarkupTextLiteral - [16..19)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92414. + Whitespace;[ ];
  92415. + ForwardSlash;[/];
  92416. + CloseAngle;[>];
  92417. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly15.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly15.stree.txt
  92418. index a2e01511c6d..0c736f6869e 100644
  92419. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly15.stree.txt
  92420. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly15.stree.txt
  92421. @@ -1,23 +1,28 @@
  92422. -Markup block - Gen<None> - 23 - (0:0,0)
  92423. - Tag block - Gen<None> - 17 - (0:0,0)
  92424. - Markup span - Gen<Markup> - [<div] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  92425. - SyntaxKind.OpenAngle;[<];
  92426. - SyntaxKind.Text;[div];
  92427. - Markup block - Gen<Attr:class, class="@(4:0,4),"@(15:0,15)> - 12 - (4:0,4)
  92428. - Markup span - Gen<None> - [ class="] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:4
  92429. - SyntaxKind.Whitespace;[ ];
  92430. - SyntaxKind.Text;[class];
  92431. - SyntaxKind.Equals;[=];
  92432. - SyntaxKind.DoubleQuote;["];
  92433. - Markup span - Gen<LitAttr:@(12:0,12)> - [btn] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:1
  92434. - SyntaxKind.Text;[btn];
  92435. - Markup span - Gen<None> - ["] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:1
  92436. - SyntaxKind.DoubleQuote;["];
  92437. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  92438. - SyntaxKind.CloseAngle;[>];
  92439. - Tag block - Gen<None> - 6 - (17:0,17)
  92440. - Markup span - Gen<Markup> - [</div>] - SpanEditHandler;Accepts:Any - (17:0,17) - Tokens:4
  92441. - SyntaxKind.OpenAngle;[<];
  92442. - SyntaxKind.ForwardSlash;[/];
  92443. - SyntaxKind.Text;[div];
  92444. - SyntaxKind.CloseAngle;[>];
  92445. +RazorDocument - [0..23)::23 - [<div class="btn"></div>]
  92446. + MarkupBlock - [0..23)::23
  92447. + MarkupTagBlock - [0..17)::17 - [<div class="btn">]
  92448. + MarkupTextLiteral - [0..4)::4 - [<div] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92449. + OpenAngle;[<];
  92450. + Text;[div];
  92451. + MarkupAttributeBlock - [4..16)::12 - [ class="btn"]
  92452. + MarkupTextLiteral - [4..5)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92453. + Whitespace;[ ];
  92454. + MarkupTextLiteral - [5..10)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92455. + Text;[class];
  92456. + Equals;[=];
  92457. + MarkupTextLiteral - [11..12)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92458. + DoubleQuote;["];
  92459. + GenericBlock - [12..15)::3
  92460. + MarkupLiteralAttributeValue - [12..15)::3 - [btn]
  92461. + MarkupTextLiteral - [12..15)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92462. + Text;[btn];
  92463. + MarkupTextLiteral - [15..16)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92464. + DoubleQuote;["];
  92465. + MarkupTextLiteral - [16..17)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92466. + CloseAngle;[>];
  92467. + MarkupTagBlock - [17..23)::6 - [</div>]
  92468. + MarkupTextLiteral - [17..23)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92469. + OpenAngle;[<];
  92470. + ForwardSlash;[/];
  92471. + Text;[div];
  92472. + CloseAngle;[>];
  92473. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly16.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly16.stree.txt
  92474. index 2785f615d77..371ac6d9947 100644
  92475. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly16.stree.txt
  92476. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly16.stree.txt
  92477. @@ -1,9 +1,39 @@
  92478. -Markup block - Gen<None> - 33 - (0:0,0)
  92479. - Tag block - Gen<TagHelper> - 33 - (0:0,0) - p - pTagHelper
  92480. - SelfClosing - <p notRequired="a" class="btn" />
  92481. - notRequired - DoubleQuotes
  92482. - Markup span - Gen<Markup> - [a] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  92483. - SyntaxKind.Text;[a];
  92484. - class - DoubleQuotes
  92485. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (26:0,26) - Tokens:1
  92486. - SyntaxKind.Text;[btn];
  92487. +RazorDocument - [0..33)::33 - [<p notRequired="a" class="btn" />]
  92488. + MarkupBlock - [0..33)::33
  92489. + MarkupTagHelperElement - [0..33)::33 - p[SelfClosing] - pTagHelper
  92490. + MarkupTagHelperStartTag - [0..33)::33
  92491. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92492. + OpenAngle;[<];
  92493. + Text;[p];
  92494. + MarkupTagHelperAttribute - [2..18)::16 - notRequired - DoubleQuotes - Unbound - [ notRequired="a"]
  92495. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92496. + Whitespace;[ ];
  92497. + MarkupTextLiteral - [3..14)::11 - [notRequired] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92498. + Text;[notRequired];
  92499. + Equals;[=];
  92500. + MarkupTextLiteral - [15..16)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92501. + DoubleQuote;["];
  92502. + MarkupTagHelperAttributeValue - [16..17)::1
  92503. + MarkupLiteralAttributeValue - [16..17)::1 - [a]
  92504. + MarkupTextLiteral - [16..17)::1 - [a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92505. + Text;[a];
  92506. + MarkupTextLiteral - [17..18)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92507. + DoubleQuote;["];
  92508. + MarkupTagHelperAttribute - [18..30)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  92509. + MarkupTextLiteral - [18..19)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92510. + Whitespace;[ ];
  92511. + MarkupTextLiteral - [19..24)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92512. + Text;[class];
  92513. + Equals;[=];
  92514. + MarkupTextLiteral - [25..26)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92515. + DoubleQuote;["];
  92516. + MarkupTagHelperAttributeValue - [26..29)::3
  92517. + MarkupLiteralAttributeValue - [26..29)::3 - [btn]
  92518. + MarkupTextLiteral - [26..29)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92519. + Text;[btn];
  92520. + MarkupTextLiteral - [29..30)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92521. + DoubleQuote;["];
  92522. + MarkupTextLiteral - [30..33)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92523. + Whitespace;[ ];
  92524. + ForwardSlash;[/];
  92525. + CloseAngle;[>];
  92526. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly17.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly17.stree.txt
  92527. index c88ea81e7a7..b157fddec9a 100644
  92528. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly17.stree.txt
  92529. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly17.stree.txt
  92530. @@ -1,16 +1,48 @@
  92531. -Markup block - Gen<None> - 45 - (0:0,0)
  92532. - Tag block - Gen<TagHelper> - 45 - (0:0,0) - p - pTagHelper
  92533. - SelfClosing - <p notRequired="@DateTime.Now" class="btn" />
  92534. - notRequired - DoubleQuotes
  92535. - Markup block - Gen<None> - 13 - (16:0,16)
  92536. - Markup block - Gen<DynAttr:@(16:0,16)> - 13 - (16:0,16)
  92537. - Expression block - Gen<Expr> - 13 - (16:0,16)
  92538. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (16:0,16) - Tokens:1
  92539. - SyntaxKind.Transition;[@];
  92540. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (17:0,17) - Tokens:3
  92541. - SyntaxKind.Identifier;[DateTime];
  92542. - SyntaxKind.Dot;[.];
  92543. - SyntaxKind.Identifier;[Now];
  92544. - class - DoubleQuotes
  92545. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (38:0,38) - Tokens:1
  92546. - SyntaxKind.Text;[btn];
  92547. +RazorDocument - [0..45)::45 - [<p notRequired="@DateTime.Now" class="btn" />]
  92548. + MarkupBlock - [0..45)::45
  92549. + MarkupTagHelperElement - [0..45)::45 - p[SelfClosing] - pTagHelper
  92550. + MarkupTagHelperStartTag - [0..45)::45
  92551. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92552. + OpenAngle;[<];
  92553. + Text;[p];
  92554. + MarkupTagHelperAttribute - [2..30)::28 - notRequired - DoubleQuotes - Unbound - [ notRequired="@DateTime.Now"]
  92555. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92556. + Whitespace;[ ];
  92557. + MarkupTextLiteral - [3..14)::11 - [notRequired] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92558. + Text;[notRequired];
  92559. + Equals;[=];
  92560. + MarkupTextLiteral - [15..16)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92561. + DoubleQuote;["];
  92562. + MarkupTagHelperAttributeValue - [16..29)::13
  92563. + MarkupDynamicAttributeValue - [16..29)::13 - [@DateTime.Now]
  92564. + GenericBlock - [16..29)::13
  92565. + CSharpCodeBlock - [16..29)::13
  92566. + CSharpImplicitExpression - [16..29)::13
  92567. + CSharpTransition - [16..17)::1 - Gen<None> - SpanEditHandler;Accepts:None
  92568. + Transition;[@];
  92569. + CSharpImplicitExpressionBody - [17..29)::12
  92570. + CSharpCodeBlock - [17..29)::12
  92571. + CSharpExpressionLiteral - [17..29)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  92572. + Identifier;[DateTime];
  92573. + Dot;[.];
  92574. + Identifier;[Now];
  92575. + MarkupTextLiteral - [29..30)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92576. + DoubleQuote;["];
  92577. + MarkupTagHelperAttribute - [30..42)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  92578. + MarkupTextLiteral - [30..31)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92579. + Whitespace;[ ];
  92580. + MarkupTextLiteral - [31..36)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92581. + Text;[class];
  92582. + Equals;[=];
  92583. + MarkupTextLiteral - [37..38)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92584. + DoubleQuote;["];
  92585. + MarkupTagHelperAttributeValue - [38..41)::3
  92586. + MarkupLiteralAttributeValue - [38..41)::3 - [btn]
  92587. + MarkupTextLiteral - [38..41)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92588. + Text;[btn];
  92589. + MarkupTextLiteral - [41..42)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92590. + DoubleQuote;["];
  92591. + MarkupTextLiteral - [42..45)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92592. + Whitespace;[ ];
  92593. + ForwardSlash;[/];
  92594. + CloseAngle;[>];
  92595. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly18.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly18.stree.txt
  92596. index 444e7dfa69e..1e173c05b50 100644
  92597. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly18.stree.txt
  92598. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly18.stree.txt
  92599. @@ -1,16 +1,49 @@
  92600. -Markup block - Gen<None> - 51 - (0:0,0)
  92601. - Tag block - Gen<TagHelper> - 51 - (0:0,0) - p - pTagHelper
  92602. - StartTagAndEndTag - <p notRequired="a" class="btn"> ... </p>
  92603. - notRequired - DoubleQuotes
  92604. - Markup span - Gen<Markup> - [a] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:1
  92605. - SyntaxKind.Text;[a];
  92606. - class - DoubleQuotes
  92607. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (26:0,26) - Tokens:1
  92608. - SyntaxKind.Text;[btn];
  92609. - SyntaxKind.HtmlTextLiteral - [words and spaces] - [31..47) - FullWidth: 16 - Slots: 1
  92610. - SyntaxKind.List - [words and spaces] - [31..47) - FullWidth: 16 - Slots: 5
  92611. - SyntaxKind.Text;[words];
  92612. - SyntaxKind.Whitespace;[ ];
  92613. - SyntaxKind.Text;[and];
  92614. - SyntaxKind.Whitespace;[ ];
  92615. - SyntaxKind.Text;[spaces];
  92616. +RazorDocument - [0..51)::51 - [<p notRequired="a" class="btn">words and spaces</p>]
  92617. + MarkupBlock - [0..51)::51
  92618. + MarkupTagHelperElement - [0..51)::51 - p[StartTagAndEndTag] - pTagHelper
  92619. + MarkupTagHelperStartTag - [0..31)::31
  92620. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92621. + OpenAngle;[<];
  92622. + Text;[p];
  92623. + MarkupTagHelperAttribute - [2..18)::16 - notRequired - DoubleQuotes - Unbound - [ notRequired="a"]
  92624. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92625. + Whitespace;[ ];
  92626. + MarkupTextLiteral - [3..14)::11 - [notRequired] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92627. + Text;[notRequired];
  92628. + Equals;[=];
  92629. + MarkupTextLiteral - [15..16)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92630. + DoubleQuote;["];
  92631. + MarkupTagHelperAttributeValue - [16..17)::1
  92632. + MarkupLiteralAttributeValue - [16..17)::1 - [a]
  92633. + MarkupTextLiteral - [16..17)::1 - [a] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92634. + Text;[a];
  92635. + MarkupTextLiteral - [17..18)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92636. + DoubleQuote;["];
  92637. + MarkupTagHelperAttribute - [18..30)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  92638. + MarkupTextLiteral - [18..19)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92639. + Whitespace;[ ];
  92640. + MarkupTextLiteral - [19..24)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92641. + Text;[class];
  92642. + Equals;[=];
  92643. + MarkupTextLiteral - [25..26)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92644. + DoubleQuote;["];
  92645. + MarkupTagHelperAttributeValue - [26..29)::3
  92646. + MarkupLiteralAttributeValue - [26..29)::3 - [btn]
  92647. + MarkupTextLiteral - [26..29)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92648. + Text;[btn];
  92649. + MarkupTextLiteral - [29..30)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92650. + DoubleQuote;["];
  92651. + MarkupTextLiteral - [30..31)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92652. + CloseAngle;[>];
  92653. + MarkupTextLiteral - [31..47)::16 - [words and spaces] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92654. + Text;[words];
  92655. + Whitespace;[ ];
  92656. + Text;[and];
  92657. + Whitespace;[ ];
  92658. + Text;[spaces];
  92659. + MarkupTagHelperEndTag - [47..51)::4
  92660. + MarkupTextLiteral - [47..51)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92661. + OpenAngle;[<];
  92662. + ForwardSlash;[/];
  92663. + Text;[p];
  92664. + CloseAngle;[>];
  92665. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly19.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly19.cspans.txt
  92666. index b46c82a311d..2930101dc19 100644
  92667. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly19.cspans.txt
  92668. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly19.cspans.txt
  92669. @@ -1 +1,2 @@
  92670. +Markup span at (12:0,12 [0] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [28] )
  92671. Markup span at (21:0,21 [3] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [28] )
  92672. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly19.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly19.stree.txt
  92673. index 66b5a6a45b3..a7e36899556 100644
  92674. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly19.stree.txt
  92675. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly19.stree.txt
  92676. @@ -1,8 +1,37 @@
  92677. -Markup block - Gen<None> - 28 - (0:0,0)
  92678. - Tag block - Gen<TagHelper> - 28 - (0:0,0) - div - divTagHelper
  92679. - SelfClosing - <div style="" class="btn" />
  92680. - style - DoubleQuotes
  92681. - Markup block - Gen<None> - 0 - (0:0,0)
  92682. - class - DoubleQuotes
  92683. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:1
  92684. - SyntaxKind.Text;[btn];
  92685. +RazorDocument - [0..28)::28 - [<div style="" class="btn" />]
  92686. + MarkupBlock - [0..28)::28
  92687. + MarkupTagHelperElement - [0..28)::28 - div[SelfClosing] - divTagHelper
  92688. + MarkupTagHelperStartTag - [0..28)::28
  92689. + MarkupTextLiteral - [0..4)::4 - [<div] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92690. + OpenAngle;[<];
  92691. + Text;[div];
  92692. + MarkupTagHelperAttribute - [4..13)::9 - style - DoubleQuotes - Unbound - [ style=""]
  92693. + MarkupTextLiteral - [4..5)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92694. + Whitespace;[ ];
  92695. + MarkupTextLiteral - [5..10)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92696. + Text;[style];
  92697. + Equals;[=];
  92698. + MarkupTextLiteral - [11..12)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92699. + DoubleQuote;["];
  92700. + MarkupTagHelperAttributeValue - [12..12)::0
  92701. + MarkupTextLiteral - [12..12)::0 - []
  92702. + MarkupTextLiteral - [12..13)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92703. + DoubleQuote;["];
  92704. + MarkupTagHelperAttribute - [13..25)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  92705. + MarkupTextLiteral - [13..14)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92706. + Whitespace;[ ];
  92707. + MarkupTextLiteral - [14..19)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92708. + Text;[class];
  92709. + Equals;[=];
  92710. + MarkupTextLiteral - [20..21)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92711. + DoubleQuote;["];
  92712. + MarkupTagHelperAttributeValue - [21..24)::3
  92713. + MarkupLiteralAttributeValue - [21..24)::3 - [btn]
  92714. + MarkupTextLiteral - [21..24)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92715. + Text;[btn];
  92716. + MarkupTextLiteral - [24..25)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92717. + DoubleQuote;["];
  92718. + MarkupTextLiteral - [25..28)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92719. + Whitespace;[ ];
  92720. + ForwardSlash;[/];
  92721. + CloseAngle;[>];
  92722. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly2.stree.txt
  92723. index 5c14e665304..8a2d870d97c 100644
  92724. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly2.stree.txt
  92725. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly2.stree.txt
  92726. @@ -1,12 +1,13 @@
  92727. -Markup block - Gen<None> - 7 - (0:0,0)
  92728. - Tag block - Gen<None> - 3 - (0:0,0)
  92729. - Markup span - Gen<Markup> - [<p>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  92730. - SyntaxKind.OpenAngle;[<];
  92731. - SyntaxKind.Text;[p];
  92732. - SyntaxKind.CloseAngle;[>];
  92733. - Tag block - Gen<None> - 4 - (3:0,3)
  92734. - Markup span - Gen<Markup> - [</p>] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:4
  92735. - SyntaxKind.OpenAngle;[<];
  92736. - SyntaxKind.ForwardSlash;[/];
  92737. - SyntaxKind.Text;[p];
  92738. - SyntaxKind.CloseAngle;[>];
  92739. +RazorDocument - [0..7)::7 - [<p></p>]
  92740. + MarkupBlock - [0..7)::7
  92741. + MarkupTagBlock - [0..3)::3 - [<p>]
  92742. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92743. + OpenAngle;[<];
  92744. + Text;[p];
  92745. + CloseAngle;[>];
  92746. + MarkupTagBlock - [3..7)::4 - [</p>]
  92747. + MarkupTextLiteral - [3..7)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92748. + OpenAngle;[<];
  92749. + ForwardSlash;[/];
  92750. + Text;[p];
  92751. + CloseAngle;[>];
  92752. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly20.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly20.stree.txt
  92753. index c3664a510e8..cfebeb7fc4b 100644
  92754. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly20.stree.txt
  92755. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly20.stree.txt
  92756. @@ -1,16 +1,48 @@
  92757. -Markup block - Gen<None> - 41 - (0:0,0)
  92758. - Tag block - Gen<TagHelper> - 41 - (0:0,0) - div - divTagHelper
  92759. - SelfClosing - <div style="@DateTime.Now" class="btn" />
  92760. - style - DoubleQuotes
  92761. - Markup block - Gen<None> - 13 - (12:0,12)
  92762. - Markup block - Gen<DynAttr:@(12:0,12)> - 13 - (12:0,12)
  92763. - Expression block - Gen<Expr> - 13 - (12:0,12)
  92764. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:1
  92765. - SyntaxKind.Transition;[@];
  92766. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (13:0,13) - Tokens:3
  92767. - SyntaxKind.Identifier;[DateTime];
  92768. - SyntaxKind.Dot;[.];
  92769. - SyntaxKind.Identifier;[Now];
  92770. - class - DoubleQuotes
  92771. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (34:0,34) - Tokens:1
  92772. - SyntaxKind.Text;[btn];
  92773. +RazorDocument - [0..41)::41 - [<div style="@DateTime.Now" class="btn" />]
  92774. + MarkupBlock - [0..41)::41
  92775. + MarkupTagHelperElement - [0..41)::41 - div[SelfClosing] - divTagHelper
  92776. + MarkupTagHelperStartTag - [0..41)::41
  92777. + MarkupTextLiteral - [0..4)::4 - [<div] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92778. + OpenAngle;[<];
  92779. + Text;[div];
  92780. + MarkupTagHelperAttribute - [4..26)::22 - style - DoubleQuotes - Unbound - [ style="@DateTime.Now"]
  92781. + MarkupTextLiteral - [4..5)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92782. + Whitespace;[ ];
  92783. + MarkupTextLiteral - [5..10)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92784. + Text;[style];
  92785. + Equals;[=];
  92786. + MarkupTextLiteral - [11..12)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92787. + DoubleQuote;["];
  92788. + MarkupTagHelperAttributeValue - [12..25)::13
  92789. + MarkupDynamicAttributeValue - [12..25)::13 - [@DateTime.Now]
  92790. + GenericBlock - [12..25)::13
  92791. + CSharpCodeBlock - [12..25)::13
  92792. + CSharpImplicitExpression - [12..25)::13
  92793. + CSharpTransition - [12..13)::1 - Gen<None> - SpanEditHandler;Accepts:None
  92794. + Transition;[@];
  92795. + CSharpImplicitExpressionBody - [13..25)::12
  92796. + CSharpCodeBlock - [13..25)::12
  92797. + CSharpExpressionLiteral - [13..25)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  92798. + Identifier;[DateTime];
  92799. + Dot;[.];
  92800. + Identifier;[Now];
  92801. + MarkupTextLiteral - [25..26)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92802. + DoubleQuote;["];
  92803. + MarkupTagHelperAttribute - [26..38)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  92804. + MarkupTextLiteral - [26..27)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92805. + Whitespace;[ ];
  92806. + MarkupTextLiteral - [27..32)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92807. + Text;[class];
  92808. + Equals;[=];
  92809. + MarkupTextLiteral - [33..34)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92810. + DoubleQuote;["];
  92811. + MarkupTagHelperAttributeValue - [34..37)::3
  92812. + MarkupLiteralAttributeValue - [34..37)::3 - [btn]
  92813. + MarkupTextLiteral - [34..37)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92814. + Text;[btn];
  92815. + MarkupTextLiteral - [37..38)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92816. + DoubleQuote;["];
  92817. + MarkupTextLiteral - [38..41)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92818. + Whitespace;[ ];
  92819. + ForwardSlash;[/];
  92820. + CloseAngle;[>];
  92821. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly21.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly21.cspans.txt
  92822. index 517442ebe94..17da676f686 100644
  92823. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly21.cspans.txt
  92824. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly21.cspans.txt
  92825. @@ -1,2 +1,3 @@
  92826. +Markup span at (12:0,12 [0] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [48] )
  92827. Markup span at (21:0,21 [3] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [48] )
  92828. Markup span at (26:0,26 [16] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [48] )
  92829. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly21.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly21.stree.txt
  92830. index 9b5a9b5c5ce..e35bb2239a0 100644
  92831. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly21.stree.txt
  92832. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly21.stree.txt
  92833. @@ -1,15 +1,47 @@
  92834. -Markup block - Gen<None> - 48 - (0:0,0)
  92835. - Tag block - Gen<TagHelper> - 48 - (0:0,0) - div - divTagHelper
  92836. - StartTagAndEndTag - <div style="" class="btn"> ... </div>
  92837. - style - DoubleQuotes
  92838. - Markup block - Gen<None> - 0 - (0:0,0)
  92839. - class - DoubleQuotes
  92840. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:1
  92841. - SyntaxKind.Text;[btn];
  92842. - SyntaxKind.HtmlTextLiteral - [words and spaces] - [26..42) - FullWidth: 16 - Slots: 1
  92843. - SyntaxKind.List - [words and spaces] - [26..42) - FullWidth: 16 - Slots: 5
  92844. - SyntaxKind.Text;[words];
  92845. - SyntaxKind.Whitespace;[ ];
  92846. - SyntaxKind.Text;[and];
  92847. - SyntaxKind.Whitespace;[ ];
  92848. - SyntaxKind.Text;[spaces];
  92849. +RazorDocument - [0..48)::48 - [<div style="" class="btn">words and spaces</div>]
  92850. + MarkupBlock - [0..48)::48
  92851. + MarkupTagHelperElement - [0..48)::48 - div[StartTagAndEndTag] - divTagHelper
  92852. + MarkupTagHelperStartTag - [0..26)::26
  92853. + MarkupTextLiteral - [0..4)::4 - [<div] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92854. + OpenAngle;[<];
  92855. + Text;[div];
  92856. + MarkupTagHelperAttribute - [4..13)::9 - style - DoubleQuotes - Unbound - [ style=""]
  92857. + MarkupTextLiteral - [4..5)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92858. + Whitespace;[ ];
  92859. + MarkupTextLiteral - [5..10)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92860. + Text;[style];
  92861. + Equals;[=];
  92862. + MarkupTextLiteral - [11..12)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92863. + DoubleQuote;["];
  92864. + MarkupTagHelperAttributeValue - [12..12)::0
  92865. + MarkupTextLiteral - [12..12)::0 - []
  92866. + MarkupTextLiteral - [12..13)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92867. + DoubleQuote;["];
  92868. + MarkupTagHelperAttribute - [13..25)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  92869. + MarkupTextLiteral - [13..14)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92870. + Whitespace;[ ];
  92871. + MarkupTextLiteral - [14..19)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92872. + Text;[class];
  92873. + Equals;[=];
  92874. + MarkupTextLiteral - [20..21)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92875. + DoubleQuote;["];
  92876. + MarkupTagHelperAttributeValue - [21..24)::3
  92877. + MarkupLiteralAttributeValue - [21..24)::3 - [btn]
  92878. + MarkupTextLiteral - [21..24)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92879. + Text;[btn];
  92880. + MarkupTextLiteral - [24..25)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92881. + DoubleQuote;["];
  92882. + MarkupTextLiteral - [25..26)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92883. + CloseAngle;[>];
  92884. + MarkupTextLiteral - [26..42)::16 - [words and spaces] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92885. + Text;[words];
  92886. + Whitespace;[ ];
  92887. + Text;[and];
  92888. + Whitespace;[ ];
  92889. + Text;[spaces];
  92890. + MarkupTagHelperEndTag - [42..48)::6
  92891. + MarkupTextLiteral - [42..48)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92892. + OpenAngle;[<];
  92893. + ForwardSlash;[/];
  92894. + Text;[div];
  92895. + CloseAngle;[>];
  92896. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly22.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly22.stree.txt
  92897. index 242d9d6cdb2..7e0cf0854e4 100644
  92898. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly22.stree.txt
  92899. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly22.stree.txt
  92900. @@ -1,30 +1,67 @@
  92901. -Markup block - Gen<None> - 71 - (0:0,0)
  92902. - Tag block - Gen<TagHelper> - 71 - (0:0,0) - div - divTagHelper
  92903. - StartTagAndEndTag - <div style="@DateTime.Now" class="@DateTime.Now"> ... </div>
  92904. - style - DoubleQuotes
  92905. - Markup block - Gen<None> - 13 - (12:0,12)
  92906. - Markup block - Gen<DynAttr:@(12:0,12)> - 13 - (12:0,12)
  92907. - Expression block - Gen<Expr> - 13 - (12:0,12)
  92908. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:1
  92909. - SyntaxKind.Transition;[@];
  92910. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (13:0,13) - Tokens:3
  92911. - SyntaxKind.Identifier;[DateTime];
  92912. - SyntaxKind.Dot;[.];
  92913. - SyntaxKind.Identifier;[Now];
  92914. - class - DoubleQuotes
  92915. - Markup block - Gen<None> - 13 - (34:0,34)
  92916. - Markup block - Gen<DynAttr:@(34:0,34)> - 13 - (34:0,34)
  92917. - Expression block - Gen<Expr> - 13 - (34:0,34)
  92918. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (34:0,34) - Tokens:1
  92919. - SyntaxKind.Transition;[@];
  92920. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (35:0,35) - Tokens:3
  92921. - SyntaxKind.Identifier;[DateTime];
  92922. - SyntaxKind.Dot;[.];
  92923. - SyntaxKind.Identifier;[Now];
  92924. - SyntaxKind.HtmlTextLiteral - [words and spaces] - [49..65) - FullWidth: 16 - Slots: 1
  92925. - SyntaxKind.List - [words and spaces] - [49..65) - FullWidth: 16 - Slots: 5
  92926. - SyntaxKind.Text;[words];
  92927. - SyntaxKind.Whitespace;[ ];
  92928. - SyntaxKind.Text;[and];
  92929. - SyntaxKind.Whitespace;[ ];
  92930. - SyntaxKind.Text;[spaces];
  92931. +RazorDocument - [0..71)::71 - [<div style="@DateTime.Now" class="@DateTime.Now">words and spaces</div>]
  92932. + MarkupBlock - [0..71)::71
  92933. + MarkupTagHelperElement - [0..71)::71 - div[StartTagAndEndTag] - divTagHelper
  92934. + MarkupTagHelperStartTag - [0..49)::49
  92935. + MarkupTextLiteral - [0..4)::4 - [<div] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92936. + OpenAngle;[<];
  92937. + Text;[div];
  92938. + MarkupTagHelperAttribute - [4..26)::22 - style - DoubleQuotes - Unbound - [ style="@DateTime.Now"]
  92939. + MarkupTextLiteral - [4..5)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92940. + Whitespace;[ ];
  92941. + MarkupTextLiteral - [5..10)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92942. + Text;[style];
  92943. + Equals;[=];
  92944. + MarkupTextLiteral - [11..12)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92945. + DoubleQuote;["];
  92946. + MarkupTagHelperAttributeValue - [12..25)::13
  92947. + MarkupDynamicAttributeValue - [12..25)::13 - [@DateTime.Now]
  92948. + GenericBlock - [12..25)::13
  92949. + CSharpCodeBlock - [12..25)::13
  92950. + CSharpImplicitExpression - [12..25)::13
  92951. + CSharpTransition - [12..13)::1 - Gen<None> - SpanEditHandler;Accepts:None
  92952. + Transition;[@];
  92953. + CSharpImplicitExpressionBody - [13..25)::12
  92954. + CSharpCodeBlock - [13..25)::12
  92955. + CSharpExpressionLiteral - [13..25)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  92956. + Identifier;[DateTime];
  92957. + Dot;[.];
  92958. + Identifier;[Now];
  92959. + MarkupTextLiteral - [25..26)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92960. + DoubleQuote;["];
  92961. + MarkupTagHelperAttribute - [26..48)::22 - class - DoubleQuotes - Unbound - [ class="@DateTime.Now"]
  92962. + MarkupTextLiteral - [26..27)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92963. + Whitespace;[ ];
  92964. + MarkupTextLiteral - [27..32)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92965. + Text;[class];
  92966. + Equals;[=];
  92967. + MarkupTextLiteral - [33..34)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92968. + DoubleQuote;["];
  92969. + MarkupTagHelperAttributeValue - [34..47)::13
  92970. + MarkupDynamicAttributeValue - [34..47)::13 - [@DateTime.Now]
  92971. + GenericBlock - [34..47)::13
  92972. + CSharpCodeBlock - [34..47)::13
  92973. + CSharpImplicitExpression - [34..47)::13
  92974. + CSharpTransition - [34..35)::1 - Gen<None> - SpanEditHandler;Accepts:None
  92975. + Transition;[@];
  92976. + CSharpImplicitExpressionBody - [35..47)::12
  92977. + CSharpCodeBlock - [35..47)::12
  92978. + CSharpExpressionLiteral - [35..47)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  92979. + Identifier;[DateTime];
  92980. + Dot;[.];
  92981. + Identifier;[Now];
  92982. + MarkupTextLiteral - [47..48)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  92983. + DoubleQuote;["];
  92984. + MarkupTextLiteral - [48..49)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92985. + CloseAngle;[>];
  92986. + MarkupTextLiteral - [49..65)::16 - [words and spaces] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92987. + Text;[words];
  92988. + Whitespace;[ ];
  92989. + Text;[and];
  92990. + Whitespace;[ ];
  92991. + Text;[spaces];
  92992. + MarkupTagHelperEndTag - [65..71)::6
  92993. + MarkupTextLiteral - [65..71)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  92994. + OpenAngle;[<];
  92995. + ForwardSlash;[/];
  92996. + Text;[div];
  92997. + CloseAngle;[>];
  92998. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly23.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly23.cspans.txt
  92999. index 120408cb77b..a788e1773e5 100644
  93000. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly23.cspans.txt
  93001. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly23.cspans.txt
  93002. @@ -1,3 +1,4 @@
  93003. +Markup span at (12:0,12 [0] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [63] )
  93004. Markup span at (21:0,21 [3] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [63] )
  93005. Markup span at (26:0,26 [5] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [63] )
  93006. Markup span at (31:0,31 [8] ) (Accepts:Any) - Parent: Tag block at (31:0,31 [8] )
  93007. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly23.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly23.stree.txt
  93008. index ae9b6d88a3f..84478fe389f 100644
  93009. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly23.stree.txt
  93010. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly23.stree.txt
  93011. @@ -1,25 +1,58 @@
  93012. -Markup block - Gen<None> - 63 - (0:0,0)
  93013. - Tag block - Gen<TagHelper> - 63 - (0:0,0) - div - divTagHelper
  93014. - StartTagAndEndTag - <div style="" class="btn"> ... </div>
  93015. - style - DoubleQuotes
  93016. - Markup block - Gen<None> - 0 - (0:0,0)
  93017. - class - DoubleQuotes
  93018. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:1
  93019. - SyntaxKind.Text;[btn];
  93020. - SyntaxKind.HtmlTextLiteral - [words] - [26..31) - FullWidth: 5 - Slots: 1
  93021. - SyntaxKind.Text;[words];
  93022. - Tag block - Gen<None> - 8 - (31:0,31)
  93023. - Markup span - Gen<Markup> - [<strong>] - SpanEditHandler;Accepts:Any - (31:0,31) - Tokens:3
  93024. - SyntaxKind.OpenAngle;[<];
  93025. - SyntaxKind.Text;[strong];
  93026. - SyntaxKind.CloseAngle;[>];
  93027. - SyntaxKind.HtmlTextLiteral - [and] - [39..42) - FullWidth: 3 - Slots: 1
  93028. - SyntaxKind.Text;[and];
  93029. - Tag block - Gen<None> - 9 - (42:0,42)
  93030. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (42:0,42) - Tokens:4
  93031. - SyntaxKind.OpenAngle;[<];
  93032. - SyntaxKind.ForwardSlash;[/];
  93033. - SyntaxKind.Text;[strong];
  93034. - SyntaxKind.CloseAngle;[>];
  93035. - SyntaxKind.HtmlTextLiteral - [spaces] - [51..57) - FullWidth: 6 - Slots: 1
  93036. - SyntaxKind.Text;[spaces];
  93037. +RazorDocument - [0..63)::63 - [<div style="" class="btn">words<strong>and</strong>spaces</div>]
  93038. + MarkupBlock - [0..63)::63
  93039. + MarkupTagHelperElement - [0..63)::63 - div[StartTagAndEndTag] - divTagHelper
  93040. + MarkupTagHelperStartTag - [0..26)::26
  93041. + MarkupTextLiteral - [0..4)::4 - [<div] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93042. + OpenAngle;[<];
  93043. + Text;[div];
  93044. + MarkupTagHelperAttribute - [4..13)::9 - style - DoubleQuotes - Unbound - [ style=""]
  93045. + MarkupTextLiteral - [4..5)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93046. + Whitespace;[ ];
  93047. + MarkupTextLiteral - [5..10)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93048. + Text;[style];
  93049. + Equals;[=];
  93050. + MarkupTextLiteral - [11..12)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93051. + DoubleQuote;["];
  93052. + MarkupTagHelperAttributeValue - [12..12)::0
  93053. + MarkupTextLiteral - [12..12)::0 - []
  93054. + MarkupTextLiteral - [12..13)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93055. + DoubleQuote;["];
  93056. + MarkupTagHelperAttribute - [13..25)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  93057. + MarkupTextLiteral - [13..14)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93058. + Whitespace;[ ];
  93059. + MarkupTextLiteral - [14..19)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93060. + Text;[class];
  93061. + Equals;[=];
  93062. + MarkupTextLiteral - [20..21)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93063. + DoubleQuote;["];
  93064. + MarkupTagHelperAttributeValue - [21..24)::3
  93065. + MarkupLiteralAttributeValue - [21..24)::3 - [btn]
  93066. + MarkupTextLiteral - [21..24)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93067. + Text;[btn];
  93068. + MarkupTextLiteral - [24..25)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93069. + DoubleQuote;["];
  93070. + MarkupTextLiteral - [25..26)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93071. + CloseAngle;[>];
  93072. + MarkupTextLiteral - [26..31)::5 - [words] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93073. + Text;[words];
  93074. + MarkupTagBlock - [31..39)::8 - [<strong>]
  93075. + MarkupTextLiteral - [31..39)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93076. + OpenAngle;[<];
  93077. + Text;[strong];
  93078. + CloseAngle;[>];
  93079. + MarkupTextLiteral - [39..42)::3 - [and] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93080. + Text;[and];
  93081. + MarkupTagBlock - [42..51)::9 - [</strong>]
  93082. + MarkupTextLiteral - [42..51)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93083. + OpenAngle;[<];
  93084. + ForwardSlash;[/];
  93085. + Text;[strong];
  93086. + CloseAngle;[>];
  93087. + MarkupTextLiteral - [51..57)::6 - [spaces] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93088. + Text;[spaces];
  93089. + MarkupTagHelperEndTag - [57..63)::6
  93090. + MarkupTextLiteral - [57..63)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93091. + OpenAngle;[<];
  93092. + ForwardSlash;[/];
  93093. + Text;[div];
  93094. + CloseAngle;[>];
  93095. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly24.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly24.stree.txt
  93096. index 190c850ed74..0e31631ea00 100644
  93097. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly24.stree.txt
  93098. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly24.stree.txt
  93099. @@ -1,9 +1,39 @@
  93100. -Markup block - Gen<None> - 31 - (0:0,0)
  93101. - Tag block - Gen<TagHelper> - 31 - (0:0,0) - p - pTagHelper - catchAllTagHelper
  93102. - SelfClosing - <p class="btn" catchAll="hi" />
  93103. - class - DoubleQuotes
  93104. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  93105. - SyntaxKind.Text;[btn];
  93106. - catchAll - DoubleQuotes
  93107. - Markup span - Gen<Markup> - [hi] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:1
  93108. - SyntaxKind.Text;[hi];
  93109. +RazorDocument - [0..31)::31 - [<p class="btn" catchAll="hi" />]
  93110. + MarkupBlock - [0..31)::31
  93111. + MarkupTagHelperElement - [0..31)::31 - p[SelfClosing] - pTagHelper - catchAllTagHelper
  93112. + MarkupTagHelperStartTag - [0..31)::31
  93113. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93114. + OpenAngle;[<];
  93115. + Text;[p];
  93116. + MarkupTagHelperAttribute - [2..14)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  93117. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93118. + Whitespace;[ ];
  93119. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93120. + Text;[class];
  93121. + Equals;[=];
  93122. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93123. + DoubleQuote;["];
  93124. + MarkupTagHelperAttributeValue - [10..13)::3
  93125. + MarkupLiteralAttributeValue - [10..13)::3 - [btn]
  93126. + MarkupTextLiteral - [10..13)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93127. + Text;[btn];
  93128. + MarkupTextLiteral - [13..14)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93129. + DoubleQuote;["];
  93130. + MarkupTagHelperAttribute - [14..28)::14 - catchAll - DoubleQuotes - Unbound - [ catchAll="hi"]
  93131. + MarkupTextLiteral - [14..15)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93132. + Whitespace;[ ];
  93133. + MarkupTextLiteral - [15..23)::8 - [catchAll] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93134. + Text;[catchAll];
  93135. + Equals;[=];
  93136. + MarkupTextLiteral - [24..25)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93137. + DoubleQuote;["];
  93138. + MarkupTagHelperAttributeValue - [25..27)::2
  93139. + MarkupLiteralAttributeValue - [25..27)::2 - [hi]
  93140. + MarkupTextLiteral - [25..27)::2 - [hi] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93141. + Text;[hi];
  93142. + MarkupTextLiteral - [27..28)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93143. + DoubleQuote;["];
  93144. + MarkupTextLiteral - [28..31)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93145. + Whitespace;[ ];
  93146. + ForwardSlash;[/];
  93147. + CloseAngle;[>];
  93148. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly25.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly25.stree.txt
  93149. index 1cda25bc241..fb72d500987 100644
  93150. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly25.stree.txt
  93151. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly25.stree.txt
  93152. @@ -1,16 +1,49 @@
  93153. -Markup block - Gen<None> - 49 - (0:0,0)
  93154. - Tag block - Gen<TagHelper> - 49 - (0:0,0) - p - pTagHelper - catchAllTagHelper
  93155. - StartTagAndEndTag - <p class="btn" catchAll="hi"> ... </p>
  93156. - class - DoubleQuotes
  93157. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  93158. - SyntaxKind.Text;[btn];
  93159. - catchAll - DoubleQuotes
  93160. - Markup span - Gen<Markup> - [hi] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:1
  93161. - SyntaxKind.Text;[hi];
  93162. - SyntaxKind.HtmlTextLiteral - [words and spaces] - [29..45) - FullWidth: 16 - Slots: 1
  93163. - SyntaxKind.List - [words and spaces] - [29..45) - FullWidth: 16 - Slots: 5
  93164. - SyntaxKind.Text;[words];
  93165. - SyntaxKind.Whitespace;[ ];
  93166. - SyntaxKind.Text;[and];
  93167. - SyntaxKind.Whitespace;[ ];
  93168. - SyntaxKind.Text;[spaces];
  93169. +RazorDocument - [0..49)::49 - [<p class="btn" catchAll="hi">words and spaces</p>]
  93170. + MarkupBlock - [0..49)::49
  93171. + MarkupTagHelperElement - [0..49)::49 - p[StartTagAndEndTag] - pTagHelper - catchAllTagHelper
  93172. + MarkupTagHelperStartTag - [0..29)::29
  93173. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93174. + OpenAngle;[<];
  93175. + Text;[p];
  93176. + MarkupTagHelperAttribute - [2..14)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  93177. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93178. + Whitespace;[ ];
  93179. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93180. + Text;[class];
  93181. + Equals;[=];
  93182. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93183. + DoubleQuote;["];
  93184. + MarkupTagHelperAttributeValue - [10..13)::3
  93185. + MarkupLiteralAttributeValue - [10..13)::3 - [btn]
  93186. + MarkupTextLiteral - [10..13)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93187. + Text;[btn];
  93188. + MarkupTextLiteral - [13..14)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93189. + DoubleQuote;["];
  93190. + MarkupTagHelperAttribute - [14..28)::14 - catchAll - DoubleQuotes - Unbound - [ catchAll="hi"]
  93191. + MarkupTextLiteral - [14..15)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93192. + Whitespace;[ ];
  93193. + MarkupTextLiteral - [15..23)::8 - [catchAll] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93194. + Text;[catchAll];
  93195. + Equals;[=];
  93196. + MarkupTextLiteral - [24..25)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93197. + DoubleQuote;["];
  93198. + MarkupTagHelperAttributeValue - [25..27)::2
  93199. + MarkupLiteralAttributeValue - [25..27)::2 - [hi]
  93200. + MarkupTextLiteral - [25..27)::2 - [hi] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93201. + Text;[hi];
  93202. + MarkupTextLiteral - [27..28)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93203. + DoubleQuote;["];
  93204. + MarkupTextLiteral - [28..29)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93205. + CloseAngle;[>];
  93206. + MarkupTextLiteral - [29..45)::16 - [words and spaces] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93207. + Text;[words];
  93208. + Whitespace;[ ];
  93209. + Text;[and];
  93210. + Whitespace;[ ];
  93211. + Text;[spaces];
  93212. + MarkupTagHelperEndTag - [45..49)::4
  93213. + MarkupTextLiteral - [45..49)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93214. + OpenAngle;[<];
  93215. + ForwardSlash;[/];
  93216. + Text;[p];
  93217. + CloseAngle;[>];
  93218. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly26.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly26.cspans.txt
  93219. index cbc34007198..4a50e7e4a8e 100644
  93220. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly26.cspans.txt
  93221. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly26.cspans.txt
  93222. @@ -1,2 +1,3 @@
  93223. +Markup span at (12:0,12 [0] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [42] )
  93224. Markup span at (21:0,21 [3] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [42] )
  93225. Markup span at (36:0,36 [2] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [42] )
  93226. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly26.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly26.stree.txt
  93227. index c8516a8331e..ac47257b993 100644
  93228. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly26.stree.txt
  93229. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly26.stree.txt
  93230. @@ -1,11 +1,51 @@
  93231. -Markup block - Gen<None> - 42 - (0:0,0)
  93232. - Tag block - Gen<TagHelper> - 42 - (0:0,0) - div - divTagHelper - catchAllTagHelper
  93233. - SelfClosing - <div style="" class="btn" catchAll="hi" />
  93234. - style - DoubleQuotes
  93235. - Markup block - Gen<None> - 0 - (0:0,0)
  93236. - class - DoubleQuotes
  93237. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:1
  93238. - SyntaxKind.Text;[btn];
  93239. - catchAll - DoubleQuotes
  93240. - Markup span - Gen<Markup> - [hi] - SpanEditHandler;Accepts:Any - (36:0,36) - Tokens:1
  93241. - SyntaxKind.Text;[hi];
  93242. +RazorDocument - [0..42)::42 - [<div style="" class="btn" catchAll="hi" />]
  93243. + MarkupBlock - [0..42)::42
  93244. + MarkupTagHelperElement - [0..42)::42 - div[SelfClosing] - divTagHelper - catchAllTagHelper
  93245. + MarkupTagHelperStartTag - [0..42)::42
  93246. + MarkupTextLiteral - [0..4)::4 - [<div] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93247. + OpenAngle;[<];
  93248. + Text;[div];
  93249. + MarkupTagHelperAttribute - [4..13)::9 - style - DoubleQuotes - Unbound - [ style=""]
  93250. + MarkupTextLiteral - [4..5)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93251. + Whitespace;[ ];
  93252. + MarkupTextLiteral - [5..10)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93253. + Text;[style];
  93254. + Equals;[=];
  93255. + MarkupTextLiteral - [11..12)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93256. + DoubleQuote;["];
  93257. + MarkupTagHelperAttributeValue - [12..12)::0
  93258. + MarkupTextLiteral - [12..12)::0 - []
  93259. + MarkupTextLiteral - [12..13)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93260. + DoubleQuote;["];
  93261. + MarkupTagHelperAttribute - [13..25)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  93262. + MarkupTextLiteral - [13..14)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93263. + Whitespace;[ ];
  93264. + MarkupTextLiteral - [14..19)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93265. + Text;[class];
  93266. + Equals;[=];
  93267. + MarkupTextLiteral - [20..21)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93268. + DoubleQuote;["];
  93269. + MarkupTagHelperAttributeValue - [21..24)::3
  93270. + MarkupLiteralAttributeValue - [21..24)::3 - [btn]
  93271. + MarkupTextLiteral - [21..24)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93272. + Text;[btn];
  93273. + MarkupTextLiteral - [24..25)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93274. + DoubleQuote;["];
  93275. + MarkupTagHelperAttribute - [25..39)::14 - catchAll - DoubleQuotes - Unbound - [ catchAll="hi"]
  93276. + MarkupTextLiteral - [25..26)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93277. + Whitespace;[ ];
  93278. + MarkupTextLiteral - [26..34)::8 - [catchAll] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93279. + Text;[catchAll];
  93280. + Equals;[=];
  93281. + MarkupTextLiteral - [35..36)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93282. + DoubleQuote;["];
  93283. + MarkupTagHelperAttributeValue - [36..38)::2
  93284. + MarkupLiteralAttributeValue - [36..38)::2 - [hi]
  93285. + MarkupTextLiteral - [36..38)::2 - [hi] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93286. + Text;[hi];
  93287. + MarkupTextLiteral - [38..39)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93288. + DoubleQuote;["];
  93289. + MarkupTextLiteral - [39..42)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93290. + Whitespace;[ ];
  93291. + ForwardSlash;[/];
  93292. + CloseAngle;[>];
  93293. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly27.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly27.cspans.txt
  93294. index 046bac01d76..49b2350a05e 100644
  93295. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly27.cspans.txt
  93296. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly27.cspans.txt
  93297. @@ -1,3 +1,4 @@
  93298. +Markup span at (12:0,12 [0] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [63] )
  93299. Markup span at (21:0,21 [3] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [63] )
  93300. Markup span at (36:0,36 [2] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [63] )
  93301. Markup span at (41:0,41 [16] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [63] )
  93302. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly27.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly27.stree.txt
  93303. index e31ee9f4043..320b3d5ca0b 100644
  93304. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly27.stree.txt
  93305. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly27.stree.txt
  93306. @@ -1,18 +1,62 @@
  93307. -Markup block - Gen<None> - 63 - (0:0,0)
  93308. - Tag block - Gen<TagHelper> - 63 - (0:0,0) - div - divTagHelper - catchAllTagHelper
  93309. - StartTagAndEndTag - <div style="" class="btn" catchAll="hi" > ... </div>
  93310. - style - DoubleQuotes
  93311. - Markup block - Gen<None> - 0 - (0:0,0)
  93312. - class - DoubleQuotes
  93313. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:1
  93314. - SyntaxKind.Text;[btn];
  93315. - catchAll - DoubleQuotes
  93316. - Markup span - Gen<Markup> - [hi] - SpanEditHandler;Accepts:Any - (36:0,36) - Tokens:1
  93317. - SyntaxKind.Text;[hi];
  93318. - SyntaxKind.HtmlTextLiteral - [words and spaces] - [41..57) - FullWidth: 16 - Slots: 1
  93319. - SyntaxKind.List - [words and spaces] - [41..57) - FullWidth: 16 - Slots: 5
  93320. - SyntaxKind.Text;[words];
  93321. - SyntaxKind.Whitespace;[ ];
  93322. - SyntaxKind.Text;[and];
  93323. - SyntaxKind.Whitespace;[ ];
  93324. - SyntaxKind.Text;[spaces];
  93325. +RazorDocument - [0..63)::63 - [<div style="" class="btn" catchAll="hi" >words and spaces</div>]
  93326. + MarkupBlock - [0..63)::63
  93327. + MarkupTagHelperElement - [0..63)::63 - div[StartTagAndEndTag] - divTagHelper - catchAllTagHelper
  93328. + MarkupTagHelperStartTag - [0..41)::41
  93329. + MarkupTextLiteral - [0..4)::4 - [<div] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93330. + OpenAngle;[<];
  93331. + Text;[div];
  93332. + MarkupTagHelperAttribute - [4..13)::9 - style - DoubleQuotes - Unbound - [ style=""]
  93333. + MarkupTextLiteral - [4..5)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93334. + Whitespace;[ ];
  93335. + MarkupTextLiteral - [5..10)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93336. + Text;[style];
  93337. + Equals;[=];
  93338. + MarkupTextLiteral - [11..12)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93339. + DoubleQuote;["];
  93340. + MarkupTagHelperAttributeValue - [12..12)::0
  93341. + MarkupTextLiteral - [12..12)::0 - []
  93342. + MarkupTextLiteral - [12..13)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93343. + DoubleQuote;["];
  93344. + MarkupTagHelperAttribute - [13..25)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  93345. + MarkupTextLiteral - [13..14)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93346. + Whitespace;[ ];
  93347. + MarkupTextLiteral - [14..19)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93348. + Text;[class];
  93349. + Equals;[=];
  93350. + MarkupTextLiteral - [20..21)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93351. + DoubleQuote;["];
  93352. + MarkupTagHelperAttributeValue - [21..24)::3
  93353. + MarkupLiteralAttributeValue - [21..24)::3 - [btn]
  93354. + MarkupTextLiteral - [21..24)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93355. + Text;[btn];
  93356. + MarkupTextLiteral - [24..25)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93357. + DoubleQuote;["];
  93358. + MarkupTagHelperAttribute - [25..39)::14 - catchAll - DoubleQuotes - Unbound - [ catchAll="hi"]
  93359. + MarkupTextLiteral - [25..26)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93360. + Whitespace;[ ];
  93361. + MarkupTextLiteral - [26..34)::8 - [catchAll] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93362. + Text;[catchAll];
  93363. + Equals;[=];
  93364. + MarkupTextLiteral - [35..36)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93365. + DoubleQuote;["];
  93366. + MarkupTagHelperAttributeValue - [36..38)::2
  93367. + MarkupLiteralAttributeValue - [36..38)::2 - [hi]
  93368. + MarkupTextLiteral - [36..38)::2 - [hi] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93369. + Text;[hi];
  93370. + MarkupTextLiteral - [38..39)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93371. + DoubleQuote;["];
  93372. + MarkupTextLiteral - [39..41)::2 - [ >] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93373. + Whitespace;[ ];
  93374. + CloseAngle;[>];
  93375. + MarkupTextLiteral - [41..57)::16 - [words and spaces] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93376. + Text;[words];
  93377. + Whitespace;[ ];
  93378. + Text;[and];
  93379. + Whitespace;[ ];
  93380. + Text;[spaces];
  93381. + MarkupTagHelperEndTag - [57..63)::6
  93382. + MarkupTextLiteral - [57..63)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93383. + OpenAngle;[<];
  93384. + ForwardSlash;[/];
  93385. + Text;[div];
  93386. + CloseAngle;[>];
  93387. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly28.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly28.cspans.txt
  93388. index 9197a8cdf39..b76fbd29f09 100644
  93389. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly28.cspans.txt
  93390. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly28.cspans.txt
  93391. @@ -1,3 +1,4 @@
  93392. +Markup span at (12:0,12 [0] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [65] )
  93393. Markup span at (21:0,21 [3] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [65] )
  93394. Markup span at (36:0,36 [1] ) (Accepts:None) - Parent: Markup block at (36:0,36 [2] )
  93395. Markup span at (37:0,37 [1] ) (Accepts:None) - Parent: Markup block at (36:0,36 [2] )
  93396. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly28.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly28.stree.txt
  93397. index 4024d4f5202..f95363ee2e5 100644
  93398. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly28.stree.txt
  93399. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly28.stree.txt
  93400. @@ -1,24 +1,67 @@
  93401. -Markup block - Gen<None> - 65 - (0:0,0)
  93402. - Tag block - Gen<TagHelper> - 65 - (0:0,0) - div - divTagHelper - catchAllTagHelper
  93403. - StartTagAndEndTag - <div style="" class="btn" catchAll="@@hi" > ... </div>
  93404. - style - DoubleQuotes
  93405. - Markup block - Gen<None> - 0 - (0:0,0)
  93406. - class - DoubleQuotes
  93407. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:1
  93408. - SyntaxKind.Text;[btn];
  93409. - catchAll - DoubleQuotes
  93410. - Markup block - Gen<None> - 4 - (36:0,36)
  93411. - Markup block - Gen<None> - 2 - (36:0,36)
  93412. - Markup span - Gen<Markup> - [@] - SpanEditHandler;Accepts:None - (36:0,36) - Tokens:1
  93413. - SyntaxKind.Transition;[@];
  93414. - Markup span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (37:0,37) - Tokens:1
  93415. - SyntaxKind.Transition;[@];
  93416. - Markup span - Gen<Markup> - [hi] - SpanEditHandler;Accepts:Any - (38:0,38) - Tokens:1
  93417. - SyntaxKind.Text;[hi];
  93418. - SyntaxKind.HtmlTextLiteral - [words and spaces] - [43..59) - FullWidth: 16 - Slots: 1
  93419. - SyntaxKind.List - [words and spaces] - [43..59) - FullWidth: 16 - Slots: 5
  93420. - SyntaxKind.Text;[words];
  93421. - SyntaxKind.Whitespace;[ ];
  93422. - SyntaxKind.Text;[and];
  93423. - SyntaxKind.Whitespace;[ ];
  93424. - SyntaxKind.Text;[spaces];
  93425. +RazorDocument - [0..65)::65 - [<div style="" class="btn" catchAll="@@hi" >words and spaces</div>]
  93426. + MarkupBlock - [0..65)::65
  93427. + MarkupTagHelperElement - [0..65)::65 - div[StartTagAndEndTag] - divTagHelper - catchAllTagHelper
  93428. + MarkupTagHelperStartTag - [0..43)::43
  93429. + MarkupTextLiteral - [0..4)::4 - [<div] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93430. + OpenAngle;[<];
  93431. + Text;[div];
  93432. + MarkupTagHelperAttribute - [4..13)::9 - style - DoubleQuotes - Unbound - [ style=""]
  93433. + MarkupTextLiteral - [4..5)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93434. + Whitespace;[ ];
  93435. + MarkupTextLiteral - [5..10)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93436. + Text;[style];
  93437. + Equals;[=];
  93438. + MarkupTextLiteral - [11..12)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93439. + DoubleQuote;["];
  93440. + MarkupTagHelperAttributeValue - [12..12)::0
  93441. + MarkupTextLiteral - [12..12)::0 - []
  93442. + MarkupTextLiteral - [12..13)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93443. + DoubleQuote;["];
  93444. + MarkupTagHelperAttribute - [13..25)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  93445. + MarkupTextLiteral - [13..14)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93446. + Whitespace;[ ];
  93447. + MarkupTextLiteral - [14..19)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93448. + Text;[class];
  93449. + Equals;[=];
  93450. + MarkupTextLiteral - [20..21)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93451. + DoubleQuote;["];
  93452. + MarkupTagHelperAttributeValue - [21..24)::3
  93453. + MarkupLiteralAttributeValue - [21..24)::3 - [btn]
  93454. + MarkupTextLiteral - [21..24)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93455. + Text;[btn];
  93456. + MarkupTextLiteral - [24..25)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93457. + DoubleQuote;["];
  93458. + MarkupTagHelperAttribute - [25..41)::16 - catchAll - DoubleQuotes - Unbound - [ catchAll="@@hi"]
  93459. + MarkupTextLiteral - [25..26)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93460. + Whitespace;[ ];
  93461. + MarkupTextLiteral - [26..34)::8 - [catchAll] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93462. + Text;[catchAll];
  93463. + Equals;[=];
  93464. + MarkupTextLiteral - [35..36)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93465. + DoubleQuote;["];
  93466. + MarkupTagHelperAttributeValue - [36..40)::4
  93467. + MarkupBlock - [36..38)::2
  93468. + MarkupTextLiteral - [36..37)::1 - [@] - Gen<LitAttr:@(36:0,36)> - SpanEditHandler;Accepts:None
  93469. + Transition;[@];
  93470. + MarkupEphemeralTextLiteral - [37..38)::1 - [@] - Gen<None> - SpanEditHandler;Accepts:None
  93471. + Transition;[@];
  93472. + MarkupLiteralAttributeValue - [38..40)::2 - [hi]
  93473. + MarkupTextLiteral - [38..40)::2 - [hi] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93474. + Text;[hi];
  93475. + MarkupTextLiteral - [40..41)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93476. + DoubleQuote;["];
  93477. + MarkupTextLiteral - [41..43)::2 - [ >] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93478. + Whitespace;[ ];
  93479. + CloseAngle;[>];
  93480. + MarkupTextLiteral - [43..59)::16 - [words and spaces] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93481. + Text;[words];
  93482. + Whitespace;[ ];
  93483. + Text;[and];
  93484. + Whitespace;[ ];
  93485. + Text;[spaces];
  93486. + MarkupTagHelperEndTag - [59..65)::6
  93487. + MarkupTextLiteral - [59..65)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93488. + OpenAngle;[<];
  93489. + ForwardSlash;[/];
  93490. + Text;[div];
  93491. + CloseAngle;[>];
  93492. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly29.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly29.stree.txt
  93493. index ec88fd1922b..3fc4b0d728d 100644
  93494. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly29.stree.txt
  93495. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly29.stree.txt
  93496. @@ -1,40 +1,91 @@
  93497. -Markup block - Gen<None> - 97 - (0:0,0)
  93498. - Tag block - Gen<TagHelper> - 97 - (0:0,0) - div - divTagHelper - catchAllTagHelper
  93499. - StartTagAndEndTag - <div style="@DateTime.Now" class="@DateTime.Now" catchAll="@DateTime.Now" > ... </div>
  93500. - style - DoubleQuotes
  93501. - Markup block - Gen<None> - 13 - (12:0,12)
  93502. - Markup block - Gen<DynAttr:@(12:0,12)> - 13 - (12:0,12)
  93503. - Expression block - Gen<Expr> - 13 - (12:0,12)
  93504. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (12:0,12) - Tokens:1
  93505. - SyntaxKind.Transition;[@];
  93506. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (13:0,13) - Tokens:3
  93507. - SyntaxKind.Identifier;[DateTime];
  93508. - SyntaxKind.Dot;[.];
  93509. - SyntaxKind.Identifier;[Now];
  93510. - class - DoubleQuotes
  93511. - Markup block - Gen<None> - 13 - (34:0,34)
  93512. - Markup block - Gen<DynAttr:@(34:0,34)> - 13 - (34:0,34)
  93513. - Expression block - Gen<Expr> - 13 - (34:0,34)
  93514. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (34:0,34) - Tokens:1
  93515. - SyntaxKind.Transition;[@];
  93516. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (35:0,35) - Tokens:3
  93517. - SyntaxKind.Identifier;[DateTime];
  93518. - SyntaxKind.Dot;[.];
  93519. - SyntaxKind.Identifier;[Now];
  93520. - catchAll - DoubleQuotes
  93521. - Markup block - Gen<None> - 13 - (59:0,59)
  93522. - Markup block - Gen<DynAttr:@(59:0,59)> - 13 - (59:0,59)
  93523. - Expression block - Gen<Expr> - 13 - (59:0,59)
  93524. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (59:0,59) - Tokens:1
  93525. - SyntaxKind.Transition;[@];
  93526. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (60:0,60) - Tokens:3
  93527. - SyntaxKind.Identifier;[DateTime];
  93528. - SyntaxKind.Dot;[.];
  93529. - SyntaxKind.Identifier;[Now];
  93530. - SyntaxKind.HtmlTextLiteral - [words and spaces] - [75..91) - FullWidth: 16 - Slots: 1
  93531. - SyntaxKind.List - [words and spaces] - [75..91) - FullWidth: 16 - Slots: 5
  93532. - SyntaxKind.Text;[words];
  93533. - SyntaxKind.Whitespace;[ ];
  93534. - SyntaxKind.Text;[and];
  93535. - SyntaxKind.Whitespace;[ ];
  93536. - SyntaxKind.Text;[spaces];
  93537. +RazorDocument - [0..97)::97 - [<div style="@DateTime.Now" class="@DateTime.Now" catchAll="@DateTime.Now" >words and spaces</div>]
  93538. + MarkupBlock - [0..97)::97
  93539. + MarkupTagHelperElement - [0..97)::97 - div[StartTagAndEndTag] - divTagHelper - catchAllTagHelper
  93540. + MarkupTagHelperStartTag - [0..75)::75
  93541. + MarkupTextLiteral - [0..4)::4 - [<div] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93542. + OpenAngle;[<];
  93543. + Text;[div];
  93544. + MarkupTagHelperAttribute - [4..26)::22 - style - DoubleQuotes - Unbound - [ style="@DateTime.Now"]
  93545. + MarkupTextLiteral - [4..5)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93546. + Whitespace;[ ];
  93547. + MarkupTextLiteral - [5..10)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93548. + Text;[style];
  93549. + Equals;[=];
  93550. + MarkupTextLiteral - [11..12)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93551. + DoubleQuote;["];
  93552. + MarkupTagHelperAttributeValue - [12..25)::13
  93553. + MarkupDynamicAttributeValue - [12..25)::13 - [@DateTime.Now]
  93554. + GenericBlock - [12..25)::13
  93555. + CSharpCodeBlock - [12..25)::13
  93556. + CSharpImplicitExpression - [12..25)::13
  93557. + CSharpTransition - [12..13)::1 - Gen<None> - SpanEditHandler;Accepts:None
  93558. + Transition;[@];
  93559. + CSharpImplicitExpressionBody - [13..25)::12
  93560. + CSharpCodeBlock - [13..25)::12
  93561. + CSharpExpressionLiteral - [13..25)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  93562. + Identifier;[DateTime];
  93563. + Dot;[.];
  93564. + Identifier;[Now];
  93565. + MarkupTextLiteral - [25..26)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93566. + DoubleQuote;["];
  93567. + MarkupTagHelperAttribute - [26..48)::22 - class - DoubleQuotes - Unbound - [ class="@DateTime.Now"]
  93568. + MarkupTextLiteral - [26..27)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93569. + Whitespace;[ ];
  93570. + MarkupTextLiteral - [27..32)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93571. + Text;[class];
  93572. + Equals;[=];
  93573. + MarkupTextLiteral - [33..34)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93574. + DoubleQuote;["];
  93575. + MarkupTagHelperAttributeValue - [34..47)::13
  93576. + MarkupDynamicAttributeValue - [34..47)::13 - [@DateTime.Now]
  93577. + GenericBlock - [34..47)::13
  93578. + CSharpCodeBlock - [34..47)::13
  93579. + CSharpImplicitExpression - [34..47)::13
  93580. + CSharpTransition - [34..35)::1 - Gen<None> - SpanEditHandler;Accepts:None
  93581. + Transition;[@];
  93582. + CSharpImplicitExpressionBody - [35..47)::12
  93583. + CSharpCodeBlock - [35..47)::12
  93584. + CSharpExpressionLiteral - [35..47)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  93585. + Identifier;[DateTime];
  93586. + Dot;[.];
  93587. + Identifier;[Now];
  93588. + MarkupTextLiteral - [47..48)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93589. + DoubleQuote;["];
  93590. + MarkupTagHelperAttribute - [48..73)::25 - catchAll - DoubleQuotes - Unbound - [ catchAll="@DateTime.Now"]
  93591. + MarkupTextLiteral - [48..49)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93592. + Whitespace;[ ];
  93593. + MarkupTextLiteral - [49..57)::8 - [catchAll] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93594. + Text;[catchAll];
  93595. + Equals;[=];
  93596. + MarkupTextLiteral - [58..59)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93597. + DoubleQuote;["];
  93598. + MarkupTagHelperAttributeValue - [59..72)::13
  93599. + MarkupDynamicAttributeValue - [59..72)::13 - [@DateTime.Now]
  93600. + GenericBlock - [59..72)::13
  93601. + CSharpCodeBlock - [59..72)::13
  93602. + CSharpImplicitExpression - [59..72)::13
  93603. + CSharpTransition - [59..60)::1 - Gen<None> - SpanEditHandler;Accepts:None
  93604. + Transition;[@];
  93605. + CSharpImplicitExpressionBody - [60..72)::12
  93606. + CSharpCodeBlock - [60..72)::12
  93607. + CSharpExpressionLiteral - [60..72)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  93608. + Identifier;[DateTime];
  93609. + Dot;[.];
  93610. + Identifier;[Now];
  93611. + MarkupTextLiteral - [72..73)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93612. + DoubleQuote;["];
  93613. + MarkupTextLiteral - [73..75)::2 - [ >] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93614. + Whitespace;[ ];
  93615. + CloseAngle;[>];
  93616. + MarkupTextLiteral - [75..91)::16 - [words and spaces] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93617. + Text;[words];
  93618. + Whitespace;[ ];
  93619. + Text;[and];
  93620. + Whitespace;[ ];
  93621. + Text;[spaces];
  93622. + MarkupTagHelperEndTag - [91..97)::6
  93623. + MarkupTextLiteral - [91..97)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93624. + OpenAngle;[<];
  93625. + ForwardSlash;[/];
  93626. + Text;[div];
  93627. + CloseAngle;[>];
  93628. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly3.stree.txt
  93629. index 332bec95c94..5e2f2113a5b 100644
  93630. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly3.stree.txt
  93631. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly3.stree.txt
  93632. @@ -1,8 +1,9 @@
  93633. -Markup block - Gen<None> - 7 - (0:0,0)
  93634. - Tag block - Gen<None> - 7 - (0:0,0)
  93635. - Markup span - Gen<Markup> - [<div />] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:5
  93636. - SyntaxKind.OpenAngle;[<];
  93637. - SyntaxKind.Text;[div];
  93638. - SyntaxKind.Whitespace;[ ];
  93639. - SyntaxKind.ForwardSlash;[/];
  93640. - SyntaxKind.CloseAngle;[>];
  93641. +RazorDocument - [0..7)::7 - [<div />]
  93642. + MarkupBlock - [0..7)::7
  93643. + MarkupTagBlock - [0..7)::7 - [<div />]
  93644. + MarkupTextLiteral - [0..7)::7 - [<div />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93645. + OpenAngle;[<];
  93646. + Text;[div];
  93647. + Whitespace;[ ];
  93648. + ForwardSlash;[/];
  93649. + CloseAngle;[>];
  93650. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly30.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly30.cspans.txt
  93651. index 787c31a999f..9fec06bb528 100644
  93652. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly30.cspans.txt
  93653. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly30.cspans.txt
  93654. @@ -1,3 +1,4 @@
  93655. +Markup span at (12:0,12 [0] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [78] )
  93656. Markup span at (21:0,21 [3] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [78] )
  93657. Markup span at (36:0,36 [2] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [78] )
  93658. Markup span at (41:0,41 [5] ) (Accepts:Any) - Parent: Tag block at (0:0,0 [78] )
  93659. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly30.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly30.stree.txt
  93660. index 6f9d64f7e8a..a9866a52e85 100644
  93661. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly30.stree.txt
  93662. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly30.stree.txt
  93663. @@ -1,28 +1,73 @@
  93664. -Markup block - Gen<None> - 78 - (0:0,0)
  93665. - Tag block - Gen<TagHelper> - 78 - (0:0,0) - div - divTagHelper - catchAllTagHelper
  93666. - StartTagAndEndTag - <div style="" class="btn" catchAll="hi" > ... </div>
  93667. - style - DoubleQuotes
  93668. - Markup block - Gen<None> - 0 - (0:0,0)
  93669. - class - DoubleQuotes
  93670. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:1
  93671. - SyntaxKind.Text;[btn];
  93672. - catchAll - DoubleQuotes
  93673. - Markup span - Gen<Markup> - [hi] - SpanEditHandler;Accepts:Any - (36:0,36) - Tokens:1
  93674. - SyntaxKind.Text;[hi];
  93675. - SyntaxKind.HtmlTextLiteral - [words] - [41..46) - FullWidth: 5 - Slots: 1
  93676. - SyntaxKind.Text;[words];
  93677. - Tag block - Gen<None> - 8 - (46:0,46)
  93678. - Markup span - Gen<Markup> - [<strong>] - SpanEditHandler;Accepts:Any - (46:0,46) - Tokens:3
  93679. - SyntaxKind.OpenAngle;[<];
  93680. - SyntaxKind.Text;[strong];
  93681. - SyntaxKind.CloseAngle;[>];
  93682. - SyntaxKind.HtmlTextLiteral - [and] - [54..57) - FullWidth: 3 - Slots: 1
  93683. - SyntaxKind.Text;[and];
  93684. - Tag block - Gen<None> - 9 - (57:0,57)
  93685. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (57:0,57) - Tokens:4
  93686. - SyntaxKind.OpenAngle;[<];
  93687. - SyntaxKind.ForwardSlash;[/];
  93688. - SyntaxKind.Text;[strong];
  93689. - SyntaxKind.CloseAngle;[>];
  93690. - SyntaxKind.HtmlTextLiteral - [spaces] - [66..72) - FullWidth: 6 - Slots: 1
  93691. - SyntaxKind.Text;[spaces];
  93692. +RazorDocument - [0..78)::78 - [<div style="" class="btn" catchAll="hi" >words<strong>and</strong>spaces</div>]
  93693. + MarkupBlock - [0..78)::78
  93694. + MarkupTagHelperElement - [0..78)::78 - div[StartTagAndEndTag] - divTagHelper - catchAllTagHelper
  93695. + MarkupTagHelperStartTag - [0..41)::41
  93696. + MarkupTextLiteral - [0..4)::4 - [<div] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93697. + OpenAngle;[<];
  93698. + Text;[div];
  93699. + MarkupTagHelperAttribute - [4..13)::9 - style - DoubleQuotes - Unbound - [ style=""]
  93700. + MarkupTextLiteral - [4..5)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93701. + Whitespace;[ ];
  93702. + MarkupTextLiteral - [5..10)::5 - [style] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93703. + Text;[style];
  93704. + Equals;[=];
  93705. + MarkupTextLiteral - [11..12)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93706. + DoubleQuote;["];
  93707. + MarkupTagHelperAttributeValue - [12..12)::0
  93708. + MarkupTextLiteral - [12..12)::0 - []
  93709. + MarkupTextLiteral - [12..13)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93710. + DoubleQuote;["];
  93711. + MarkupTagHelperAttribute - [13..25)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  93712. + MarkupTextLiteral - [13..14)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93713. + Whitespace;[ ];
  93714. + MarkupTextLiteral - [14..19)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93715. + Text;[class];
  93716. + Equals;[=];
  93717. + MarkupTextLiteral - [20..21)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93718. + DoubleQuote;["];
  93719. + MarkupTagHelperAttributeValue - [21..24)::3
  93720. + MarkupLiteralAttributeValue - [21..24)::3 - [btn]
  93721. + MarkupTextLiteral - [21..24)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93722. + Text;[btn];
  93723. + MarkupTextLiteral - [24..25)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93724. + DoubleQuote;["];
  93725. + MarkupTagHelperAttribute - [25..39)::14 - catchAll - DoubleQuotes - Unbound - [ catchAll="hi"]
  93726. + MarkupTextLiteral - [25..26)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93727. + Whitespace;[ ];
  93728. + MarkupTextLiteral - [26..34)::8 - [catchAll] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93729. + Text;[catchAll];
  93730. + Equals;[=];
  93731. + MarkupTextLiteral - [35..36)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93732. + DoubleQuote;["];
  93733. + MarkupTagHelperAttributeValue - [36..38)::2
  93734. + MarkupLiteralAttributeValue - [36..38)::2 - [hi]
  93735. + MarkupTextLiteral - [36..38)::2 - [hi] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93736. + Text;[hi];
  93737. + MarkupTextLiteral - [38..39)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93738. + DoubleQuote;["];
  93739. + MarkupTextLiteral - [39..41)::2 - [ >] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93740. + Whitespace;[ ];
  93741. + CloseAngle;[>];
  93742. + MarkupTextLiteral - [41..46)::5 - [words] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93743. + Text;[words];
  93744. + MarkupTagBlock - [46..54)::8 - [<strong>]
  93745. + MarkupTextLiteral - [46..54)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93746. + OpenAngle;[<];
  93747. + Text;[strong];
  93748. + CloseAngle;[>];
  93749. + MarkupTextLiteral - [54..57)::3 - [and] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93750. + Text;[and];
  93751. + MarkupTagBlock - [57..66)::9 - [</strong>]
  93752. + MarkupTextLiteral - [57..66)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93753. + OpenAngle;[<];
  93754. + ForwardSlash;[/];
  93755. + Text;[strong];
  93756. + CloseAngle;[>];
  93757. + MarkupTextLiteral - [66..72)::6 - [spaces] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93758. + Text;[spaces];
  93759. + MarkupTagHelperEndTag - [72..78)::6
  93760. + MarkupTextLiteral - [72..78)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93761. + OpenAngle;[<];
  93762. + ForwardSlash;[/];
  93763. + Text;[div];
  93764. + CloseAngle;[>];
  93765. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly4.stree.txt
  93766. index d462f4ec3d5..ba660e300cb 100644
  93767. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly4.stree.txt
  93768. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly4.stree.txt
  93769. @@ -1,12 +1,13 @@
  93770. -Markup block - Gen<None> - 11 - (0:0,0)
  93771. - Tag block - Gen<None> - 5 - (0:0,0)
  93772. - Markup span - Gen<Markup> - [<div>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  93773. - SyntaxKind.OpenAngle;[<];
  93774. - SyntaxKind.Text;[div];
  93775. - SyntaxKind.CloseAngle;[>];
  93776. - Tag block - Gen<None> - 6 - (5:0,5)
  93777. - Markup span - Gen<Markup> - [</div>] - SpanEditHandler;Accepts:Any - (5:0,5) - Tokens:4
  93778. - SyntaxKind.OpenAngle;[<];
  93779. - SyntaxKind.ForwardSlash;[/];
  93780. - SyntaxKind.Text;[div];
  93781. - SyntaxKind.CloseAngle;[>];
  93782. +RazorDocument - [0..11)::11 - [<div></div>]
  93783. + MarkupBlock - [0..11)::11
  93784. + MarkupTagBlock - [0..5)::5 - [<div>]
  93785. + MarkupTextLiteral - [0..5)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93786. + OpenAngle;[<];
  93787. + Text;[div];
  93788. + CloseAngle;[>];
  93789. + MarkupTagBlock - [5..11)::6 - [</div>]
  93790. + MarkupTextLiteral - [5..11)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93791. + OpenAngle;[<];
  93792. + ForwardSlash;[/];
  93793. + Text;[div];
  93794. + CloseAngle;[>];
  93795. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly5.stree.txt
  93796. index bb270e35d40..a30484ca56a 100644
  93797. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly5.stree.txt
  93798. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly5.stree.txt
  93799. @@ -1,6 +1,25 @@
  93800. -Markup block - Gen<None> - 17 - (0:0,0)
  93801. - Tag block - Gen<TagHelper> - 17 - (0:0,0) - p - pTagHelper
  93802. - SelfClosing - <p class="btn" />
  93803. - class - DoubleQuotes
  93804. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  93805. - SyntaxKind.Text;[btn];
  93806. +RazorDocument - [0..17)::17 - [<p class="btn" />]
  93807. + MarkupBlock - [0..17)::17
  93808. + MarkupTagHelperElement - [0..17)::17 - p[SelfClosing] - pTagHelper
  93809. + MarkupTagHelperStartTag - [0..17)::17
  93810. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93811. + OpenAngle;[<];
  93812. + Text;[p];
  93813. + MarkupTagHelperAttribute - [2..14)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  93814. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93815. + Whitespace;[ ];
  93816. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93817. + Text;[class];
  93818. + Equals;[=];
  93819. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93820. + DoubleQuote;["];
  93821. + MarkupTagHelperAttributeValue - [10..13)::3
  93822. + MarkupLiteralAttributeValue - [10..13)::3 - [btn]
  93823. + MarkupTextLiteral - [10..13)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93824. + Text;[btn];
  93825. + MarkupTextLiteral - [13..14)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93826. + DoubleQuote;["];
  93827. + MarkupTextLiteral - [14..17)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93828. + Whitespace;[ ];
  93829. + ForwardSlash;[/];
  93830. + CloseAngle;[>];
  93831. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly6.stree.txt
  93832. index 8fc7518aa90..1aed039c431 100644
  93833. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly6.stree.txt
  93834. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly6.stree.txt
  93835. @@ -1,13 +1,34 @@
  93836. -Markup block - Gen<None> - 27 - (0:0,0)
  93837. - Tag block - Gen<TagHelper> - 27 - (0:0,0) - p - pTagHelper
  93838. - SelfClosing - <p class="@DateTime.Now" />
  93839. - class - DoubleQuotes
  93840. - Markup block - Gen<None> - 13 - (10:0,10)
  93841. - Markup block - Gen<DynAttr:@(10:0,10)> - 13 - (10:0,10)
  93842. - Expression block - Gen<Expr> - 13 - (10:0,10)
  93843. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  93844. - SyntaxKind.Transition;[@];
  93845. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (11:0,11) - Tokens:3
  93846. - SyntaxKind.Identifier;[DateTime];
  93847. - SyntaxKind.Dot;[.];
  93848. - SyntaxKind.Identifier;[Now];
  93849. +RazorDocument - [0..27)::27 - [<p class="@DateTime.Now" />]
  93850. + MarkupBlock - [0..27)::27
  93851. + MarkupTagHelperElement - [0..27)::27 - p[SelfClosing] - pTagHelper
  93852. + MarkupTagHelperStartTag - [0..27)::27
  93853. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93854. + OpenAngle;[<];
  93855. + Text;[p];
  93856. + MarkupTagHelperAttribute - [2..24)::22 - class - DoubleQuotes - Unbound - [ class="@DateTime.Now"]
  93857. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93858. + Whitespace;[ ];
  93859. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93860. + Text;[class];
  93861. + Equals;[=];
  93862. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93863. + DoubleQuote;["];
  93864. + MarkupTagHelperAttributeValue - [10..23)::13
  93865. + MarkupDynamicAttributeValue - [10..23)::13 - [@DateTime.Now]
  93866. + GenericBlock - [10..23)::13
  93867. + CSharpCodeBlock - [10..23)::13
  93868. + CSharpImplicitExpression - [10..23)::13
  93869. + CSharpTransition - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  93870. + Transition;[@];
  93871. + CSharpImplicitExpressionBody - [11..23)::12
  93872. + CSharpCodeBlock - [11..23)::12
  93873. + CSharpExpressionLiteral - [11..23)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  93874. + Identifier;[DateTime];
  93875. + Dot;[.];
  93876. + Identifier;[Now];
  93877. + MarkupTextLiteral - [23..24)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93878. + DoubleQuote;["];
  93879. + MarkupTextLiteral - [24..27)::3 - [ />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93880. + Whitespace;[ ];
  93881. + ForwardSlash;[/];
  93882. + CloseAngle;[>];
  93883. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly7.stree.txt
  93884. index cc6c2633101..ca02246abd8 100644
  93885. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly7.stree.txt
  93886. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly7.stree.txt
  93887. @@ -1,13 +1,35 @@
  93888. -Markup block - Gen<None> - 35 - (0:0,0)
  93889. - Tag block - Gen<TagHelper> - 35 - (0:0,0) - p - pTagHelper
  93890. - StartTagAndEndTag - <p class="btn"> ... </p>
  93891. - class - DoubleQuotes
  93892. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  93893. - SyntaxKind.Text;[btn];
  93894. - SyntaxKind.HtmlTextLiteral - [words and spaces] - [15..31) - FullWidth: 16 - Slots: 1
  93895. - SyntaxKind.List - [words and spaces] - [15..31) - FullWidth: 16 - Slots: 5
  93896. - SyntaxKind.Text;[words];
  93897. - SyntaxKind.Whitespace;[ ];
  93898. - SyntaxKind.Text;[and];
  93899. - SyntaxKind.Whitespace;[ ];
  93900. - SyntaxKind.Text;[spaces];
  93901. +RazorDocument - [0..35)::35 - [<p class="btn">words and spaces</p>]
  93902. + MarkupBlock - [0..35)::35
  93903. + MarkupTagHelperElement - [0..35)::35 - p[StartTagAndEndTag] - pTagHelper
  93904. + MarkupTagHelperStartTag - [0..15)::15
  93905. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93906. + OpenAngle;[<];
  93907. + Text;[p];
  93908. + MarkupTagHelperAttribute - [2..14)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  93909. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93910. + Whitespace;[ ];
  93911. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93912. + Text;[class];
  93913. + Equals;[=];
  93914. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93915. + DoubleQuote;["];
  93916. + MarkupTagHelperAttributeValue - [10..13)::3
  93917. + MarkupLiteralAttributeValue - [10..13)::3 - [btn]
  93918. + MarkupTextLiteral - [10..13)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93919. + Text;[btn];
  93920. + MarkupTextLiteral - [13..14)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93921. + DoubleQuote;["];
  93922. + MarkupTextLiteral - [14..15)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93923. + CloseAngle;[>];
  93924. + MarkupTextLiteral - [15..31)::16 - [words and spaces] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93925. + Text;[words];
  93926. + Whitespace;[ ];
  93927. + Text;[and];
  93928. + Whitespace;[ ];
  93929. + Text;[spaces];
  93930. + MarkupTagHelperEndTag - [31..35)::4
  93931. + MarkupTextLiteral - [31..35)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93932. + OpenAngle;[<];
  93933. + ForwardSlash;[/];
  93934. + Text;[p];
  93935. + CloseAngle;[>];
  93936. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly8.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly8.stree.txt
  93937. index 74a1a3c71a8..9f13f60e7dd 100644
  93938. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly8.stree.txt
  93939. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly8.stree.txt
  93940. @@ -1,20 +1,44 @@
  93941. -Markup block - Gen<None> - 45 - (0:0,0)
  93942. - Tag block - Gen<TagHelper> - 45 - (0:0,0) - p - pTagHelper
  93943. - StartTagAndEndTag - <p class="@DateTime.Now"> ... </p>
  93944. - class - DoubleQuotes
  93945. - Markup block - Gen<None> - 13 - (10:0,10)
  93946. - Markup block - Gen<DynAttr:@(10:0,10)> - 13 - (10:0,10)
  93947. - Expression block - Gen<Expr> - 13 - (10:0,10)
  93948. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (10:0,10) - Tokens:1
  93949. - SyntaxKind.Transition;[@];
  93950. - Code span - Gen<Expr> - [DateTime.Now] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (11:0,11) - Tokens:3
  93951. - SyntaxKind.Identifier;[DateTime];
  93952. - SyntaxKind.Dot;[.];
  93953. - SyntaxKind.Identifier;[Now];
  93954. - SyntaxKind.HtmlTextLiteral - [words and spaces] - [25..41) - FullWidth: 16 - Slots: 1
  93955. - SyntaxKind.List - [words and spaces] - [25..41) - FullWidth: 16 - Slots: 5
  93956. - SyntaxKind.Text;[words];
  93957. - SyntaxKind.Whitespace;[ ];
  93958. - SyntaxKind.Text;[and];
  93959. - SyntaxKind.Whitespace;[ ];
  93960. - SyntaxKind.Text;[spaces];
  93961. +RazorDocument - [0..45)::45 - [<p class="@DateTime.Now">words and spaces</p>]
  93962. + MarkupBlock - [0..45)::45
  93963. + MarkupTagHelperElement - [0..45)::45 - p[StartTagAndEndTag] - pTagHelper
  93964. + MarkupTagHelperStartTag - [0..25)::25
  93965. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93966. + OpenAngle;[<];
  93967. + Text;[p];
  93968. + MarkupTagHelperAttribute - [2..24)::22 - class - DoubleQuotes - Unbound - [ class="@DateTime.Now"]
  93969. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93970. + Whitespace;[ ];
  93971. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93972. + Text;[class];
  93973. + Equals;[=];
  93974. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93975. + DoubleQuote;["];
  93976. + MarkupTagHelperAttributeValue - [10..23)::13
  93977. + MarkupDynamicAttributeValue - [10..23)::13 - [@DateTime.Now]
  93978. + GenericBlock - [10..23)::13
  93979. + CSharpCodeBlock - [10..23)::13
  93980. + CSharpImplicitExpression - [10..23)::13
  93981. + CSharpTransition - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  93982. + Transition;[@];
  93983. + CSharpImplicitExpressionBody - [11..23)::12
  93984. + CSharpCodeBlock - [11..23)::12
  93985. + CSharpExpressionLiteral - [11..23)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  93986. + Identifier;[DateTime];
  93987. + Dot;[.];
  93988. + Identifier;[Now];
  93989. + MarkupTextLiteral - [23..24)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  93990. + DoubleQuote;["];
  93991. + MarkupTextLiteral - [24..25)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93992. + CloseAngle;[>];
  93993. + MarkupTextLiteral - [25..41)::16 - [words and spaces] - Gen<Markup> - SpanEditHandler;Accepts:Any
  93994. + Text;[words];
  93995. + Whitespace;[ ];
  93996. + Text;[and];
  93997. + Whitespace;[ ];
  93998. + Text;[spaces];
  93999. + MarkupTagHelperEndTag - [41..45)::4
  94000. + MarkupTextLiteral - [41..45)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94001. + OpenAngle;[<];
  94002. + ForwardSlash;[/];
  94003. + Text;[p];
  94004. + CloseAngle;[>];
  94005. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly9.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly9.stree.txt
  94006. index e6e6849632d..18da3d21139 100644
  94007. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly9.stree.txt
  94008. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RequiredAttributeDescriptorsCreateTagHelperBlocksCorrectly9.stree.txt
  94009. @@ -1,23 +1,46 @@
  94010. -Markup block - Gen<None> - 50 - (0:0,0)
  94011. - Tag block - Gen<TagHelper> - 50 - (0:0,0) - p - pTagHelper
  94012. - StartTagAndEndTag - <p class="btn"> ... </p>
  94013. - class - DoubleQuotes
  94014. - Markup span - Gen<Markup> - [btn] - SpanEditHandler;Accepts:Any - (10:0,10) - Tokens:1
  94015. - SyntaxKind.Text;[btn];
  94016. - SyntaxKind.HtmlTextLiteral - [words] - [15..20) - FullWidth: 5 - Slots: 1
  94017. - SyntaxKind.Text;[words];
  94018. - Tag block - Gen<None> - 8 - (20:0,20)
  94019. - Markup span - Gen<Markup> - [<strong>] - SpanEditHandler;Accepts:Any - (20:0,20) - Tokens:3
  94020. - SyntaxKind.OpenAngle;[<];
  94021. - SyntaxKind.Text;[strong];
  94022. - SyntaxKind.CloseAngle;[>];
  94023. - SyntaxKind.HtmlTextLiteral - [and] - [28..31) - FullWidth: 3 - Slots: 1
  94024. - SyntaxKind.Text;[and];
  94025. - Tag block - Gen<None> - 9 - (31:0,31)
  94026. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (31:0,31) - Tokens:4
  94027. - SyntaxKind.OpenAngle;[<];
  94028. - SyntaxKind.ForwardSlash;[/];
  94029. - SyntaxKind.Text;[strong];
  94030. - SyntaxKind.CloseAngle;[>];
  94031. - SyntaxKind.HtmlTextLiteral - [spaces] - [40..46) - FullWidth: 6 - Slots: 1
  94032. - SyntaxKind.Text;[spaces];
  94033. +RazorDocument - [0..50)::50 - [<p class="btn">words<strong>and</strong>spaces</p>]
  94034. + MarkupBlock - [0..50)::50
  94035. + MarkupTagHelperElement - [0..50)::50 - p[StartTagAndEndTag] - pTagHelper
  94036. + MarkupTagHelperStartTag - [0..15)::15
  94037. + MarkupTextLiteral - [0..2)::2 - [<p] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94038. + OpenAngle;[<];
  94039. + Text;[p];
  94040. + MarkupTagHelperAttribute - [2..14)::12 - class - DoubleQuotes - Unbound - [ class="btn"]
  94041. + MarkupTextLiteral - [2..3)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94042. + Whitespace;[ ];
  94043. + MarkupTextLiteral - [3..8)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94044. + Text;[class];
  94045. + Equals;[=];
  94046. + MarkupTextLiteral - [9..10)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  94047. + DoubleQuote;["];
  94048. + MarkupTagHelperAttributeValue - [10..13)::3
  94049. + MarkupLiteralAttributeValue - [10..13)::3 - [btn]
  94050. + MarkupTextLiteral - [10..13)::3 - [btn] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94051. + Text;[btn];
  94052. + MarkupTextLiteral - [13..14)::1 - ["] - Gen<None> - SpanEditHandler;Accepts:Any
  94053. + DoubleQuote;["];
  94054. + MarkupTextLiteral - [14..15)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94055. + CloseAngle;[>];
  94056. + MarkupTextLiteral - [15..20)::5 - [words] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94057. + Text;[words];
  94058. + MarkupTagBlock - [20..28)::8 - [<strong>]
  94059. + MarkupTextLiteral - [20..28)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94060. + OpenAngle;[<];
  94061. + Text;[strong];
  94062. + CloseAngle;[>];
  94063. + MarkupTextLiteral - [28..31)::3 - [and] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94064. + Text;[and];
  94065. + MarkupTagBlock - [31..40)::9 - [</strong>]
  94066. + MarkupTextLiteral - [31..40)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94067. + OpenAngle;[<];
  94068. + ForwardSlash;[/];
  94069. + Text;[strong];
  94070. + CloseAngle;[>];
  94071. + MarkupTextLiteral - [40..46)::6 - [spaces] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94072. + Text;[spaces];
  94073. + MarkupTagHelperEndTag - [46..50)::4
  94074. + MarkupTextLiteral - [46..50)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94075. + OpenAngle;[<];
  94076. + ForwardSlash;[/];
  94077. + Text;[p];
  94078. + CloseAngle;[>];
  94079. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RewritesNestedTagHelperTagBlocks1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RewritesNestedTagHelperTagBlocks1.stree.txt
  94080. index 7eba221fee1..c636cb3ea85 100644
  94081. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RewritesNestedTagHelperTagBlocks1.stree.txt
  94082. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RewritesNestedTagHelperTagBlocks1.stree.txt
  94083. @@ -1,5 +1,26 @@
  94084. -Markup block - Gen<None> - 18 - (0:0,0)
  94085. - Tag block - Gen<TagHelper> - 18 - (0:0,0) - p - ptaghelper
  94086. - StartTagAndEndTag - <p> ... </p>
  94087. - Tag block - Gen<TagHelper> - 11 - (3:0,3) - div - divtaghelper
  94088. - StartTagAndEndTag - <div> ... </div>
  94089. +RazorDocument - [0..18)::18 - [<p><div></div></p>]
  94090. + MarkupBlock - [0..18)::18
  94091. + MarkupTagHelperElement - [0..18)::18 - p[StartTagAndEndTag] - ptaghelper
  94092. + MarkupTagHelperStartTag - [0..3)::3
  94093. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94094. + OpenAngle;[<];
  94095. + Text;[p];
  94096. + CloseAngle;[>];
  94097. + MarkupTagHelperElement - [3..14)::11 - div[StartTagAndEndTag] - divtaghelper
  94098. + MarkupTagHelperStartTag - [3..8)::5
  94099. + MarkupTextLiteral - [3..8)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94100. + OpenAngle;[<];
  94101. + Text;[div];
  94102. + CloseAngle;[>];
  94103. + MarkupTagHelperEndTag - [8..14)::6
  94104. + MarkupTextLiteral - [8..14)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94105. + OpenAngle;[<];
  94106. + ForwardSlash;[/];
  94107. + Text;[div];
  94108. + CloseAngle;[>];
  94109. + MarkupTagHelperEndTag - [14..18)::4
  94110. + MarkupTextLiteral - [14..18)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94111. + OpenAngle;[<];
  94112. + ForwardSlash;[/];
  94113. + Text;[p];
  94114. + CloseAngle;[>];
  94115. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RewritesNestedTagHelperTagBlocks2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RewritesNestedTagHelperTagBlocks2.stree.txt
  94116. index c8f3670c6ff..ec545b9d15b 100644
  94117. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RewritesNestedTagHelperTagBlocks2.stree.txt
  94118. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RewritesNestedTagHelperTagBlocks2.stree.txt
  94119. @@ -1,11 +1,31 @@
  94120. -Markup block - Gen<None> - 30 - (0:0,0)
  94121. - Tag block - Gen<TagHelper> - 30 - (0:0,0) - p - ptaghelper
  94122. - StartTagAndEndTag - <p> ... </p>
  94123. - SyntaxKind.HtmlTextLiteral - [Hello World ] - [3..15) - FullWidth: 12 - Slots: 1
  94124. - SyntaxKind.List - [Hello World ] - [3..15) - FullWidth: 12 - Slots: 4
  94125. - SyntaxKind.Text;[Hello];
  94126. - SyntaxKind.Whitespace;[ ];
  94127. - SyntaxKind.Text;[World];
  94128. - SyntaxKind.Whitespace;[ ];
  94129. - Tag block - Gen<TagHelper> - 11 - (15:0,15) - div - divtaghelper
  94130. - StartTagAndEndTag - <div> ... </div>
  94131. +RazorDocument - [0..30)::30 - [<p>Hello World <div></div></p>]
  94132. + MarkupBlock - [0..30)::30
  94133. + MarkupTagHelperElement - [0..30)::30 - p[StartTagAndEndTag] - ptaghelper
  94134. + MarkupTagHelperStartTag - [0..3)::3
  94135. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94136. + OpenAngle;[<];
  94137. + Text;[p];
  94138. + CloseAngle;[>];
  94139. + MarkupTextLiteral - [3..15)::12 - [Hello World ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94140. + Text;[Hello];
  94141. + Whitespace;[ ];
  94142. + Text;[World];
  94143. + Whitespace;[ ];
  94144. + MarkupTagHelperElement - [15..26)::11 - div[StartTagAndEndTag] - divtaghelper
  94145. + MarkupTagHelperStartTag - [15..20)::5
  94146. + MarkupTextLiteral - [15..20)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94147. + OpenAngle;[<];
  94148. + Text;[div];
  94149. + CloseAngle;[>];
  94150. + MarkupTagHelperEndTag - [20..26)::6
  94151. + MarkupTextLiteral - [20..26)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94152. + OpenAngle;[<];
  94153. + ForwardSlash;[/];
  94154. + Text;[div];
  94155. + CloseAngle;[>];
  94156. + MarkupTagHelperEndTag - [26..30)::4
  94157. + MarkupTextLiteral - [26..30)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94158. + OpenAngle;[<];
  94159. + ForwardSlash;[/];
  94160. + Text;[p];
  94161. + CloseAngle;[>];
  94162. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RewritesNestedTagHelperTagBlocks3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RewritesNestedTagHelperTagBlocks3.stree.txt
  94163. index 5fa917d8d87..d07da514b8d 100644
  94164. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RewritesNestedTagHelperTagBlocks3.stree.txt
  94165. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RewritesNestedTagHelperTagBlocks3.stree.txt
  94166. @@ -1,17 +1,58 @@
  94167. -Markup block - Gen<None> - 43 - (0:0,0)
  94168. - Tag block - Gen<TagHelper> - 19 - (0:0,0) - p - ptaghelper
  94169. - StartTagAndEndTag - <p> ... </p>
  94170. - SyntaxKind.HtmlTextLiteral - [Hel] - [3..6) - FullWidth: 3 - Slots: 1
  94171. - SyntaxKind.Text;[Hel];
  94172. - Tag block - Gen<TagHelper> - 9 - (6:0,6) - p - ptaghelper
  94173. - StartTagAndEndTag - <p> ... </p>
  94174. - SyntaxKind.HtmlTextLiteral - [lo] - [9..11) - FullWidth: 2 - Slots: 1
  94175. - SyntaxKind.Text;[lo];
  94176. - SyntaxKind.HtmlTextLiteral - [ ] - [19..20) - FullWidth: 1 - Slots: 1
  94177. - SyntaxKind.Whitespace;[ ];
  94178. - Tag block - Gen<TagHelper> - 23 - (20:0,20) - p - ptaghelper
  94179. - StartTagAndEndTag - <p> ... </p>
  94180. - Tag block - Gen<TagHelper> - 16 - (23:0,23) - div - divtaghelper
  94181. - StartTagAndEndTag - <div> ... </div>
  94182. - SyntaxKind.HtmlTextLiteral - [World] - [28..33) - FullWidth: 5 - Slots: 1
  94183. - SyntaxKind.Text;[World];
  94184. +RazorDocument - [0..43)::43 - [<p>Hel<p>lo</p></p> <p><div>World</div></p>]
  94185. + MarkupBlock - [0..43)::43
  94186. + MarkupTagHelperElement - [0..19)::19 - p[StartTagAndEndTag] - ptaghelper
  94187. + MarkupTagHelperStartTag - [0..3)::3
  94188. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94189. + OpenAngle;[<];
  94190. + Text;[p];
  94191. + CloseAngle;[>];
  94192. + MarkupTextLiteral - [3..6)::3 - [Hel] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94193. + Text;[Hel];
  94194. + MarkupTagHelperElement - [6..15)::9 - p[StartTagAndEndTag] - ptaghelper
  94195. + MarkupTagHelperStartTag - [6..9)::3
  94196. + MarkupTextLiteral - [6..9)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94197. + OpenAngle;[<];
  94198. + Text;[p];
  94199. + CloseAngle;[>];
  94200. + MarkupTextLiteral - [9..11)::2 - [lo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94201. + Text;[lo];
  94202. + MarkupTagHelperEndTag - [11..15)::4
  94203. + MarkupTextLiteral - [11..15)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94204. + OpenAngle;[<];
  94205. + ForwardSlash;[/];
  94206. + Text;[p];
  94207. + CloseAngle;[>];
  94208. + MarkupTagHelperEndTag - [15..19)::4
  94209. + MarkupTextLiteral - [15..19)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94210. + OpenAngle;[<];
  94211. + ForwardSlash;[/];
  94212. + Text;[p];
  94213. + CloseAngle;[>];
  94214. + MarkupTextLiteral - [19..20)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94215. + Whitespace;[ ];
  94216. + MarkupTagHelperElement - [20..43)::23 - p[StartTagAndEndTag] - ptaghelper
  94217. + MarkupTagHelperStartTag - [20..23)::3
  94218. + MarkupTextLiteral - [20..23)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94219. + OpenAngle;[<];
  94220. + Text;[p];
  94221. + CloseAngle;[>];
  94222. + MarkupTagHelperElement - [23..39)::16 - div[StartTagAndEndTag] - divtaghelper
  94223. + MarkupTagHelperStartTag - [23..28)::5
  94224. + MarkupTextLiteral - [23..28)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94225. + OpenAngle;[<];
  94226. + Text;[div];
  94227. + CloseAngle;[>];
  94228. + MarkupTextLiteral - [28..33)::5 - [World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94229. + Text;[World];
  94230. + MarkupTagHelperEndTag - [33..39)::6
  94231. + MarkupTextLiteral - [33..39)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94232. + OpenAngle;[<];
  94233. + ForwardSlash;[/];
  94234. + Text;[div];
  94235. + CloseAngle;[>];
  94236. + MarkupTagHelperEndTag - [39..43)::4
  94237. + MarkupTextLiteral - [39..43)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94238. + OpenAngle;[<];
  94239. + ForwardSlash;[/];
  94240. + Text;[p];
  94241. + CloseAngle;[>];
  94242. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RewritesNestedTagHelperTagBlocks4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RewritesNestedTagHelperTagBlocks4.stree.txt
  94243. index c938c867303..4a0b88b6b7e 100644
  94244. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RewritesNestedTagHelperTagBlocks4.stree.txt
  94245. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/RewritesNestedTagHelperTagBlocks4.stree.txt
  94246. @@ -1,35 +1,56 @@
  94247. -Markup block - Gen<None> - 55 - (0:0,0)
  94248. - Tag block - Gen<TagHelper> - 29 - (0:0,0) - p - ptaghelper
  94249. - StartTagAndEndTag - <p> ... </p>
  94250. - SyntaxKind.HtmlTextLiteral - [Hel] - [3..6) - FullWidth: 3 - Slots: 1
  94251. - SyntaxKind.Text;[Hel];
  94252. - Tag block - Gen<None> - 8 - (6:0,6)
  94253. - Markup span - Gen<Markup> - [<strong>] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:3
  94254. - SyntaxKind.OpenAngle;[<];
  94255. - SyntaxKind.Text;[strong];
  94256. - SyntaxKind.CloseAngle;[>];
  94257. - SyntaxKind.HtmlTextLiteral - [lo] - [14..16) - FullWidth: 2 - Slots: 1
  94258. - SyntaxKind.Text;[lo];
  94259. - Tag block - Gen<None> - 9 - (16:0,16)
  94260. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:4
  94261. - SyntaxKind.OpenAngle;[<];
  94262. - SyntaxKind.ForwardSlash;[/];
  94263. - SyntaxKind.Text;[strong];
  94264. - SyntaxKind.CloseAngle;[>];
  94265. - SyntaxKind.HtmlTextLiteral - [ ] - [29..30) - FullWidth: 1 - Slots: 1
  94266. - SyntaxKind.Whitespace;[ ];
  94267. - Tag block - Gen<TagHelper> - 25 - (30:0,30) - p - ptaghelper
  94268. - StartTagAndEndTag - <p> ... </p>
  94269. - Tag block - Gen<None> - 6 - (33:0,33)
  94270. - Markup span - Gen<Markup> - [<span>] - SpanEditHandler;Accepts:Any - (33:0,33) - Tokens:3
  94271. - SyntaxKind.OpenAngle;[<];
  94272. - SyntaxKind.Text;[span];
  94273. - SyntaxKind.CloseAngle;[>];
  94274. - SyntaxKind.HtmlTextLiteral - [World] - [39..44) - FullWidth: 5 - Slots: 1
  94275. - SyntaxKind.Text;[World];
  94276. - Tag block - Gen<None> - 7 - (44:0,44)
  94277. - Markup span - Gen<Markup> - [</span>] - SpanEditHandler;Accepts:Any - (44:0,44) - Tokens:4
  94278. - SyntaxKind.OpenAngle;[<];
  94279. - SyntaxKind.ForwardSlash;[/];
  94280. - SyntaxKind.Text;[span];
  94281. - SyntaxKind.CloseAngle;[>];
  94282. +RazorDocument - [0..55)::55 - [<p>Hel<strong>lo</strong></p> <p><span>World</span></p>]
  94283. + MarkupBlock - [0..55)::55
  94284. + MarkupTagHelperElement - [0..29)::29 - p[StartTagAndEndTag] - ptaghelper
  94285. + MarkupTagHelperStartTag - [0..3)::3
  94286. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94287. + OpenAngle;[<];
  94288. + Text;[p];
  94289. + CloseAngle;[>];
  94290. + MarkupTextLiteral - [3..6)::3 - [Hel] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94291. + Text;[Hel];
  94292. + MarkupTagBlock - [6..14)::8 - [<strong>]
  94293. + MarkupTextLiteral - [6..14)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94294. + OpenAngle;[<];
  94295. + Text;[strong];
  94296. + CloseAngle;[>];
  94297. + MarkupTextLiteral - [14..16)::2 - [lo] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94298. + Text;[lo];
  94299. + MarkupTagBlock - [16..25)::9 - [</strong>]
  94300. + MarkupTextLiteral - [16..25)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94301. + OpenAngle;[<];
  94302. + ForwardSlash;[/];
  94303. + Text;[strong];
  94304. + CloseAngle;[>];
  94305. + MarkupTagHelperEndTag - [25..29)::4
  94306. + MarkupTextLiteral - [25..29)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94307. + OpenAngle;[<];
  94308. + ForwardSlash;[/];
  94309. + Text;[p];
  94310. + CloseAngle;[>];
  94311. + MarkupTextLiteral - [29..30)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94312. + Whitespace;[ ];
  94313. + MarkupTagHelperElement - [30..55)::25 - p[StartTagAndEndTag] - ptaghelper
  94314. + MarkupTagHelperStartTag - [30..33)::3
  94315. + MarkupTextLiteral - [30..33)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94316. + OpenAngle;[<];
  94317. + Text;[p];
  94318. + CloseAngle;[>];
  94319. + MarkupTagBlock - [33..39)::6 - [<span>]
  94320. + MarkupTextLiteral - [33..39)::6 - [<span>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94321. + OpenAngle;[<];
  94322. + Text;[span];
  94323. + CloseAngle;[>];
  94324. + MarkupTextLiteral - [39..44)::5 - [World] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94325. + Text;[World];
  94326. + MarkupTagBlock - [44..51)::7 - [</span>]
  94327. + MarkupTextLiteral - [44..51)::7 - [</span>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94328. + OpenAngle;[<];
  94329. + ForwardSlash;[/];
  94330. + Text;[span];
  94331. + CloseAngle;[>];
  94332. + MarkupTagHelperEndTag - [51..55)::4
  94333. + MarkupTextLiteral - [51..55)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94334. + OpenAngle;[<];
  94335. + ForwardSlash;[/];
  94336. + Text;[p];
  94337. + CloseAngle;[>];
  94338. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren1.stree.txt
  94339. index e29f5606fd1..8bb9014098d 100644
  94340. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren1.stree.txt
  94341. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren1.stree.txt
  94342. @@ -1,5 +1,22 @@
  94343. -Markup block - Gen<None> - 13 - (0:0,0)
  94344. - Tag block - Gen<TagHelper> - 13 - (0:0,0) - p - PTagHelper
  94345. - StartTagAndEndTag - <p> ... </p>
  94346. - Tag block - Gen<TagHelper> - 6 - (3:0,3) - br - BRTagHelper
  94347. - SelfClosing - <br />
  94348. +RazorDocument - [0..13)::13 - [<p><br /></p>]
  94349. + MarkupBlock - [0..13)::13
  94350. + MarkupTagHelperElement - [0..13)::13 - p[StartTagAndEndTag] - PTagHelper
  94351. + MarkupTagHelperStartTag - [0..3)::3
  94352. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94353. + OpenAngle;[<];
  94354. + Text;[p];
  94355. + CloseAngle;[>];
  94356. + MarkupTagHelperElement - [3..9)::6 - br[SelfClosing] - BRTagHelper
  94357. + MarkupTagHelperStartTag - [3..9)::6
  94358. + MarkupTextLiteral - [3..9)::6 - [<br />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94359. + OpenAngle;[<];
  94360. + Text;[br];
  94361. + Whitespace;[ ];
  94362. + ForwardSlash;[/];
  94363. + CloseAngle;[>];
  94364. + MarkupTagHelperEndTag - [9..13)::4
  94365. + MarkupTextLiteral - [9..13)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94366. + OpenAngle;[<];
  94367. + ForwardSlash;[/];
  94368. + Text;[p];
  94369. + CloseAngle;[>];
  94370. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren10.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren10.stree.txt
  94371. index 8df0379937e..84b878746d2 100644
  94372. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren10.stree.txt
  94373. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren10.stree.txt
  94374. @@ -1,31 +1,61 @@
  94375. -Markup block - Gen<None> - 69 - (0:0,0)
  94376. - Tag block - Gen<TagHelper> - 69 - (0:0,0) - p - PTagHelper
  94377. - StartTagAndEndTag - <p> ... </p>
  94378. - Tag block - Gen<TagHelper> - 47 - (3:0,3) - strong - StrongTagHelper
  94379. - StartTagAndEndTag - <strong> ... </strong>
  94380. - SyntaxKind.HtmlTextLiteral - [Title:] - [11..17) - FullWidth: 6 - Slots: 1
  94381. - SyntaxKind.Text;[Title:];
  94382. - Tag block - Gen<TagHelper> - 4 - (17:0,17) - br - BRTagHelper
  94383. - StartTagOnly - <br>
  94384. - Tag block - Gen<None> - 4 - (21:0,21)
  94385. - Markup span - Gen<Markup> - [<em>] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:3
  94386. - SyntaxKind.OpenAngle;[<];
  94387. - SyntaxKind.Text;[em];
  94388. - SyntaxKind.CloseAngle;[>];
  94389. - SyntaxKind.HtmlTextLiteral - [A Very Cool] - [25..36) - FullWidth: 11 - Slots: 1
  94390. - SyntaxKind.List - [A Very Cool] - [25..36) - FullWidth: 11 - Slots: 5
  94391. - SyntaxKind.Text;[A];
  94392. - SyntaxKind.Whitespace;[ ];
  94393. - SyntaxKind.Text;[Very];
  94394. - SyntaxKind.Whitespace;[ ];
  94395. - SyntaxKind.Text;[Cool];
  94396. - Tag block - Gen<None> - 5 - (36:0,36)
  94397. - Markup span - Gen<Markup> - [</em>] - SpanEditHandler;Accepts:Any - (36:0,36) - Tokens:4
  94398. - SyntaxKind.OpenAngle;[<];
  94399. - SyntaxKind.ForwardSlash;[/];
  94400. - SyntaxKind.Text;[em];
  94401. - SyntaxKind.CloseAngle;[>];
  94402. - Tag block - Gen<TagHelper> - 6 - (50:0,50) - br - BRTagHelper
  94403. - SelfClosing - <br />
  94404. - SyntaxKind.HtmlTextLiteral - [Something] - [56..65) - FullWidth: 9 - Slots: 1
  94405. - SyntaxKind.Text;[Something];
  94406. +RazorDocument - [0..69)::69 - [<p><strong>Title:<br><em>A Very Cool</em></strong><br />Something</p>]
  94407. + MarkupBlock - [0..69)::69
  94408. + MarkupTagHelperElement - [0..69)::69 - p[StartTagAndEndTag] - PTagHelper
  94409. + MarkupTagHelperStartTag - [0..3)::3
  94410. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94411. + OpenAngle;[<];
  94412. + Text;[p];
  94413. + CloseAngle;[>];
  94414. + MarkupTagHelperElement - [3..50)::47 - strong[StartTagAndEndTag] - StrongTagHelper
  94415. + MarkupTagHelperStartTag - [3..11)::8
  94416. + MarkupTextLiteral - [3..11)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94417. + OpenAngle;[<];
  94418. + Text;[strong];
  94419. + CloseAngle;[>];
  94420. + MarkupTextLiteral - [11..17)::6 - [Title:] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94421. + Text;[Title:];
  94422. + MarkupTagHelperElement - [17..21)::4 - br[StartTagOnly] - BRTagHelper
  94423. + MarkupTagHelperStartTag - [17..21)::4
  94424. + MarkupTextLiteral - [17..21)::4 - [<br>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94425. + OpenAngle;[<];
  94426. + Text;[br];
  94427. + CloseAngle;[>];
  94428. + MarkupTagBlock - [21..25)::4 - [<em>]
  94429. + MarkupTextLiteral - [21..25)::4 - [<em>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94430. + OpenAngle;[<];
  94431. + Text;[em];
  94432. + CloseAngle;[>];
  94433. + MarkupTextLiteral - [25..36)::11 - [A Very Cool] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94434. + Text;[A];
  94435. + Whitespace;[ ];
  94436. + Text;[Very];
  94437. + Whitespace;[ ];
  94438. + Text;[Cool];
  94439. + MarkupTagBlock - [36..41)::5 - [</em>]
  94440. + MarkupTextLiteral - [36..41)::5 - [</em>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94441. + OpenAngle;[<];
  94442. + ForwardSlash;[/];
  94443. + Text;[em];
  94444. + CloseAngle;[>];
  94445. + MarkupTagHelperEndTag - [41..50)::9
  94446. + MarkupTextLiteral - [41..50)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94447. + OpenAngle;[<];
  94448. + ForwardSlash;[/];
  94449. + Text;[strong];
  94450. + CloseAngle;[>];
  94451. + MarkupTagHelperElement - [50..56)::6 - br[SelfClosing] - BRTagHelper
  94452. + MarkupTagHelperStartTag - [50..56)::6
  94453. + MarkupTextLiteral - [50..56)::6 - [<br />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94454. + OpenAngle;[<];
  94455. + Text;[br];
  94456. + Whitespace;[ ];
  94457. + ForwardSlash;[/];
  94458. + CloseAngle;[>];
  94459. + MarkupTextLiteral - [56..65)::9 - [Something] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94460. + Text;[Something];
  94461. + MarkupTagHelperEndTag - [65..69)::4
  94462. + MarkupTextLiteral - [65..69)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94463. + OpenAngle;[<];
  94464. + ForwardSlash;[/];
  94465. + Text;[p];
  94466. + CloseAngle;[>];
  94467. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren11.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren11.stree.txt
  94468. index e4506e29618..68b47c8c9b3 100644
  94469. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren11.stree.txt
  94470. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren11.stree.txt
  94471. @@ -1,40 +1,60 @@
  94472. -Markup block - Gen<None> - 69 - (0:0,0)
  94473. - Tag block - Gen<TagHelper> - 69 - (0:0,0) - p - PTagHelper
  94474. - StartTagAndEndTag - <p> ... </p>
  94475. - Tag block - Gen<None> - 8 - (3:0,3)
  94476. - Markup span - Gen<Markup> - [<custom>] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:3
  94477. - SyntaxKind.OpenAngle;[<];
  94478. - SyntaxKind.Text;[custom];
  94479. - SyntaxKind.CloseAngle;[>];
  94480. - SyntaxKind.HtmlTextLiteral - [Title:] - [11..17) - FullWidth: 6 - Slots: 1
  94481. - SyntaxKind.Text;[Title:];
  94482. - Tag block - Gen<TagHelper> - 4 - (17:0,17) - br - BRTagHelper
  94483. - StartTagOnly - <br>
  94484. - Tag block - Gen<None> - 4 - (21:0,21)
  94485. - Markup span - Gen<Markup> - [<em>] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:3
  94486. - SyntaxKind.OpenAngle;[<];
  94487. - SyntaxKind.Text;[em];
  94488. - SyntaxKind.CloseAngle;[>];
  94489. - SyntaxKind.HtmlTextLiteral - [A Very Cool] - [25..36) - FullWidth: 11 - Slots: 1
  94490. - SyntaxKind.List - [A Very Cool] - [25..36) - FullWidth: 11 - Slots: 5
  94491. - SyntaxKind.Text;[A];
  94492. - SyntaxKind.Whitespace;[ ];
  94493. - SyntaxKind.Text;[Very];
  94494. - SyntaxKind.Whitespace;[ ];
  94495. - SyntaxKind.Text;[Cool];
  94496. - Tag block - Gen<None> - 5 - (36:0,36)
  94497. - Markup span - Gen<Markup> - [</em>] - SpanEditHandler;Accepts:Any - (36:0,36) - Tokens:4
  94498. - SyntaxKind.OpenAngle;[<];
  94499. - SyntaxKind.ForwardSlash;[/];
  94500. - SyntaxKind.Text;[em];
  94501. - SyntaxKind.CloseAngle;[>];
  94502. - Tag block - Gen<None> - 9 - (41:0,41)
  94503. - Markup span - Gen<Markup> - [</custom>] - SpanEditHandler;Accepts:Any - (41:0,41) - Tokens:4
  94504. - SyntaxKind.OpenAngle;[<];
  94505. - SyntaxKind.ForwardSlash;[/];
  94506. - SyntaxKind.Text;[custom];
  94507. - SyntaxKind.CloseAngle;[>];
  94508. - Tag block - Gen<TagHelper> - 6 - (50:0,50) - br - BRTagHelper
  94509. - SelfClosing - <br />
  94510. - SyntaxKind.HtmlTextLiteral - [Something] - [56..65) - FullWidth: 9 - Slots: 1
  94511. - SyntaxKind.Text;[Something];
  94512. +RazorDocument - [0..69)::69 - [<p><custom>Title:<br><em>A Very Cool</em></custom><br />Something</p>]
  94513. + MarkupBlock - [0..69)::69
  94514. + MarkupTagHelperElement - [0..69)::69 - p[StartTagAndEndTag] - PTagHelper
  94515. + MarkupTagHelperStartTag - [0..3)::3
  94516. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94517. + OpenAngle;[<];
  94518. + Text;[p];
  94519. + CloseAngle;[>];
  94520. + MarkupTagBlock - [3..11)::8 - [<custom>]
  94521. + MarkupTextLiteral - [3..11)::8 - [<custom>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94522. + OpenAngle;[<];
  94523. + Text;[custom];
  94524. + CloseAngle;[>];
  94525. + MarkupTextLiteral - [11..17)::6 - [Title:] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94526. + Text;[Title:];
  94527. + MarkupTagHelperElement - [17..21)::4 - br[StartTagOnly] - BRTagHelper
  94528. + MarkupTagHelperStartTag - [17..21)::4
  94529. + MarkupTextLiteral - [17..21)::4 - [<br>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94530. + OpenAngle;[<];
  94531. + Text;[br];
  94532. + CloseAngle;[>];
  94533. + MarkupTagBlock - [21..25)::4 - [<em>]
  94534. + MarkupTextLiteral - [21..25)::4 - [<em>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94535. + OpenAngle;[<];
  94536. + Text;[em];
  94537. + CloseAngle;[>];
  94538. + MarkupTextLiteral - [25..36)::11 - [A Very Cool] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94539. + Text;[A];
  94540. + Whitespace;[ ];
  94541. + Text;[Very];
  94542. + Whitespace;[ ];
  94543. + Text;[Cool];
  94544. + MarkupTagBlock - [36..41)::5 - [</em>]
  94545. + MarkupTextLiteral - [36..41)::5 - [</em>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94546. + OpenAngle;[<];
  94547. + ForwardSlash;[/];
  94548. + Text;[em];
  94549. + CloseAngle;[>];
  94550. + MarkupTagBlock - [41..50)::9 - [</custom>]
  94551. + MarkupTextLiteral - [41..50)::9 - [</custom>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94552. + OpenAngle;[<];
  94553. + ForwardSlash;[/];
  94554. + Text;[custom];
  94555. + CloseAngle;[>];
  94556. + MarkupTagHelperElement - [50..56)::6 - br[SelfClosing] - BRTagHelper
  94557. + MarkupTagHelperStartTag - [50..56)::6
  94558. + MarkupTextLiteral - [50..56)::6 - [<br />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94559. + OpenAngle;[<];
  94560. + Text;[br];
  94561. + Whitespace;[ ];
  94562. + ForwardSlash;[/];
  94563. + CloseAngle;[>];
  94564. + MarkupTextLiteral - [56..65)::9 - [Something] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94565. + Text;[Something];
  94566. + MarkupTagHelperEndTag - [65..69)::4
  94567. + MarkupTextLiteral - [65..69)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94568. + OpenAngle;[<];
  94569. + ForwardSlash;[/];
  94570. + Text;[p];
  94571. + CloseAngle;[>];
  94572. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren12.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren12.stree.txt
  94573. index 297c4e8e7e2..8305e3b0167 100644
  94574. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren12.stree.txt
  94575. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren12.stree.txt
  94576. @@ -1,7 +1,18 @@
  94577. -Markup block - Gen<None> - 9 - (0:0,0)
  94578. - Tag block - Gen<TagHelper> - 9 - (0:0,0) - p - PTagHelper
  94579. - StartTagAndEndTag - <p> ... </p>
  94580. - Tag block - Gen<None> - 2 - (3:0,3)
  94581. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:2
  94582. - SyntaxKind.OpenAngle;[<];
  94583. - SyntaxKind.ForwardSlash;[/];
  94584. +RazorDocument - [0..9)::9 - [<p></</p>]
  94585. + MarkupBlock - [0..9)::9
  94586. + MarkupTagHelperElement - [0..9)::9 - p[StartTagAndEndTag] - PTagHelper
  94587. + MarkupTagHelperStartTag - [0..3)::3
  94588. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94589. + OpenAngle;[<];
  94590. + Text;[p];
  94591. + CloseAngle;[>];
  94592. + MarkupTagBlock - [3..5)::2 - [</]
  94593. + MarkupTextLiteral - [3..5)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94594. + OpenAngle;[<];
  94595. + ForwardSlash;[/];
  94596. + MarkupTagHelperEndTag - [5..9)::4
  94597. + MarkupTextLiteral - [5..9)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94598. + OpenAngle;[<];
  94599. + ForwardSlash;[/];
  94600. + Text;[p];
  94601. + CloseAngle;[>];
  94602. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren13.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren13.stree.txt
  94603. index f742691a625..693ab1c7059 100644
  94604. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren13.stree.txt
  94605. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren13.stree.txt
  94606. @@ -1,6 +1,17 @@
  94607. -Markup block - Gen<None> - 8 - (0:0,0)
  94608. - Tag block - Gen<TagHelper> - 8 - (0:0,0) - p - PTagHelper
  94609. - StartTagAndEndTag - <p> ... </p>
  94610. - Tag block - Gen<None> - 1 - (3:0,3)
  94611. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:1
  94612. - SyntaxKind.OpenAngle;[<];
  94613. +RazorDocument - [0..8)::8 - [<p><</p>]
  94614. + MarkupBlock - [0..8)::8
  94615. + MarkupTagHelperElement - [0..8)::8 - p[StartTagAndEndTag] - PTagHelper
  94616. + MarkupTagHelperStartTag - [0..3)::3
  94617. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94618. + OpenAngle;[<];
  94619. + Text;[p];
  94620. + CloseAngle;[>];
  94621. + MarkupTagBlock - [3..4)::1 - [<]
  94622. + MarkupTextLiteral - [3..4)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94623. + OpenAngle;[<];
  94624. + MarkupTagHelperEndTag - [4..8)::4
  94625. + MarkupTextLiteral - [4..8)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94626. + OpenAngle;[<];
  94627. + ForwardSlash;[/];
  94628. + Text;[p];
  94629. + CloseAngle;[>];
  94630. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren14.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren14.stree.txt
  94631. index 422ea4afdb6..4f584753c9d 100644
  94632. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren14.stree.txt
  94633. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren14.stree.txt
  94634. @@ -1,31 +1,66 @@
  94635. -Markup block - Gen<None> - 76 - (0:0,0)
  94636. - Tag block - Gen<TagHelper> - 76 - (0:0,0) - p - PTagHelper
  94637. - StartTagAndEndTag - <p> ... </p>
  94638. - Tag block - Gen<None> - 8 - (3:0,3)
  94639. - Markup span - Gen<Markup> - [<custom>] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:3
  94640. - SyntaxKind.OpenAngle;[<];
  94641. - SyntaxKind.Text;[custom];
  94642. - SyntaxKind.CloseAngle;[>];
  94643. - Tag block - Gen<TagHelper> - 4 - (11:0,11) - br - BRTagHelper
  94644. - StartTagOnly - <br>
  94645. - SyntaxKind.HtmlTextLiteral - [:] - [15..16) - FullWidth: 1 - Slots: 1
  94646. - SyntaxKind.Text;[:];
  94647. - Tag block - Gen<TagHelper> - 39 - (16:0,16) - strong - StrongTagHelper
  94648. - StartTagAndEndTag - <strong> ... </strong>
  94649. - Tag block - Gen<TagHelper> - 22 - (24:0,24) - strong - StrongTagHelper
  94650. - StartTagAndEndTag - <strong> ... </strong>
  94651. - SyntaxKind.HtmlTextLiteral - [Hello] - [32..37) - FullWidth: 5 - Slots: 1
  94652. - SyntaxKind.Text;[Hello];
  94653. - SyntaxKind.HtmlTextLiteral - [:] - [55..56) - FullWidth: 1 - Slots: 1
  94654. - SyntaxKind.Text;[:];
  94655. - Tag block - Gen<None> - 7 - (56:0,56)
  94656. - Markup span - Gen<Markup> - [<input>] - SpanEditHandler;Accepts:Any - (56:0,56) - Tokens:3
  94657. - SyntaxKind.OpenAngle;[<];
  94658. - SyntaxKind.Text;[input];
  94659. - SyntaxKind.CloseAngle;[>];
  94660. - Tag block - Gen<None> - 9 - (63:0,63)
  94661. - Markup span - Gen<Markup> - [</custom>] - SpanEditHandler;Accepts:Any - (63:0,63) - Tokens:4
  94662. - SyntaxKind.OpenAngle;[<];
  94663. - SyntaxKind.ForwardSlash;[/];
  94664. - SyntaxKind.Text;[custom];
  94665. - SyntaxKind.CloseAngle;[>];
  94666. +RazorDocument - [0..76)::76 - [<p><custom><br>:<strong><strong>Hello</strong></strong>:<input></custom></p>]
  94667. + MarkupBlock - [0..76)::76
  94668. + MarkupTagHelperElement - [0..76)::76 - p[StartTagAndEndTag] - PTagHelper
  94669. + MarkupTagHelperStartTag - [0..3)::3
  94670. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94671. + OpenAngle;[<];
  94672. + Text;[p];
  94673. + CloseAngle;[>];
  94674. + MarkupTagBlock - [3..11)::8 - [<custom>]
  94675. + MarkupTextLiteral - [3..11)::8 - [<custom>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94676. + OpenAngle;[<];
  94677. + Text;[custom];
  94678. + CloseAngle;[>];
  94679. + MarkupTagHelperElement - [11..15)::4 - br[StartTagOnly] - BRTagHelper
  94680. + MarkupTagHelperStartTag - [11..15)::4
  94681. + MarkupTextLiteral - [11..15)::4 - [<br>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94682. + OpenAngle;[<];
  94683. + Text;[br];
  94684. + CloseAngle;[>];
  94685. + MarkupTextLiteral - [15..16)::1 - [:] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94686. + Text;[:];
  94687. + MarkupTagHelperElement - [16..55)::39 - strong[StartTagAndEndTag] - StrongTagHelper
  94688. + MarkupTagHelperStartTag - [16..24)::8
  94689. + MarkupTextLiteral - [16..24)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94690. + OpenAngle;[<];
  94691. + Text;[strong];
  94692. + CloseAngle;[>];
  94693. + MarkupTagHelperElement - [24..46)::22 - strong[StartTagAndEndTag] - StrongTagHelper
  94694. + MarkupTagHelperStartTag - [24..32)::8
  94695. + MarkupTextLiteral - [24..32)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94696. + OpenAngle;[<];
  94697. + Text;[strong];
  94698. + CloseAngle;[>];
  94699. + MarkupTextLiteral - [32..37)::5 - [Hello] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94700. + Text;[Hello];
  94701. + MarkupTagHelperEndTag - [37..46)::9
  94702. + MarkupTextLiteral - [37..46)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94703. + OpenAngle;[<];
  94704. + ForwardSlash;[/];
  94705. + Text;[strong];
  94706. + CloseAngle;[>];
  94707. + MarkupTagHelperEndTag - [46..55)::9
  94708. + MarkupTextLiteral - [46..55)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94709. + OpenAngle;[<];
  94710. + ForwardSlash;[/];
  94711. + Text;[strong];
  94712. + CloseAngle;[>];
  94713. + MarkupTextLiteral - [55..56)::1 - [:] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94714. + Text;[:];
  94715. + MarkupTagBlock - [56..63)::7 - [<input>]
  94716. + MarkupTextLiteral - [56..63)::7 - [<input>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94717. + OpenAngle;[<];
  94718. + Text;[input];
  94719. + CloseAngle;[>];
  94720. + MarkupTagBlock - [63..72)::9 - [</custom>]
  94721. + MarkupTextLiteral - [63..72)::9 - [</custom>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94722. + OpenAngle;[<];
  94723. + ForwardSlash;[/];
  94724. + Text;[custom];
  94725. + CloseAngle;[>];
  94726. + MarkupTagHelperEndTag - [72..76)::4
  94727. + MarkupTextLiteral - [72..76)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94728. + OpenAngle;[<];
  94729. + ForwardSlash;[/];
  94730. + Text;[p];
  94731. + CloseAngle;[>];
  94732. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren2.stree.txt
  94733. index 4d6830116ea..400f13a4949 100644
  94734. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren2.stree.txt
  94735. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren2.stree.txt
  94736. @@ -1,9 +1,26 @@
  94737. -Markup block - Gen<None> - 17 - (0:0,0)
  94738. - Tag block - Gen<TagHelper> - 17 - (0:0,0) - p - PTagHelper
  94739. - StartTagAndEndTag - <p> ... </p>
  94740. - SyntaxKind.HtmlTextLiteral - [LF] - [3..5) - FullWidth: 2 - Slots: 1
  94741. - SyntaxKind.NewLine;[LF];
  94742. - Tag block - Gen<TagHelper> - 6 - (5:1,0) - br - BRTagHelper
  94743. - SelfClosing - <br />
  94744. - SyntaxKind.HtmlTextLiteral - [LF] - [11..13) - FullWidth: 2 - Slots: 1
  94745. - SyntaxKind.NewLine;[LF];
  94746. +RazorDocument - [0..17)::17 - [<p>LF<br />LF</p>]
  94747. + MarkupBlock - [0..17)::17
  94748. + MarkupTagHelperElement - [0..17)::17 - p[StartTagAndEndTag] - PTagHelper
  94749. + MarkupTagHelperStartTag - [0..3)::3
  94750. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94751. + OpenAngle;[<];
  94752. + Text;[p];
  94753. + CloseAngle;[>];
  94754. + MarkupTextLiteral - [3..5)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94755. + NewLine;[LF];
  94756. + MarkupTagHelperElement - [5..11)::6 - br[SelfClosing] - BRTagHelper
  94757. + MarkupTagHelperStartTag - [5..11)::6
  94758. + MarkupTextLiteral - [5..11)::6 - [<br />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94759. + OpenAngle;[<];
  94760. + Text;[br];
  94761. + Whitespace;[ ];
  94762. + ForwardSlash;[/];
  94763. + CloseAngle;[>];
  94764. + MarkupTextLiteral - [11..13)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94765. + NewLine;[LF];
  94766. + MarkupTagHelperEndTag - [13..17)::4
  94767. + MarkupTextLiteral - [13..17)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94768. + OpenAngle;[<];
  94769. + ForwardSlash;[/];
  94770. + Text;[p];
  94771. + CloseAngle;[>];
  94772. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren3.stree.txt
  94773. index 3f5750436cf..aefe5796576 100644
  94774. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren3.stree.txt
  94775. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren3.stree.txt
  94776. @@ -1,5 +1,20 @@
  94777. -Markup block - Gen<None> - 11 - (0:0,0)
  94778. - Tag block - Gen<TagHelper> - 11 - (0:0,0) - p - PTagHelper
  94779. - StartTagAndEndTag - <p> ... </p>
  94780. - Tag block - Gen<TagHelper> - 4 - (3:0,3) - br - BRTagHelper
  94781. - StartTagOnly - <br>
  94782. +RazorDocument - [0..11)::11 - [<p><br></p>]
  94783. + MarkupBlock - [0..11)::11
  94784. + MarkupTagHelperElement - [0..11)::11 - p[StartTagAndEndTag] - PTagHelper
  94785. + MarkupTagHelperStartTag - [0..3)::3
  94786. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94787. + OpenAngle;[<];
  94788. + Text;[p];
  94789. + CloseAngle;[>];
  94790. + MarkupTagHelperElement - [3..7)::4 - br[StartTagOnly] - BRTagHelper
  94791. + MarkupTagHelperStartTag - [3..7)::4
  94792. + MarkupTextLiteral - [3..7)::4 - [<br>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94793. + OpenAngle;[<];
  94794. + Text;[br];
  94795. + CloseAngle;[>];
  94796. + MarkupTagHelperEndTag - [7..11)::4
  94797. + MarkupTextLiteral - [7..11)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94798. + OpenAngle;[<];
  94799. + ForwardSlash;[/];
  94800. + Text;[p];
  94801. + CloseAngle;[>];
  94802. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren4.stree.txt
  94803. index d22c234e563..e8acd8e6631 100644
  94804. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren4.stree.txt
  94805. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren4.stree.txt
  94806. @@ -1,5 +1,16 @@
  94807. -Markup block - Gen<None> - 12 - (0:0,0)
  94808. - Tag block - Gen<TagHelper> - 12 - (0:0,0) - p - PTagHelper
  94809. - StartTagAndEndTag - <p> ... </p>
  94810. - SyntaxKind.HtmlTextLiteral - [Hello] - [3..8) - FullWidth: 5 - Slots: 1
  94811. - SyntaxKind.Text;[Hello];
  94812. +RazorDocument - [0..12)::12 - [<p>Hello</p>]
  94813. + MarkupBlock - [0..12)::12
  94814. + MarkupTagHelperElement - [0..12)::12 - p[StartTagAndEndTag] - PTagHelper
  94815. + MarkupTagHelperStartTag - [0..3)::3
  94816. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94817. + OpenAngle;[<];
  94818. + Text;[p];
  94819. + CloseAngle;[>];
  94820. + MarkupTextLiteral - [3..8)::5 - [Hello] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94821. + Text;[Hello];
  94822. + MarkupTagHelperEndTag - [8..12)::4
  94823. + MarkupTextLiteral - [8..12)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94824. + OpenAngle;[<];
  94825. + ForwardSlash;[/];
  94826. + Text;[p];
  94827. + CloseAngle;[>];
  94828. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren5.stree.txt
  94829. index bc2c07615b6..b89b0055347 100644
  94830. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren5.stree.txt
  94831. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren5.stree.txt
  94832. @@ -1,10 +1,21 @@
  94833. -Markup block - Gen<None> - 13 - (0:0,0)
  94834. - Tag block - Gen<TagHelper> - 13 - (0:0,0) - p - PTagHelper
  94835. - StartTagAndEndTag - <p> ... </p>
  94836. - Tag block - Gen<None> - 6 - (3:0,3)
  94837. - Markup span - Gen<Markup> - [<hr />] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:5
  94838. - SyntaxKind.OpenAngle;[<];
  94839. - SyntaxKind.Text;[hr];
  94840. - SyntaxKind.Whitespace;[ ];
  94841. - SyntaxKind.ForwardSlash;[/];
  94842. - SyntaxKind.CloseAngle;[>];
  94843. +RazorDocument - [0..13)::13 - [<p><hr /></p>]
  94844. + MarkupBlock - [0..13)::13
  94845. + MarkupTagHelperElement - [0..13)::13 - p[StartTagAndEndTag] - PTagHelper
  94846. + MarkupTagHelperStartTag - [0..3)::3
  94847. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94848. + OpenAngle;[<];
  94849. + Text;[p];
  94850. + CloseAngle;[>];
  94851. + MarkupTagBlock - [3..9)::6 - [<hr />]
  94852. + MarkupTextLiteral - [3..9)::6 - [<hr />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94853. + OpenAngle;[<];
  94854. + Text;[hr];
  94855. + Whitespace;[ ];
  94856. + ForwardSlash;[/];
  94857. + CloseAngle;[>];
  94858. + MarkupTagHelperEndTag - [9..13)::4
  94859. + MarkupTextLiteral - [9..13)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94860. + OpenAngle;[<];
  94861. + ForwardSlash;[/];
  94862. + Text;[p];
  94863. + CloseAngle;[>];
  94864. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren6.stree.txt
  94865. index 04b573dd1db..55e5d05d51e 100644
  94866. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren6.stree.txt
  94867. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren6.stree.txt
  94868. @@ -1,7 +1,22 @@
  94869. -Markup block - Gen<None> - 16 - (0:0,0)
  94870. - Tag block - Gen<TagHelper> - 16 - (0:0,0) - p - PTagHelper
  94871. - StartTagAndEndTag - <p> ... </p>
  94872. - Tag block - Gen<TagHelper> - 4 - (3:0,3) - br - BRTagHelper
  94873. - StartTagOnly - <br>
  94874. - SyntaxKind.HtmlTextLiteral - [Hello] - [7..12) - FullWidth: 5 - Slots: 1
  94875. - SyntaxKind.Text;[Hello];
  94876. +RazorDocument - [0..16)::16 - [<p><br>Hello</p>]
  94877. + MarkupBlock - [0..16)::16
  94878. + MarkupTagHelperElement - [0..16)::16 - p[StartTagAndEndTag] - PTagHelper
  94879. + MarkupTagHelperStartTag - [0..3)::3
  94880. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94881. + OpenAngle;[<];
  94882. + Text;[p];
  94883. + CloseAngle;[>];
  94884. + MarkupTagHelperElement - [3..7)::4 - br[StartTagOnly] - BRTagHelper
  94885. + MarkupTagHelperStartTag - [3..7)::4
  94886. + MarkupTextLiteral - [3..7)::4 - [<br>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94887. + OpenAngle;[<];
  94888. + Text;[br];
  94889. + CloseAngle;[>];
  94890. + MarkupTextLiteral - [7..12)::5 - [Hello] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94891. + Text;[Hello];
  94892. + MarkupTagHelperEndTag - [12..16)::4
  94893. + MarkupTextLiteral - [12..16)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94894. + OpenAngle;[<];
  94895. + ForwardSlash;[/];
  94896. + Text;[p];
  94897. + CloseAngle;[>];
  94898. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren7.stree.txt
  94899. index 7d735095960..449ecd9ffff 100644
  94900. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren7.stree.txt
  94901. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren7.stree.txt
  94902. @@ -1,11 +1,38 @@
  94903. -Markup block - Gen<None> - 45 - (0:0,0)
  94904. - Tag block - Gen<TagHelper> - 45 - (0:0,0) - p - PTagHelper
  94905. - StartTagAndEndTag - <p> ... </p>
  94906. - Tag block - Gen<TagHelper> - 23 - (3:0,3) - strong - StrongTagHelper
  94907. - StartTagAndEndTag - <strong> ... </strong>
  94908. - SyntaxKind.HtmlTextLiteral - [Title:] - [11..17) - FullWidth: 6 - Slots: 1
  94909. - SyntaxKind.Text;[Title:];
  94910. - Tag block - Gen<TagHelper> - 6 - (26:0,26) - br - BRTagHelper
  94911. - SelfClosing - <br />
  94912. - SyntaxKind.HtmlTextLiteral - [Something] - [32..41) - FullWidth: 9 - Slots: 1
  94913. - SyntaxKind.Text;[Something];
  94914. +RazorDocument - [0..45)::45 - [<p><strong>Title:</strong><br />Something</p>]
  94915. + MarkupBlock - [0..45)::45
  94916. + MarkupTagHelperElement - [0..45)::45 - p[StartTagAndEndTag] - PTagHelper
  94917. + MarkupTagHelperStartTag - [0..3)::3
  94918. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94919. + OpenAngle;[<];
  94920. + Text;[p];
  94921. + CloseAngle;[>];
  94922. + MarkupTagHelperElement - [3..26)::23 - strong[StartTagAndEndTag] - StrongTagHelper
  94923. + MarkupTagHelperStartTag - [3..11)::8
  94924. + MarkupTextLiteral - [3..11)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94925. + OpenAngle;[<];
  94926. + Text;[strong];
  94927. + CloseAngle;[>];
  94928. + MarkupTextLiteral - [11..17)::6 - [Title:] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94929. + Text;[Title:];
  94930. + MarkupTagHelperEndTag - [17..26)::9
  94931. + MarkupTextLiteral - [17..26)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94932. + OpenAngle;[<];
  94933. + ForwardSlash;[/];
  94934. + Text;[strong];
  94935. + CloseAngle;[>];
  94936. + MarkupTagHelperElement - [26..32)::6 - br[SelfClosing] - BRTagHelper
  94937. + MarkupTagHelperStartTag - [26..32)::6
  94938. + MarkupTextLiteral - [26..32)::6 - [<br />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94939. + OpenAngle;[<];
  94940. + Text;[br];
  94941. + Whitespace;[ ];
  94942. + ForwardSlash;[/];
  94943. + CloseAngle;[>];
  94944. + MarkupTextLiteral - [32..41)::9 - [Something] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94945. + Text;[Something];
  94946. + MarkupTagHelperEndTag - [41..45)::4
  94947. + MarkupTextLiteral - [41..45)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94948. + OpenAngle;[<];
  94949. + ForwardSlash;[/];
  94950. + Text;[p];
  94951. + CloseAngle;[>];
  94952. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren8.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren8.stree.txt
  94953. index 7d735095960..449ecd9ffff 100644
  94954. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren8.stree.txt
  94955. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren8.stree.txt
  94956. @@ -1,11 +1,38 @@
  94957. -Markup block - Gen<None> - 45 - (0:0,0)
  94958. - Tag block - Gen<TagHelper> - 45 - (0:0,0) - p - PTagHelper
  94959. - StartTagAndEndTag - <p> ... </p>
  94960. - Tag block - Gen<TagHelper> - 23 - (3:0,3) - strong - StrongTagHelper
  94961. - StartTagAndEndTag - <strong> ... </strong>
  94962. - SyntaxKind.HtmlTextLiteral - [Title:] - [11..17) - FullWidth: 6 - Slots: 1
  94963. - SyntaxKind.Text;[Title:];
  94964. - Tag block - Gen<TagHelper> - 6 - (26:0,26) - br - BRTagHelper
  94965. - SelfClosing - <br />
  94966. - SyntaxKind.HtmlTextLiteral - [Something] - [32..41) - FullWidth: 9 - Slots: 1
  94967. - SyntaxKind.Text;[Something];
  94968. +RazorDocument - [0..45)::45 - [<p><strong>Title:</strong><br />Something</p>]
  94969. + MarkupBlock - [0..45)::45
  94970. + MarkupTagHelperElement - [0..45)::45 - p[StartTagAndEndTag] - PTagHelper
  94971. + MarkupTagHelperStartTag - [0..3)::3
  94972. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94973. + OpenAngle;[<];
  94974. + Text;[p];
  94975. + CloseAngle;[>];
  94976. + MarkupTagHelperElement - [3..26)::23 - strong[StartTagAndEndTag] - StrongTagHelper
  94977. + MarkupTagHelperStartTag - [3..11)::8
  94978. + MarkupTextLiteral - [3..11)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94979. + OpenAngle;[<];
  94980. + Text;[strong];
  94981. + CloseAngle;[>];
  94982. + MarkupTextLiteral - [11..17)::6 - [Title:] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94983. + Text;[Title:];
  94984. + MarkupTagHelperEndTag - [17..26)::9
  94985. + MarkupTextLiteral - [17..26)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94986. + OpenAngle;[<];
  94987. + ForwardSlash;[/];
  94988. + Text;[strong];
  94989. + CloseAngle;[>];
  94990. + MarkupTagHelperElement - [26..32)::6 - br[SelfClosing] - BRTagHelper
  94991. + MarkupTagHelperStartTag - [26..32)::6
  94992. + MarkupTextLiteral - [26..32)::6 - [<br />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94993. + OpenAngle;[<];
  94994. + Text;[br];
  94995. + Whitespace;[ ];
  94996. + ForwardSlash;[/];
  94997. + CloseAngle;[>];
  94998. + MarkupTextLiteral - [32..41)::9 - [Something] - Gen<Markup> - SpanEditHandler;Accepts:Any
  94999. + Text;[Something];
  95000. + MarkupTagHelperEndTag - [41..45)::4
  95001. + MarkupTextLiteral - [41..45)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95002. + OpenAngle;[<];
  95003. + ForwardSlash;[/];
  95004. + Text;[p];
  95005. + CloseAngle;[>];
  95006. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren9.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren9.stree.txt
  95007. index 82426967abc..d41c4ed6223 100644
  95008. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren9.stree.txt
  95009. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsAllowedChildren9.stree.txt
  95010. @@ -1,17 +1,43 @@
  95011. -Markup block - Gen<None> - 51 - (0:0,0)
  95012. - Tag block - Gen<TagHelper> - 51 - (0:0,0) - p - PTagHelper
  95013. - StartTagAndEndTag - <p> ... </p>
  95014. - SyntaxKind.HtmlTextLiteral - [ ] - [3..5) - FullWidth: 2 - Slots: 1
  95015. - SyntaxKind.Whitespace;[ ];
  95016. - Tag block - Gen<TagHelper> - 23 - (5:0,5) - strong - StrongTagHelper
  95017. - StartTagAndEndTag - <strong> ... </strong>
  95018. - SyntaxKind.HtmlTextLiteral - [Title:] - [13..19) - FullWidth: 6 - Slots: 1
  95019. - SyntaxKind.Text;[Title:];
  95020. - SyntaxKind.HtmlTextLiteral - [ ] - [28..30) - FullWidth: 2 - Slots: 1
  95021. - SyntaxKind.Whitespace;[ ];
  95022. - Tag block - Gen<TagHelper> - 6 - (30:0,30) - br - BRTagHelper
  95023. - SelfClosing - <br />
  95024. - SyntaxKind.HtmlTextLiteral - [ Something] - [36..47) - FullWidth: 11 - Slots: 1
  95025. - SyntaxKind.List - [ Something] - [36..47) - FullWidth: 11 - Slots: 2
  95026. - SyntaxKind.Whitespace;[ ];
  95027. - SyntaxKind.Text;[Something];
  95028. +RazorDocument - [0..51)::51 - [<p> <strong>Title:</strong> <br /> Something</p>]
  95029. + MarkupBlock - [0..51)::51
  95030. + MarkupTagHelperElement - [0..51)::51 - p[StartTagAndEndTag] - PTagHelper
  95031. + MarkupTagHelperStartTag - [0..3)::3
  95032. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95033. + OpenAngle;[<];
  95034. + Text;[p];
  95035. + CloseAngle;[>];
  95036. + MarkupTextLiteral - [3..5)::2 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95037. + Whitespace;[ ];
  95038. + MarkupTagHelperElement - [5..28)::23 - strong[StartTagAndEndTag] - StrongTagHelper
  95039. + MarkupTagHelperStartTag - [5..13)::8
  95040. + MarkupTextLiteral - [5..13)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95041. + OpenAngle;[<];
  95042. + Text;[strong];
  95043. + CloseAngle;[>];
  95044. + MarkupTextLiteral - [13..19)::6 - [Title:] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95045. + Text;[Title:];
  95046. + MarkupTagHelperEndTag - [19..28)::9
  95047. + MarkupTextLiteral - [19..28)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95048. + OpenAngle;[<];
  95049. + ForwardSlash;[/];
  95050. + Text;[strong];
  95051. + CloseAngle;[>];
  95052. + MarkupTextLiteral - [28..30)::2 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95053. + Whitespace;[ ];
  95054. + MarkupTagHelperElement - [30..36)::6 - br[SelfClosing] - BRTagHelper
  95055. + MarkupTagHelperStartTag - [30..36)::6
  95056. + MarkupTextLiteral - [30..36)::6 - [<br />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95057. + OpenAngle;[<];
  95058. + Text;[br];
  95059. + Whitespace;[ ];
  95060. + ForwardSlash;[/];
  95061. + CloseAngle;[>];
  95062. + MarkupTextLiteral - [36..47)::11 - [ Something] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95063. + Whitespace;[ ];
  95064. + Text;[Something];
  95065. + MarkupTagHelperEndTag - [47..51)::4
  95066. + MarkupTextLiteral - [47..51)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95067. + OpenAngle;[<];
  95068. + ForwardSlash;[/];
  95069. + Text;[p];
  95070. + CloseAngle;[>];
  95071. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedRequiredParent1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedRequiredParent1.stree.txt
  95072. index 9fd8ce0f987..482ce72d72d 100644
  95073. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedRequiredParent1.stree.txt
  95074. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedRequiredParent1.stree.txt
  95075. @@ -1,12 +1,13 @@
  95076. -Markup block - Gen<None> - 17 - (0:0,0)
  95077. - Tag block - Gen<None> - 8 - (0:0,0)
  95078. - Markup span - Gen<Markup> - [<strong>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  95079. - SyntaxKind.OpenAngle;[<];
  95080. - SyntaxKind.Text;[strong];
  95081. - SyntaxKind.CloseAngle;[>];
  95082. - Tag block - Gen<None> - 9 - (8:0,8)
  95083. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:4
  95084. - SyntaxKind.OpenAngle;[<];
  95085. - SyntaxKind.ForwardSlash;[/];
  95086. - SyntaxKind.Text;[strong];
  95087. - SyntaxKind.CloseAngle;[>];
  95088. +RazorDocument - [0..17)::17 - [<strong></strong>]
  95089. + MarkupBlock - [0..17)::17
  95090. + MarkupTagBlock - [0..8)::8 - [<strong>]
  95091. + MarkupTextLiteral - [0..8)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95092. + OpenAngle;[<];
  95093. + Text;[strong];
  95094. + CloseAngle;[>];
  95095. + MarkupTagBlock - [8..17)::9 - [</strong>]
  95096. + MarkupTextLiteral - [8..17)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95097. + OpenAngle;[<];
  95098. + ForwardSlash;[/];
  95099. + Text;[strong];
  95100. + CloseAngle;[>];
  95101. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedRequiredParent2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedRequiredParent2.stree.txt
  95102. index 83c4bcba880..08b6e074443 100644
  95103. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedRequiredParent2.stree.txt
  95104. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedRequiredParent2.stree.txt
  95105. @@ -1,5 +1,26 @@
  95106. -Markup block - Gen<None> - 24 - (0:0,0)
  95107. - Tag block - Gen<TagHelper> - 24 - (0:0,0) - p - PTagHelper
  95108. - StartTagAndEndTag - <p> ... </p>
  95109. - Tag block - Gen<TagHelper> - 17 - (3:0,3) - strong - StrongTagHelper
  95110. - StartTagAndEndTag - <strong> ... </strong>
  95111. +RazorDocument - [0..24)::24 - [<p><strong></strong></p>]
  95112. + MarkupBlock - [0..24)::24
  95113. + MarkupTagHelperElement - [0..24)::24 - p[StartTagAndEndTag] - PTagHelper
  95114. + MarkupTagHelperStartTag - [0..3)::3
  95115. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95116. + OpenAngle;[<];
  95117. + Text;[p];
  95118. + CloseAngle;[>];
  95119. + MarkupTagHelperElement - [3..20)::17 - strong[StartTagAndEndTag] - StrongTagHelper
  95120. + MarkupTagHelperStartTag - [3..11)::8
  95121. + MarkupTextLiteral - [3..11)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95122. + OpenAngle;[<];
  95123. + Text;[strong];
  95124. + CloseAngle;[>];
  95125. + MarkupTagHelperEndTag - [11..20)::9
  95126. + MarkupTextLiteral - [11..20)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95127. + OpenAngle;[<];
  95128. + ForwardSlash;[/];
  95129. + Text;[strong];
  95130. + CloseAngle;[>];
  95131. + MarkupTagHelperEndTag - [20..24)::4
  95132. + MarkupTextLiteral - [20..24)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95133. + OpenAngle;[<];
  95134. + ForwardSlash;[/];
  95135. + Text;[p];
  95136. + CloseAngle;[>];
  95137. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedRequiredParent3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedRequiredParent3.stree.txt
  95138. index b1b5ce01f20..0d08c51691f 100644
  95139. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedRequiredParent3.stree.txt
  95140. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedRequiredParent3.stree.txt
  95141. @@ -1,14 +1,25 @@
  95142. -Markup block - Gen<None> - 28 - (0:0,0)
  95143. - Tag block - Gen<None> - 5 - (0:0,0)
  95144. - Markup span - Gen<Markup> - [<div>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  95145. - SyntaxKind.OpenAngle;[<];
  95146. - SyntaxKind.Text;[div];
  95147. - SyntaxKind.CloseAngle;[>];
  95148. - Tag block - Gen<TagHelper> - 17 - (5:0,5) - strong - StrongTagHelper
  95149. - StartTagAndEndTag - <strong> ... </strong>
  95150. - Tag block - Gen<None> - 6 - (22:0,22)
  95151. - Markup span - Gen<Markup> - [</div>] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:4
  95152. - SyntaxKind.OpenAngle;[<];
  95153. - SyntaxKind.ForwardSlash;[/];
  95154. - SyntaxKind.Text;[div];
  95155. - SyntaxKind.CloseAngle;[>];
  95156. +RazorDocument - [0..28)::28 - [<div><strong></strong></div>]
  95157. + MarkupBlock - [0..28)::28
  95158. + MarkupTagBlock - [0..5)::5 - [<div>]
  95159. + MarkupTextLiteral - [0..5)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95160. + OpenAngle;[<];
  95161. + Text;[div];
  95162. + CloseAngle;[>];
  95163. + MarkupTagHelperElement - [5..22)::17 - strong[StartTagAndEndTag] - StrongTagHelper
  95164. + MarkupTagHelperStartTag - [5..13)::8
  95165. + MarkupTextLiteral - [5..13)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95166. + OpenAngle;[<];
  95167. + Text;[strong];
  95168. + CloseAngle;[>];
  95169. + MarkupTagHelperEndTag - [13..22)::9
  95170. + MarkupTextLiteral - [13..22)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95171. + OpenAngle;[<];
  95172. + ForwardSlash;[/];
  95173. + Text;[strong];
  95174. + CloseAngle;[>];
  95175. + MarkupTagBlock - [22..28)::6 - [</div>]
  95176. + MarkupTextLiteral - [22..28)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95177. + OpenAngle;[<];
  95178. + ForwardSlash;[/];
  95179. + Text;[div];
  95180. + CloseAngle;[>];
  95181. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedRequiredParent4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedRequiredParent4.stree.txt
  95182. index 4c965f4a52d..7107cc6aa0b 100644
  95183. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedRequiredParent4.stree.txt
  95184. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedRequiredParent4.stree.txt
  95185. @@ -1,23 +1,24 @@
  95186. -Markup block - Gen<None> - 34 - (0:0,0)
  95187. - Tag block - Gen<None> - 8 - (0:0,0)
  95188. - Markup span - Gen<Markup> - [<strong>] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:3
  95189. - SyntaxKind.OpenAngle;[<];
  95190. - SyntaxKind.Text;[strong];
  95191. - SyntaxKind.CloseAngle;[>];
  95192. - Tag block - Gen<None> - 8 - (8:0,8)
  95193. - Markup span - Gen<Markup> - [<strong>] - SpanEditHandler;Accepts:Any - (8:0,8) - Tokens:3
  95194. - SyntaxKind.OpenAngle;[<];
  95195. - SyntaxKind.Text;[strong];
  95196. - SyntaxKind.CloseAngle;[>];
  95197. - Tag block - Gen<None> - 9 - (16:0,16)
  95198. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (16:0,16) - Tokens:4
  95199. - SyntaxKind.OpenAngle;[<];
  95200. - SyntaxKind.ForwardSlash;[/];
  95201. - SyntaxKind.Text;[strong];
  95202. - SyntaxKind.CloseAngle;[>];
  95203. - Tag block - Gen<None> - 9 - (25:0,25)
  95204. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:4
  95205. - SyntaxKind.OpenAngle;[<];
  95206. - SyntaxKind.ForwardSlash;[/];
  95207. - SyntaxKind.Text;[strong];
  95208. - SyntaxKind.CloseAngle;[>];
  95209. +RazorDocument - [0..34)::34 - [<strong><strong></strong></strong>]
  95210. + MarkupBlock - [0..34)::34
  95211. + MarkupTagBlock - [0..8)::8 - [<strong>]
  95212. + MarkupTextLiteral - [0..8)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95213. + OpenAngle;[<];
  95214. + Text;[strong];
  95215. + CloseAngle;[>];
  95216. + MarkupTagBlock - [8..16)::8 - [<strong>]
  95217. + MarkupTextLiteral - [8..16)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95218. + OpenAngle;[<];
  95219. + Text;[strong];
  95220. + CloseAngle;[>];
  95221. + MarkupTagBlock - [16..25)::9 - [</strong>]
  95222. + MarkupTextLiteral - [16..25)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95223. + OpenAngle;[<];
  95224. + ForwardSlash;[/];
  95225. + Text;[strong];
  95226. + CloseAngle;[>];
  95227. + MarkupTagBlock - [25..34)::9 - [</strong>]
  95228. + MarkupTextLiteral - [25..34)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95229. + OpenAngle;[<];
  95230. + ForwardSlash;[/];
  95231. + Text;[strong];
  95232. + CloseAngle;[>];
  95233. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedRequiredParent5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedRequiredParent5.stree.txt
  95234. index ef949078511..bc8a5c19cf2 100644
  95235. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedRequiredParent5.stree.txt
  95236. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedRequiredParent5.stree.txt
  95237. @@ -1,16 +1,37 @@
  95238. -Markup block - Gen<None> - 41 - (0:0,0)
  95239. - Tag block - Gen<TagHelper> - 41 - (0:0,0) - p - PTagHelper
  95240. - StartTagAndEndTag - <p> ... </p>
  95241. - Tag block - Gen<TagHelper> - 34 - (3:0,3) - strong - StrongTagHelper
  95242. - StartTagAndEndTag - <strong> ... </strong>
  95243. - Tag block - Gen<None> - 8 - (11:0,11)
  95244. - Markup span - Gen<Markup> - [<strong>] - SpanEditHandler;Accepts:Any - (11:0,11) - Tokens:3
  95245. - SyntaxKind.OpenAngle;[<];
  95246. - SyntaxKind.Text;[strong];
  95247. - SyntaxKind.CloseAngle;[>];
  95248. - Tag block - Gen<None> - 9 - (19:0,19)
  95249. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (19:0,19) - Tokens:4
  95250. - SyntaxKind.OpenAngle;[<];
  95251. - SyntaxKind.ForwardSlash;[/];
  95252. - SyntaxKind.Text;[strong];
  95253. - SyntaxKind.CloseAngle;[>];
  95254. +RazorDocument - [0..41)::41 - [<p><strong><strong></strong></strong></p>]
  95255. + MarkupBlock - [0..41)::41
  95256. + MarkupTagHelperElement - [0..41)::41 - p[StartTagAndEndTag] - PTagHelper
  95257. + MarkupTagHelperStartTag - [0..3)::3
  95258. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95259. + OpenAngle;[<];
  95260. + Text;[p];
  95261. + CloseAngle;[>];
  95262. + MarkupTagHelperElement - [3..37)::34 - strong[StartTagAndEndTag] - StrongTagHelper
  95263. + MarkupTagHelperStartTag - [3..11)::8
  95264. + MarkupTextLiteral - [3..11)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95265. + OpenAngle;[<];
  95266. + Text;[strong];
  95267. + CloseAngle;[>];
  95268. + MarkupTagBlock - [11..19)::8 - [<strong>]
  95269. + MarkupTextLiteral - [11..19)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95270. + OpenAngle;[<];
  95271. + Text;[strong];
  95272. + CloseAngle;[>];
  95273. + MarkupTagBlock - [19..28)::9 - [</strong>]
  95274. + MarkupTextLiteral - [19..28)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95275. + OpenAngle;[<];
  95276. + ForwardSlash;[/];
  95277. + Text;[strong];
  95278. + CloseAngle;[>];
  95279. + MarkupTagHelperEndTag - [28..37)::9
  95280. + MarkupTextLiteral - [28..37)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95281. + OpenAngle;[<];
  95282. + ForwardSlash;[/];
  95283. + Text;[strong];
  95284. + CloseAngle;[>];
  95285. + MarkupTagHelperEndTag - [37..41)::4
  95286. + MarkupTextLiteral - [37..41)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95287. + OpenAngle;[<];
  95288. + ForwardSlash;[/];
  95289. + Text;[p];
  95290. + CloseAngle;[>];
  95291. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent1.stree.txt
  95292. index 1ab6c121d7b..1adcc775ec3 100644
  95293. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent1.stree.txt
  95294. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent1.stree.txt
  95295. @@ -1,14 +1,19 @@
  95296. -Markup block - Gen<None> - 24 - (0:0,0)
  95297. - Tag block - Gen<TagHelper> - 7 - (0:0,0) - input - InputTagHelper
  95298. - StartTagOnly - <input>
  95299. - Tag block - Gen<None> - 8 - (7:0,7)
  95300. - Markup span - Gen<Markup> - [<strong>] - SpanEditHandler;Accepts:Any - (7:0,7) - Tokens:3
  95301. - SyntaxKind.OpenAngle;[<];
  95302. - SyntaxKind.Text;[strong];
  95303. - SyntaxKind.CloseAngle;[>];
  95304. - Tag block - Gen<None> - 9 - (15:0,15)
  95305. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:4
  95306. - SyntaxKind.OpenAngle;[<];
  95307. - SyntaxKind.ForwardSlash;[/];
  95308. - SyntaxKind.Text;[strong];
  95309. - SyntaxKind.CloseAngle;[>];
  95310. +RazorDocument - [0..24)::24 - [<input><strong></strong>]
  95311. + MarkupBlock - [0..24)::24
  95312. + MarkupTagHelperElement - [0..7)::7 - input[StartTagOnly] - InputTagHelper
  95313. + MarkupTagHelperStartTag - [0..7)::7
  95314. + MarkupTextLiteral - [0..7)::7 - [<input>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95315. + OpenAngle;[<];
  95316. + Text;[input];
  95317. + CloseAngle;[>];
  95318. + MarkupTagBlock - [7..15)::8 - [<strong>]
  95319. + MarkupTextLiteral - [7..15)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95320. + OpenAngle;[<];
  95321. + Text;[strong];
  95322. + CloseAngle;[>];
  95323. + MarkupTagBlock - [15..24)::9 - [</strong>]
  95324. + MarkupTextLiteral - [15..24)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95325. + OpenAngle;[<];
  95326. + ForwardSlash;[/];
  95327. + Text;[strong];
  95328. + CloseAngle;[>];
  95329. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent2.stree.txt
  95330. index 280c9a6d76b..481e713ac0b 100644
  95331. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent2.stree.txt
  95332. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent2.stree.txt
  95333. @@ -1,7 +1,32 @@
  95334. -Markup block - Gen<None> - 31 - (0:0,0)
  95335. - Tag block - Gen<TagHelper> - 31 - (0:0,0) - p - PTagHelper
  95336. - StartTagAndEndTag - <p> ... </p>
  95337. - Tag block - Gen<TagHelper> - 7 - (3:0,3) - input - InputTagHelper
  95338. - StartTagOnly - <input>
  95339. - Tag block - Gen<TagHelper> - 17 - (10:0,10) - strong - StrongTagHelper
  95340. - StartTagAndEndTag - <strong> ... </strong>
  95341. +RazorDocument - [0..31)::31 - [<p><input><strong></strong></p>]
  95342. + MarkupBlock - [0..31)::31
  95343. + MarkupTagHelperElement - [0..31)::31 - p[StartTagAndEndTag] - PTagHelper
  95344. + MarkupTagHelperStartTag - [0..3)::3
  95345. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95346. + OpenAngle;[<];
  95347. + Text;[p];
  95348. + CloseAngle;[>];
  95349. + MarkupTagHelperElement - [3..10)::7 - input[StartTagOnly] - InputTagHelper
  95350. + MarkupTagHelperStartTag - [3..10)::7
  95351. + MarkupTextLiteral - [3..10)::7 - [<input>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95352. + OpenAngle;[<];
  95353. + Text;[input];
  95354. + CloseAngle;[>];
  95355. + MarkupTagHelperElement - [10..27)::17 - strong[StartTagAndEndTag] - StrongTagHelper
  95356. + MarkupTagHelperStartTag - [10..18)::8
  95357. + MarkupTextLiteral - [10..18)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95358. + OpenAngle;[<];
  95359. + Text;[strong];
  95360. + CloseAngle;[>];
  95361. + MarkupTagHelperEndTag - [18..27)::9
  95362. + MarkupTextLiteral - [18..27)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95363. + OpenAngle;[<];
  95364. + ForwardSlash;[/];
  95365. + Text;[strong];
  95366. + CloseAngle;[>];
  95367. + MarkupTagHelperEndTag - [27..31)::4
  95368. + MarkupTextLiteral - [27..31)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95369. + OpenAngle;[<];
  95370. + ForwardSlash;[/];
  95371. + Text;[p];
  95372. + CloseAngle;[>];
  95373. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent3.stree.txt
  95374. index 7243ec7a37b..04a257b7b1f 100644
  95375. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent3.stree.txt
  95376. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent3.stree.txt
  95377. @@ -1,10 +1,31 @@
  95378. -Markup block - Gen<None> - 28 - (0:0,0)
  95379. - Tag block - Gen<TagHelper> - 28 - (0:0,0) - p - PTagHelper
  95380. - StartTagAndEndTag - <p> ... </p>
  95381. - Tag block - Gen<None> - 4 - (3:0,3)
  95382. - Markup span - Gen<Markup> - [<br>] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:3
  95383. - SyntaxKind.OpenAngle;[<];
  95384. - SyntaxKind.Text;[br];
  95385. - SyntaxKind.CloseAngle;[>];
  95386. - Tag block - Gen<TagHelper> - 17 - (7:0,7) - strong - StrongTagHelper
  95387. - StartTagAndEndTag - <strong> ... </strong>
  95388. +RazorDocument - [0..28)::28 - [<p><br><strong></strong></p>]
  95389. + MarkupBlock - [0..28)::28
  95390. + MarkupTagHelperElement - [0..28)::28 - p[StartTagAndEndTag] - PTagHelper
  95391. + MarkupTagHelperStartTag - [0..3)::3
  95392. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95393. + OpenAngle;[<];
  95394. + Text;[p];
  95395. + CloseAngle;[>];
  95396. + MarkupTagBlock - [3..7)::4 - [<br>]
  95397. + MarkupTextLiteral - [3..7)::4 - [<br>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95398. + OpenAngle;[<];
  95399. + Text;[br];
  95400. + CloseAngle;[>];
  95401. + MarkupTagHelperElement - [7..24)::17 - strong[StartTagAndEndTag] - StrongTagHelper
  95402. + MarkupTagHelperStartTag - [7..15)::8
  95403. + MarkupTextLiteral - [7..15)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95404. + OpenAngle;[<];
  95405. + Text;[strong];
  95406. + CloseAngle;[>];
  95407. + MarkupTagHelperEndTag - [15..24)::9
  95408. + MarkupTextLiteral - [15..24)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95409. + OpenAngle;[<];
  95410. + ForwardSlash;[/];
  95411. + Text;[strong];
  95412. + CloseAngle;[>];
  95413. + MarkupTagHelperEndTag - [24..28)::4
  95414. + MarkupTextLiteral - [24..28)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95415. + OpenAngle;[<];
  95416. + ForwardSlash;[/];
  95417. + Text;[p];
  95418. + CloseAngle;[>];
  95419. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent4.stree.txt
  95420. index b27259b12da..823a54af0b2 100644
  95421. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent4.stree.txt
  95422. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent4.stree.txt
  95423. @@ -1,12 +1,43 @@
  95424. -Markup block - Gen<None> - 35 - (0:0,0)
  95425. - Tag block - Gen<TagHelper> - 35 - (0:0,0) - p - PTagHelper
  95426. - StartTagAndEndTag - <p> ... </p>
  95427. - Tag block - Gen<TagHelper> - 11 - (3:0,3) - p - PTagHelper
  95428. - StartTagAndEndTag - <p> ... </p>
  95429. - Tag block - Gen<None> - 4 - (6:0,6)
  95430. - Markup span - Gen<Markup> - [<br>] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:3
  95431. - SyntaxKind.OpenAngle;[<];
  95432. - SyntaxKind.Text;[br];
  95433. - SyntaxKind.CloseAngle;[>];
  95434. - Tag block - Gen<TagHelper> - 17 - (14:0,14) - strong - StrongTagHelper
  95435. - StartTagAndEndTag - <strong> ... </strong>
  95436. +RazorDocument - [0..35)::35 - [<p><p><br></p><strong></strong></p>]
  95437. + MarkupBlock - [0..35)::35
  95438. + MarkupTagHelperElement - [0..35)::35 - p[StartTagAndEndTag] - PTagHelper
  95439. + MarkupTagHelperStartTag - [0..3)::3
  95440. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95441. + OpenAngle;[<];
  95442. + Text;[p];
  95443. + CloseAngle;[>];
  95444. + MarkupTagHelperElement - [3..14)::11 - p[StartTagAndEndTag] - PTagHelper
  95445. + MarkupTagHelperStartTag - [3..6)::3
  95446. + MarkupTextLiteral - [3..6)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95447. + OpenAngle;[<];
  95448. + Text;[p];
  95449. + CloseAngle;[>];
  95450. + MarkupTagBlock - [6..10)::4 - [<br>]
  95451. + MarkupTextLiteral - [6..10)::4 - [<br>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95452. + OpenAngle;[<];
  95453. + Text;[br];
  95454. + CloseAngle;[>];
  95455. + MarkupTagHelperEndTag - [10..14)::4
  95456. + MarkupTextLiteral - [10..14)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95457. + OpenAngle;[<];
  95458. + ForwardSlash;[/];
  95459. + Text;[p];
  95460. + CloseAngle;[>];
  95461. + MarkupTagHelperElement - [14..31)::17 - strong[StartTagAndEndTag] - StrongTagHelper
  95462. + MarkupTagHelperStartTag - [14..22)::8
  95463. + MarkupTextLiteral - [14..22)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95464. + OpenAngle;[<];
  95465. + Text;[strong];
  95466. + CloseAngle;[>];
  95467. + MarkupTagHelperEndTag - [22..31)::9
  95468. + MarkupTextLiteral - [22..31)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95469. + OpenAngle;[<];
  95470. + ForwardSlash;[/];
  95471. + Text;[strong];
  95472. + CloseAngle;[>];
  95473. + MarkupTagHelperEndTag - [31..35)::4
  95474. + MarkupTextLiteral - [31..35)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95475. + OpenAngle;[<];
  95476. + ForwardSlash;[/];
  95477. + Text;[p];
  95478. + CloseAngle;[>];
  95479. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent5.stree.txt
  95480. index 1ab6c121d7b..1adcc775ec3 100644
  95481. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent5.stree.txt
  95482. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent5.stree.txt
  95483. @@ -1,14 +1,19 @@
  95484. -Markup block - Gen<None> - 24 - (0:0,0)
  95485. - Tag block - Gen<TagHelper> - 7 - (0:0,0) - input - InputTagHelper
  95486. - StartTagOnly - <input>
  95487. - Tag block - Gen<None> - 8 - (7:0,7)
  95488. - Markup span - Gen<Markup> - [<strong>] - SpanEditHandler;Accepts:Any - (7:0,7) - Tokens:3
  95489. - SyntaxKind.OpenAngle;[<];
  95490. - SyntaxKind.Text;[strong];
  95491. - SyntaxKind.CloseAngle;[>];
  95492. - Tag block - Gen<None> - 9 - (15:0,15)
  95493. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:4
  95494. - SyntaxKind.OpenAngle;[<];
  95495. - SyntaxKind.ForwardSlash;[/];
  95496. - SyntaxKind.Text;[strong];
  95497. - SyntaxKind.CloseAngle;[>];
  95498. +RazorDocument - [0..24)::24 - [<input><strong></strong>]
  95499. + MarkupBlock - [0..24)::24
  95500. + MarkupTagHelperElement - [0..7)::7 - input[StartTagOnly] - InputTagHelper
  95501. + MarkupTagHelperStartTag - [0..7)::7
  95502. + MarkupTextLiteral - [0..7)::7 - [<input>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95503. + OpenAngle;[<];
  95504. + Text;[input];
  95505. + CloseAngle;[>];
  95506. + MarkupTagBlock - [7..15)::8 - [<strong>]
  95507. + MarkupTextLiteral - [7..15)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95508. + OpenAngle;[<];
  95509. + Text;[strong];
  95510. + CloseAngle;[>];
  95511. + MarkupTagBlock - [15..24)::9 - [</strong>]
  95512. + MarkupTextLiteral - [15..24)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95513. + OpenAngle;[<];
  95514. + ForwardSlash;[/];
  95515. + Text;[strong];
  95516. + CloseAngle;[>];
  95517. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent6.stree.txt
  95518. index 377fb3c34c6..286f87c9085 100644
  95519. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent6.stree.txt
  95520. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent6.stree.txt
  95521. @@ -1,7 +1,30 @@
  95522. -Markup block - Gen<None> - 26 - (0:0,0)
  95523. - Tag block - Gen<TagHelper> - 26 - (0:0,0) - p - PTagHelper
  95524. - StartTagAndEndTag - <p> ... </p>
  95525. - Tag block - Gen<TagHelper> - 9 - (3:0,3) - input - InputTagHelper
  95526. - SelfClosing - <input />
  95527. - Tag block - Gen<TagHelper> - 10 - (12:0,12) - strong - StrongTagHelper
  95528. - SelfClosing - <strong />
  95529. +RazorDocument - [0..26)::26 - [<p><input /><strong /></p>]
  95530. + MarkupBlock - [0..26)::26
  95531. + MarkupTagHelperElement - [0..26)::26 - p[StartTagAndEndTag] - PTagHelper
  95532. + MarkupTagHelperStartTag - [0..3)::3
  95533. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95534. + OpenAngle;[<];
  95535. + Text;[p];
  95536. + CloseAngle;[>];
  95537. + MarkupTagHelperElement - [3..12)::9 - input[SelfClosing] - InputTagHelper
  95538. + MarkupTagHelperStartTag - [3..12)::9
  95539. + MarkupTextLiteral - [3..12)::9 - [<input />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95540. + OpenAngle;[<];
  95541. + Text;[input];
  95542. + Whitespace;[ ];
  95543. + ForwardSlash;[/];
  95544. + CloseAngle;[>];
  95545. + MarkupTagHelperElement - [12..22)::10 - strong[SelfClosing] - StrongTagHelper
  95546. + MarkupTagHelperStartTag - [12..22)::10
  95547. + MarkupTextLiteral - [12..22)::10 - [<strong />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95548. + OpenAngle;[<];
  95549. + Text;[strong];
  95550. + Whitespace;[ ];
  95551. + ForwardSlash;[/];
  95552. + CloseAngle;[>];
  95553. + MarkupTagHelperEndTag - [22..26)::4
  95554. + MarkupTextLiteral - [22..26)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95555. + OpenAngle;[<];
  95556. + ForwardSlash;[/];
  95557. + Text;[p];
  95558. + CloseAngle;[>];
  95559. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent7.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent7.stree.txt
  95560. index 2ad65df3f96..272441bde8b 100644
  95561. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent7.stree.txt
  95562. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent7.stree.txt
  95563. @@ -1,12 +1,29 @@
  95564. -Markup block - Gen<None> - 23 - (0:0,0)
  95565. - Tag block - Gen<TagHelper> - 23 - (0:0,0) - p - PTagHelper
  95566. - StartTagAndEndTag - <p> ... </p>
  95567. - Tag block - Gen<None> - 6 - (3:0,3)
  95568. - Markup span - Gen<Markup> - [<br />] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:5
  95569. - SyntaxKind.OpenAngle;[<];
  95570. - SyntaxKind.Text;[br];
  95571. - SyntaxKind.Whitespace;[ ];
  95572. - SyntaxKind.ForwardSlash;[/];
  95573. - SyntaxKind.CloseAngle;[>];
  95574. - Tag block - Gen<TagHelper> - 10 - (9:0,9) - strong - StrongTagHelper
  95575. - SelfClosing - <strong />
  95576. +RazorDocument - [0..23)::23 - [<p><br /><strong /></p>]
  95577. + MarkupBlock - [0..23)::23
  95578. + MarkupTagHelperElement - [0..23)::23 - p[StartTagAndEndTag] - PTagHelper
  95579. + MarkupTagHelperStartTag - [0..3)::3
  95580. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95581. + OpenAngle;[<];
  95582. + Text;[p];
  95583. + CloseAngle;[>];
  95584. + MarkupTagBlock - [3..9)::6 - [<br />]
  95585. + MarkupTextLiteral - [3..9)::6 - [<br />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95586. + OpenAngle;[<];
  95587. + Text;[br];
  95588. + Whitespace;[ ];
  95589. + ForwardSlash;[/];
  95590. + CloseAngle;[>];
  95591. + MarkupTagHelperElement - [9..19)::10 - strong[SelfClosing] - StrongTagHelper
  95592. + MarkupTagHelperStartTag - [9..19)::10
  95593. + MarkupTextLiteral - [9..19)::10 - [<strong />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95594. + OpenAngle;[<];
  95595. + Text;[strong];
  95596. + Whitespace;[ ];
  95597. + ForwardSlash;[/];
  95598. + CloseAngle;[>];
  95599. + MarkupTagHelperEndTag - [19..23)::4
  95600. + MarkupTextLiteral - [19..23)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95601. + OpenAngle;[<];
  95602. + ForwardSlash;[/];
  95603. + Text;[p];
  95604. + CloseAngle;[>];
  95605. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent8.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent8.stree.txt
  95606. index 8f5688bdd5a..71a820bd467 100644
  95607. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent8.stree.txt
  95608. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNestedVoidSelfClosingRequiredParent8.stree.txt
  95609. @@ -1,14 +1,41 @@
  95610. -Markup block - Gen<None> - 30 - (0:0,0)
  95611. - Tag block - Gen<TagHelper> - 30 - (0:0,0) - p - PTagHelper
  95612. - StartTagAndEndTag - <p> ... </p>
  95613. - Tag block - Gen<TagHelper> - 13 - (3:0,3) - p - PTagHelper
  95614. - StartTagAndEndTag - <p> ... </p>
  95615. - Tag block - Gen<None> - 6 - (6:0,6)
  95616. - Markup span - Gen<Markup> - [<br />] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:5
  95617. - SyntaxKind.OpenAngle;[<];
  95618. - SyntaxKind.Text;[br];
  95619. - SyntaxKind.Whitespace;[ ];
  95620. - SyntaxKind.ForwardSlash;[/];
  95621. - SyntaxKind.CloseAngle;[>];
  95622. - Tag block - Gen<TagHelper> - 10 - (16:0,16) - strong - StrongTagHelper
  95623. - SelfClosing - <strong />
  95624. +RazorDocument - [0..30)::30 - [<p><p><br /></p><strong /></p>]
  95625. + MarkupBlock - [0..30)::30
  95626. + MarkupTagHelperElement - [0..30)::30 - p[StartTagAndEndTag] - PTagHelper
  95627. + MarkupTagHelperStartTag - [0..3)::3
  95628. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95629. + OpenAngle;[<];
  95630. + Text;[p];
  95631. + CloseAngle;[>];
  95632. + MarkupTagHelperElement - [3..16)::13 - p[StartTagAndEndTag] - PTagHelper
  95633. + MarkupTagHelperStartTag - [3..6)::3
  95634. + MarkupTextLiteral - [3..6)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95635. + OpenAngle;[<];
  95636. + Text;[p];
  95637. + CloseAngle;[>];
  95638. + MarkupTagBlock - [6..12)::6 - [<br />]
  95639. + MarkupTextLiteral - [6..12)::6 - [<br />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95640. + OpenAngle;[<];
  95641. + Text;[br];
  95642. + Whitespace;[ ];
  95643. + ForwardSlash;[/];
  95644. + CloseAngle;[>];
  95645. + MarkupTagHelperEndTag - [12..16)::4
  95646. + MarkupTextLiteral - [12..16)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95647. + OpenAngle;[<];
  95648. + ForwardSlash;[/];
  95649. + Text;[p];
  95650. + CloseAngle;[>];
  95651. + MarkupTagHelperElement - [16..26)::10 - strong[SelfClosing] - StrongTagHelper
  95652. + MarkupTagHelperStartTag - [16..26)::10
  95653. + MarkupTextLiteral - [16..26)::10 - [<strong />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95654. + OpenAngle;[<];
  95655. + Text;[strong];
  95656. + Whitespace;[ ];
  95657. + ForwardSlash;[/];
  95658. + CloseAngle;[>];
  95659. + MarkupTagHelperEndTag - [26..30)::4
  95660. + MarkupTextLiteral - [26..30)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95661. + OpenAngle;[<];
  95662. + ForwardSlash;[/];
  95663. + Text;[p];
  95664. + CloseAngle;[>];
  95665. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNullTagNameWithAllowedChildrenForCatchAll.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNullTagNameWithAllowedChildrenForCatchAll.stree.txt
  95666. index 087bf2552c4..4c501a22581 100644
  95667. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNullTagNameWithAllowedChildrenForCatchAll.stree.txt
  95668. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNullTagNameWithAllowedChildrenForCatchAll.stree.txt
  95669. @@ -1,7 +1,18 @@
  95670. -Markup block - Gen<None> - 9 - (0:0,0)
  95671. - Tag block - Gen<TagHelper> - 9 - (0:0,0) - p - PTagHelper - CatchAllTagHelper
  95672. - StartTagAndEndTag - <p> ... </p>
  95673. - Tag block - Gen<None> - 2 - (3:0,3)
  95674. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (3:0,3) - Tokens:2
  95675. - SyntaxKind.OpenAngle;[<];
  95676. - SyntaxKind.ForwardSlash;[/];
  95677. +RazorDocument - [0..9)::9 - [<p></</p>]
  95678. + MarkupBlock - [0..9)::9
  95679. + MarkupTagHelperElement - [0..9)::9 - p[StartTagAndEndTag] - PTagHelper - CatchAllTagHelper
  95680. + MarkupTagHelperStartTag - [0..3)::3
  95681. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95682. + OpenAngle;[<];
  95683. + Text;[p];
  95684. + CloseAngle;[>];
  95685. + MarkupTagBlock - [3..5)::2 - [</]
  95686. + MarkupTextLiteral - [3..5)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95687. + OpenAngle;[<];
  95688. + ForwardSlash;[/];
  95689. + MarkupTagHelperEndTag - [5..9)::4
  95690. + MarkupTextLiteral - [5..9)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95691. + OpenAngle;[<];
  95692. + ForwardSlash;[/];
  95693. + Text;[p];
  95694. + CloseAngle;[>];
  95695. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNullTagNameWithAllowedChildrenForCatchAllWithPrefix.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNullTagNameWithAllowedChildrenForCatchAllWithPrefix.stree.txt
  95696. index eb1d8656032..dc937c139a9 100644
  95697. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNullTagNameWithAllowedChildrenForCatchAllWithPrefix.stree.txt
  95698. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsNullTagNameWithAllowedChildrenForCatchAllWithPrefix.stree.txt
  95699. @@ -1,7 +1,18 @@
  95700. -Markup block - Gen<None> - 15 - (0:0,0)
  95701. - Tag block - Gen<TagHelper> - 15 - (0:0,0) - th:p - PTagHelper - CatchAllTagHelper
  95702. - StartTagAndEndTag - <th:p> ... </th:p>
  95703. - Tag block - Gen<None> - 2 - (6:0,6)
  95704. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (6:0,6) - Tokens:2
  95705. - SyntaxKind.OpenAngle;[<];
  95706. - SyntaxKind.ForwardSlash;[/];
  95707. +RazorDocument - [0..15)::15 - [<th:p></</th:p>]
  95708. + MarkupBlock - [0..15)::15
  95709. + MarkupTagHelperElement - [0..15)::15 - th:p[StartTagAndEndTag] - PTagHelper - CatchAllTagHelper
  95710. + MarkupTagHelperStartTag - [0..6)::6
  95711. + MarkupTextLiteral - [0..6)::6 - [<th:p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95712. + OpenAngle;[<];
  95713. + Text;[th:p];
  95714. + CloseAngle;[>];
  95715. + MarkupTagBlock - [6..8)::2 - [</]
  95716. + MarkupTextLiteral - [6..8)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95717. + OpenAngle;[<];
  95718. + ForwardSlash;[/];
  95719. + MarkupTagHelperEndTag - [8..15)::7
  95720. + MarkupTextLiteral - [8..15)::7 - [</th:p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95721. + OpenAngle;[<];
  95722. + ForwardSlash;[/];
  95723. + Text;[th:p];
  95724. + CloseAngle;[>];
  95725. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsPartialRequiredParentTags1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsPartialRequiredParentTags1.stree.txt
  95726. index cb816d8adc1..0d18d3c3396 100644
  95727. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsPartialRequiredParentTags1.stree.txt
  95728. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsPartialRequiredParentTags1.stree.txt
  95729. @@ -1,5 +1,14 @@
  95730. -Markup block - Gen<None> - 11 - (0:0,0)
  95731. - Tag block - Gen<TagHelper> - 11 - (0:0,0) - p - PTagHelper - CatchALlTagHelper
  95732. - StartTagAndEndTag - <p>
  95733. - Tag block - Gen<TagHelper> - 8 - (3:0,3) - strong - StrongTagHelper - CatchALlTagHelper
  95734. - StartTagAndEndTag - <strong>
  95735. +RazorDocument - [0..11)::11 - [<p><strong>]
  95736. + MarkupBlock - [0..11)::11
  95737. + MarkupTagHelperElement - [0..11)::11 - p[StartTagAndEndTag] - PTagHelper - CatchALlTagHelper
  95738. + MarkupTagHelperStartTag - [0..3)::3
  95739. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95740. + OpenAngle;[<];
  95741. + Text;[p];
  95742. + CloseAngle;[>];
  95743. + MarkupTagHelperElement - [3..11)::8 - strong[StartTagAndEndTag] - StrongTagHelper - CatchALlTagHelper
  95744. + MarkupTagHelperStartTag - [3..11)::8
  95745. + MarkupTextLiteral - [3..11)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95746. + OpenAngle;[<];
  95747. + Text;[strong];
  95748. + CloseAngle;[>];
  95749. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsPartialRequiredParentTags2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsPartialRequiredParentTags2.stree.txt
  95750. index c413ca3712d..d461b06212a 100644
  95751. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsPartialRequiredParentTags2.stree.txt
  95752. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsPartialRequiredParentTags2.stree.txt
  95753. @@ -1,5 +1,20 @@
  95754. -Markup block - Gen<None> - 20 - (0:0,0)
  95755. - Tag block - Gen<TagHelper> - 20 - (0:0,0) - p - PTagHelper - CatchALlTagHelper
  95756. - StartTagAndEndTag - <p>
  95757. - Tag block - Gen<TagHelper> - 17 - (3:0,3) - strong - StrongTagHelper - CatchALlTagHelper
  95758. - StartTagAndEndTag - <strong> ... </strong>
  95759. +RazorDocument - [0..20)::20 - [<p><strong></strong>]
  95760. + MarkupBlock - [0..20)::20
  95761. + MarkupTagHelperElement - [0..20)::20 - p[StartTagAndEndTag] - PTagHelper - CatchALlTagHelper
  95762. + MarkupTagHelperStartTag - [0..3)::3
  95763. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95764. + OpenAngle;[<];
  95765. + Text;[p];
  95766. + CloseAngle;[>];
  95767. + MarkupTagHelperElement - [3..20)::17 - strong[StartTagAndEndTag] - StrongTagHelper - CatchALlTagHelper
  95768. + MarkupTagHelperStartTag - [3..11)::8
  95769. + MarkupTextLiteral - [3..11)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95770. + OpenAngle;[<];
  95771. + Text;[strong];
  95772. + CloseAngle;[>];
  95773. + MarkupTagHelperEndTag - [11..20)::9
  95774. + MarkupTextLiteral - [11..20)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95775. + OpenAngle;[<];
  95776. + ForwardSlash;[/];
  95777. + Text;[strong];
  95778. + CloseAngle;[>];
  95779. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsPartialRequiredParentTags3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsPartialRequiredParentTags3.stree.txt
  95780. index 2d2b3021211..c052a766632 100644
  95781. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsPartialRequiredParentTags3.stree.txt
  95782. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsPartialRequiredParentTags3.stree.txt
  95783. @@ -1,7 +1,26 @@
  95784. -Markup block - Gen<None> - 23 - (0:0,0)
  95785. - Tag block - Gen<TagHelper> - 15 - (0:0,0) - p - PTagHelper - CatchALlTagHelper
  95786. - StartTagAndEndTag - <p> ... </p>
  95787. - Tag block - Gen<TagHelper> - 8 - (3:0,3) - strong - StrongTagHelper - CatchALlTagHelper
  95788. - StartTagAndEndTag - <strong>
  95789. - Tag block - Gen<TagHelper> - 8 - (15:0,15) - strong - StrongTagHelper - CatchALlTagHelper
  95790. - StartTagAndEndTag - <strong>
  95791. +RazorDocument - [0..23)::23 - [<p><strong></p><strong>]
  95792. + MarkupBlock - [0..23)::23
  95793. + MarkupTagHelperElement - [0..15)::15 - p[StartTagAndEndTag] - PTagHelper - CatchALlTagHelper
  95794. + MarkupTagHelperStartTag - [0..3)::3
  95795. + MarkupTextLiteral - [0..3)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95796. + OpenAngle;[<];
  95797. + Text;[p];
  95798. + CloseAngle;[>];
  95799. + MarkupTagHelperElement - [3..11)::8 - strong[StartTagAndEndTag] - StrongTagHelper - CatchALlTagHelper
  95800. + MarkupTagHelperStartTag - [3..11)::8
  95801. + MarkupTextLiteral - [3..11)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95802. + OpenAngle;[<];
  95803. + Text;[strong];
  95804. + CloseAngle;[>];
  95805. + MarkupTagHelperEndTag - [11..15)::4
  95806. + MarkupTextLiteral - [11..15)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95807. + OpenAngle;[<];
  95808. + ForwardSlash;[/];
  95809. + Text;[p];
  95810. + CloseAngle;[>];
  95811. + MarkupTagHelperElement - [15..23)::8 - strong[StartTagAndEndTag] - StrongTagHelper - CatchALlTagHelper
  95812. + MarkupTagHelperStartTag - [15..23)::8
  95813. + MarkupTextLiteral - [15..23)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95814. + OpenAngle;[<];
  95815. + Text;[strong];
  95816. + CloseAngle;[>];
  95817. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsPartialRequiredParentTags4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsPartialRequiredParentTags4.stree.txt
  95818. index 446e5d6f5a7..4d3b6a25289 100644
  95819. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsPartialRequiredParentTags4.stree.txt
  95820. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsPartialRequiredParentTags4.stree.txt
  95821. @@ -1,21 +1,41 @@
  95822. -Markup block - Gen<None> - 36 - (0:0,0)
  95823. - Tag block - Gen<None> - 1 - (0:0,0)
  95824. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  95825. - SyntaxKind.OpenAngle;[<];
  95826. - Tag block - Gen<TagHelper> - 35 - (1:0,1) - p - PTagHelper - CatchALlTagHelper
  95827. - StartTagAndEndTag - <p> ... </p>
  95828. - Tag block - Gen<None> - 1 - (4:0,4)
  95829. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  95830. - SyntaxKind.OpenAngle;[<];
  95831. - Tag block - Gen<TagHelper> - 18 - (5:0,5) - strong - StrongTagHelper - CatchALlTagHelper
  95832. - StartTagAndEndTag - <strong> ... </strong
  95833. - Tag block - Gen<None> - 2 - (13:0,13)
  95834. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:2
  95835. - SyntaxKind.OpenAngle;[<];
  95836. - SyntaxKind.ForwardSlash;[/];
  95837. - Tag block - Gen<None> - 9 - (23:0,23)
  95838. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:4
  95839. - SyntaxKind.OpenAngle;[<];
  95840. - SyntaxKind.ForwardSlash;[/];
  95841. - SyntaxKind.Text;[strong];
  95842. - SyntaxKind.CloseAngle;[>];
  95843. +RazorDocument - [0..36)::36 - [<<p><<strong></</strong</strong></p>]
  95844. + MarkupBlock - [0..36)::36
  95845. + MarkupTagBlock - [0..1)::1 - [<]
  95846. + MarkupTextLiteral - [0..1)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95847. + OpenAngle;[<];
  95848. + MarkupTagHelperElement - [1..36)::35 - p[StartTagAndEndTag] - PTagHelper - CatchALlTagHelper
  95849. + MarkupTagHelperStartTag - [1..4)::3
  95850. + MarkupTextLiteral - [1..4)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95851. + OpenAngle;[<];
  95852. + Text;[p];
  95853. + CloseAngle;[>];
  95854. + MarkupTagBlock - [4..5)::1 - [<]
  95855. + MarkupTextLiteral - [4..5)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95856. + OpenAngle;[<];
  95857. + MarkupTagHelperElement - [5..23)::18 - strong[StartTagAndEndTag] - StrongTagHelper - CatchALlTagHelper
  95858. + MarkupTagHelperStartTag - [5..13)::8
  95859. + MarkupTextLiteral - [5..13)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95860. + OpenAngle;[<];
  95861. + Text;[strong];
  95862. + CloseAngle;[>];
  95863. + MarkupTagBlock - [13..15)::2 - [</]
  95864. + MarkupTextLiteral - [13..15)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95865. + OpenAngle;[<];
  95866. + ForwardSlash;[/];
  95867. + MarkupTagHelperEndTag - [15..23)::8
  95868. + MarkupTextLiteral - [15..23)::8 - [</strong] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95869. + OpenAngle;[<];
  95870. + ForwardSlash;[/];
  95871. + Text;[strong];
  95872. + MarkupTagBlock - [23..32)::9 - [</strong>]
  95873. + MarkupTextLiteral - [23..32)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95874. + OpenAngle;[<];
  95875. + ForwardSlash;[/];
  95876. + Text;[strong];
  95877. + CloseAngle;[>];
  95878. + MarkupTagHelperEndTag - [32..36)::4
  95879. + MarkupTextLiteral - [32..36)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95880. + OpenAngle;[<];
  95881. + ForwardSlash;[/];
  95882. + Text;[p];
  95883. + CloseAngle;[>];
  95884. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsPartialRequiredParentTags5.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsPartialRequiredParentTags5.stree.txt
  95885. index e97170dc3a3..9aac8c37454 100644
  95886. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsPartialRequiredParentTags5.stree.txt
  95887. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsPartialRequiredParentTags5.stree.txt
  95888. @@ -1,21 +1,42 @@
  95889. -Markup block - Gen<None> - 37 - (0:0,0)
  95890. - Tag block - Gen<None> - 1 - (0:0,0)
  95891. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  95892. - SyntaxKind.OpenAngle;[<];
  95893. - Tag block - Gen<TagHelper> - 36 - (1:0,1) - p - PTagHelper - CatchALlTagHelper
  95894. - StartTagAndEndTag - <p> ... </p>
  95895. - Tag block - Gen<None> - 1 - (4:0,4)
  95896. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  95897. - SyntaxKind.OpenAngle;[<];
  95898. - Tag block - Gen<TagHelper> - 19 - (5:0,5) - strong - StrongTagHelper - CatchALlTagHelper
  95899. - StartTagAndEndTag - <strong> ... </strong>
  95900. - Tag block - Gen<None> - 2 - (13:0,13)
  95901. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:2
  95902. - SyntaxKind.OpenAngle;[<];
  95903. - SyntaxKind.ForwardSlash;[/];
  95904. - Tag block - Gen<None> - 9 - (24:0,24)
  95905. - Markup span - Gen<Markup> - [</strong>] - SpanEditHandler;Accepts:Any - (24:0,24) - Tokens:4
  95906. - SyntaxKind.OpenAngle;[<];
  95907. - SyntaxKind.ForwardSlash;[/];
  95908. - SyntaxKind.Text;[strong];
  95909. - SyntaxKind.CloseAngle;[>];
  95910. +RazorDocument - [0..37)::37 - [<<p><<strong></</strong></strong></p>]
  95911. + MarkupBlock - [0..37)::37
  95912. + MarkupTagBlock - [0..1)::1 - [<]
  95913. + MarkupTextLiteral - [0..1)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95914. + OpenAngle;[<];
  95915. + MarkupTagHelperElement - [1..37)::36 - p[StartTagAndEndTag] - PTagHelper - CatchALlTagHelper
  95916. + MarkupTagHelperStartTag - [1..4)::3
  95917. + MarkupTextLiteral - [1..4)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95918. + OpenAngle;[<];
  95919. + Text;[p];
  95920. + CloseAngle;[>];
  95921. + MarkupTagBlock - [4..5)::1 - [<]
  95922. + MarkupTextLiteral - [4..5)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95923. + OpenAngle;[<];
  95924. + MarkupTagHelperElement - [5..24)::19 - strong[StartTagAndEndTag] - StrongTagHelper - CatchALlTagHelper
  95925. + MarkupTagHelperStartTag - [5..13)::8
  95926. + MarkupTextLiteral - [5..13)::8 - [<strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95927. + OpenAngle;[<];
  95928. + Text;[strong];
  95929. + CloseAngle;[>];
  95930. + MarkupTagBlock - [13..15)::2 - [</]
  95931. + MarkupTextLiteral - [13..15)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95932. + OpenAngle;[<];
  95933. + ForwardSlash;[/];
  95934. + MarkupTagHelperEndTag - [15..24)::9
  95935. + MarkupTextLiteral - [15..24)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95936. + OpenAngle;[<];
  95937. + ForwardSlash;[/];
  95938. + Text;[strong];
  95939. + CloseAngle;[>];
  95940. + MarkupTagBlock - [24..33)::9 - [</strong>]
  95941. + MarkupTextLiteral - [24..33)::9 - [</strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95942. + OpenAngle;[<];
  95943. + ForwardSlash;[/];
  95944. + Text;[strong];
  95945. + CloseAngle;[>];
  95946. + MarkupTagHelperEndTag - [33..37)::4
  95947. + MarkupTextLiteral - [33..37)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95948. + OpenAngle;[<];
  95949. + ForwardSlash;[/];
  95950. + Text;[p];
  95951. + CloseAngle;[>];
  95952. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsPartialRequiredParentTags6.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsPartialRequiredParentTags6.stree.txt
  95953. index 0dcb4d95dc2..c51a7114841 100644
  95954. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsPartialRequiredParentTags6.stree.txt
  95955. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsPartialRequiredParentTags6.stree.txt
  95956. @@ -1,24 +1,45 @@
  95957. -Markup block - Gen<None> - 38 - (0:0,0)
  95958. - Tag block - Gen<None> - 1 - (0:0,0)
  95959. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:1
  95960. - SyntaxKind.OpenAngle;[<];
  95961. - Tag block - Gen<TagHelper> - 37 - (1:0,1) - p - PTagHelper - CatchALlTagHelper
  95962. - StartTagAndEndTag - <p> ... </p>
  95963. - Tag block - Gen<None> - 1 - (4:0,4)
  95964. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (4:0,4) - Tokens:1
  95965. - SyntaxKind.OpenAngle;[<];
  95966. - Tag block - Gen<TagHelper> - 20 - (5:0,5) - custom - CatchALlTagHelper
  95967. - StartTagAndEndTag - <custom> ... </custom>
  95968. - Tag block - Gen<None> - 2 - (13:0,13)
  95969. - Markup span - Gen<Markup> - [</] - SpanEditHandler;Accepts:Any - (13:0,13) - Tokens:2
  95970. - SyntaxKind.OpenAngle;[<];
  95971. - SyntaxKind.ForwardSlash;[/];
  95972. - Tag block - Gen<None> - 1 - (15:0,15)
  95973. - Markup span - Gen<Markup> - [<] - SpanEditHandler;Accepts:Any - (15:0,15) - Tokens:1
  95974. - SyntaxKind.OpenAngle;[<];
  95975. - Tag block - Gen<None> - 9 - (25:0,25)
  95976. - Markup span - Gen<Markup> - [</custom>] - SpanEditHandler;Accepts:Any - (25:0,25) - Tokens:4
  95977. - SyntaxKind.OpenAngle;[<];
  95978. - SyntaxKind.ForwardSlash;[/];
  95979. - SyntaxKind.Text;[custom];
  95980. - SyntaxKind.CloseAngle;[>];
  95981. +RazorDocument - [0..38)::38 - [<<p><<custom></<</custom></custom></p>]
  95982. + MarkupBlock - [0..38)::38
  95983. + MarkupTagBlock - [0..1)::1 - [<]
  95984. + MarkupTextLiteral - [0..1)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95985. + OpenAngle;[<];
  95986. + MarkupTagHelperElement - [1..38)::37 - p[StartTagAndEndTag] - PTagHelper - CatchALlTagHelper
  95987. + MarkupTagHelperStartTag - [1..4)::3
  95988. + MarkupTextLiteral - [1..4)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95989. + OpenAngle;[<];
  95990. + Text;[p];
  95991. + CloseAngle;[>];
  95992. + MarkupTagBlock - [4..5)::1 - [<]
  95993. + MarkupTextLiteral - [4..5)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95994. + OpenAngle;[<];
  95995. + MarkupTagHelperElement - [5..25)::20 - custom[StartTagAndEndTag] - CatchALlTagHelper
  95996. + MarkupTagHelperStartTag - [5..13)::8
  95997. + MarkupTextLiteral - [5..13)::8 - [<custom>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  95998. + OpenAngle;[<];
  95999. + Text;[custom];
  96000. + CloseAngle;[>];
  96001. + MarkupTagBlock - [13..15)::2 - [</]
  96002. + MarkupTextLiteral - [13..15)::2 - [</] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96003. + OpenAngle;[<];
  96004. + ForwardSlash;[/];
  96005. + MarkupTagBlock - [15..16)::1 - [<]
  96006. + MarkupTextLiteral - [15..16)::1 - [<] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96007. + OpenAngle;[<];
  96008. + MarkupTagHelperEndTag - [16..25)::9
  96009. + MarkupTextLiteral - [16..25)::9 - [</custom>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96010. + OpenAngle;[<];
  96011. + ForwardSlash;[/];
  96012. + Text;[custom];
  96013. + CloseAngle;[>];
  96014. + MarkupTagBlock - [25..34)::9 - [</custom>]
  96015. + MarkupTextLiteral - [25..34)::9 - [</custom>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96016. + OpenAngle;[<];
  96017. + ForwardSlash;[/];
  96018. + Text;[custom];
  96019. + CloseAngle;[>];
  96020. + MarkupTagHelperEndTag - [34..38)::4
  96021. + MarkupTextLiteral - [34..38)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96022. + OpenAngle;[<];
  96023. + ForwardSlash;[/];
  96024. + Text;[p];
  96025. + CloseAngle;[>];
  96026. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsTagHelperPrefixAndAllowedChildren.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsTagHelperPrefixAndAllowedChildren.stree.txt
  96027. index 921662bbfe1..72123df7a2e 100644
  96028. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsTagHelperPrefixAndAllowedChildren.stree.txt
  96029. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsTagHelperPrefixAndAllowedChildren.stree.txt
  96030. @@ -1,5 +1,26 @@
  96031. -Markup block - Gen<None> - 36 - (0:0,0)
  96032. - Tag block - Gen<TagHelper> - 36 - (0:0,0) - th:p - PTagHelper
  96033. - StartTagAndEndTag - <th:p> ... </th:p>
  96034. - Tag block - Gen<TagHelper> - 23 - (6:0,6) - th:strong - StrongTagHelper
  96035. - StartTagAndEndTag - <th:strong> ... </th:strong>
  96036. +RazorDocument - [0..36)::36 - [<th:p><th:strong></th:strong></th:p>]
  96037. + MarkupBlock - [0..36)::36
  96038. + MarkupTagHelperElement - [0..36)::36 - th:p[StartTagAndEndTag] - PTagHelper
  96039. + MarkupTagHelperStartTag - [0..6)::6
  96040. + MarkupTextLiteral - [0..6)::6 - [<th:p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96041. + OpenAngle;[<];
  96042. + Text;[th:p];
  96043. + CloseAngle;[>];
  96044. + MarkupTagHelperElement - [6..29)::23 - th:strong[StartTagAndEndTag] - StrongTagHelper
  96045. + MarkupTagHelperStartTag - [6..17)::11
  96046. + MarkupTextLiteral - [6..17)::11 - [<th:strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96047. + OpenAngle;[<];
  96048. + Text;[th:strong];
  96049. + CloseAngle;[>];
  96050. + MarkupTagHelperEndTag - [17..29)::12
  96051. + MarkupTextLiteral - [17..29)::12 - [</th:strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96052. + OpenAngle;[<];
  96053. + ForwardSlash;[/];
  96054. + Text;[th:strong];
  96055. + CloseAngle;[>];
  96056. + MarkupTagHelperEndTag - [29..36)::7
  96057. + MarkupTextLiteral - [29..36)::7 - [</th:p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96058. + OpenAngle;[<];
  96059. + ForwardSlash;[/];
  96060. + Text;[th:p];
  96061. + CloseAngle;[>];
  96062. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsTagHelperPrefixAndAllowedChildrenAndRequireParent.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsTagHelperPrefixAndAllowedChildrenAndRequireParent.stree.txt
  96063. index 921662bbfe1..72123df7a2e 100644
  96064. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsTagHelperPrefixAndAllowedChildrenAndRequireParent.stree.txt
  96065. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsTagHelperPrefixAndAllowedChildrenAndRequireParent.stree.txt
  96066. @@ -1,5 +1,26 @@
  96067. -Markup block - Gen<None> - 36 - (0:0,0)
  96068. - Tag block - Gen<TagHelper> - 36 - (0:0,0) - th:p - PTagHelper
  96069. - StartTagAndEndTag - <th:p> ... </th:p>
  96070. - Tag block - Gen<TagHelper> - 23 - (6:0,6) - th:strong - StrongTagHelper
  96071. - StartTagAndEndTag - <th:strong> ... </th:strong>
  96072. +RazorDocument - [0..36)::36 - [<th:p><th:strong></th:strong></th:p>]
  96073. + MarkupBlock - [0..36)::36
  96074. + MarkupTagHelperElement - [0..36)::36 - th:p[StartTagAndEndTag] - PTagHelper
  96075. + MarkupTagHelperStartTag - [0..6)::6
  96076. + MarkupTextLiteral - [0..6)::6 - [<th:p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96077. + OpenAngle;[<];
  96078. + Text;[th:p];
  96079. + CloseAngle;[>];
  96080. + MarkupTagHelperElement - [6..29)::23 - th:strong[StartTagAndEndTag] - StrongTagHelper
  96081. + MarkupTagHelperStartTag - [6..17)::11
  96082. + MarkupTextLiteral - [6..17)::11 - [<th:strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96083. + OpenAngle;[<];
  96084. + Text;[th:strong];
  96085. + CloseAngle;[>];
  96086. + MarkupTagHelperEndTag - [17..29)::12
  96087. + MarkupTextLiteral - [17..29)::12 - [</th:strong>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96088. + OpenAngle;[<];
  96089. + ForwardSlash;[/];
  96090. + Text;[th:strong];
  96091. + CloseAngle;[>];
  96092. + MarkupTagHelperEndTag - [29..36)::7
  96093. + MarkupTextLiteral - [29..36)::7 - [</th:p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96094. + OpenAngle;[<];
  96095. + ForwardSlash;[/];
  96096. + Text;[th:p];
  96097. + CloseAngle;[>];
  96098. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsTagHelpersInHtmlTypedScriptTags1.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsTagHelpersInHtmlTypedScriptTags1.stree.txt
  96099. index c1b2328c073..dbabd3d1c42 100644
  96100. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsTagHelpersInHtmlTypedScriptTags1.stree.txt
  96101. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsTagHelpersInHtmlTypedScriptTags1.stree.txt
  96102. @@ -1,27 +1,38 @@
  96103. -Markup block - Gen<None> - 43 - (0:0,0)
  96104. - Tag block - Gen<None> - 25 - (0:0,0)
  96105. - Markup span - Gen<Markup> - [<script] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  96106. - SyntaxKind.OpenAngle;[<];
  96107. - SyntaxKind.Text;[script];
  96108. - Markup block - Gen<Attr:type, type='@(7:0,7),'@(23:0,23)> - 17 - (7:0,7)
  96109. - Markup span - Gen<None> - [ type='] - SpanEditHandler;Accepts:Any - (7:0,7) - Tokens:4
  96110. - SyntaxKind.Whitespace;[ ];
  96111. - SyntaxKind.Text;[type];
  96112. - SyntaxKind.Equals;[=];
  96113. - SyntaxKind.SingleQuote;['];
  96114. - Markup span - Gen<LitAttr:@(14:0,14)> - [text/html] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:3
  96115. - SyntaxKind.Text;[text];
  96116. - SyntaxKind.ForwardSlash;[/];
  96117. - SyntaxKind.Text;[html];
  96118. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:1
  96119. - SyntaxKind.SingleQuote;['];
  96120. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (24:0,24) - Tokens:1
  96121. - SyntaxKind.CloseAngle;[>];
  96122. - Tag block - Gen<TagHelper> - 9 - (25:0,25) - input - inputtaghelper
  96123. - SelfClosing - <input />
  96124. - Tag block - Gen<None> - 9 - (34:0,34)
  96125. - Markup span - Gen<Markup> - [</script>] - SpanEditHandler;Accepts:Any - (34:0,34) - Tokens:4
  96126. - SyntaxKind.OpenAngle;[<];
  96127. - SyntaxKind.ForwardSlash;[/];
  96128. - SyntaxKind.Text;[script];
  96129. - SyntaxKind.CloseAngle;[>];
  96130. +RazorDocument - [0..43)::43 - [<script type='text/html'><input /></script>]
  96131. + MarkupBlock - [0..43)::43
  96132. + MarkupTagBlock - [0..25)::25 - [<script type='text/html'>]
  96133. + MarkupTextLiteral - [0..7)::7 - [<script] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96134. + OpenAngle;[<];
  96135. + Text;[script];
  96136. + MarkupAttributeBlock - [7..24)::17 - [ type='text/html']
  96137. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96138. + Whitespace;[ ];
  96139. + MarkupTextLiteral - [8..12)::4 - [type] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96140. + Text;[type];
  96141. + Equals;[=];
  96142. + MarkupTextLiteral - [13..14)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  96143. + SingleQuote;['];
  96144. + GenericBlock - [14..23)::9
  96145. + MarkupLiteralAttributeValue - [14..23)::9 - [text/html]
  96146. + MarkupTextLiteral - [14..23)::9 - [text/html] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96147. + Text;[text];
  96148. + ForwardSlash;[/];
  96149. + Text;[html];
  96150. + MarkupTextLiteral - [23..24)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  96151. + SingleQuote;['];
  96152. + MarkupTextLiteral - [24..25)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96153. + CloseAngle;[>];
  96154. + MarkupTagHelperElement - [25..34)::9 - input[SelfClosing] - inputtaghelper
  96155. + MarkupTagHelperStartTag - [25..34)::9
  96156. + MarkupTextLiteral - [25..34)::9 - [<input />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96157. + OpenAngle;[<];
  96158. + Text;[input];
  96159. + Whitespace;[ ];
  96160. + ForwardSlash;[/];
  96161. + CloseAngle;[>];
  96162. + MarkupTagBlock - [34..43)::9 - [</script>]
  96163. + MarkupTextLiteral - [34..43)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96164. + OpenAngle;[<];
  96165. + ForwardSlash;[/];
  96166. + Text;[script];
  96167. + CloseAngle;[>];
  96168. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsTagHelpersInHtmlTypedScriptTags2.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsTagHelpersInHtmlTypedScriptTags2.stree.txt
  96169. index 9b1e8963b53..f244fd4d6db 100644
  96170. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsTagHelpersInHtmlTypedScriptTags2.stree.txt
  96171. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsTagHelpersInHtmlTypedScriptTags2.stree.txt
  96172. @@ -1,47 +1,66 @@
  96173. -Markup block - Gen<None> - 76 - (0:0,0)
  96174. - Tag block - Gen<None> - 58 - (0:0,0)
  96175. - Markup span - Gen<Markup> - [<script] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  96176. - SyntaxKind.OpenAngle;[<];
  96177. - SyntaxKind.Text;[script];
  96178. - Markup block - Gen<Attr:id, id='@(7:0,7),'@(21:0,21)> - 15 - (7:0,7)
  96179. - Markup span - Gen<None> - [ id='] - SpanEditHandler;Accepts:Any - (7:0,7) - Tokens:4
  96180. - SyntaxKind.Whitespace;[ ];
  96181. - SyntaxKind.Text;[id];
  96182. - SyntaxKind.Equals;[=];
  96183. - SyntaxKind.SingleQuote;['];
  96184. - Markup span - Gen<LitAttr:@(12:0,12)> - [scriptTag] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:1
  96185. - SyntaxKind.Text;[scriptTag];
  96186. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (21:0,21) - Tokens:1
  96187. - SyntaxKind.SingleQuote;['];
  96188. - Markup block - Gen<Attr:type, type='@(22:0,22),'@(38:0,38)> - 17 - (22:0,22)
  96189. - Markup span - Gen<None> - [ type='] - SpanEditHandler;Accepts:Any - (22:0,22) - Tokens:4
  96190. - SyntaxKind.Whitespace;[ ];
  96191. - SyntaxKind.Text;[type];
  96192. - SyntaxKind.Equals;[=];
  96193. - SyntaxKind.SingleQuote;['];
  96194. - Markup span - Gen<LitAttr:@(29:0,29)> - [text/html] - SpanEditHandler;Accepts:Any - (29:0,29) - Tokens:3
  96195. - SyntaxKind.Text;[text];
  96196. - SyntaxKind.ForwardSlash;[/];
  96197. - SyntaxKind.Text;[html];
  96198. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (38:0,38) - Tokens:1
  96199. - SyntaxKind.SingleQuote;['];
  96200. - Markup block - Gen<Attr:class, class='@(39:0,39),'@(56:0,56)> - 18 - (39:0,39)
  96201. - Markup span - Gen<None> - [ class='] - SpanEditHandler;Accepts:Any - (39:0,39) - Tokens:4
  96202. - SyntaxKind.Whitespace;[ ];
  96203. - SyntaxKind.Text;[class];
  96204. - SyntaxKind.Equals;[=];
  96205. - SyntaxKind.SingleQuote;['];
  96206. - Markup span - Gen<LitAttr:@(47:0,47)> - [something] - SpanEditHandler;Accepts:Any - (47:0,47) - Tokens:1
  96207. - SyntaxKind.Text;[something];
  96208. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (56:0,56) - Tokens:1
  96209. - SyntaxKind.SingleQuote;['];
  96210. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (57:0,57) - Tokens:1
  96211. - SyntaxKind.CloseAngle;[>];
  96212. - Tag block - Gen<TagHelper> - 9 - (58:0,58) - input - inputtaghelper
  96213. - SelfClosing - <input />
  96214. - Tag block - Gen<None> - 9 - (67:0,67)
  96215. - Markup span - Gen<Markup> - [</script>] - SpanEditHandler;Accepts:Any - (67:0,67) - Tokens:4
  96216. - SyntaxKind.OpenAngle;[<];
  96217. - SyntaxKind.ForwardSlash;[/];
  96218. - SyntaxKind.Text;[script];
  96219. - SyntaxKind.CloseAngle;[>];
  96220. +RazorDocument - [0..76)::76 - [<script id='scriptTag' type='text/html' class='something'><input /></script>]
  96221. + MarkupBlock - [0..76)::76
  96222. + MarkupTagBlock - [0..58)::58 - [<script id='scriptTag' type='text/html' class='something'>]
  96223. + MarkupTextLiteral - [0..7)::7 - [<script] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96224. + OpenAngle;[<];
  96225. + Text;[script];
  96226. + MarkupAttributeBlock - [7..22)::15 - [ id='scriptTag']
  96227. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96228. + Whitespace;[ ];
  96229. + MarkupTextLiteral - [8..10)::2 - [id] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96230. + Text;[id];
  96231. + Equals;[=];
  96232. + MarkupTextLiteral - [11..12)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  96233. + SingleQuote;['];
  96234. + GenericBlock - [12..21)::9
  96235. + MarkupLiteralAttributeValue - [12..21)::9 - [scriptTag]
  96236. + MarkupTextLiteral - [12..21)::9 - [scriptTag] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96237. + Text;[scriptTag];
  96238. + MarkupTextLiteral - [21..22)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  96239. + SingleQuote;['];
  96240. + MarkupAttributeBlock - [22..39)::17 - [ type='text/html']
  96241. + MarkupTextLiteral - [22..23)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96242. + Whitespace;[ ];
  96243. + MarkupTextLiteral - [23..27)::4 - [type] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96244. + Text;[type];
  96245. + Equals;[=];
  96246. + MarkupTextLiteral - [28..29)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  96247. + SingleQuote;['];
  96248. + GenericBlock - [29..38)::9
  96249. + MarkupLiteralAttributeValue - [29..38)::9 - [text/html]
  96250. + MarkupTextLiteral - [29..38)::9 - [text/html] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96251. + Text;[text];
  96252. + ForwardSlash;[/];
  96253. + Text;[html];
  96254. + MarkupTextLiteral - [38..39)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  96255. + SingleQuote;['];
  96256. + MarkupAttributeBlock - [39..57)::18 - [ class='something']
  96257. + MarkupTextLiteral - [39..40)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96258. + Whitespace;[ ];
  96259. + MarkupTextLiteral - [40..45)::5 - [class] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96260. + Text;[class];
  96261. + Equals;[=];
  96262. + MarkupTextLiteral - [46..47)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  96263. + SingleQuote;['];
  96264. + GenericBlock - [47..56)::9
  96265. + MarkupLiteralAttributeValue - [47..56)::9 - [something]
  96266. + MarkupTextLiteral - [47..56)::9 - [something] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96267. + Text;[something];
  96268. + MarkupTextLiteral - [56..57)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  96269. + SingleQuote;['];
  96270. + MarkupTextLiteral - [57..58)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96271. + CloseAngle;[>];
  96272. + MarkupTagHelperElement - [58..67)::9 - input[SelfClosing] - inputtaghelper
  96273. + MarkupTagHelperStartTag - [58..67)::9
  96274. + MarkupTextLiteral - [58..67)::9 - [<input />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96275. + OpenAngle;[<];
  96276. + Text;[input];
  96277. + Whitespace;[ ];
  96278. + ForwardSlash;[/];
  96279. + CloseAngle;[>];
  96280. + MarkupTagBlock - [67..76)::9 - [</script>]
  96281. + MarkupTextLiteral - [67..76)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96282. + OpenAngle;[<];
  96283. + ForwardSlash;[/];
  96284. + Text;[script];
  96285. + CloseAngle;[>];
  96286. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsTagHelpersInHtmlTypedScriptTags3.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsTagHelpersInHtmlTypedScriptTags3.stree.txt
  96287. index 324cd570119..d10c1b64dcf 100644
  96288. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsTagHelpersInHtmlTypedScriptTags3.stree.txt
  96289. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsTagHelpersInHtmlTypedScriptTags3.stree.txt
  96290. @@ -1,53 +1,78 @@
  96291. -Markup block - Gen<None> - 84 - (0:0,0)
  96292. - Tag block - Gen<None> - 25 - (0:0,0)
  96293. - Markup span - Gen<Markup> - [<script] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  96294. - SyntaxKind.OpenAngle;[<];
  96295. - SyntaxKind.Text;[script];
  96296. - Markup block - Gen<Attr:type, type='@(7:0,7),'@(23:0,23)> - 17 - (7:0,7)
  96297. - Markup span - Gen<None> - [ type='] - SpanEditHandler;Accepts:Any - (7:0,7) - Tokens:4
  96298. - SyntaxKind.Whitespace;[ ];
  96299. - SyntaxKind.Text;[type];
  96300. - SyntaxKind.Equals;[=];
  96301. - SyntaxKind.SingleQuote;['];
  96302. - Markup span - Gen<LitAttr:@(14:0,14)> - [text/html] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:3
  96303. - SyntaxKind.Text;[text];
  96304. - SyntaxKind.ForwardSlash;[/];
  96305. - SyntaxKind.Text;[html];
  96306. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:1
  96307. - SyntaxKind.SingleQuote;['];
  96308. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (24:0,24) - Tokens:1
  96309. - SyntaxKind.CloseAngle;[>];
  96310. - Tag block - Gen<TagHelper> - 50 - (25:0,25) - p - ptaghelper
  96311. - StartTagAndEndTag - <p> ... </p>
  96312. - Tag block - Gen<None> - 25 - (28:0,28)
  96313. - Markup span - Gen<Markup> - [<script] - SpanEditHandler;Accepts:Any - (28:0,28) - Tokens:2
  96314. - SyntaxKind.OpenAngle;[<];
  96315. - SyntaxKind.Text;[script];
  96316. - Markup block - Gen<Attr:type, type='@(35:0,35),'@(51:0,51)> - 17 - (35:0,35)
  96317. - Markup span - Gen<None> - [ type='] - SpanEditHandler;Accepts:Any - (35:0,35) - Tokens:4
  96318. - SyntaxKind.Whitespace;[ ];
  96319. - SyntaxKind.Text;[type];
  96320. - SyntaxKind.Equals;[=];
  96321. - SyntaxKind.SingleQuote;['];
  96322. - Markup span - Gen<LitAttr:@(42:0,42)> - [text/html] - SpanEditHandler;Accepts:Any - (42:0,42) - Tokens:3
  96323. - SyntaxKind.Text;[text];
  96324. - SyntaxKind.ForwardSlash;[/];
  96325. - SyntaxKind.Text;[html];
  96326. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (51:0,51) - Tokens:1
  96327. - SyntaxKind.SingleQuote;['];
  96328. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (52:0,52) - Tokens:1
  96329. - SyntaxKind.CloseAngle;[>];
  96330. - Tag block - Gen<TagHelper> - 9 - (53:0,53) - input - inputtaghelper
  96331. - SelfClosing - <input />
  96332. - Tag block - Gen<None> - 9 - (62:0,62)
  96333. - Markup span - Gen<Markup> - [</script>] - SpanEditHandler;Accepts:Any - (62:0,62) - Tokens:4
  96334. - SyntaxKind.OpenAngle;[<];
  96335. - SyntaxKind.ForwardSlash;[/];
  96336. - SyntaxKind.Text;[script];
  96337. - SyntaxKind.CloseAngle;[>];
  96338. - Tag block - Gen<None> - 9 - (75:0,75)
  96339. - Markup span - Gen<Markup> - [</script>] - SpanEditHandler;Accepts:Any - (75:0,75) - Tokens:4
  96340. - SyntaxKind.OpenAngle;[<];
  96341. - SyntaxKind.ForwardSlash;[/];
  96342. - SyntaxKind.Text;[script];
  96343. - SyntaxKind.CloseAngle;[>];
  96344. +RazorDocument - [0..84)::84 - [<script type='text/html'><p><script type='text/html'><input /></script></p></script>]
  96345. + MarkupBlock - [0..84)::84
  96346. + MarkupTagBlock - [0..25)::25 - [<script type='text/html'>]
  96347. + MarkupTextLiteral - [0..7)::7 - [<script] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96348. + OpenAngle;[<];
  96349. + Text;[script];
  96350. + MarkupAttributeBlock - [7..24)::17 - [ type='text/html']
  96351. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96352. + Whitespace;[ ];
  96353. + MarkupTextLiteral - [8..12)::4 - [type] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96354. + Text;[type];
  96355. + Equals;[=];
  96356. + MarkupTextLiteral - [13..14)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  96357. + SingleQuote;['];
  96358. + GenericBlock - [14..23)::9
  96359. + MarkupLiteralAttributeValue - [14..23)::9 - [text/html]
  96360. + MarkupTextLiteral - [14..23)::9 - [text/html] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96361. + Text;[text];
  96362. + ForwardSlash;[/];
  96363. + Text;[html];
  96364. + MarkupTextLiteral - [23..24)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  96365. + SingleQuote;['];
  96366. + MarkupTextLiteral - [24..25)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96367. + CloseAngle;[>];
  96368. + MarkupTagHelperElement - [25..75)::50 - p[StartTagAndEndTag] - ptaghelper
  96369. + MarkupTagHelperStartTag - [25..28)::3
  96370. + MarkupTextLiteral - [25..28)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96371. + OpenAngle;[<];
  96372. + Text;[p];
  96373. + CloseAngle;[>];
  96374. + MarkupTagBlock - [28..53)::25 - [<script type='text/html'>]
  96375. + MarkupTextLiteral - [28..35)::7 - [<script] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96376. + OpenAngle;[<];
  96377. + Text;[script];
  96378. + MarkupAttributeBlock - [35..52)::17 - [ type='text/html']
  96379. + MarkupTextLiteral - [35..36)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96380. + Whitespace;[ ];
  96381. + MarkupTextLiteral - [36..40)::4 - [type] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96382. + Text;[type];
  96383. + Equals;[=];
  96384. + MarkupTextLiteral - [41..42)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  96385. + SingleQuote;['];
  96386. + GenericBlock - [42..51)::9
  96387. + MarkupLiteralAttributeValue - [42..51)::9 - [text/html]
  96388. + MarkupTextLiteral - [42..51)::9 - [text/html] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96389. + Text;[text];
  96390. + ForwardSlash;[/];
  96391. + Text;[html];
  96392. + MarkupTextLiteral - [51..52)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  96393. + SingleQuote;['];
  96394. + MarkupTextLiteral - [52..53)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96395. + CloseAngle;[>];
  96396. + MarkupTagHelperElement - [53..62)::9 - input[SelfClosing] - inputtaghelper
  96397. + MarkupTagHelperStartTag - [53..62)::9
  96398. + MarkupTextLiteral - [53..62)::9 - [<input />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96399. + OpenAngle;[<];
  96400. + Text;[input];
  96401. + Whitespace;[ ];
  96402. + ForwardSlash;[/];
  96403. + CloseAngle;[>];
  96404. + MarkupTagBlock - [62..71)::9 - [</script>]
  96405. + MarkupTextLiteral - [62..71)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96406. + OpenAngle;[<];
  96407. + ForwardSlash;[/];
  96408. + Text;[script];
  96409. + CloseAngle;[>];
  96410. + MarkupTagHelperEndTag - [71..75)::4
  96411. + MarkupTextLiteral - [71..75)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96412. + OpenAngle;[<];
  96413. + ForwardSlash;[/];
  96414. + Text;[p];
  96415. + CloseAngle;[>];
  96416. + MarkupTagBlock - [75..84)::9 - [</script>]
  96417. + MarkupTextLiteral - [75..84)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96418. + OpenAngle;[<];
  96419. + ForwardSlash;[/];
  96420. + Text;[script];
  96421. + CloseAngle;[>];
  96422. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsTagHelpersInHtmlTypedScriptTags4.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsTagHelpersInHtmlTypedScriptTags4.stree.txt
  96423. index 701a3080a47..42c1b2fe113 100644
  96424. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsTagHelpersInHtmlTypedScriptTags4.stree.txt
  96425. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/TagHelperParseTreeRewriterTest/UnderstandsTagHelpersInHtmlTypedScriptTags4.stree.txt
  96426. @@ -1,59 +1,80 @@
  96427. -Markup block - Gen<None> - 85 - (0:0,0)
  96428. - Tag block - Gen<None> - 25 - (0:0,0)
  96429. - Markup span - Gen<Markup> - [<script] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  96430. - SyntaxKind.OpenAngle;[<];
  96431. - SyntaxKind.Text;[script];
  96432. - Markup block - Gen<Attr:type, type='@(7:0,7),'@(23:0,23)> - 17 - (7:0,7)
  96433. - Markup span - Gen<None> - [ type='] - SpanEditHandler;Accepts:Any - (7:0,7) - Tokens:4
  96434. - SyntaxKind.Whitespace;[ ];
  96435. - SyntaxKind.Text;[type];
  96436. - SyntaxKind.Equals;[=];
  96437. - SyntaxKind.SingleQuote;['];
  96438. - Markup span - Gen<LitAttr:@(14:0,14)> - [text/html] - SpanEditHandler;Accepts:Any - (14:0,14) - Tokens:3
  96439. - SyntaxKind.Text;[text];
  96440. - SyntaxKind.ForwardSlash;[/];
  96441. - SyntaxKind.Text;[html];
  96442. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (23:0,23) - Tokens:1
  96443. - SyntaxKind.SingleQuote;['];
  96444. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (24:0,24) - Tokens:1
  96445. - SyntaxKind.CloseAngle;[>];
  96446. - Tag block - Gen<TagHelper> - 51 - (25:0,25) - p - ptaghelper
  96447. - StartTagAndEndTag - <p> ... </p>
  96448. - Tag block - Gen<None> - 26 - (28:0,28)
  96449. - Markup span - Gen<Markup> - [<script] - SpanEditHandler;Accepts:Any - (28:0,28) - Tokens:2
  96450. - SyntaxKind.OpenAngle;[<];
  96451. - SyntaxKind.Text;[script];
  96452. - Markup block - Gen<Attr:type, type='@(35:0,35),'@(52:0,52)> - 18 - (35:0,35)
  96453. - Markup span - Gen<None> - [ type='] - SpanEditHandler;Accepts:Any - (35:0,35) - Tokens:4
  96454. - SyntaxKind.Whitespace;[ ];
  96455. - SyntaxKind.Text;[type];
  96456. - SyntaxKind.Equals;[=];
  96457. - SyntaxKind.SingleQuote;['];
  96458. - Markup span - Gen<LitAttr:@(42:0,42)> - [text/] - SpanEditHandler;Accepts:Any - (42:0,42) - Tokens:2
  96459. - SyntaxKind.Text;[text];
  96460. - SyntaxKind.ForwardSlash;[/];
  96461. - Markup span - Gen<LitAttr: @(47:0,47)> - [ html] - SpanEditHandler;Accepts:Any - (47:0,47) - Tokens:2
  96462. - SyntaxKind.Whitespace;[ ];
  96463. - SyntaxKind.Text;[html];
  96464. - Markup span - Gen<None> - ['] - SpanEditHandler;Accepts:Any - (52:0,52) - Tokens:1
  96465. - SyntaxKind.SingleQuote;['];
  96466. - Markup span - Gen<Markup> - [>] - SpanEditHandler;Accepts:Any - (53:0,53) - Tokens:1
  96467. - SyntaxKind.CloseAngle;[>];
  96468. - Markup span - Gen<Markup> - [<input />] - SpanEditHandler;Accepts:Any - (54:0,54) - Tokens:5
  96469. - SyntaxKind.OpenAngle;[<];
  96470. - SyntaxKind.Text;[input];
  96471. - SyntaxKind.Whitespace;[ ];
  96472. - SyntaxKind.ForwardSlash;[/];
  96473. - SyntaxKind.CloseAngle;[>];
  96474. - Tag block - Gen<None> - 9 - (63:0,63)
  96475. - Markup span - Gen<Markup> - [</script>] - SpanEditHandler;Accepts:Any - (63:0,63) - Tokens:4
  96476. - SyntaxKind.OpenAngle;[<];
  96477. - SyntaxKind.ForwardSlash;[/];
  96478. - SyntaxKind.Text;[script];
  96479. - SyntaxKind.CloseAngle;[>];
  96480. - Tag block - Gen<None> - 9 - (76:0,76)
  96481. - Markup span - Gen<Markup> - [</script>] - SpanEditHandler;Accepts:Any - (76:0,76) - Tokens:4
  96482. - SyntaxKind.OpenAngle;[<];
  96483. - SyntaxKind.ForwardSlash;[/];
  96484. - SyntaxKind.Text;[script];
  96485. - SyntaxKind.CloseAngle;[>];
  96486. +RazorDocument - [0..85)::85 - [<script type='text/html'><p><script type='text/ html'><input /></script></p></script>]
  96487. + MarkupBlock - [0..85)::85
  96488. + MarkupTagBlock - [0..25)::25 - [<script type='text/html'>]
  96489. + MarkupTextLiteral - [0..7)::7 - [<script] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96490. + OpenAngle;[<];
  96491. + Text;[script];
  96492. + MarkupAttributeBlock - [7..24)::17 - [ type='text/html']
  96493. + MarkupTextLiteral - [7..8)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96494. + Whitespace;[ ];
  96495. + MarkupTextLiteral - [8..12)::4 - [type] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96496. + Text;[type];
  96497. + Equals;[=];
  96498. + MarkupTextLiteral - [13..14)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  96499. + SingleQuote;['];
  96500. + GenericBlock - [14..23)::9
  96501. + MarkupLiteralAttributeValue - [14..23)::9 - [text/html]
  96502. + MarkupTextLiteral - [14..23)::9 - [text/html] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96503. + Text;[text];
  96504. + ForwardSlash;[/];
  96505. + Text;[html];
  96506. + MarkupTextLiteral - [23..24)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  96507. + SingleQuote;['];
  96508. + MarkupTextLiteral - [24..25)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96509. + CloseAngle;[>];
  96510. + MarkupTagHelperElement - [25..76)::51 - p[StartTagAndEndTag] - ptaghelper
  96511. + MarkupTagHelperStartTag - [25..28)::3
  96512. + MarkupTextLiteral - [25..28)::3 - [<p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96513. + OpenAngle;[<];
  96514. + Text;[p];
  96515. + CloseAngle;[>];
  96516. + MarkupTagBlock - [28..54)::26 - [<script type='text/ html'>]
  96517. + MarkupTextLiteral - [28..35)::7 - [<script] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96518. + OpenAngle;[<];
  96519. + Text;[script];
  96520. + MarkupAttributeBlock - [35..53)::18 - [ type='text/ html']
  96521. + MarkupTextLiteral - [35..36)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96522. + Whitespace;[ ];
  96523. + MarkupTextLiteral - [36..40)::4 - [type] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96524. + Text;[type];
  96525. + Equals;[=];
  96526. + MarkupTextLiteral - [41..42)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  96527. + SingleQuote;['];
  96528. + GenericBlock - [42..52)::10
  96529. + MarkupLiteralAttributeValue - [42..47)::5 - [text/]
  96530. + MarkupTextLiteral - [42..47)::5 - [text/] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96531. + Text;[text];
  96532. + ForwardSlash;[/];
  96533. + MarkupLiteralAttributeValue - [47..52)::5 - [ html]
  96534. + MarkupTextLiteral - [47..48)::1 - [ ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96535. + Whitespace;[ ];
  96536. + MarkupTextLiteral - [48..52)::4 - [html] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96537. + Text;[html];
  96538. + MarkupTextLiteral - [52..53)::1 - ['] - Gen<None> - SpanEditHandler;Accepts:Any
  96539. + SingleQuote;['];
  96540. + MarkupTextLiteral - [53..54)::1 - [>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96541. + CloseAngle;[>];
  96542. + MarkupTextLiteral - [54..63)::9 - [<input />] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96543. + OpenAngle;[<];
  96544. + Text;[input];
  96545. + Whitespace;[ ];
  96546. + ForwardSlash;[/];
  96547. + CloseAngle;[>];
  96548. + MarkupTagBlock - [63..72)::9 - [</script>]
  96549. + MarkupTextLiteral - [63..72)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96550. + OpenAngle;[<];
  96551. + ForwardSlash;[/];
  96552. + Text;[script];
  96553. + CloseAngle;[>];
  96554. + MarkupTagHelperEndTag - [72..76)::4
  96555. + MarkupTextLiteral - [72..76)::4 - [</p>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96556. + OpenAngle;[<];
  96557. + ForwardSlash;[/];
  96558. + Text;[p];
  96559. + CloseAngle;[>];
  96560. + MarkupTagBlock - [76..85)::9 - [</script>]
  96561. + MarkupTextLiteral - [76..85)::9 - [</script>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96562. + OpenAngle;[<];
  96563. + ForwardSlash;[/];
  96564. + Text;[script];
  96565. + CloseAngle;[>];
  96566. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/WhiteSpaceRewriterTest/Moves_Whitespace_Preceeding_ExpressionBlock_To_Parent_Block.cspans.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/WhiteSpaceRewriterTest/Moves_Whitespace_Preceeding_ExpressionBlock_To_Parent_Block.cspans.txt
  96567. index 14c16af649f..64df8a7ddd2 100644
  96568. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/WhiteSpaceRewriterTest/Moves_Whitespace_Preceeding_ExpressionBlock_To_Parent_Block.cspans.txt
  96569. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/WhiteSpaceRewriterTest/Moves_Whitespace_Preceeding_ExpressionBlock_To_Parent_Block.cspans.txt
  96570. @@ -1,4 +1,18 @@
  96571. -Markup span at (0:0,0 [8] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [17] )
  96572. -Transition span at (8:0,8 [1] ) (Accepts:None) - Parent: Expression block at (8:0,8 [4] )
  96573. -Code span at (9:0,9 [3] ) (Accepts:NonWhitespace) - Parent: Expression block at (8:0,8 [4] )
  96574. -Markup span at (12:0,12 [5] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [17] )
  96575. +Markup span at (0:0,0 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [58] )
  96576. +Markup span at (2:1,0 [5] ) (Accepts:Any) - Parent: Tag block at (2:1,0 [5] )
  96577. +Markup span at (7:1,5 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [58] )
  96578. +Markup span at (9:2,0 [4] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [58] )
  96579. +Transition span at (13:2,4 [1] ) (Accepts:None) - Parent: Expression block at (13:2,4 [7] )
  96580. +Code span at (14:2,5 [6] ) (Accepts:NonWhitespace) - Parent: Expression block at (13:2,4 [7] )
  96581. +Markup span at (20:2,11 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [58] )
  96582. +Markup span at (22:3,0 [6] ) (Accepts:Any) - Parent: Tag block at (22:3,0 [6] )
  96583. +Markup span at (28:3,6 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [58] )
  96584. +Markup span at (30:4,0 [5] ) (Accepts:Any) - Parent: Tag block at (30:4,0 [5] )
  96585. +Markup span at (35:4,5 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [58] )
  96586. +Markup span at (37:5,0 [4] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [58] )
  96587. +Transition span at (41:5,4 [1] ) (Accepts:None) - Parent: Expression block at (41:5,4 [9] )
  96588. +MetaCode span at (42:5,5 [1] ) (Accepts:None) - Parent: Expression block at (41:5,4 [9] )
  96589. +Code span at (43:5,6 [6] ) (Accepts:Any) - Parent: Expression block at (41:5,4 [9] )
  96590. +MetaCode span at (49:5,12 [1] ) (Accepts:None) - Parent: Expression block at (41:5,4 [9] )
  96591. +Markup span at (50:5,13 [2] ) (Accepts:Any) - Parent: Markup block at (0:0,0 [58] )
  96592. +Markup span at (52:6,0 [6] ) (Accepts:Any) - Parent: Tag block at (52:6,0 [6] )
  96593. diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/WhiteSpaceRewriterTest/Moves_Whitespace_Preceeding_ExpressionBlock_To_Parent_Block.stree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/WhiteSpaceRewriterTest/Moves_Whitespace_Preceeding_ExpressionBlock_To_Parent_Block.stree.txt
  96594. index fae418250da..50eaa74f920 100644
  96595. --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/WhiteSpaceRewriterTest/Moves_Whitespace_Preceeding_ExpressionBlock_To_Parent_Block.stree.txt
  96596. +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/WhiteSpaceRewriterTest/Moves_Whitespace_Preceeding_ExpressionBlock_To_Parent_Block.stree.txt
  96597. @@ -1,12 +1,60 @@
  96598. -Markup block - Gen<None> - 17 - (0:0,0)
  96599. - Markup span - Gen<Markup> - [test ] - SpanEditHandler;Accepts:Any - (0:0,0) - Tokens:2
  96600. - SyntaxKind.Text;[test];
  96601. - SyntaxKind.Whitespace;[ ];
  96602. - Expression block - Gen<Expr> - 4 - (8:0,8)
  96603. - Transition span - Gen<None> - [@] - SpanEditHandler;Accepts:None - (8:0,8) - Tokens:1
  96604. - SyntaxKind.Transition;[@];
  96605. - Code span - Gen<Expr> - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14 - (9:0,9) - Tokens:1
  96606. - SyntaxKind.Identifier;[foo];
  96607. - Markup span - Gen<Markup> - [ test] - SpanEditHandler;Accepts:Any - (12:0,12) - Tokens:2
  96608. - SyntaxKind.Whitespace;[ ];
  96609. - SyntaxKind.Text;[test];
  96610. +RazorDocument - [0..58)::58 - [LF<div>LF @resultLF</div>LF<div>LF @(result)LF</div>]
  96611. + MarkupBlock - [0..58)::58
  96612. + MarkupTextLiteral - [0..2)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96613. + NewLine;[LF];
  96614. + MarkupTagBlock - [2..7)::5 - [<div>]
  96615. + MarkupTextLiteral - [2..7)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96616. + OpenAngle;[<];
  96617. + Text;[div];
  96618. + CloseAngle;[>];
  96619. + MarkupTextLiteral - [7..9)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96620. + NewLine;[LF];
  96621. + MarkupTextLiteral - [9..13)::4 - [ ]
  96622. + Whitespace;[ ];
  96623. + CSharpCodeBlock - [13..20)::7
  96624. + CSharpImplicitExpression - [13..20)::7
  96625. + CSharpTransition - [13..14)::1 - Gen<None> - SpanEditHandler;Accepts:None
  96626. + Transition;[@];
  96627. + CSharpImplicitExpressionBody - [14..20)::6
  96628. + CSharpCodeBlock - [14..20)::6
  96629. + CSharpExpressionLiteral - [14..20)::6 - [result] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K14
  96630. + Identifier;[result];
  96631. + MarkupTextLiteral - [20..22)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96632. + NewLine;[LF];
  96633. + MarkupTagBlock - [22..28)::6 - [</div>]
  96634. + MarkupTextLiteral - [22..28)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96635. + OpenAngle;[<];
  96636. + ForwardSlash;[/];
  96637. + Text;[div];
  96638. + CloseAngle;[>];
  96639. + MarkupTextLiteral - [28..30)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96640. + NewLine;[LF];
  96641. + MarkupTagBlock - [30..35)::5 - [<div>]
  96642. + MarkupTextLiteral - [30..35)::5 - [<div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96643. + OpenAngle;[<];
  96644. + Text;[div];
  96645. + CloseAngle;[>];
  96646. + MarkupTextLiteral - [35..37)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96647. + NewLine;[LF];
  96648. + MarkupTextLiteral - [37..41)::4 - [ ]
  96649. + Whitespace;[ ];
  96650. + CSharpCodeBlock - [41..50)::9
  96651. + CSharpExplicitExpression - [41..50)::9
  96652. + CSharpTransition - [41..42)::1 - Gen<None> - SpanEditHandler;Accepts:None
  96653. + Transition;[@];
  96654. + CSharpExplicitExpressionBody - [42..50)::8
  96655. + RazorMetaCode - [42..43)::1 - Gen<None> - SpanEditHandler;Accepts:None
  96656. + LeftParenthesis;[(];
  96657. + CSharpCodeBlock - [43..49)::6
  96658. + CSharpExpressionLiteral - [43..49)::6 - [result] - Gen<Expr> - SpanEditHandler;Accepts:Any
  96659. + Identifier;[result];
  96660. + RazorMetaCode - [49..50)::1 - Gen<None> - SpanEditHandler;Accepts:None
  96661. + RightParenthesis;[)];
  96662. + MarkupTextLiteral - [50..52)::2 - [LF] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96663. + NewLine;[LF];
  96664. + MarkupTagBlock - [52..58)::6 - [</div>]
  96665. + MarkupTextLiteral - [52..58)::6 - [</div>] - Gen<Markup> - SpanEditHandler;Accepts:Any
  96666. + OpenAngle;[<];
  96667. + ForwardSlash;[/];
  96668. + Text;[div];
  96669. + CloseAngle;[>];
  96670. diff --git a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/IntegrationTests/IntegrationTestBase.cs b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/IntegrationTests/IntegrationTestBase.cs
  96671. index 2194ef38df9..4a2be2b738d 100644
  96672. --- a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/IntegrationTests/IntegrationTestBase.cs
  96673. +++ b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/IntegrationTests/IntegrationTestBase.cs
  96674. @@ -16,6 +16,7 @@ using System.Threading;
  96675. using Microsoft.AspNetCore.Razor.Language.Legacy;
  96676. using Microsoft.AspNetCore.Razor.Language.CodeGeneration;
  96677. using Microsoft.AspNetCore.Razor.Language.Intermediate;
  96678. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  96679. using Microsoft.CodeAnalysis;
  96680. using Microsoft.CodeAnalysis.CSharp;
  96681. using Microsoft.CodeAnalysis.Razor;
  96682. @@ -462,38 +463,38 @@ namespace Microsoft.AspNetCore.Razor.Language.IntegrationTests
  96683. var syntaxTree = codeDocument.GetSyntaxTree();
  96684. var visitor = new CodeSpanVisitor();
  96685. - visitor.VisitBlock(syntaxTree.Root);
  96686. + visitor.Visit(syntaxTree.Root);
  96687. var charBuffer = new char[codeDocument.Source.Length];
  96688. codeDocument.Source.CopyTo(0, charBuffer, 0, codeDocument.Source.Length);
  96689. var sourceContent = new string(charBuffer);
  96690. var spans = visitor.CodeSpans;
  96691. - for (var i= 0; i < spans.Count; i++)
  96692. + for (var i = 0; i < spans.Count; i++)
  96693. {
  96694. var span = spans[i];
  96695. - if (span.Start.FilePath == null || span.Start.FilePath != codeDocument.Source.FilePath)
  96696. + var sourceSpan = span.GetSourceSpan(codeDocument.Source);
  96697. + if (sourceSpan == null)
  96698. {
  96699. // Not in the main file, skip.
  96700. continue;
  96701. }
  96702. - var location = new SourceSpan(span.Start, span.Length);
  96703. - var expectedSpan = sourceContent.Substring(span.Start.AbsoluteIndex, span.Length);
  96704. + var expectedSpan = sourceContent.Substring(sourceSpan.AbsoluteIndex, sourceSpan.Length);
  96705. // See #2593
  96706. if (string.IsNullOrWhiteSpace(expectedSpan))
  96707. {
  96708. // For now we don't verify whitespace inside of a directive. We know that directives cheat
  96709. // with how they bound whitespace/C#/markup to make completion work.
  96710. - if (span.Parent is Block block && block.Type == BlockKindInternal.Directive)
  96711. + if (span.FirstAncestorOrSelf<RazorDirectiveSyntax>() != null)
  96712. {
  96713. continue;
  96714. }
  96715. }
  96716. // See #2594
  96717. - if (string.Equals("@", expectedSpan) && span.Kind == SpanKindInternal.Code)
  96718. + if (string.Equals("@", expectedSpan))
  96719. {
  96720. // For now we don't verify an escaped transition. In some cases one of the @ tokens in @@foo
  96721. // will be mapped as C# but will not be present in the output buffer because it's not actually C#.
  96722. @@ -504,16 +505,16 @@ namespace Microsoft.AspNetCore.Razor.Language.IntegrationTests
  96723. for (var j = 0; j < csharpDocument.SourceMappings.Count; j++)
  96724. {
  96725. var mapping = csharpDocument.SourceMappings[j];
  96726. - if (mapping.OriginalSpan == location)
  96727. + if (mapping.OriginalSpan == sourceSpan)
  96728. {
  96729. var actualSpan = csharpDocument.GeneratedCode.Substring(
  96730. - mapping.GeneratedSpan.AbsoluteIndex,
  96731. + mapping.GeneratedSpan.AbsoluteIndex,
  96732. mapping.GeneratedSpan.Length);
  96733. if (!string.Equals(expectedSpan, actualSpan, StringComparison.Ordinal))
  96734. {
  96735. throw new XunitException(
  96736. - $"Found the span {location} in the output mappings but it contains " +
  96737. + $"Found the span {sourceSpan} in the output mappings but it contains " +
  96738. $"'{EscapeWhitespace(actualSpan)}' instead of '{EscapeWhitespace(expectedSpan)}'.");
  96739. }
  96740. @@ -525,24 +526,34 @@ namespace Microsoft.AspNetCore.Razor.Language.IntegrationTests
  96741. if (!found)
  96742. {
  96743. throw new XunitException(
  96744. - $"Could not find the span {location} - containing '{EscapeWhitespace(expectedSpan)}' " +
  96745. + $"Could not find the span {sourceSpan} - containing '{EscapeWhitespace(expectedSpan)}' " +
  96746. $"in the output.");
  96747. }
  96748. }
  96749. }
  96750. - private class CodeSpanVisitor : ParserVisitor
  96751. + private class CodeSpanVisitor : SyntaxRewriter
  96752. {
  96753. - public List<Span> CodeSpans { get; } = new List<Span>();
  96754. + public List<Syntax.SyntaxNode> CodeSpans { get; } = new List<Syntax.SyntaxNode>();
  96755. - public override void VisitSpan(Span span)
  96756. + public override Syntax.SyntaxNode VisitCSharpStatementLiteral(CSharpStatementLiteralSyntax node)
  96757. {
  96758. - if (span.Kind == SpanKindInternal.Code)
  96759. + var context = node.GetSpanContext();
  96760. + if (context != null && context.ChunkGenerator != SpanChunkGenerator.Null)
  96761. {
  96762. - CodeSpans.Add(span);
  96763. + CodeSpans.Add(node);
  96764. }
  96765. + return base.VisitCSharpStatementLiteral(node);
  96766. + }
  96767. - base.VisitSpan(span);
  96768. + public override Syntax.SyntaxNode VisitCSharpExpressionLiteral(CSharpExpressionLiteralSyntax node)
  96769. + {
  96770. + var context = node.GetSpanContext();
  96771. + if (context != null && context.ChunkGenerator != SpanChunkGenerator.Null)
  96772. + {
  96773. + CodeSpans.Add(node);
  96774. + }
  96775. + return base.VisitCSharpExpressionLiteral(node);
  96776. }
  96777. }
  96778. diff --git a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/BlockFactory.cs b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/BlockFactory.cs
  96779. deleted file mode 100644
  96780. index 0b924e87f2b..00000000000
  96781. --- a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/BlockFactory.cs
  96782. +++ /dev/null
  96783. @@ -1,99 +0,0 @@
  96784. -// Copyright (c) .NET Foundation. All rights reserved.
  96785. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  96786. -
  96787. -using System;
  96788. -using System.Collections.Generic;
  96789. -
  96790. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  96791. -{
  96792. - internal class BlockFactory
  96793. - {
  96794. - private SpanFactory _factory;
  96795. -
  96796. - public BlockFactory(SpanFactory factory)
  96797. - {
  96798. - _factory = factory;
  96799. - }
  96800. -
  96801. - public Block EscapedMarkupTagBlock(string prefix, string suffix)
  96802. - {
  96803. - return EscapedMarkupTagBlock(prefix, suffix, AcceptedCharactersInternal.Any);
  96804. - }
  96805. -
  96806. - public Block EscapedMarkupTagBlock(string prefix, string suffix, params SyntaxTreeNode[] children)
  96807. - {
  96808. - return EscapedMarkupTagBlock(prefix, suffix, AcceptedCharactersInternal.Any, children);
  96809. - }
  96810. -
  96811. - public Block EscapedMarkupTagBlock(
  96812. - string prefix,
  96813. - string suffix,
  96814. - AcceptedCharactersInternal acceptedCharacters,
  96815. - params SyntaxTreeNode[] children)
  96816. - {
  96817. - var newChildren = new List<SyntaxTreeNode>(
  96818. - new SyntaxTreeNode[]
  96819. - {
  96820. - _factory.Markup(prefix),
  96821. - _factory.BangEscape(),
  96822. - _factory.Markup(suffix).Accepts(acceptedCharacters)
  96823. - });
  96824. -
  96825. - newChildren.AddRange(children);
  96826. -
  96827. - return new MarkupTagBlock(newChildren.ToArray());
  96828. - }
  96829. -
  96830. - public Block MarkupTagBlock(string content)
  96831. - {
  96832. - return MarkupTagBlock(content, AcceptedCharactersInternal.Any);
  96833. - }
  96834. -
  96835. - public Block MarkupTagBlock(string content, AcceptedCharactersInternal acceptedCharacters)
  96836. - {
  96837. - return new MarkupTagBlock(
  96838. - _factory.Markup(content).Accepts(acceptedCharacters)
  96839. - );
  96840. - }
  96841. -
  96842. - public HtmlCommentBlock HtmlCommentBlock(string content)
  96843. - {
  96844. - return HtmlCommentBlock(_factory, f => new SyntaxTreeNode[] { f.Markup(content).Accepts(AcceptedCharactersInternal.Whitespace) });
  96845. - }
  96846. -
  96847. - public static HtmlCommentBlock HtmlCommentBlock(SpanFactory factory, Func<SpanFactory, IEnumerable<SyntaxTreeNode>> nodesBuilder = null)
  96848. - {
  96849. - var nodes = new List<SyntaxTreeNode>();
  96850. - nodes.Add(factory.Markup("<!--").Accepts(AcceptedCharactersInternal.None));
  96851. - if (nodesBuilder != null)
  96852. - {
  96853. - nodes.AddRange(nodesBuilder(factory));
  96854. - }
  96855. - nodes.Add(factory.Markup("-->").Accepts(AcceptedCharactersInternal.None));
  96856. -
  96857. - return new HtmlCommentBlock(nodes.ToArray());
  96858. - }
  96859. -
  96860. - public Block TagHelperBlock(
  96861. - string tagName,
  96862. - TagMode tagMode,
  96863. - SourceLocation start,
  96864. - Block startTag,
  96865. - SyntaxTreeNode[] children,
  96866. - Block endTag)
  96867. - {
  96868. - var builder = new TagHelperBlockBuilder(
  96869. - tagName,
  96870. - tagMode,
  96871. - attributes: new List<TagHelperAttributeNode>(),
  96872. - children: children)
  96873. - {
  96874. - Start = start,
  96875. - SourceStartTag = startTag,
  96876. - SourceEndTag = endTag
  96877. - };
  96878. -
  96879. - return builder.Build();
  96880. - }
  96881. - }
  96882. -}
  96883. \ No newline at end of file
  96884. diff --git a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/BlockTypes.cs b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/BlockTypes.cs
  96885. deleted file mode 100644
  96886. index 56deb6b460c..00000000000
  96887. --- a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/BlockTypes.cs
  96888. +++ /dev/null
  96889. @@ -1,230 +0,0 @@
  96890. -// Copyright (c) .NET Foundation. All rights reserved.
  96891. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  96892. -
  96893. -using System.Collections.Generic;
  96894. -
  96895. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  96896. -{
  96897. - // The product code doesn't need this, but having subclasses for the block types makes tests much cleaner :)
  96898. -
  96899. - internal class StatementBlock : Block
  96900. - {
  96901. - private const BlockKindInternal ThisBlockKind = BlockKindInternal.Statement;
  96902. -
  96903. - public StatementBlock(IParentChunkGenerator chunkGenerator, IReadOnlyList<SyntaxTreeNode> children)
  96904. - : base(ThisBlockKind, children, chunkGenerator)
  96905. - {
  96906. - }
  96907. -
  96908. - public StatementBlock(IParentChunkGenerator chunkGenerator, params SyntaxTreeNode[] children)
  96909. - : this(chunkGenerator, (IReadOnlyList<SyntaxTreeNode>)children)
  96910. - {
  96911. - }
  96912. -
  96913. - public StatementBlock(params SyntaxTreeNode[] children)
  96914. - : this(ParentChunkGenerator.Null, children)
  96915. - {
  96916. - }
  96917. - }
  96918. -
  96919. - internal class DirectiveBlock : Block
  96920. - {
  96921. - private const BlockKindInternal ThisBlockKind = BlockKindInternal.Directive;
  96922. -
  96923. - public DirectiveBlock(IParentChunkGenerator chunkGenerator, IReadOnlyList<SyntaxTreeNode> children)
  96924. - : base(ThisBlockKind, children, chunkGenerator)
  96925. - {
  96926. - }
  96927. -
  96928. - public DirectiveBlock(IParentChunkGenerator chunkGenerator, params SyntaxTreeNode[] children)
  96929. - : this(chunkGenerator, (IReadOnlyList<SyntaxTreeNode>)children)
  96930. - {
  96931. - }
  96932. -
  96933. - public DirectiveBlock(params SyntaxTreeNode[] children)
  96934. - : this(ParentChunkGenerator.Null, children)
  96935. - {
  96936. - }
  96937. - }
  96938. -
  96939. - internal class ExpressionBlock : Block
  96940. - {
  96941. - private const BlockKindInternal ThisBlockKind = BlockKindInternal.Expression;
  96942. -
  96943. - public ExpressionBlock(IParentChunkGenerator chunkGenerator, IReadOnlyList<SyntaxTreeNode> children)
  96944. - : base(ThisBlockKind, children, chunkGenerator)
  96945. - {
  96946. - }
  96947. -
  96948. - public ExpressionBlock(IParentChunkGenerator chunkGenerator, params SyntaxTreeNode[] children)
  96949. - : this(chunkGenerator, (IReadOnlyList<SyntaxTreeNode>)children)
  96950. - {
  96951. - }
  96952. -
  96953. - public ExpressionBlock(params SyntaxTreeNode[] children)
  96954. - : this(new ExpressionChunkGenerator(), children)
  96955. - {
  96956. - }
  96957. - }
  96958. -
  96959. - internal class MarkupTagBlock : Block
  96960. - {
  96961. - private const BlockKindInternal ThisBlockKind = BlockKindInternal.Tag;
  96962. -
  96963. - public MarkupTagBlock(params SyntaxTreeNode[] children)
  96964. - : base(ThisBlockKind, children, ParentChunkGenerator.Null)
  96965. - {
  96966. - }
  96967. - }
  96968. -
  96969. - internal class MarkupBlock : Block
  96970. - {
  96971. - private const BlockKindInternal ThisBlockKind = BlockKindInternal.Markup;
  96972. -
  96973. - public MarkupBlock(
  96974. - BlockKindInternal BlockKind,
  96975. - IParentChunkGenerator chunkGenerator,
  96976. - IReadOnlyList<SyntaxTreeNode> children)
  96977. - : base(BlockKind, children, chunkGenerator)
  96978. - {
  96979. - }
  96980. -
  96981. - public MarkupBlock(IParentChunkGenerator chunkGenerator, IReadOnlyList<SyntaxTreeNode> children)
  96982. - : this(ThisBlockKind, chunkGenerator, children)
  96983. - {
  96984. - }
  96985. -
  96986. - public MarkupBlock(IParentChunkGenerator chunkGenerator, params SyntaxTreeNode[] children)
  96987. - : this(chunkGenerator, (IReadOnlyList<SyntaxTreeNode>)children)
  96988. - {
  96989. - }
  96990. -
  96991. - public MarkupBlock(params SyntaxTreeNode[] children)
  96992. - : this(ParentChunkGenerator.Null, children)
  96993. - {
  96994. - }
  96995. - }
  96996. -
  96997. - internal class MarkupTagHelperBlock : TagHelperBlock
  96998. - {
  96999. - public MarkupTagHelperBlock(string tagName)
  97000. - : this(tagName, tagMode: TagMode.StartTagAndEndTag, attributes: new List<TagHelperAttributeNode>())
  97001. - {
  97002. - }
  97003. -
  97004. - public MarkupTagHelperBlock(string tagName, TagMode tagMode)
  97005. - : this(tagName, tagMode, new List<TagHelperAttributeNode>())
  97006. - {
  97007. - }
  97008. -
  97009. - public MarkupTagHelperBlock(
  97010. - string tagName,
  97011. - IList<TagHelperAttributeNode> attributes)
  97012. - : this(tagName, TagMode.StartTagAndEndTag, attributes, children: new SyntaxTreeNode[0])
  97013. - {
  97014. - }
  97015. -
  97016. - public MarkupTagHelperBlock(
  97017. - string tagName,
  97018. - TagMode tagMode,
  97019. - IList<TagHelperAttributeNode> attributes)
  97020. - : this(tagName, tagMode, attributes, new SyntaxTreeNode[0])
  97021. - {
  97022. - }
  97023. -
  97024. - public MarkupTagHelperBlock(string tagName, params SyntaxTreeNode[] children)
  97025. - : this(
  97026. - tagName,
  97027. - TagMode.StartTagAndEndTag,
  97028. - attributes: new List<TagHelperAttributeNode>(),
  97029. - children: children)
  97030. - {
  97031. - }
  97032. -
  97033. - public MarkupTagHelperBlock(string tagName, TagMode tagMode, params SyntaxTreeNode[] children)
  97034. - : this(tagName, tagMode, new List<TagHelperAttributeNode>(), children)
  97035. - {
  97036. - }
  97037. -
  97038. - public MarkupTagHelperBlock(
  97039. - string tagName,
  97040. - IList<TagHelperAttributeNode> attributes,
  97041. - params SyntaxTreeNode[] children)
  97042. - : base(new TagHelperBlockBuilder(
  97043. - tagName,
  97044. - TagMode.StartTagAndEndTag,
  97045. - attributes: attributes,
  97046. - children: children))
  97047. - {
  97048. - }
  97049. -
  97050. - public MarkupTagHelperBlock(
  97051. - string tagName,
  97052. - TagMode tagMode,
  97053. - IList<TagHelperAttributeNode> attributes,
  97054. - params SyntaxTreeNode[] children)
  97055. - : base(new TagHelperBlockBuilder(tagName, tagMode, attributes, children))
  97056. - {
  97057. - }
  97058. - }
  97059. -
  97060. - internal class TemplateBlock : Block
  97061. - {
  97062. - private const BlockKindInternal ThisBlockKind = BlockKindInternal.Template;
  97063. -
  97064. - public TemplateBlock(IParentChunkGenerator chunkGenerator, IReadOnlyList<SyntaxTreeNode> children)
  97065. - : base(ThisBlockKind, children, chunkGenerator)
  97066. - {
  97067. - }
  97068. -
  97069. - public TemplateBlock(IParentChunkGenerator chunkGenerator, params SyntaxTreeNode[] children)
  97070. - : this(chunkGenerator, (IReadOnlyList<SyntaxTreeNode>)children)
  97071. - {
  97072. - }
  97073. -
  97074. - public TemplateBlock(params SyntaxTreeNode[] children)
  97075. - : this(new TemplateBlockChunkGenerator(), children)
  97076. - {
  97077. - }
  97078. -
  97079. - public TemplateBlock(IReadOnlyList<SyntaxTreeNode> children)
  97080. - : this(new TemplateBlockChunkGenerator(), children)
  97081. - {
  97082. - }
  97083. - }
  97084. -
  97085. - internal class CommentBlock : Block
  97086. - {
  97087. - private const BlockKindInternal ThisBlockKind = BlockKindInternal.Comment;
  97088. -
  97089. - public CommentBlock(IParentChunkGenerator chunkGenerator, IReadOnlyList<SyntaxTreeNode> children)
  97090. - : base(ThisBlockKind, children, chunkGenerator)
  97091. - {
  97092. - }
  97093. -
  97094. - public CommentBlock(IParentChunkGenerator chunkGenerator, params SyntaxTreeNode[] children)
  97095. - : this(chunkGenerator, (IReadOnlyList<SyntaxTreeNode>)children)
  97096. - {
  97097. - }
  97098. -
  97099. - public CommentBlock(params SyntaxTreeNode[] children)
  97100. - : this(new RazorCommentChunkGenerator(), children)
  97101. - {
  97102. - }
  97103. -
  97104. - public CommentBlock(IReadOnlyList<SyntaxTreeNode> children)
  97105. - : this(new RazorCommentChunkGenerator(), children)
  97106. - {
  97107. - }
  97108. - }
  97109. -
  97110. - internal class HtmlCommentBlock : Block
  97111. - {
  97112. - private const BlockKindInternal ThisBlockKind = BlockKindInternal.HtmlComment;
  97113. -
  97114. - public HtmlCommentBlock(params SyntaxTreeNode[] children)
  97115. - : base(ThisBlockKind, children, ParentChunkGenerator.Null)
  97116. - {
  97117. - }
  97118. - }
  97119. -}
  97120. diff --git a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/ClassifiedSpan/ClassifiedSpanSerializer.cs b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/ClassifiedSpan/ClassifiedSpanSerializer.cs
  97121. index 40b557ff700..f38e4fb8388 100644
  97122. --- a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/ClassifiedSpan/ClassifiedSpanSerializer.cs
  97123. +++ b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/ClassifiedSpan/ClassifiedSpanSerializer.cs
  97124. @@ -1,18 +1,19 @@
  97125. // Copyright (c) .NET Foundation. All rights reserved.
  97126. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  97127. +using System;
  97128. using System.IO;
  97129. namespace Microsoft.AspNetCore.Razor.Language.Legacy
  97130. {
  97131. internal class ClassifiedSpanSerializer
  97132. {
  97133. - internal static string Serialize(SyntaxTreeNode node, string filePath = null)
  97134. + internal static string Serialize(RazorSyntaxTree syntaxTree)
  97135. {
  97136. using (var writer = new StringWriter())
  97137. {
  97138. - var visitor = new ClassifiedSpanWriter(writer, filePath);
  97139. - visitor.Visit(node);
  97140. + var visitor = new ClassifiedSpanWriter(writer, syntaxTree);
  97141. + visitor.Visit();
  97142. return writer.ToString();
  97143. }
  97144. diff --git a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/ClassifiedSpan/ClassifiedSpanVerifier.cs b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/ClassifiedSpan/ClassifiedSpanVerifier.cs
  97145. index c70a57337f9..4894d4cf722 100644
  97146. --- a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/ClassifiedSpan/ClassifiedSpanVerifier.cs
  97147. +++ b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/ClassifiedSpan/ClassifiedSpanVerifier.cs
  97148. @@ -1,6 +1,7 @@
  97149. // Copyright (c) .NET Foundation. All rights reserved.
  97150. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  97151. +using System;
  97152. using System.IO;
  97153. using System.Text;
  97154. using Xunit;
  97155. @@ -10,12 +11,12 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  97156. {
  97157. internal class ClassifiedSpanVerifier
  97158. {
  97159. - internal static void Verify(SyntaxTreeNode node, string filePath, string[] baseline)
  97160. + internal static void Verify(RazorSyntaxTree syntaxTree, string[] baseline)
  97161. {
  97162. using (var writer = new StringWriter())
  97163. {
  97164. - var walker = new Walker(writer, filePath, baseline);
  97165. - walker.Visit(node);
  97166. + var walker = new Walker(writer, syntaxTree, baseline);
  97167. + walker.Visit();
  97168. walker.AssertReachedEndOfBaseline();
  97169. }
  97170. }
  97171. @@ -27,7 +28,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  97172. private int _index;
  97173. - public Walker(StringWriter writer, string filePath, string[] baseline) : base(writer, filePath)
  97174. + public Walker(StringWriter writer, RazorSyntaxTree syntaxTree, string[] baseline) : base(writer, syntaxTree)
  97175. {
  97176. _writer = writer;
  97177. _baseline = baseline;
  97178. diff --git a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/ClassifiedSpan/ClassifiedSpanWriter.cs b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/ClassifiedSpan/ClassifiedSpanWriter.cs
  97179. index fc6258a7da1..ceaf79d9355 100644
  97180. --- a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/ClassifiedSpan/ClassifiedSpanWriter.cs
  97181. +++ b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/ClassifiedSpan/ClassifiedSpanWriter.cs
  97182. @@ -1,31 +1,24 @@
  97183. // Copyright (c) .NET Foundation. All rights reserved.
  97184. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  97185. -using System;
  97186. -using System.Collections.Generic;
  97187. using System.IO;
  97188. -using System.Linq;
  97189. namespace Microsoft.AspNetCore.Razor.Language.Legacy
  97190. {
  97191. internal class ClassifiedSpanWriter
  97192. {
  97193. - private readonly string _filePath;
  97194. + private readonly RazorSyntaxTree _syntaxTree;
  97195. private readonly TextWriter _writer;
  97196. - public ClassifiedSpanWriter(TextWriter writer, string filePath)
  97197. + public ClassifiedSpanWriter(TextWriter writer, RazorSyntaxTree syntaxTree)
  97198. {
  97199. _writer = writer;
  97200. - _filePath = filePath;
  97201. + _syntaxTree = syntaxTree;
  97202. }
  97203. - public virtual void Visit(SyntaxTreeNode node)
  97204. + public virtual void Visit()
  97205. {
  97206. - if (!(node is Block block))
  97207. - {
  97208. - return;
  97209. - }
  97210. - var classifiedSpans = GetClassifiedSpans(block, _filePath);
  97211. + var classifiedSpans = _syntaxTree.GetClassifiedSpans();
  97212. foreach (var span in classifiedSpans)
  97213. {
  97214. VisitClassifiedSpan(span);
  97215. @@ -59,54 +52,5 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  97216. {
  97217. _writer.Write(value);
  97218. }
  97219. -
  97220. - internal static IReadOnlyList<ClassifiedSpanInternal> GetClassifiedSpans(Block root, string filePath)
  97221. - {
  97222. - // We don't care about the options and diagnostic here.
  97223. - var syntaxTree = RazorSyntaxTree.Create(
  97224. - root,
  97225. - TestRazorSourceDocument.Create(filePath: filePath),
  97226. - Array.Empty<RazorDiagnostic>(),
  97227. - RazorParserOptions.CreateDefault());
  97228. -
  97229. - return syntaxTree.GetClassifiedSpans();
  97230. - }
  97231. -
  97232. - private static List<Span> Flatten(SyntaxTreeNode root)
  97233. - {
  97234. - var result = new List<Span>();
  97235. - AppendFlattenedSpans(root, result);
  97236. - return result;
  97237. -
  97238. - void AppendFlattenedSpans(SyntaxTreeNode node, List<Span> foundSpans)
  97239. - {
  97240. - if (node is Span spanNode)
  97241. - {
  97242. - foundSpans.Add(spanNode);
  97243. - }
  97244. - else
  97245. - {
  97246. - if (node is TagHelperBlock tagHelperNode)
  97247. - {
  97248. - // These aren't in document order, sort them first and then dig in
  97249. - var attributeNodes = tagHelperNode.Attributes.Select(kvp => kvp.Value).Where(att => att != null).ToList();
  97250. - attributeNodes.Sort((x, y) => x.Start.AbsoluteIndex.CompareTo(y.Start.AbsoluteIndex));
  97251. -
  97252. - foreach (var attribute in attributeNodes)
  97253. - {
  97254. - AppendFlattenedSpans(attribute, foundSpans);
  97255. - }
  97256. - }
  97257. -
  97258. - if (node is Block blockNode)
  97259. - {
  97260. - foreach (var child in blockNode.Children)
  97261. - {
  97262. - AppendFlattenedSpans(child, foundSpans);
  97263. - }
  97264. - }
  97265. - }
  97266. - }
  97267. - }
  97268. }
  97269. }
  97270. diff --git a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/ErrorCollector.cs b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/ErrorCollector.cs
  97271. deleted file mode 100644
  97272. index 13da12b61a5..00000000000
  97273. --- a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/ErrorCollector.cs
  97274. +++ /dev/null
  97275. @@ -1,57 +0,0 @@
  97276. -// Copyright (c) .NET Foundation. All rights reserved.
  97277. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  97278. -
  97279. -using System;
  97280. -using System.Text;
  97281. -
  97282. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  97283. -{
  97284. - public class ErrorCollector
  97285. - {
  97286. - private StringBuilder _message = new StringBuilder();
  97287. - private int _indent = 0;
  97288. -
  97289. - public bool Success { get; private set; }
  97290. -
  97291. - public string Message
  97292. - {
  97293. - get { return _message.ToString(); }
  97294. - }
  97295. -
  97296. - public ErrorCollector()
  97297. - {
  97298. - Success = true;
  97299. - }
  97300. -
  97301. - public void AddError(string msg, params object[] args)
  97302. - {
  97303. - Append("F", msg, args);
  97304. - Success = false;
  97305. - }
  97306. -
  97307. - public void AddMessage(string msg, params object[] args)
  97308. - {
  97309. - Append("P", msg, args);
  97310. - }
  97311. -
  97312. - public IDisposable Indent()
  97313. - {
  97314. - _indent++;
  97315. - return new DisposableAction(Unindent);
  97316. - }
  97317. -
  97318. - public void Unindent()
  97319. - {
  97320. - _indent--;
  97321. - }
  97322. -
  97323. - private void Append(string prefix, string msg, object[] args)
  97324. - {
  97325. - _message.Append(prefix);
  97326. - _message.Append(":");
  97327. - _message.Append(new String('\t', _indent));
  97328. - _message.AppendFormat(msg, args);
  97329. - _message.AppendLine();
  97330. - }
  97331. - }
  97332. -}
  97333. diff --git a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/ParserTestBase.cs b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/ParserTestBase.cs
  97334. index 3a00f99dcf8..801a6dbb72a 100644
  97335. --- a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/ParserTestBase.cs
  97336. +++ b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/ParserTestBase.cs
  97337. @@ -31,8 +31,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  97338. internal ParserTestBase()
  97339. {
  97340. - Factory = CreateSpanFactory();
  97341. - BlockFactory = CreateBlockFactory();
  97342. TestProjectRoot = TestProject.GetProjectDirectory(GetType());
  97343. }
  97344. @@ -42,10 +40,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  97345. /// </summary>
  97346. protected bool FixupSpans { get; set; }
  97347. - internal SpanFactory Factory { get; private set; }
  97348. -
  97349. - internal BlockFactory BlockFactory { get; private set; }
  97350. -
  97351. #if GENERATE_BASELINES
  97352. protected bool GenerateBaselines { get; set; } = true;
  97353. #else
  97354. @@ -93,13 +87,13 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  97355. #endif
  97356. }
  97357. - internal void AssertSyntaxTreeNodeMatchesBaseline(RazorSyntaxTree syntaxTree)
  97358. - {
  97359. - AssertSyntaxTreeNodeMatchesBaseline(syntaxTree.Root, syntaxTree.Source.FilePath, syntaxTree.Diagnostics.ToArray());
  97360. - }
  97361. + protected int BaselineTestCount { get; set; }
  97362. - internal void AssertSyntaxTreeNodeMatchesBaseline(Block root, string filePath, params RazorDiagnostic[] diagnostics)
  97363. + internal virtual void AssertSyntaxTreeNodeMatchesBaseline(RazorSyntaxTree syntaxTree)
  97364. {
  97365. + var root = syntaxTree.Root;
  97366. + var diagnostics = syntaxTree.Diagnostics;
  97367. + var filePath = syntaxTree.Source.FilePath;
  97368. if (FileName == null)
  97369. {
  97370. var message = $"{nameof(AssertSyntaxTreeNodeMatchesBaseline)} should only be called from a parser test ({nameof(FileName)} is null).";
  97371. @@ -112,16 +106,18 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  97372. throw new InvalidOperationException(message);
  97373. }
  97374. - var baselineFileName = Path.ChangeExtension(FileName, ".stree.txt");
  97375. - var baselineDiagnosticsFileName = Path.ChangeExtension(FileName, ".diag.txt");
  97376. - var baselineClassifiedSpansFileName = Path.ChangeExtension(FileName, ".cspans.txt");
  97377. - var baselineTagHelperSpansFileName = Path.ChangeExtension(FileName, ".tspans.txt");
  97378. + var fileName = BaselineTestCount > 0 ? FileName + $"_{BaselineTestCount}" : FileName;
  97379. + var baselineFileName = Path.ChangeExtension(fileName, ".stree.txt");
  97380. + var baselineDiagnosticsFileName = Path.ChangeExtension(fileName, ".diag.txt");
  97381. + var baselineClassifiedSpansFileName = Path.ChangeExtension(fileName, ".cspans.txt");
  97382. + var baselineTagHelperSpansFileName = Path.ChangeExtension(fileName, ".tspans.txt");
  97383. + BaselineTestCount++;
  97384. if (GenerateBaselines)
  97385. {
  97386. // Write syntax tree baseline
  97387. var baselineFullPath = Path.Combine(TestProjectRoot, baselineFileName);
  97388. - File.WriteAllText(baselineFullPath, SyntaxTreeNodeSerializer.Serialize(root));
  97389. + File.WriteAllText(baselineFullPath, SyntaxNodeSerializer.Serialize(root));
  97390. // Write diagnostics baseline
  97391. var baselineDiagnosticsFullPath = Path.Combine(TestProjectRoot, baselineDiagnosticsFileName);
  97392. @@ -137,11 +133,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  97393. // Write classified spans baseline
  97394. var classifiedSpansBaselineFullPath = Path.Combine(TestProjectRoot, baselineClassifiedSpansFileName);
  97395. - File.WriteAllText(classifiedSpansBaselineFullPath, ClassifiedSpanSerializer.Serialize(root, filePath));
  97396. + File.WriteAllText(classifiedSpansBaselineFullPath, ClassifiedSpanSerializer.Serialize(syntaxTree));
  97397. // Write tag helper spans baseline
  97398. var tagHelperSpansBaselineFullPath = Path.Combine(TestProjectRoot, baselineTagHelperSpansFileName);
  97399. - var serializedTagHelperSpans = TagHelperSpanSerializer.Serialize(root, filePath);
  97400. + var serializedTagHelperSpans = TagHelperSpanSerializer.Serialize(syntaxTree);
  97401. if (!string.IsNullOrEmpty(serializedTagHelperSpans))
  97402. {
  97403. File.WriteAllText(tagHelperSpansBaselineFullPath, serializedTagHelperSpans);
  97404. @@ -162,7 +158,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  97405. }
  97406. var baseline = stFile.ReadAllText().Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
  97407. - SyntaxTreeNodeVerifier.Verify(root, baseline);
  97408. + SyntaxNodeVerifier.Verify(root, baseline);
  97409. // Verify diagnostics
  97410. var baselineDiagnostics = string.Empty;
  97411. @@ -183,8 +179,9 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  97412. }
  97413. else
  97414. {
  97415. - var classifiedSpanBaseline = classifiedSpanFile.ReadAllText().Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
  97416. - ClassifiedSpanVerifier.Verify(root, filePath, classifiedSpanBaseline);
  97417. + var classifiedSpanBaseline = new string[0];
  97418. + classifiedSpanBaseline = classifiedSpanFile.ReadAllText().Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
  97419. + ClassifiedSpanVerifier.Verify(syntaxTree, classifiedSpanBaseline);
  97420. }
  97421. // Verify tag helper spans
  97422. @@ -193,12 +190,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  97423. if (tagHelperSpanFile.Exists())
  97424. {
  97425. tagHelperSpanBaseline = tagHelperSpanFile.ReadAllText().Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
  97426. + TagHelperSpanVerifier.Verify(syntaxTree, tagHelperSpanBaseline);
  97427. }
  97428. -
  97429. - TagHelperSpanVerifier.Verify(root, filePath, tagHelperSpanBaseline);
  97430. }
  97431. - private static string SerializeDiagnostic(RazorDiagnostic diagnostic)
  97432. + protected static string SerializeDiagnostic(RazorDiagnostic diagnostic)
  97433. {
  97434. var content = RazorDiagnosticSerializer.Serialize(diagnostic);
  97435. var normalized = NormalizeNewLines(content);
  97436. @@ -221,16 +217,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  97437. AssertSyntaxTreeNodeMatchesBaseline(syntaxTree);
  97438. }
  97439. - internal virtual void BaselineTest(Block root, string filePath = null, bool verifySyntaxTree = true, params RazorDiagnostic[] diagnostics)
  97440. - {
  97441. - if (verifySyntaxTree)
  97442. - {
  97443. - SyntaxTreeVerifier.Verify(root);
  97444. - }
  97445. -
  97446. - AssertSyntaxTreeNodeMatchesBaseline(root, filePath, diagnostics);
  97447. - }
  97448. -
  97449. internal RazorSyntaxTree ParseBlock(string document, bool designTime)
  97450. {
  97451. return ParseBlock(RazorLanguageVersion.Latest, document, designTime);
  97452. @@ -248,28 +234,28 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  97453. internal abstract RazorSyntaxTree ParseBlock(RazorLanguageVersion version, string document, IEnumerable<DirectiveDescriptor> directives, bool designTime);
  97454. - internal RazorSyntaxTree ParseDocument(string document, bool designTime = false)
  97455. + internal RazorSyntaxTree ParseDocument(string document, bool designTime = false, RazorParserFeatureFlags featureFlags = null)
  97456. {
  97457. - return ParseDocument(RazorLanguageVersion.Latest, document, designTime);
  97458. + return ParseDocument(RazorLanguageVersion.Latest, document, designTime, featureFlags);
  97459. }
  97460. - internal RazorSyntaxTree ParseDocument(RazorLanguageVersion version, string document, bool designTime = false)
  97461. + internal RazorSyntaxTree ParseDocument(RazorLanguageVersion version, string document, bool designTime = false, RazorParserFeatureFlags featureFlags = null)
  97462. {
  97463. - return ParseDocument(version, document, null, designTime);
  97464. + return ParseDocument(version, document, null, designTime, featureFlags);
  97465. }
  97466. - internal RazorSyntaxTree ParseDocument(string document, IEnumerable<DirectiveDescriptor> directives, bool designTime = false)
  97467. + internal RazorSyntaxTree ParseDocument(string document, IEnumerable<DirectiveDescriptor> directives, bool designTime = false, RazorParserFeatureFlags featureFlags = null)
  97468. {
  97469. - return ParseDocument(RazorLanguageVersion.Latest, document, directives, designTime);
  97470. + return ParseDocument(RazorLanguageVersion.Latest, document, directives, designTime, featureFlags);
  97471. }
  97472. - internal virtual RazorSyntaxTree ParseDocument(RazorLanguageVersion version, string document, IEnumerable<DirectiveDescriptor> directives, bool designTime = false)
  97473. + internal virtual RazorSyntaxTree ParseDocument(RazorLanguageVersion version, string document, IEnumerable<DirectiveDescriptor> directives, bool designTime = false, RazorParserFeatureFlags featureFlags = null)
  97474. {
  97475. directives = directives ?? Array.Empty<DirectiveDescriptor>();
  97476. - var source = TestRazorSourceDocument.Create(document, filePath: null, normalizeNewLines: true);
  97477. + var source = TestRazorSourceDocument.Create(document, filePath: null, relativePath: null, normalizeNewLines: true);
  97478. - var options = CreateParserOptions(version, directives, designTime);
  97479. + var options = CreateParserOptions(version, directives, designTime, featureFlags);
  97480. var context = new ParserContext(source, options);
  97481. var codeParser = new CSharpCodeParser(directives, context);
  97482. @@ -278,9 +264,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  97483. codeParser.HtmlParser = markupParser;
  97484. markupParser.CodeParser = codeParser;
  97485. - markupParser.ParseDocument();
  97486. + var root = markupParser.ParseDocument().CreateRed();
  97487. - var root = context.Builder.Build();
  97488. var diagnostics = context.ErrorSink.Errors;
  97489. var codeDocument = RazorCodeDocument.Create(source);
  97490. @@ -298,22 +283,24 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  97491. {
  97492. directives = directives ?? Array.Empty<DirectiveDescriptor>();
  97493. - var source = TestRazorSourceDocument.Create(document, filePath: null, normalizeNewLines: true);
  97494. + var source = TestRazorSourceDocument.Create(document, filePath: null, relativePath: null, normalizeNewLines: true);
  97495. +
  97496. var options = CreateParserOptions(version, directives, designTime);
  97497. var context = new ParserContext(source, options);
  97498. - var parser = new HtmlMarkupParser(context);
  97499. - parser.CodeParser = new CSharpCodeParser(directives, context)
  97500. - {
  97501. - HtmlParser = parser,
  97502. - };
  97503. + var codeParser = new CSharpCodeParser(directives, context);
  97504. + var markupParser = new HtmlMarkupParser(context);
  97505. - parser.ParseBlock();
  97506. + codeParser.HtmlParser = markupParser;
  97507. + markupParser.CodeParser = codeParser;
  97508. +
  97509. + var root = markupParser.ParseBlock().CreateRed();
  97510. - var root = context.Builder.Build();
  97511. var diagnostics = context.ErrorSink.Errors;
  97512. - return RazorSyntaxTree.Create(root, source, diagnostics, options);
  97513. + var syntaxTree = RazorSyntaxTree.Create(root, source, diagnostics, options);
  97514. +
  97515. + return syntaxTree;
  97516. }
  97517. internal RazorSyntaxTree ParseCodeBlock(string document, bool designTime = false)
  97518. @@ -329,41 +316,31 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  97519. {
  97520. directives = directives ?? Array.Empty<DirectiveDescriptor>();
  97521. - var source = TestRazorSourceDocument.Create(document, filePath: null, normalizeNewLines: true);
  97522. + var source = TestRazorSourceDocument.Create(document, filePath: null, relativePath: null, normalizeNewLines: true);
  97523. +
  97524. var options = CreateParserOptions(version, directives, designTime);
  97525. var context = new ParserContext(source, options);
  97526. - var parser = new CSharpCodeParser(directives, context);
  97527. - parser.HtmlParser = new HtmlMarkupParser(context)
  97528. - {
  97529. - CodeParser = parser,
  97530. - };
  97531. + var codeParser = new CSharpCodeParser(directives, context);
  97532. + var markupParser = new HtmlMarkupParser(context);
  97533. +
  97534. + codeParser.HtmlParser = markupParser;
  97535. + markupParser.CodeParser = codeParser;
  97536. - parser.ParseBlock();
  97537. + var root = codeParser.ParseBlock().CreateRed();
  97538. - var root = context.Builder.Build();
  97539. var diagnostics = context.ErrorSink.Errors;
  97540. - return RazorSyntaxTree.Create(root, source, diagnostics, options);
  97541. - }
  97542. + var syntaxTree = RazorSyntaxTree.Create(root, source, diagnostics, options);
  97543. - internal SpanFactory CreateSpanFactory()
  97544. - {
  97545. - return new SpanFactory();
  97546. + return syntaxTree;
  97547. }
  97548. - internal abstract BlockFactory CreateBlockFactory();
  97549. -
  97550. internal virtual void ParseBlockTest(string document)
  97551. {
  97552. ParseBlockTest(document, null, false, new RazorDiagnostic[0]);
  97553. }
  97554. - internal virtual void ParseBlockTest(string document, bool designTime)
  97555. - {
  97556. - ParseBlockTest(document, null, designTime, new RazorDiagnostic[0]);
  97557. - }
  97558. -
  97559. internal virtual void ParseBlockTest(string document, IEnumerable<DirectiveDescriptor> directives)
  97560. {
  97561. ParseBlockTest(document, directives, null);
  97562. @@ -381,55 +358,25 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  97563. internal virtual void ParseBlockTest(RazorLanguageVersion version, string document)
  97564. {
  97565. - ParseBlockTest(version, document, expectedRoot: null);
  97566. - }
  97567. -
  97568. - internal virtual void ParseBlockTest(RazorLanguageVersion version, string document, Block expectedRoot)
  97569. - {
  97570. - ParseBlockTest(version, document, expectedRoot, false, null);
  97571. - }
  97572. -
  97573. - internal virtual void ParseBlockTest(string document, Block expectedRoot)
  97574. - {
  97575. - ParseBlockTest(document, expectedRoot, false, null);
  97576. - }
  97577. -
  97578. - internal virtual void ParseBlockTest(string document, IEnumerable<DirectiveDescriptor> directives, Block expectedRoot)
  97579. - {
  97580. - ParseBlockTest(document, directives, expectedRoot, false, null);
  97581. - }
  97582. -
  97583. - internal virtual void ParseBlockTest(string document, Block expectedRoot, bool designTime)
  97584. - {
  97585. - ParseBlockTest(document, expectedRoot, designTime, null);
  97586. - }
  97587. -
  97588. - internal virtual void ParseBlockTest(string document, Block expectedRoot, params RazorDiagnostic[] expectedErrors)
  97589. - {
  97590. - ParseBlockTest(document, expectedRoot, false, expectedErrors);
  97591. - }
  97592. -
  97593. - internal virtual void ParseBlockTest(string document, IEnumerable<DirectiveDescriptor> directives, Block expectedRoot, params RazorDiagnostic[] expectedErrors)
  97594. - {
  97595. - ParseBlockTest(document, directives, expectedRoot, false, expectedErrors);
  97596. + ParseBlockTest(version, document, false, null);
  97597. }
  97598. - internal virtual void ParseBlockTest(string document, Block expected, bool designTime, params RazorDiagnostic[] expectedErrors)
  97599. + internal virtual void ParseBlockTest(string document, IEnumerable<DirectiveDescriptor> directives, params RazorDiagnostic[] expectedErrors)
  97600. {
  97601. - ParseBlockTest(document, null, expected, designTime, expectedErrors);
  97602. + ParseBlockTest(document, directives, false, expectedErrors);
  97603. }
  97604. - internal virtual void ParseBlockTest(RazorLanguageVersion version, string document, Block expected, bool designTime, params RazorDiagnostic[] expectedErrors)
  97605. + internal virtual void ParseBlockTest(RazorLanguageVersion version, string document, bool designTime, params RazorDiagnostic[] expectedErrors)
  97606. {
  97607. - ParseBlockTest(version, document, null, expected, designTime, expectedErrors);
  97608. + ParseBlockTest(version, document, null, designTime, expectedErrors);
  97609. }
  97610. - internal virtual void ParseBlockTest(string document, IEnumerable<DirectiveDescriptor> directives, Block expected, bool designTime, params RazorDiagnostic[] expectedErrors)
  97611. + internal virtual void ParseBlockTest(string document, IEnumerable<DirectiveDescriptor> directives, bool designTime, params RazorDiagnostic[] expectedErrors)
  97612. {
  97613. - ParseBlockTest(RazorLanguageVersion.Latest, document, directives, expected, designTime, expectedErrors);
  97614. + ParseBlockTest(RazorLanguageVersion.Latest, document, directives, designTime, expectedErrors);
  97615. }
  97616. - internal virtual void ParseBlockTest(RazorLanguageVersion version, string document, IEnumerable<DirectiveDescriptor> directives, Block expected, bool designTime, params RazorDiagnostic[] expectedErrors)
  97617. + internal virtual void ParseBlockTest(RazorLanguageVersion version, string document, IEnumerable<DirectiveDescriptor> directives, bool designTime, params RazorDiagnostic[] expectedErrors)
  97618. {
  97619. var result = ParseBlock(version, document, directives, designTime);
  97620. @@ -478,24 +425,14 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  97621. ParseDocumentTest(document, null, false);
  97622. }
  97623. - internal virtual void ParseDocumentTest(string document, IEnumerable<DirectiveDescriptor> directives)
  97624. + internal virtual void ParseDocumentTest(string document, params RazorDiagnostic[] expectedErrors)
  97625. {
  97626. - ParseDocumentTest(document, directives, expected: null);
  97627. + ParseDocumentTest(document, false, expectedErrors);
  97628. }
  97629. - internal virtual void ParseDocumentTest(string document, Block expectedRoot)
  97630. + internal virtual void ParseDocumentTest(string document, IEnumerable<DirectiveDescriptor> directives, params RazorDiagnostic[] expectedErrors)
  97631. {
  97632. - ParseDocumentTest(document, expectedRoot, false, null);
  97633. - }
  97634. -
  97635. - internal virtual void ParseDocumentTest(string document, Block expectedRoot, params RazorDiagnostic[] expectedErrors)
  97636. - {
  97637. - ParseDocumentTest(document, expectedRoot, false, expectedErrors);
  97638. - }
  97639. -
  97640. - internal virtual void ParseDocumentTest(string document, IEnumerable<DirectiveDescriptor> directives, Block expected, params RazorDiagnostic[] expectedErrors)
  97641. - {
  97642. - ParseDocumentTest(document, directives, expected, false, expectedErrors);
  97643. + ParseDocumentTest(document, directives, false, expectedErrors);
  97644. }
  97645. internal virtual void ParseDocumentTest(string document, bool designTime)
  97646. @@ -503,277 +440,57 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  97647. ParseDocumentTest(document, null, designTime);
  97648. }
  97649. - internal virtual void ParseDocumentTest(string document, Block expectedRoot, bool designTime)
  97650. + internal virtual void ParseDocumentTest(string document, bool designTime, params RazorDiagnostic[] expectedErrors)
  97651. {
  97652. - ParseDocumentTest(document, expectedRoot, designTime, null);
  97653. + ParseDocumentTest(document, null, designTime, expectedErrors);
  97654. }
  97655. - internal virtual void ParseDocumentTest(string document, Block expected, bool designTime, params RazorDiagnostic[] expectedErrors)
  97656. - {
  97657. - ParseDocumentTest(document, null, expected, designTime, expectedErrors);
  97658. - }
  97659. -
  97660. - internal virtual void ParseDocumentTest(string document, IEnumerable<DirectiveDescriptor> directives, Block expected, bool designTime, params RazorDiagnostic[] expectedErrors)
  97661. + internal virtual void ParseDocumentTest(string document, IEnumerable<DirectiveDescriptor> directives, bool designTime, params RazorDiagnostic[] expectedErrors)
  97662. {
  97663. var result = ParseDocument(document, directives, designTime);
  97664. BaselineTest(result);
  97665. }
  97666. - internal static void EvaluateResults(RazorSyntaxTree result, Block expectedRoot)
  97667. - {
  97668. - EvaluateResults(result, expectedRoot, null);
  97669. - }
  97670. -
  97671. - internal static void EvaluateResults(RazorSyntaxTree result, Block expectedRoot, IList<RazorDiagnostic> expectedErrors)
  97672. - {
  97673. - EvaluateParseTree(result.Root, expectedRoot);
  97674. - EvaluateRazorErrors(result.Diagnostics, expectedErrors);
  97675. - }
  97676. -
  97677. - internal static void EvaluateParseTree(Block actualRoot, Block expectedRoot)
  97678. - {
  97679. - // Evaluate the result
  97680. - var collector = new ErrorCollector();
  97681. -
  97682. - if (expectedRoot == null)
  97683. - {
  97684. - Assert.Null(actualRoot);
  97685. - }
  97686. - else
  97687. - {
  97688. - // Link all the nodes
  97689. - expectedRoot.LinkNodes();
  97690. - Assert.NotNull(actualRoot);
  97691. - EvaluateSyntaxTreeNode(collector, actualRoot, expectedRoot);
  97692. - if (collector.Success)
  97693. - {
  97694. - WriteTraceLine("Parse Tree Validation Succeeded:" + Environment.NewLine + collector.Message);
  97695. - }
  97696. - else
  97697. - {
  97698. - Assert.True(false, Environment.NewLine + collector.Message);
  97699. - }
  97700. - }
  97701. - }
  97702. -
  97703. - private static void EvaluateSyntaxTreeNode(ErrorCollector collector, SyntaxTreeNode actual, SyntaxTreeNode expected)
  97704. - {
  97705. - if (actual == null)
  97706. - {
  97707. - AddNullActualError(collector, actual, expected);
  97708. - return;
  97709. - }
  97710. -
  97711. - if (actual.IsBlock != expected.IsBlock)
  97712. - {
  97713. - AddMismatchError(collector, actual, expected);
  97714. - }
  97715. - else
  97716. - {
  97717. - if (expected.IsBlock)
  97718. - {
  97719. - EvaluateBlock(collector, (Block)actual, (Block)expected);
  97720. - }
  97721. - else
  97722. - {
  97723. - EvaluateSpan(collector, (Span)actual, (Span)expected);
  97724. - }
  97725. - }
  97726. - }
  97727. -
  97728. - private static void EvaluateSpan(ErrorCollector collector, Span actual, Span expected)
  97729. - {
  97730. - if (!Equals(expected, actual))
  97731. - {
  97732. - AddMismatchError(collector, actual, expected);
  97733. - }
  97734. - else
  97735. - {
  97736. - AddPassedMessage(collector, expected);
  97737. - }
  97738. - }
  97739. -
  97740. - private static void EvaluateBlock(ErrorCollector collector, Block actual, Block expected)
  97741. + internal static RazorParserOptions CreateParserOptions(
  97742. + RazorLanguageVersion version,
  97743. + IEnumerable<DirectiveDescriptor> directives,
  97744. + bool designTime,
  97745. + RazorParserFeatureFlags featureFlags = null)
  97746. {
  97747. - if (actual.Type != expected.Type || !expected.ChunkGenerator.Equals(actual.ChunkGenerator))
  97748. - {
  97749. - AddMismatchError(collector, actual, expected);
  97750. - }
  97751. - else
  97752. - {
  97753. - if (actual is TagHelperBlock)
  97754. - {
  97755. - EvaluateTagHelperBlock(collector, actual as TagHelperBlock, expected as TagHelperBlock);
  97756. - }
  97757. -
  97758. - AddPassedMessage(collector, expected);
  97759. - using (collector.Indent())
  97760. - {
  97761. - var expectedNodes = expected.Children.GetEnumerator();
  97762. - var actualNodes = actual.Children.GetEnumerator();
  97763. - while (expectedNodes.MoveNext())
  97764. - {
  97765. - if (!actualNodes.MoveNext())
  97766. - {
  97767. - collector.AddError("{0} - FAILED :: No more elements at this node", expectedNodes.Current);
  97768. - }
  97769. - else
  97770. - {
  97771. - EvaluateSyntaxTreeNode(collector, actualNodes.Current, expectedNodes.Current);
  97772. - }
  97773. - }
  97774. - while (actualNodes.MoveNext())
  97775. - {
  97776. - collector.AddError("End of Node - FAILED :: Found Node: {0}", actualNodes.Current);
  97777. - }
  97778. - }
  97779. - }
  97780. + return new TestRazorParserOptions(
  97781. + directives.ToArray(),
  97782. + designTime,
  97783. + parseLeadingDirectives: false,
  97784. + version: version,
  97785. + featureFlags: featureFlags);
  97786. }
  97787. - private static void EvaluateTagHelperBlock(ErrorCollector collector, TagHelperBlock actual, TagHelperBlock expected)
  97788. + private class TestRazorParserOptions : RazorParserOptions
  97789. {
  97790. - if (expected == null)
  97791. - {
  97792. - AddMismatchError(collector, actual, expected);
  97793. - }
  97794. - else
  97795. + public TestRazorParserOptions(DirectiveDescriptor[] directives, bool designTime, bool parseLeadingDirectives, RazorLanguageVersion version, RazorParserFeatureFlags featureFlags = null)
  97796. {
  97797. - if (!string.Equals(expected.TagName, actual.TagName, StringComparison.Ordinal))
  97798. + if (directives == null)
  97799. {
  97800. - collector.AddError(
  97801. - "{0} - FAILED :: TagName mismatch for TagHelperBlock :: ACTUAL: {1}",
  97802. - expected.TagName,
  97803. - actual.TagName);
  97804. + throw new ArgumentNullException(nameof(directives));
  97805. }
  97806. - if (expected.TagMode != actual.TagMode)
  97807. - {
  97808. - collector.AddError(
  97809. - $"{expected.TagMode} - FAILED :: {nameof(TagMode)} for {nameof(TagHelperBlock)} " +
  97810. - $"{actual.TagName} :: ACTUAL: {actual.TagMode}");
  97811. - }
  97812. -
  97813. - var expectedAttributes = expected.Attributes.GetEnumerator();
  97814. - var actualAttributes = actual.Attributes.GetEnumerator();
  97815. -
  97816. - while (expectedAttributes.MoveNext())
  97817. - {
  97818. - if (!actualAttributes.MoveNext())
  97819. - {
  97820. - collector.AddError("{0} - FAILED :: No more attributes on this node", expectedAttributes.Current);
  97821. - }
  97822. - else
  97823. - {
  97824. - EvaluateTagHelperAttribute(collector, actualAttributes.Current, expectedAttributes.Current);
  97825. - }
  97826. - }
  97827. - while (actualAttributes.MoveNext())
  97828. - {
  97829. - collector.AddError("End of Attributes - FAILED :: Found Attribute: {0}", actualAttributes.Current.Name);
  97830. - }
  97831. - }
  97832. - }
  97833. -
  97834. - private static void EvaluateTagHelperAttribute(
  97835. - ErrorCollector collector,
  97836. - TagHelperAttributeNode actual,
  97837. - TagHelperAttributeNode expected)
  97838. - {
  97839. - if (actual.Name != expected.Name)
  97840. - {
  97841. - collector.AddError("{0} - FAILED :: Attribute names do not match", expected.Name);
  97842. - }
  97843. - else
  97844. - {
  97845. - collector.AddMessage("{0} - PASSED :: Attribute names match", expected.Name);
  97846. - }
  97847. -
  97848. - if (actual.AttributeStructure != expected.AttributeStructure)
  97849. - {
  97850. - collector.AddError("{0} - FAILED :: Attribute value styles do not match", expected.AttributeStructure.ToString());
  97851. - }
  97852. - else
  97853. - {
  97854. - collector.AddMessage("{0} - PASSED :: Attribute value style match", expected.AttributeStructure);
  97855. + Directives = directives;
  97856. + DesignTime = designTime;
  97857. + ParseLeadingDirectives = parseLeadingDirectives;
  97858. + Version = version;
  97859. + FeatureFlags = featureFlags ?? RazorParserFeatureFlags.Create(Version);
  97860. }
  97861. - if (actual.AttributeStructure != AttributeStructure.Minimized)
  97862. - {
  97863. - EvaluateSyntaxTreeNode(collector, actual.Value, expected.Value);
  97864. - }
  97865. - }
  97866. -
  97867. - private static void AddPassedMessage(ErrorCollector collector, SyntaxTreeNode expected)
  97868. - {
  97869. - collector.AddMessage("{0} - PASSED", expected);
  97870. - }
  97871. -
  97872. - private static void AddMismatchError(ErrorCollector collector, SyntaxTreeNode actual, SyntaxTreeNode expected)
  97873. - {
  97874. - collector.AddError("{0} - FAILED :: Actual: {1}", expected, actual);
  97875. - }
  97876. -
  97877. - private static void AddNullActualError(ErrorCollector collector, SyntaxTreeNode actual, SyntaxTreeNode expected)
  97878. - {
  97879. - collector.AddError("{0} - FAILED :: Actual: << Null >>", expected);
  97880. - }
  97881. -
  97882. - internal static void EvaluateRazorErrors(IEnumerable<RazorDiagnostic> actualErrors, IList<RazorDiagnostic> expectedErrors)
  97883. - {
  97884. - var realCount = actualErrors.Count();
  97885. + public override bool DesignTime { get; }
  97886. - // Evaluate the errors
  97887. - if (expectedErrors == null || expectedErrors.Count == 0)
  97888. - {
  97889. - Assert.True(
  97890. - realCount == 0,
  97891. - "Expected that no errors would be raised, but the following errors were:" + Environment.NewLine + FormatErrors(actualErrors));
  97892. - }
  97893. - else
  97894. - {
  97895. - Assert.True(
  97896. - expectedErrors.Count == realCount,
  97897. - $"Expected that {expectedErrors.Count} errors would be raised, but {realCount} errors were." +
  97898. - $"{Environment.NewLine}Expected Errors: {Environment.NewLine}{FormatErrors(expectedErrors)}" +
  97899. - $"{Environment.NewLine}Actual Errors: {Environment.NewLine}{FormatErrors(actualErrors)}");
  97900. - Assert.Equal(expectedErrors, actualErrors);
  97901. - }
  97902. - WriteTraceLine("Expected Errors were raised:" + Environment.NewLine + FormatErrors(expectedErrors));
  97903. - }
  97904. + public override IReadOnlyCollection<DirectiveDescriptor> Directives { get; }
  97905. - internal static string FormatErrors(IEnumerable<RazorDiagnostic> errors)
  97906. - {
  97907. - if (errors == null)
  97908. - {
  97909. - return "\t<< No Errors >>";
  97910. - }
  97911. + public override bool ParseLeadingDirectives { get; }
  97912. - var builder = new StringBuilder();
  97913. - foreach (var error in errors)
  97914. - {
  97915. - builder.AppendFormat("\t{0}", error);
  97916. - builder.AppendLine();
  97917. - }
  97918. - return builder.ToString();
  97919. - }
  97920. -
  97921. - [Conditional("PARSER_TRACE")]
  97922. - private static void WriteTraceLine(string format, params object[] args)
  97923. - {
  97924. - Trace.WriteLine(string.Format(format, args));
  97925. - }
  97926. + public override RazorLanguageVersion Version { get; }
  97927. - private static RazorParserOptions CreateParserOptions(
  97928. - RazorLanguageVersion version,
  97929. - IEnumerable<DirectiveDescriptor> directives,
  97930. - bool designTime)
  97931. - {
  97932. - return new DefaultRazorParserOptions(
  97933. - directives.ToArray(),
  97934. - designTime,
  97935. - parseLeadingDirectives: false,
  97936. - version: version);
  97937. + internal override RazorParserFeatureFlags FeatureFlags { get; }
  97938. }
  97939. }
  97940. }
  97941. diff --git a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxTreeNodeSerializer.cs b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxNodeSerializer.cs
  97942. similarity index 52%
  97943. rename from test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxTreeNodeSerializer.cs
  97944. rename to test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxNodeSerializer.cs
  97945. index 50a22e25a7f..df81d123518 100644
  97946. --- a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxTreeNodeSerializer.cs
  97947. +++ b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxNodeSerializer.cs
  97948. @@ -1,13 +1,14 @@
  97949. -// Copyright (c) .NET Foundation. All rights reserved.
  97950. +// Copyright (c) .NET Foundation. All rights reserved.
  97951. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  97952. using System.IO;
  97953. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  97954. namespace Microsoft.AspNetCore.Razor.Language.Legacy
  97955. {
  97956. - public static class SyntaxTreeNodeSerializer
  97957. + public static class SyntaxNodeSerializer
  97958. {
  97959. - internal static string Serialize(SyntaxTreeNode node)
  97960. + internal static string Serialize(SyntaxNode node)
  97961. {
  97962. using (var writer = new StringWriter())
  97963. {
  97964. @@ -18,30 +19,42 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  97965. }
  97966. }
  97967. - private class Walker : SyntaxTreeNodeWalker
  97968. + private class Walker : SyntaxNodeWalker
  97969. {
  97970. - private readonly SyntaxTreeNodeWriter _visitor;
  97971. + private readonly SyntaxNodeWriter _visitor;
  97972. private readonly TextWriter _writer;
  97973. public Walker(TextWriter writer)
  97974. {
  97975. - _visitor = new SyntaxTreeNodeWriter(writer);
  97976. + _visitor = new SyntaxNodeWriter(writer);
  97977. _writer = writer;
  97978. }
  97979. public TextWriter Writer { get; }
  97980. - public override void Visit(SyntaxTreeNode node)
  97981. + public override SyntaxNode Visit(SyntaxNode node)
  97982. {
  97983. + if (node == null)
  97984. + {
  97985. + return node;
  97986. + }
  97987. +
  97988. + if (node.IsList)
  97989. + {
  97990. + return base.DefaultVisit(node);
  97991. + }
  97992. +
  97993. _visitor.Visit(node);
  97994. _writer.WriteLine();
  97995. - if (node is Block block)
  97996. + if (!node.IsToken && !node.IsTrivia)
  97997. {
  97998. _visitor.Depth++;
  97999. - base.VisitDefault(block);
  98000. + node = base.DefaultVisit(node);
  98001. _visitor.Depth--;
  98002. }
  98003. +
  98004. + return node;
  98005. }
  98006. }
  98007. }
  98008. diff --git a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxTreeNodeVerifier.cs b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxNodeVerifier.cs
  98009. similarity index 76%
  98010. rename from test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxTreeNodeVerifier.cs
  98011. rename to test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxNodeVerifier.cs
  98012. index bb8d0bab729..17a0cbf72f3 100644
  98013. --- a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxTreeNodeVerifier.cs
  98014. +++ b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxNodeVerifier.cs
  98015. @@ -1,4 +1,4 @@
  98016. -// Copyright (c) .NET Foundation. All rights reserved.
  98017. +// Copyright (c) .NET Foundation. All rights reserved.
  98018. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  98019. using System;
  98020. @@ -6,24 +6,25 @@ using System.Collections.Generic;
  98021. using System.IO;
  98022. using System.Linq;
  98023. using System.Text;
  98024. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  98025. using Xunit;
  98026. using Xunit.Sdk;
  98027. namespace Microsoft.AspNetCore.Razor.Language.Legacy
  98028. {
  98029. - public static class SyntaxTreeNodeVerifier
  98030. + public static class SyntaxNodeVerifier
  98031. {
  98032. - internal static void Verify(SyntaxTreeNode node, string[] baseline)
  98033. + internal static void Verify(SyntaxNode node, string[] baseline)
  98034. {
  98035. var walker = new Walker(baseline);
  98036. walker.Visit(node);
  98037. walker.AssertReachedEndOfBaseline();
  98038. }
  98039. - private class Walker : SyntaxTreeNodeWalker
  98040. + private class Walker : SyntaxNodeWalker
  98041. {
  98042. private readonly string[] _baseline;
  98043. - private readonly SyntaxTreeNodeWriter _visitor;
  98044. + private readonly SyntaxNodeWriter _visitor;
  98045. private readonly StringWriter _writer;
  98046. private int _index;
  98047. @@ -32,14 +33,24 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  98048. {
  98049. _writer = new StringWriter();
  98050. - _visitor = new SyntaxTreeNodeWriter(_writer);
  98051. + _visitor = new SyntaxNodeWriter(_writer);
  98052. _baseline = baseline;
  98053. }
  98054. public TextWriter Writer { get; }
  98055. - public override void Visit(SyntaxTreeNode node)
  98056. + public override SyntaxNode Visit(SyntaxNode node)
  98057. {
  98058. + if (node == null)
  98059. + {
  98060. + return node;
  98061. + }
  98062. +
  98063. + if (node.IsList)
  98064. + {
  98065. + return base.DefaultVisit(node);
  98066. + }
  98067. +
  98068. var expected = _index < _baseline.Length ? _baseline[_index++] : null;
  98069. // Write the node as text for comparison
  98070. @@ -56,12 +67,14 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  98071. AssertNodeEquals(node, Ancestors, expected, actual);
  98072. - if (node is Block block)
  98073. + if (!node.IsToken && !node.IsTrivia)
  98074. {
  98075. _visitor.Depth++;
  98076. - base.VisitDefault(block);
  98077. + base.DefaultVisit(node);
  98078. _visitor.Depth--;
  98079. }
  98080. +
  98081. + return node;
  98082. }
  98083. public void AssertReachedEndOfBaseline()
  98084. @@ -70,7 +83,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  98085. Assert.True(_baseline.Length == _index, "Not all lines of the baseline were visited!");
  98086. }
  98087. - private void AssertNodeEquals(SyntaxTreeNode node, IEnumerable<SyntaxTreeNode> ancestors, string expected, string actual)
  98088. + private void AssertNodeEquals(SyntaxNode node, IEnumerable<SyntaxNode> ancestors, string expected, string actual)
  98089. {
  98090. if (string.Equals(expected, actual))
  98091. {
  98092. @@ -81,7 +94,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  98093. if (expected == null)
  98094. {
  98095. var message = "The node is missing from baseline.";
  98096. - throw new SyntaxTreeNodeBaselineException(node, Ancestors.ToArray(), expected, actual, message);
  98097. + throw new SyntaxNodeBaselineException(node, Ancestors.ToArray(), expected, actual, message);
  98098. }
  98099. int charsVerified = 0;
  98100. @@ -95,7 +108,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  98101. throw new InvalidOperationException("We can't figure out HOW these two things are different. This is a bug.");
  98102. }
  98103. - private void AssertNestingEqual(SyntaxTreeNode node, IEnumerable<SyntaxTreeNode> ancestors, string expected, string actual, ref int charsVerified)
  98104. + private void AssertNestingEqual(SyntaxNode node, IEnumerable<SyntaxNode> ancestors, string expected, string actual, ref int charsVerified)
  98105. {
  98106. var i = 0;
  98107. for (; i < expected.Length; i++)
  98108. @@ -125,13 +138,13 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  98109. if (failed)
  98110. {
  98111. var message = "The node is at the wrong level of nesting. This usually means a child is missing.";
  98112. - throw new SyntaxTreeNodeBaselineException(node, ancestors.ToArray(), expected, actual, message);
  98113. + throw new SyntaxNodeBaselineException(node, ancestors.ToArray(), expected, actual, message);
  98114. }
  98115. charsVerified = j;
  98116. }
  98117. - private void AssertNameEqual(SyntaxTreeNode node, IEnumerable<SyntaxTreeNode> ancestors, string expected, string actual, ref int charsVerified)
  98118. + private void AssertNameEqual(SyntaxNode node, IEnumerable<SyntaxNode> ancestors, string expected, string actual, ref int charsVerified)
  98119. {
  98120. var expectedName = GetName(expected, charsVerified);
  98121. var actualName = GetName(actual, charsVerified);
  98122. @@ -139,14 +152,14 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  98123. if (!string.Equals(expectedName, actualName))
  98124. {
  98125. var message = $"Node names are not equal.";
  98126. - throw new SyntaxTreeNodeBaselineException(node, ancestors.ToArray(), expected, actual, message);
  98127. + throw new SyntaxNodeBaselineException(node, ancestors.ToArray(), expected, actual, message);
  98128. }
  98129. charsVerified += expectedName.Length;
  98130. }
  98131. // Either both strings need to have a delimiter next or neither should.
  98132. - private void AssertDelimiter(SyntaxTreeNode node, string expected, string actual, bool required, ref int charsVerified)
  98133. + private void AssertDelimiter(SyntaxNode node, string expected, string actual, bool required, ref int charsVerified)
  98134. {
  98135. if (charsVerified == expected.Length && required)
  98136. {
  98137. @@ -180,7 +193,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  98138. charsVerified += 3;
  98139. }
  98140. - private void AssertLocationEqual(SyntaxTreeNode node, IEnumerable<SyntaxTreeNode> ancestors, string expected, string actual, ref int charsVerified)
  98141. + private void AssertLocationEqual(SyntaxNode node, IEnumerable<SyntaxNode> ancestors, string expected, string actual, ref int charsVerified)
  98142. {
  98143. var expectedLocation = GetLocation(expected, charsVerified);
  98144. var actualLocation = GetLocation(actual, charsVerified);
  98145. @@ -188,13 +201,13 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  98146. if (!string.Equals(expectedLocation, actualLocation))
  98147. {
  98148. var message = $"Locations are not equal.";
  98149. - throw new SyntaxTreeNodeBaselineException(node, ancestors.ToArray(), expected, actual, message);
  98150. + throw new SyntaxNodeBaselineException(node, ancestors.ToArray(), expected, actual, message);
  98151. }
  98152. charsVerified += expectedLocation.Length;
  98153. }
  98154. - private void AssertContentEqual(SyntaxTreeNode node, IEnumerable<SyntaxTreeNode> ancestors, string expected, string actual, ref int charsVerified)
  98155. + private void AssertContentEqual(SyntaxNode node, IEnumerable<SyntaxNode> ancestors, string expected, string actual, ref int charsVerified)
  98156. {
  98157. var expectedContent = GetContent(expected, charsVerified);
  98158. var actualContent = GetContent(actual, charsVerified);
  98159. @@ -202,7 +215,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  98160. if (!string.Equals(expectedContent, actualContent))
  98161. {
  98162. var message = $"Contents are not equal.";
  98163. - throw new SyntaxTreeNodeBaselineException(node, ancestors.ToArray(), expected, actual, message);
  98164. + throw new SyntaxNodeBaselineException(node, ancestors.ToArray(), expected, actual, message);
  98165. }
  98166. charsVerified += expectedContent.Length;
  98167. @@ -230,9 +243,9 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  98168. return start == text.Length ? string.Empty : text.Substring(start);
  98169. }
  98170. - private class SyntaxTreeNodeBaselineException : XunitException
  98171. + private class SyntaxNodeBaselineException : XunitException
  98172. {
  98173. - public SyntaxTreeNodeBaselineException(SyntaxTreeNode node, SyntaxTreeNode[] ancestors, string expected, string actual, string userMessage)
  98174. + public SyntaxNodeBaselineException(SyntaxNode node, SyntaxNode[] ancestors, string expected, string actual, string userMessage)
  98175. : base(Format(node, ancestors, expected, actual, userMessage))
  98176. {
  98177. Node = node;
  98178. @@ -240,13 +253,13 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  98179. Actual = actual;
  98180. }
  98181. - public SyntaxTreeNode Node { get; }
  98182. + public SyntaxNode Node { get; }
  98183. public string Actual { get; }
  98184. public string Expected { get; }
  98185. - private static string Format(SyntaxTreeNode node, SyntaxTreeNode[] ancestors, string expected, string actual, string userMessage)
  98186. + private static string Format(SyntaxNode node, SyntaxNode[] ancestors, string expected, string actual, string userMessage)
  98187. {
  98188. var builder = new StringBuilder();
  98189. builder.AppendLine(userMessage);
  98190. @@ -280,4 +293,4 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  98191. }
  98192. }
  98193. }
  98194. -}
  98195. \ No newline at end of file
  98196. +}
  98197. diff --git a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxNodeWalker.cs b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxNodeWalker.cs
  98198. new file mode 100644
  98199. index 00000000000..818732d685d
  98200. --- /dev/null
  98201. +++ b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxNodeWalker.cs
  98202. @@ -0,0 +1,37 @@
  98203. +// Copyright (c) .NET Foundation. All rights reserved.
  98204. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  98205. +
  98206. +using System.Collections.Generic;
  98207. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  98208. +
  98209. +namespace Microsoft.AspNetCore.Razor.Language.Legacy
  98210. +{
  98211. + internal class SyntaxNodeWalker : SyntaxRewriter
  98212. + {
  98213. + private readonly List<SyntaxNode> _ancestors = new List<SyntaxNode>();
  98214. +
  98215. + protected IReadOnlyList<SyntaxNode> Ancestors => _ancestors;
  98216. +
  98217. + protected SyntaxNode Parent => _ancestors.Count > 0 ? _ancestors[0] : null;
  98218. +
  98219. + protected override SyntaxNode DefaultVisit(SyntaxNode node)
  98220. + {
  98221. + _ancestors.Insert(0, node);
  98222. +
  98223. + try
  98224. + {
  98225. + for (var i = 0; i < node.SlotCount; i++)
  98226. + {
  98227. + var child = node.GetNodeSlot(i);
  98228. + Visit(child);
  98229. + }
  98230. + }
  98231. + finally
  98232. + {
  98233. + _ancestors.RemoveAt(0);
  98234. + }
  98235. +
  98236. + return node;
  98237. + }
  98238. + }
  98239. +}
  98240. diff --git a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxNodeWriter.cs b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxNodeWriter.cs
  98241. new file mode 100644
  98242. index 00000000000..3d1faba30e7
  98243. --- /dev/null
  98244. +++ b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxNodeWriter.cs
  98245. @@ -0,0 +1,219 @@
  98246. +// Copyright (c) .NET Foundation. All rights reserved.
  98247. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  98248. +
  98249. +using System;
  98250. +using System.IO;
  98251. +using System.Linq;
  98252. +using System.Text;
  98253. +using Microsoft.AspNetCore.Razor.Language.Legacy;
  98254. +
  98255. +namespace Microsoft.AspNetCore.Razor.Language.Syntax
  98256. +{
  98257. + internal class SyntaxNodeWriter : SyntaxRewriter
  98258. + {
  98259. + private readonly TextWriter _writer;
  98260. + private bool _visitedRoot;
  98261. +
  98262. + public SyntaxNodeWriter(TextWriter writer)
  98263. + {
  98264. + _writer = writer;
  98265. + }
  98266. +
  98267. + public int Depth { get; set; }
  98268. +
  98269. + public override SyntaxNode Visit(SyntaxNode node)
  98270. + {
  98271. + if (node is SyntaxToken token)
  98272. + {
  98273. + return VisitToken(token);
  98274. + }
  98275. +
  98276. + WriteNode(node);
  98277. + return node;
  98278. + }
  98279. +
  98280. + public override SyntaxNode VisitToken(SyntaxToken token)
  98281. + {
  98282. + WriteToken(token);
  98283. + return base.VisitToken(token);
  98284. + }
  98285. +
  98286. + public override SyntaxNode VisitTrivia(SyntaxTrivia trivia)
  98287. + {
  98288. + WriteTrivia(trivia);
  98289. + return base.VisitTrivia(trivia);
  98290. + }
  98291. +
  98292. + private void WriteNode(SyntaxNode node)
  98293. + {
  98294. + WriteIndent();
  98295. + Write(node.Kind);
  98296. + WriteSeparator();
  98297. + Write($"[{node.Position}..{node.EndPosition})::{node.FullWidth}");
  98298. +
  98299. + if (node is RazorDirectiveSyntax razorDirective)
  98300. + {
  98301. + WriteRazorDirective(razorDirective);
  98302. + }
  98303. + else if (node is MarkupTagHelperElementSyntax tagHelperElement)
  98304. + {
  98305. + WriteTagHelperElement(tagHelperElement);
  98306. + }
  98307. + else if (node is MarkupTagHelperAttributeSyntax tagHelperAttribute)
  98308. + {
  98309. + WriteTagHelperAttributeInfo(tagHelperAttribute.TagHelperAttributeInfo);
  98310. + }
  98311. + else if (node is MarkupMinimizedTagHelperAttributeSyntax minimizedTagHelperAttribute)
  98312. + {
  98313. + WriteTagHelperAttributeInfo(minimizedTagHelperAttribute.TagHelperAttributeInfo);
  98314. + }
  98315. +
  98316. + if (ShouldDisplayNodeContent(node))
  98317. + {
  98318. + WriteSeparator();
  98319. + Write($"[{node.GetContent()}]");
  98320. + }
  98321. +
  98322. + var annotation = node.GetAnnotations().FirstOrDefault(a => a.Kind == SyntaxConstants.SpanContextKind);
  98323. + if (annotation != null && annotation.Data is SpanContext context)
  98324. + {
  98325. + WriteSpanContext(context);
  98326. + }
  98327. +
  98328. + if (!_visitedRoot)
  98329. + {
  98330. + WriteSeparator();
  98331. + Write($"[{node.ToFullString()}]");
  98332. + _visitedRoot = true;
  98333. + }
  98334. + }
  98335. +
  98336. + private void WriteRazorDirective(RazorDirectiveSyntax node)
  98337. + {
  98338. + if (node.DirectiveDescriptor == null)
  98339. + {
  98340. + return;
  98341. + }
  98342. +
  98343. + var builder = new StringBuilder("Directive:{");
  98344. + builder.Append(node.DirectiveDescriptor.Directive);
  98345. + builder.Append(";");
  98346. + builder.Append(node.DirectiveDescriptor.Kind);
  98347. + builder.Append(";");
  98348. + builder.Append(node.DirectiveDescriptor.Usage);
  98349. + builder.Append("}");
  98350. +
  98351. + var diagnostics = node.GetDiagnostics();
  98352. + if (diagnostics.Length > 0)
  98353. + {
  98354. + builder.Append(" [");
  98355. + var ids = string.Join(", ", diagnostics.Select(diagnostic => $"{diagnostic.Id}{diagnostic.Span}"));
  98356. + builder.Append(ids);
  98357. + builder.Append("]");
  98358. + }
  98359. +
  98360. + WriteSeparator();
  98361. + Write(builder.ToString());
  98362. + }
  98363. +
  98364. + private void WriteTagHelperElement(MarkupTagHelperElementSyntax node)
  98365. + {
  98366. + // Write tag name
  98367. + WriteSeparator();
  98368. + Write($"{node.TagHelperInfo.TagName}[{node.TagHelperInfo.TagMode}]");
  98369. +
  98370. + // Write descriptors
  98371. + foreach (var descriptor in node.TagHelperInfo.BindingResult.Descriptors)
  98372. + {
  98373. + WriteSeparator();
  98374. +
  98375. + // Get the type name without the namespace.
  98376. + var typeName = descriptor.Name.Substring(descriptor.Name.LastIndexOf('.') + 1);
  98377. + Write(typeName);
  98378. + }
  98379. + }
  98380. +
  98381. + private void WriteTagHelperAttributeInfo(TagHelperAttributeInfo info)
  98382. + {
  98383. + // Write attributes
  98384. + WriteSeparator();
  98385. + Write(info.Name);
  98386. + WriteSeparator();
  98387. + Write(info.AttributeStructure);
  98388. + WriteSeparator();
  98389. + Write(info.Bound ? "Bound" : "Unbound");
  98390. + }
  98391. +
  98392. + private void WriteToken(SyntaxToken token)
  98393. + {
  98394. + WriteIndent();
  98395. + var content = token.IsMissing ? "<Missing>" : token.Content;
  98396. + var diagnostics = token.GetDiagnostics();
  98397. + var tokenString = $"{token.Kind};[{content}];{string.Join(", ", diagnostics.Select(diagnostic => diagnostic.Id + diagnostic.Span))}";
  98398. + Write(tokenString);
  98399. + }
  98400. +
  98401. + private void WriteTrivia(SyntaxTrivia trivia)
  98402. + {
  98403. + throw new NotImplementedException();
  98404. + }
  98405. +
  98406. + private void WriteSpanContext(SpanContext context)
  98407. + {
  98408. + WriteSeparator();
  98409. + Write($"Gen<{context.ChunkGenerator}>");
  98410. + WriteSeparator();
  98411. + Write(context.EditHandler);
  98412. + }
  98413. +
  98414. + protected void WriteIndent()
  98415. + {
  98416. + for (var i = 0; i < Depth; i++)
  98417. + {
  98418. + for (var j = 0; j < 4; j++)
  98419. + {
  98420. + Write(' ');
  98421. + }
  98422. + }
  98423. + }
  98424. +
  98425. + protected void WriteSeparator()
  98426. + {
  98427. + Write(" - ");
  98428. + }
  98429. +
  98430. + protected void WriteNewLine()
  98431. + {
  98432. + _writer.WriteLine();
  98433. + }
  98434. +
  98435. + protected void Write(object value)
  98436. + {
  98437. + if (value is string stringValue)
  98438. + {
  98439. + stringValue = stringValue.Replace("\r\n", "LF");
  98440. + _writer.Write(stringValue);
  98441. + return;
  98442. + }
  98443. +
  98444. + _writer.Write(value);
  98445. + }
  98446. +
  98447. + private static bool ShouldDisplayNodeContent(SyntaxNode node)
  98448. + {
  98449. + return node.Kind == SyntaxKind.MarkupTextLiteral ||
  98450. + node.Kind == SyntaxKind.MarkupEphemeralTextLiteral ||
  98451. + node.Kind == SyntaxKind.MarkupTagBlock ||
  98452. + node.Kind == SyntaxKind.MarkupAttributeBlock ||
  98453. + node.Kind == SyntaxKind.MarkupMinimizedAttributeBlock ||
  98454. + node.Kind == SyntaxKind.MarkupTagHelperAttribute ||
  98455. + node.Kind == SyntaxKind.MarkupMinimizedTagHelperAttribute ||
  98456. + node.Kind == SyntaxKind.MarkupLiteralAttributeValue ||
  98457. + node.Kind == SyntaxKind.MarkupDynamicAttributeValue ||
  98458. + node.Kind == SyntaxKind.CSharpStatementLiteral ||
  98459. + node.Kind == SyntaxKind.CSharpExpressionLiteral ||
  98460. + node.Kind == SyntaxKind.CSharpEphemeralTextLiteral ||
  98461. + node.Kind == SyntaxKind.UnclassifiedTextLiteral;
  98462. + }
  98463. + }
  98464. +}
  98465. diff --git a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxTreeNodeWalker.cs b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxTreeNodeWalker.cs
  98466. deleted file mode 100644
  98467. index 93b84cd3571..00000000000
  98468. --- a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxTreeNodeWalker.cs
  98469. +++ /dev/null
  98470. @@ -1,40 +0,0 @@
  98471. -// Copyright (c) .NET Foundation. All rights reserved.
  98472. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  98473. -
  98474. -using System.Collections.Generic;
  98475. -
  98476. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  98477. -{
  98478. - internal class SyntaxTreeNodeWalker : ParserVisitor
  98479. - {
  98480. - private readonly List<SyntaxTreeNode> _ancestors = new List<SyntaxTreeNode>();
  98481. -
  98482. - protected IReadOnlyList<SyntaxTreeNode> Ancestors => _ancestors;
  98483. -
  98484. - protected SyntaxTreeNode Parent => _ancestors.Count > 0 ? _ancestors[0] : null;
  98485. -
  98486. - public override void VisitDefault(Block block)
  98487. - {
  98488. - var children = block.Children;
  98489. - if (block.Children.Count == 0)
  98490. - {
  98491. - return;
  98492. - }
  98493. -
  98494. - _ancestors.Insert(0, block);
  98495. -
  98496. - try
  98497. - {
  98498. - for (var i = 0; i < block.Children.Count; i++)
  98499. - {
  98500. - var child = children[i];
  98501. - Visit(child);
  98502. - }
  98503. - }
  98504. - finally
  98505. - {
  98506. - _ancestors.RemoveAt(0);
  98507. - }
  98508. - }
  98509. - }
  98510. -}
  98511. \ No newline at end of file
  98512. diff --git a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxTreeNodeWriter.cs b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxTreeNodeWriter.cs
  98513. deleted file mode 100644
  98514. index 3c40d045802..00000000000
  98515. --- a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/SyntaxTreeNodeWriter.cs
  98516. +++ /dev/null
  98517. @@ -1,329 +0,0 @@
  98518. -// Copyright (c) .NET Foundation. All rights reserved.
  98519. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  98520. -
  98521. -using System;
  98522. -using System.Collections.Generic;
  98523. -using System.Diagnostics;
  98524. -using System.IO;
  98525. -using System.Linq;
  98526. -using Microsoft.AspNetCore.Razor.Language.Syntax;
  98527. -
  98528. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  98529. -{
  98530. - internal class SyntaxTreeNodeWriter : ParserVisitor
  98531. - {
  98532. - private readonly TextWriter _writer;
  98533. -
  98534. - public int Depth { get; set; }
  98535. -
  98536. - public SyntaxTreeNodeWriter(TextWriter writer)
  98537. - {
  98538. - _writer = writer;
  98539. - }
  98540. -
  98541. - public override void VisitDefault(Block block)
  98542. - {
  98543. - WriteBlock(block);
  98544. - }
  98545. -
  98546. - public override void VisitDefault(Span span)
  98547. - {
  98548. - WriteSpan(span);
  98549. - }
  98550. -
  98551. - public override void VisitTagHelperBlock(TagHelperChunkGenerator chunkGenerator, Block block)
  98552. - {
  98553. - WriteBlock(block);
  98554. -
  98555. - if (block is TagHelperBlock tagHelperBlock)
  98556. - {
  98557. - // Write tag name
  98558. - WriteSeparator();
  98559. - Write(tagHelperBlock.TagName);
  98560. -
  98561. - // Write descriptors
  98562. - foreach (var descriptor in tagHelperBlock.Binding?.Descriptors ?? Array.Empty<TagHelperDescriptor>())
  98563. - {
  98564. - WriteSeparator();
  98565. -
  98566. - // Get the type name without the namespace.
  98567. - var typeName = descriptor.Name.Substring(descriptor.Name.LastIndexOf('.') + 1);
  98568. - Write(typeName);
  98569. - }
  98570. -
  98571. - // Write tag mode, start tag and end tag
  98572. - Depth++;
  98573. - WriteNewLine();
  98574. - WriteIndent();
  98575. - Write(tagHelperBlock.TagMode);
  98576. - WriteSeparator();
  98577. - Write(GetNodeContent(tagHelperBlock.SourceStartTag));
  98578. - if (tagHelperBlock.SourceEndTag != null)
  98579. - {
  98580. - Write(" ... ");
  98581. - Write(GetNodeContent(tagHelperBlock.SourceEndTag));
  98582. - }
  98583. -
  98584. - // Write attributes
  98585. - foreach (var attribute in tagHelperBlock.Attributes)
  98586. - {
  98587. - WriteNewLine();
  98588. - WriteIndent();
  98589. - Write(attribute.Name);
  98590. - WriteSeparator();
  98591. - Write(attribute.AttributeStructure);
  98592. -
  98593. - if (attribute.Value != null)
  98594. - {
  98595. - Depth++;
  98596. - WriteNewLine();
  98597. - // Recursively render attribute value
  98598. - VisitNode(attribute.Value);
  98599. - Depth--;
  98600. - }
  98601. - }
  98602. - Depth--;
  98603. - }
  98604. - }
  98605. -
  98606. - public override void VisitAttributeBlock(AttributeBlockChunkGenerator chunkGenerator, Block block)
  98607. - {
  98608. - WriteBlock(block);
  98609. - }
  98610. -
  98611. - public override void VisitCommentBlock(RazorCommentChunkGenerator chunkGenerator, Block block)
  98612. - {
  98613. - WriteBlock(block);
  98614. - }
  98615. -
  98616. - public override void VisitDirectiveBlock(DirectiveChunkGenerator chunkGenerator, Block block)
  98617. - {
  98618. - WriteBlock(block);
  98619. - }
  98620. -
  98621. - public override void VisitDynamicAttributeBlock(DynamicAttributeBlockChunkGenerator chunkGenerator, Block block)
  98622. - {
  98623. - WriteBlock(block);
  98624. - }
  98625. -
  98626. - public override void VisitExpressionBlock(ExpressionChunkGenerator chunkGenerator, Block block)
  98627. - {
  98628. - WriteBlock(block);
  98629. - }
  98630. -
  98631. - public override void VisitTemplateBlock(TemplateBlockChunkGenerator chunkGenerator, Block block)
  98632. - {
  98633. - WriteBlock(block);
  98634. - }
  98635. -
  98636. - public override void VisitMarkupSpan(MarkupChunkGenerator chunkGenerator, Span span)
  98637. - {
  98638. - WriteSpan(span);
  98639. - }
  98640. -
  98641. - public override void VisitAddTagHelperSpan(AddTagHelperChunkGenerator chunkGenerator, Span span)
  98642. - {
  98643. - WriteSpan(span);
  98644. - }
  98645. -
  98646. - public override void VisitExpressionSpan(ExpressionChunkGenerator chunkGenerator, Span span)
  98647. - {
  98648. - WriteSpan(span);
  98649. - }
  98650. -
  98651. - public override void VisitImportSpan(AddImportChunkGenerator chunkGenerator, Span span)
  98652. - {
  98653. - WriteSpan(span);
  98654. - }
  98655. -
  98656. - public override void VisitLiteralAttributeSpan(LiteralAttributeChunkGenerator chunkGenerator, Span span)
  98657. - {
  98658. - WriteSpan(span);
  98659. - }
  98660. -
  98661. - public override void VisitRemoveTagHelperSpan(RemoveTagHelperChunkGenerator chunkGenerator, Span span)
  98662. - {
  98663. - WriteSpan(span);
  98664. - }
  98665. -
  98666. - public override void VisitTagHelperPrefixDirectiveSpan(TagHelperPrefixDirectiveChunkGenerator chunkGenerator, Span span)
  98667. - {
  98668. - WriteSpan(span);
  98669. - }
  98670. -
  98671. - public override void VisitStatementSpan(StatementChunkGenerator chunkGenerator, Span span)
  98672. - {
  98673. - WriteSpan(span);
  98674. - }
  98675. -
  98676. - public override void VisitDirectiveToken(DirectiveTokenChunkGenerator chunkGenerator, Span span)
  98677. - {
  98678. - WriteSpan(span);
  98679. - }
  98680. -
  98681. - protected void WriteBlock(Block block)
  98682. - {
  98683. - WriteIndent();
  98684. - Write($"{block.Type} block");
  98685. - WriteSeparator();
  98686. - Write($"Gen<{block.ChunkGenerator}>");
  98687. - WriteSeparator();
  98688. - Write(block.Length);
  98689. - WriteSeparator();
  98690. - WriteSourceLocation(block.Start);
  98691. - }
  98692. -
  98693. - protected void WriteSpan(Span span)
  98694. - {
  98695. - if (span.SyntaxNode != null)
  98696. - {
  98697. - WriteSyntaxNode(span.SyntaxNode);
  98698. - return;
  98699. - }
  98700. -
  98701. - WriteIndent();
  98702. - Write($"{span.Kind} span");
  98703. - WriteSeparator();
  98704. - Write($"Gen<{span.ChunkGenerator}>");
  98705. - WriteSeparator();
  98706. - Write($"[{span.Content}]");
  98707. - WriteSeparator();
  98708. - Write(span.EditHandler);
  98709. - WriteSeparator();
  98710. - WriteSourceLocation(span.Start);
  98711. - WriteSeparator();
  98712. - Write($"Tokens:{span.Tokens.Count}");
  98713. -
  98714. - // Write tokens
  98715. - Depth++;
  98716. - foreach (var token in span.Tokens)
  98717. - {
  98718. - WriteNewLine();
  98719. - WriteSyntaxToken(token);
  98720. - }
  98721. - Depth--;
  98722. - }
  98723. -
  98724. - private void WriteSyntaxNode(SyntaxNode syntaxNode)
  98725. - {
  98726. - WriteIndent();
  98727. - Write($"{typeof(SyntaxKind).Name}.{syntaxNode.Kind}");
  98728. - WriteSeparator();
  98729. - Write($"[{syntaxNode.ToFullString()}]");
  98730. - WriteSeparator();
  98731. - Write($"[{syntaxNode.Position}..{syntaxNode.EndPosition})");
  98732. - WriteSeparator();
  98733. - Write($"FullWidth: {syntaxNode.FullWidth}");
  98734. - WriteSeparator();
  98735. - Write($"Slots: {syntaxNode.SlotCount}");
  98736. -
  98737. - // Write tokens
  98738. - Depth++;
  98739. - for (var i = 0; i < syntaxNode.SlotCount; i++)
  98740. - {
  98741. - var slot = syntaxNode.GetNodeSlot(i);
  98742. - if (slot == null)
  98743. - {
  98744. - continue;
  98745. - }
  98746. -
  98747. - WriteNewLine();
  98748. - if (slot.IsList || !(slot is SyntaxToken syntaxToken))
  98749. - {
  98750. - WriteSyntaxNode(slot);
  98751. - continue;
  98752. - }
  98753. -
  98754. - WriteSyntaxToken(syntaxToken);
  98755. - }
  98756. - Depth--;
  98757. - }
  98758. -
  98759. - protected void WriteSyntaxToken(SyntaxToken syntaxToken)
  98760. - {
  98761. - WriteIndent();
  98762. - var diagnostics = syntaxToken.GetDiagnostics();
  98763. - var tokenString = $"{typeof(SyntaxKind).Name}.{syntaxToken.Kind};[{syntaxToken.Content}];{string.Join(", ", diagnostics.Select(diagnostic => diagnostic.Id + diagnostic.Span))}";
  98764. - Write(tokenString);
  98765. - }
  98766. -
  98767. - protected void WriteSourceLocation(SourceLocation location)
  98768. - {
  98769. - Write(location);
  98770. - }
  98771. -
  98772. - protected void WriteLocationTaggedString(LocationTagged<string> item)
  98773. - {
  98774. - Write(item.ToString("F", null));
  98775. - }
  98776. -
  98777. - protected void WriteIndent()
  98778. - {
  98779. - for (var i = 0; i < Depth; i++)
  98780. - {
  98781. - for (var j = 0; j < 4; j++)
  98782. - {
  98783. - Write(' ');
  98784. - }
  98785. - }
  98786. - }
  98787. -
  98788. - protected void WriteSeparator()
  98789. - {
  98790. - Write(" - ");
  98791. - }
  98792. -
  98793. - protected void WriteNewLine()
  98794. - {
  98795. - _writer.WriteLine();
  98796. - }
  98797. -
  98798. - protected void Write(object value)
  98799. - {
  98800. - if (value is string stringValue)
  98801. - {
  98802. - stringValue = stringValue.Replace("\r\n", "LF");
  98803. - _writer.Write(stringValue);
  98804. - return;
  98805. - }
  98806. -
  98807. - _writer.Write(value);
  98808. - }
  98809. -
  98810. - private string GetNodeContent(SyntaxTreeNode node)
  98811. - {
  98812. - if (node is Span span)
  98813. - {
  98814. - return span.Content;
  98815. - }
  98816. - else if (node is Block block)
  98817. - {
  98818. - var content = string.Empty;
  98819. - foreach (var child in block.Children)
  98820. - {
  98821. - content += GetNodeContent(child);
  98822. - }
  98823. -
  98824. - return content;
  98825. - }
  98826. -
  98827. - return string.Empty;
  98828. - }
  98829. -
  98830. - private void VisitNode(SyntaxTreeNode node)
  98831. - {
  98832. - Visit(node);
  98833. -
  98834. - if (node is Block block)
  98835. - {
  98836. - Depth++;
  98837. - foreach (var child in block.Children)
  98838. - {
  98839. - WriteNewLine();
  98840. - VisitNode(child);
  98841. - }
  98842. - Depth--;
  98843. - }
  98844. - }
  98845. - }
  98846. -}
  98847. \ No newline at end of file
  98848. diff --git a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/TagHelperSpan/TagHelperSpanSerializer.cs b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/TagHelperSpan/TagHelperSpanSerializer.cs
  98849. index 1639bb26856..8b4e0bd8edb 100644
  98850. --- a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/TagHelperSpan/TagHelperSpanSerializer.cs
  98851. +++ b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/TagHelperSpan/TagHelperSpanSerializer.cs
  98852. @@ -1,18 +1,19 @@
  98853. // Copyright (c) .NET Foundation. All rights reserved.
  98854. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  98855. +using System;
  98856. using System.IO;
  98857. namespace Microsoft.AspNetCore.Razor.Language.Legacy
  98858. {
  98859. internal class TagHelperSpanSerializer
  98860. {
  98861. - internal static string Serialize(SyntaxTreeNode node, string filePath = null)
  98862. + internal static string Serialize(RazorSyntaxTree syntaxTree)
  98863. {
  98864. using (var writer = new StringWriter())
  98865. {
  98866. - var visitor = new TagHelperSpanWriter(writer, filePath);
  98867. - visitor.Visit(node);
  98868. + var visitor = new TagHelperSpanWriter(writer, syntaxTree);
  98869. + visitor.Visit();
  98870. return writer.ToString();
  98871. }
  98872. diff --git a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/TagHelperSpan/TagHelperSpanVerifier.cs b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/TagHelperSpan/TagHelperSpanVerifier.cs
  98873. index 7fd7d9f075e..3b5a08a2713 100644
  98874. --- a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/TagHelperSpan/TagHelperSpanVerifier.cs
  98875. +++ b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/TagHelperSpan/TagHelperSpanVerifier.cs
  98876. @@ -1,6 +1,7 @@
  98877. // Copyright (c) .NET Foundation. All rights reserved.
  98878. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  98879. +using System;
  98880. using System.IO;
  98881. using System.Text;
  98882. using Xunit;
  98883. @@ -10,12 +11,12 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  98884. {
  98885. internal class TagHelperSpanVerifier
  98886. {
  98887. - internal static void Verify(SyntaxTreeNode node, string filePath, string[] baseline)
  98888. + internal static void Verify(RazorSyntaxTree syntaxTree, string[] baseline)
  98889. {
  98890. using (var writer = new StringWriter())
  98891. {
  98892. - var walker = new Walker(writer, filePath, baseline);
  98893. - walker.Visit(node);
  98894. + var walker = new Walker(writer, syntaxTree, baseline);
  98895. + walker.Visit();
  98896. walker.AssertReachedEndOfBaseline();
  98897. }
  98898. }
  98899. @@ -27,7 +28,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  98900. private int _index;
  98901. - public Walker(StringWriter writer, string filePath, string[] baseline) : base(writer, filePath)
  98902. + public Walker(StringWriter writer, RazorSyntaxTree syntaxTree, string[] baseline) : base(writer, syntaxTree)
  98903. {
  98904. _writer = writer;
  98905. _baseline = baseline;
  98906. diff --git a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/TagHelperSpan/TagHelperSpanWriter.cs b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/TagHelperSpan/TagHelperSpanWriter.cs
  98907. index 1552bdb71dc..3a814aa0675 100644
  98908. --- a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/TagHelperSpan/TagHelperSpanWriter.cs
  98909. +++ b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/TagHelperSpan/TagHelperSpanWriter.cs
  98910. @@ -1,31 +1,24 @@
  98911. // Copyright (c) .NET Foundation. All rights reserved.
  98912. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  98913. -using System;
  98914. -using System.Collections.Generic;
  98915. using System.IO;
  98916. namespace Microsoft.AspNetCore.Razor.Language.Legacy
  98917. {
  98918. internal class TagHelperSpanWriter
  98919. {
  98920. - private readonly string _filePath;
  98921. + private readonly RazorSyntaxTree _syntaxTree;
  98922. private readonly TextWriter _writer;
  98923. - public TagHelperSpanWriter(TextWriter writer, string filePath)
  98924. + public TagHelperSpanWriter(TextWriter writer, RazorSyntaxTree syntaxTree)
  98925. {
  98926. _writer = writer;
  98927. - _filePath = filePath;
  98928. + _syntaxTree = syntaxTree;
  98929. }
  98930. - public virtual void Visit(SyntaxTreeNode node)
  98931. + public virtual void Visit()
  98932. {
  98933. - if (!(node is Block block))
  98934. - {
  98935. - return;
  98936. - }
  98937. -
  98938. - var tagHelperSpans = GetTagHelperSpans(block, _filePath);
  98939. + var tagHelperSpans = _syntaxTree.GetTagHelperSpans();
  98940. foreach (var span in tagHelperSpans)
  98941. {
  98942. VisitTagHelperSpan(span);
  98943. @@ -65,17 +58,5 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
  98944. {
  98945. _writer.Write(value);
  98946. }
  98947. -
  98948. - internal static IReadOnlyList<TagHelperSpanInternal> GetTagHelperSpans(Block root, string filePath)
  98949. - {
  98950. - // We don't care about the options and diagnostic here.
  98951. - var syntaxTree = RazorSyntaxTree.Create(
  98952. - root,
  98953. - TestRazorSourceDocument.Create(filePath: filePath),
  98954. - Array.Empty<RazorDiagnostic>(),
  98955. - RazorParserOptions.CreateDefault());
  98956. -
  98957. - return syntaxTree.GetTagHelperSpans();
  98958. - }
  98959. }
  98960. }
  98961. diff --git a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/TestSpanBuilder.cs b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/TestSpanBuilder.cs
  98962. deleted file mode 100644
  98963. index ec27b0fcc3f..00000000000
  98964. --- a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/Legacy/TestSpanBuilder.cs
  98965. +++ /dev/null
  98966. @@ -1,441 +0,0 @@
  98967. -// Copyright (c) .NET Foundation. All rights reserved.
  98968. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  98969. -
  98970. -using System;
  98971. -using System.Collections.Generic;
  98972. -using System.Linq;
  98973. -using Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax;
  98974. -
  98975. -namespace Microsoft.AspNetCore.Razor.Language.Legacy
  98976. -{
  98977. - internal static class SpanFactoryExtensions
  98978. - {
  98979. - public static UnclassifiedCodeSpanConstructor EmptyCSharp(this SpanFactory self)
  98980. - {
  98981. - return new UnclassifiedCodeSpanConstructor(
  98982. - self.Span(
  98983. - SpanKindInternal.Code,
  98984. - string.Empty,
  98985. - SyntaxKind.Unknown));
  98986. - }
  98987. -
  98988. - public static SpanConstructor EmptyHtml(this SpanFactory self)
  98989. - {
  98990. - return self
  98991. - .Span(
  98992. - SpanKindInternal.Markup,
  98993. - string.Empty,
  98994. - SyntaxKind.Unknown)
  98995. - .With(new MarkupChunkGenerator());
  98996. - }
  98997. -
  98998. - public static UnclassifiedCodeSpanConstructor Code(this SpanFactory self, string content)
  98999. - {
  99000. - return new UnclassifiedCodeSpanConstructor(
  99001. - self.Span(SpanKindInternal.Code, content, markup: false));
  99002. - }
  99003. -
  99004. - public static SpanConstructor CodeTransition(this SpanFactory self)
  99005. - {
  99006. - return self
  99007. - .Span(SpanKindInternal.Transition, SyntaxConstants.TransitionString, markup: false)
  99008. - .Accepts(AcceptedCharactersInternal.None);
  99009. - }
  99010. -
  99011. - public static SpanConstructor CodeTransition(this SpanFactory self, string content)
  99012. - {
  99013. - return self.Span(SpanKindInternal.Transition, content, markup: false).Accepts(AcceptedCharactersInternal.None);
  99014. - }
  99015. -
  99016. - public static SpanConstructor CodeTransition(this SpanFactory self, SyntaxKind type)
  99017. - {
  99018. - return self
  99019. - .Span(SpanKindInternal.Transition, SyntaxConstants.TransitionString, type)
  99020. - .Accepts(AcceptedCharactersInternal.None);
  99021. - }
  99022. -
  99023. - public static SpanConstructor CodeTransition(this SpanFactory self, string content, SyntaxKind type)
  99024. - {
  99025. - return self.Span(SpanKindInternal.Transition, content, type).Accepts(AcceptedCharactersInternal.None);
  99026. - }
  99027. -
  99028. - public static SpanConstructor MarkupTransition(this SpanFactory self)
  99029. - {
  99030. - return self
  99031. - .Span(SpanKindInternal.Transition, SyntaxConstants.TransitionString, markup: true)
  99032. - .Accepts(AcceptedCharactersInternal.None);
  99033. - }
  99034. -
  99035. - public static SpanConstructor MarkupTransition(this SpanFactory self, string content)
  99036. - {
  99037. - return self.Span(SpanKindInternal.Transition, content, markup: true).Accepts(AcceptedCharactersInternal.None);
  99038. - }
  99039. -
  99040. - public static SpanConstructor MarkupTransition(this SpanFactory self, SyntaxKind type)
  99041. - {
  99042. - return self
  99043. - .Span(SpanKindInternal.Transition, SyntaxConstants.TransitionString, type)
  99044. - .Accepts(AcceptedCharactersInternal.None);
  99045. - }
  99046. -
  99047. - public static SpanConstructor MarkupTransition(this SpanFactory self, string content, SyntaxKind type)
  99048. - {
  99049. - return self.Span(SpanKindInternal.Transition, content, type).Accepts(AcceptedCharactersInternal.None);
  99050. - }
  99051. -
  99052. - public static SpanConstructor MetaCode(this SpanFactory self, string content)
  99053. - {
  99054. - return self.Span(SpanKindInternal.MetaCode, content, markup: false);
  99055. - }
  99056. -
  99057. - public static SpanConstructor MetaCode(this SpanFactory self, string content, SyntaxKind type)
  99058. - {
  99059. - return self.Span(SpanKindInternal.MetaCode, content, type);
  99060. - }
  99061. -
  99062. - public static SpanConstructor MetaMarkup(this SpanFactory self, string content)
  99063. - {
  99064. - return self.Span(SpanKindInternal.MetaCode, content, markup: true);
  99065. - }
  99066. -
  99067. - public static SpanConstructor MetaMarkup(this SpanFactory self, string content, SyntaxKind type)
  99068. - {
  99069. - return self.Span(SpanKindInternal.MetaCode, content, type);
  99070. - }
  99071. -
  99072. - public static SpanConstructor Comment(this SpanFactory self, string content, SyntaxKind type)
  99073. - {
  99074. - return self.Span(SpanKindInternal.Comment, content, type);
  99075. - }
  99076. -
  99077. - public static SpanConstructor BangEscape(this SpanFactory self)
  99078. - {
  99079. - return self
  99080. - .Span(SpanKindInternal.MetaCode, "!", markup: true)
  99081. - .With(SpanChunkGenerator.Null)
  99082. - .Accepts(AcceptedCharactersInternal.None);
  99083. - }
  99084. -
  99085. - public static SpanConstructor Markup(this SpanFactory self, string content)
  99086. - {
  99087. - return self.Span(SpanKindInternal.Markup, content, markup: true).With(new MarkupChunkGenerator());
  99088. - }
  99089. -
  99090. - public static SpanConstructor Markup(this SpanFactory self, params string[] content)
  99091. - {
  99092. - return self.Span(SpanKindInternal.Markup, content, markup: true).With(new MarkupChunkGenerator());
  99093. - }
  99094. -
  99095. - public static SpanConstructor CodeMarkup(this SpanFactory self, params string[] content)
  99096. - {
  99097. - return self
  99098. - .Span(SpanKindInternal.Code, content, markup: true)
  99099. - .AsCodeMarkup();
  99100. - }
  99101. -
  99102. - public static SpanConstructor CSharpCodeMarkup(this SpanFactory self, string content)
  99103. - {
  99104. - return self.Code(content)
  99105. - .AsImplicitExpression(CSharpCodeParser.DefaultKeywords, acceptTrailingDot: true)
  99106. - .AsCodeMarkup();
  99107. - }
  99108. -
  99109. - public static SpanConstructor AsCodeMarkup(this SpanConstructor self)
  99110. - {
  99111. - return self
  99112. - .With(new ImplicitExpressionEditHandler(
  99113. - (content) => SpanConstructor.TestTokenizer(content),
  99114. - CSharpCodeParser.DefaultKeywords,
  99115. - acceptTrailingDot: true))
  99116. - .With(new MarkupChunkGenerator())
  99117. - .Accepts(AcceptedCharactersInternal.AnyExceptNewline);
  99118. - }
  99119. -
  99120. - public static SpanConstructor AsDirectiveToken(this SpanConstructor self, DirectiveTokenDescriptor descriptor)
  99121. - {
  99122. - return self
  99123. - .With(new DirectiveTokenChunkGenerator(descriptor))
  99124. - .With(new DirectiveTokenEditHandler((content) => SpanConstructor.TestTokenizer(content)))
  99125. - .Accepts(AcceptedCharactersInternal.NonWhitespace);
  99126. - }
  99127. -
  99128. - public static SourceLocation GetLocationAndAdvance(this SourceLocationTracker self, string content)
  99129. - {
  99130. - var ret = self.CurrentLocation;
  99131. - self.UpdateLocation(content);
  99132. - return ret;
  99133. - }
  99134. - }
  99135. -
  99136. - internal class SpanFactory
  99137. - {
  99138. - public SpanFactory()
  99139. - {
  99140. - LocationTracker = new SourceLocationTracker();
  99141. -
  99142. - MarkupTokenizerFactory = doc => new HtmlTokenizer(doc);
  99143. - CodeTokenizerFactory = doc => new CSharpTokenizer(doc);
  99144. - }
  99145. -
  99146. - public Func<ITextDocument, HtmlTokenizer> MarkupTokenizerFactory { get; }
  99147. - public Func<ITextDocument, CSharpTokenizer> CodeTokenizerFactory { get; }
  99148. - public SourceLocationTracker LocationTracker { get; }
  99149. -
  99150. -
  99151. - public SpanConstructor Span(SpanKindInternal spanKind, string content, SyntaxKind kind)
  99152. - {
  99153. - return CreateTokenSpan(spanKind, content, () => SyntaxFactory.Token(kind, content));
  99154. - }
  99155. -
  99156. - public SpanConstructor Span(SpanKindInternal kind, string content, bool markup)
  99157. - {
  99158. - return new SpanConstructor(kind, LocationTracker.CurrentLocation, Tokenize(new[] { content }, markup));
  99159. - }
  99160. -
  99161. - public SpanConstructor Span(SpanKindInternal kind, string[] content, bool markup)
  99162. - {
  99163. - return new SpanConstructor(kind, LocationTracker.CurrentLocation, Tokenize(content, markup));
  99164. - }
  99165. -
  99166. - public SpanConstructor Span(SpanKindInternal kind, params SyntaxToken[] tokens)
  99167. - {
  99168. - var start = LocationTracker.CurrentLocation;
  99169. - foreach (var token in tokens)
  99170. - {
  99171. - LocationTracker.UpdateLocation(token.Content);
  99172. - }
  99173. -
  99174. - return new SpanConstructor(kind, start, tokens);
  99175. - }
  99176. -
  99177. - private SpanConstructor CreateTokenSpan(SpanKindInternal kind, string content, Func<SyntaxToken> ctor)
  99178. - {
  99179. - var start = LocationTracker.CurrentLocation;
  99180. - LocationTracker.UpdateLocation(content);
  99181. -
  99182. - return new SpanConstructor(kind, start, new[] { ctor() });
  99183. - }
  99184. -
  99185. - public void Reset()
  99186. - {
  99187. - LocationTracker.CurrentLocation = SourceLocation.Zero;
  99188. - }
  99189. -
  99190. - private IEnumerable<SyntaxToken> Tokenize(IEnumerable<string> contentFragments, bool markup)
  99191. - {
  99192. - return contentFragments.SelectMany(fragment => Tokenize(fragment, markup));
  99193. - }
  99194. -
  99195. - private IEnumerable<SyntaxToken> Tokenize(string content, bool markup)
  99196. - {
  99197. - var tokenizer = MakeTokenizer(markup, new SeekableTextReader(content, filePath: null));
  99198. - SyntaxToken token;
  99199. - SyntaxToken last = null;
  99200. -
  99201. - while ((token = tokenizer.NextToken()) != null)
  99202. - {
  99203. - last = token;
  99204. - yield return token;
  99205. - }
  99206. -
  99207. - LocationTracker.UpdateLocation(content);
  99208. - }
  99209. -
  99210. - private ITokenizer MakeTokenizer(bool markup, SeekableTextReader seekableTextReader)
  99211. - {
  99212. - if (markup)
  99213. - {
  99214. - return MarkupTokenizerFactory(seekableTextReader);
  99215. - }
  99216. - else
  99217. - {
  99218. - return CodeTokenizerFactory(seekableTextReader);
  99219. - }
  99220. - }
  99221. - }
  99222. -
  99223. - internal static class SpanConstructorExtensions
  99224. - {
  99225. - public static SpanConstructor Accepts(this SpanConstructor self, AcceptedCharactersInternal accepted)
  99226. - {
  99227. - return self.With(eh => eh.AcceptedCharacters = accepted);
  99228. - }
  99229. -
  99230. - public static SpanConstructor AutoCompleteWith(this SpanConstructor self, string autoCompleteString)
  99231. - {
  99232. - return AutoCompleteWith(self, autoCompleteString, atEndOfSpan: false);
  99233. - }
  99234. -
  99235. - public static SpanConstructor AutoCompleteWith(
  99236. - this SpanConstructor self,
  99237. - string autoCompleteString,
  99238. - bool atEndOfSpan)
  99239. - {
  99240. - return self.With(new AutoCompleteEditHandler(
  99241. - (content) => SpanConstructor.TestTokenizer(content),
  99242. - autoCompleteAtEndOfSpan: atEndOfSpan)
  99243. - {
  99244. - AutoCompleteString = autoCompleteString
  99245. - });
  99246. - }
  99247. - }
  99248. -
  99249. - internal class UnclassifiedCodeSpanConstructor
  99250. - {
  99251. - SpanConstructor _self;
  99252. -
  99253. - public UnclassifiedCodeSpanConstructor(SpanConstructor self)
  99254. - {
  99255. - _self = self;
  99256. - }
  99257. -
  99258. - public SpanConstructor AsMetaCode()
  99259. - {
  99260. - _self.Builder.Kind = SpanKindInternal.MetaCode;
  99261. - return _self;
  99262. - }
  99263. -
  99264. - public SpanConstructor AsStatement()
  99265. - {
  99266. - return _self.With(new StatementChunkGenerator());
  99267. - }
  99268. -
  99269. - public SpanConstructor AsCodeBlock()
  99270. - {
  99271. - return AsStatement().With(new CodeBlockEditHandler(CSharpLanguageCharacteristics.Instance.TokenizeString));
  99272. - }
  99273. -
  99274. - public SpanConstructor AsExpression()
  99275. - {
  99276. - return _self.With(new ExpressionChunkGenerator());
  99277. - }
  99278. -
  99279. - public SpanConstructor AsImplicitExpression(ISet<string> keywords)
  99280. - {
  99281. - return AsImplicitExpression(keywords, acceptTrailingDot: false);
  99282. - }
  99283. -
  99284. - public SpanConstructor AsImplicitExpression(ISet<string> keywords, bool acceptTrailingDot)
  99285. - {
  99286. - return _self
  99287. - .With(new ImplicitExpressionEditHandler((content) => SpanConstructor.TestTokenizer(content), keywords, acceptTrailingDot))
  99288. - .With(new ExpressionChunkGenerator());
  99289. - }
  99290. -
  99291. - public SpanConstructor AsNamespaceImport(string ns)
  99292. - {
  99293. - return _self.With(new AddImportChunkGenerator(ns));
  99294. - }
  99295. -
  99296. - public SpanConstructor Hidden()
  99297. - {
  99298. - return _self.With(SpanChunkGenerator.Null);
  99299. - }
  99300. -
  99301. - public SpanConstructor AsAddTagHelper(
  99302. - string lookupText,
  99303. - string directiveText,
  99304. - string typePattern = null,
  99305. - string assemblyName = null,
  99306. - params RazorDiagnostic[] errors)
  99307. - {
  99308. - var diagnostics = errors.ToList();
  99309. - return _self
  99310. - .With(new AddTagHelperChunkGenerator(lookupText, directiveText, typePattern, assemblyName, diagnostics))
  99311. - .Accepts(AcceptedCharactersInternal.AnyExceptNewline);
  99312. - }
  99313. -
  99314. - public SpanConstructor AsRemoveTagHelper(
  99315. - string lookupText,
  99316. - string directiveText,
  99317. - string typePattern = null,
  99318. - string assemblyName = null,
  99319. - params RazorDiagnostic[] errors)
  99320. - {
  99321. - var diagnostics = errors.ToList();
  99322. - return _self
  99323. - .With(new RemoveTagHelperChunkGenerator(lookupText, directiveText, typePattern, assemblyName, diagnostics))
  99324. - .Accepts(AcceptedCharactersInternal.AnyExceptNewline);
  99325. - }
  99326. -
  99327. - public SpanConstructor AsTagHelperPrefixDirective(string prefix, string directiveText, params RazorDiagnostic[] errors)
  99328. - {
  99329. - var diagnostics = errors.ToList();
  99330. - return _self
  99331. - .With(new TagHelperPrefixDirectiveChunkGenerator(prefix, directiveText, diagnostics))
  99332. - .Accepts(AcceptedCharactersInternal.AnyExceptNewline);
  99333. - }
  99334. -
  99335. - public SpanConstructor As(ISpanChunkGenerator chunkGenerator)
  99336. - {
  99337. - return _self.With(chunkGenerator);
  99338. - }
  99339. - }
  99340. -
  99341. - internal class SpanConstructor
  99342. - {
  99343. - public SpanBuilder Builder { get; private set; }
  99344. -
  99345. - internal static IEnumerable<SyntaxToken> TestTokenizer(string str)
  99346. - {
  99347. - yield return SyntaxFactory.Token(SyntaxKind.Unknown, str);
  99348. - }
  99349. -
  99350. - public SpanConstructor(SpanKindInternal kind, SourceLocation location, IEnumerable<SyntaxToken> tokens)
  99351. - {
  99352. - Builder = new SpanBuilder(location);
  99353. - Builder.Kind = kind;
  99354. - Builder.EditHandler = SpanEditHandler.CreateDefault((content) => SpanConstructor.TestTokenizer(content));
  99355. - foreach (var token in tokens)
  99356. - {
  99357. - Builder.Accept(token);
  99358. - }
  99359. - }
  99360. -
  99361. - private Span Build()
  99362. - {
  99363. - return Builder.Build();
  99364. - }
  99365. -
  99366. - public SpanConstructor As(SpanKindInternal spanKind)
  99367. - {
  99368. - Builder.Kind = spanKind;
  99369. - return this;
  99370. - }
  99371. -
  99372. - public SpanConstructor With(ISpanChunkGenerator generator)
  99373. - {
  99374. - Builder.ChunkGenerator = generator;
  99375. - return this;
  99376. - }
  99377. -
  99378. - public SpanConstructor With(SpanEditHandler handler)
  99379. - {
  99380. - Builder.EditHandler = handler;
  99381. - return this;
  99382. - }
  99383. -
  99384. - public SpanConstructor With(Action<ISpanChunkGenerator> generatorConfigurer)
  99385. - {
  99386. - generatorConfigurer(Builder.ChunkGenerator);
  99387. - return this;
  99388. - }
  99389. -
  99390. - public SpanConstructor With(Action<SpanEditHandler> handlerConfigurer)
  99391. - {
  99392. - handlerConfigurer(Builder.EditHandler);
  99393. - return this;
  99394. - }
  99395. -
  99396. - public static implicit operator Span(SpanConstructor self)
  99397. - {
  99398. - return self.Build();
  99399. - }
  99400. -
  99401. - public SpanConstructor Hidden()
  99402. - {
  99403. - Builder.ChunkGenerator = SpanChunkGenerator.Null;
  99404. - return this;
  99405. - }
  99406. - }
  99407. -}
  99408. diff --git a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/SyntaxTreeVerifier.cs b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/SyntaxTreeVerifier.cs
  99409. index e0b26941a4d..fee17d1368d 100644
  99410. --- a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/SyntaxTreeVerifier.cs
  99411. +++ b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/SyntaxTreeVerifier.cs
  99412. @@ -3,39 +3,43 @@
  99413. using System;
  99414. using Microsoft.AspNetCore.Razor.Language.Legacy;
  99415. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  99416. namespace Microsoft.AspNetCore.Razor.Language
  99417. {
  99418. // Verifies recursively that a syntax tree has no gaps in terms of position/location.
  99419. - internal class SyntaxTreeVerifier : ParserVisitor
  99420. + internal class SyntaxTreeVerifier
  99421. {
  99422. - private readonly SourceLocationTracker _tracker = new SourceLocationTracker(SourceLocation.Zero);
  99423. -
  99424. - private SyntaxTreeVerifier()
  99425. - {
  99426. - }
  99427. -
  99428. public static void Verify(RazorSyntaxTree syntaxTree)
  99429. {
  99430. - Verify(syntaxTree.Root);
  99431. + new Verifier(syntaxTree.Source).Visit(syntaxTree.Root);
  99432. }
  99433. - public static void Verify(Block block)
  99434. + private class Verifier : SyntaxRewriter
  99435. {
  99436. - new SyntaxTreeVerifier().VisitBlock(block);
  99437. - }
  99438. + private readonly SourceLocationTracker _tracker;
  99439. + private readonly RazorSourceDocument _source;
  99440. - public override void VisitSpan(Span span)
  99441. - {
  99442. - var start = span.Start;
  99443. - if (!start.Equals(_tracker.CurrentLocation))
  99444. + public Verifier(RazorSourceDocument source)
  99445. {
  99446. - throw new InvalidOperationException($"Span starting at {span.Start} should start at {_tracker.CurrentLocation} - {span} ");
  99447. + _tracker = new SourceLocationTracker(new SourceLocation(source.FilePath, 0, 0, 0));
  99448. + _source = source;
  99449. }
  99450. - for (var i = 0; i < span.Tokens.Count; i++)
  99451. + public override SyntaxNode VisitToken(SyntaxToken token)
  99452. {
  99453. - _tracker.UpdateLocation(span.Tokens[i].Content);
  99454. + if (token != null && !token.IsMissing && token.Kind != SyntaxKind.Marker)
  99455. + {
  99456. + var start = token.GetSourceLocation(_source);
  99457. + if (!start.Equals(_tracker.CurrentLocation))
  99458. + {
  99459. + throw new InvalidOperationException($"Token starting at {start} should start at {_tracker.CurrentLocation} - {token} ");
  99460. + }
  99461. +
  99462. + _tracker.UpdateLocation(token.Content);
  99463. + }
  99464. +
  99465. + return base.VisitToken(token);
  99466. }
  99467. }
  99468. }
  99469. diff --git a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/TestRazorCodeDocument.cs b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/TestRazorCodeDocument.cs
  99470. index 4a6430d618f..00afb4fb5d3 100644
  99471. --- a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/TestRazorCodeDocument.cs
  99472. +++ b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/TestRazorCodeDocument.cs
  99473. @@ -13,9 +13,9 @@ namespace Microsoft.AspNetCore.Razor.Language
  99474. return new DefaultRazorCodeDocument(source, imports: null);
  99475. }
  99476. - public static RazorCodeDocument Create(string content)
  99477. + public static RazorCodeDocument Create(string content, bool normalizeNewLines = false)
  99478. {
  99479. - var source = TestRazorSourceDocument.Create(content);
  99480. + var source = TestRazorSourceDocument.Create(content, normalizeNewLines: normalizeNewLines);
  99481. return new DefaultRazorCodeDocument(source, imports: null);
  99482. }
  99483. diff --git a/test/Microsoft.AspNetCore.Razor.Test.Common/Microsoft.AspNetCore.Razor.Test.Common.csproj b/test/Microsoft.AspNetCore.Razor.Test.Common/Microsoft.AspNetCore.Razor.Test.Common.csproj
  99484. index e5037f4f925..418a3b82d1c 100644
  99485. --- a/test/Microsoft.AspNetCore.Razor.Test.Common/Microsoft.AspNetCore.Razor.Test.Common.csproj
  99486. +++ b/test/Microsoft.AspNetCore.Razor.Test.Common/Microsoft.AspNetCore.Razor.Test.Common.csproj
  99487. @@ -1,4 +1,4 @@
  99488. -<Project Sdk="Microsoft.NET.Sdk">
  99489. +<Project Sdk="Microsoft.NET.Sdk">
  99490. <PropertyGroup>
  99491. <!-- To generate baselines, run tests with /p:GenerateBaselines=true -->
  99492. diff --git a/test/Microsoft.AspNetCore.Razor.Test.Common/Properties/AssemblyInfo.cs b/test/Microsoft.AspNetCore.Razor.Test.Common/Properties/AssemblyInfo.cs
  99493. index 0022faa2276..098d7b5b275 100644
  99494. --- a/test/Microsoft.AspNetCore.Razor.Test.Common/Properties/AssemblyInfo.cs
  99495. +++ b/test/Microsoft.AspNetCore.Razor.Test.Common/Properties/AssemblyInfo.cs
  99496. @@ -2,6 +2,7 @@
  99497. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  99498. using System.Runtime.CompilerServices;
  99499. +[assembly: InternalsVisibleTo("Microsoft.VisualStudio.Editor.Razor.Test.Common, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
  99500. [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Razor.LanguageServer.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
  99501. [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Razor.Extensions.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
  99502. [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
  99503. diff --git a/test/Microsoft.CodeAnalysis.Razor.Workspaces.Test/DefaultRazorCompletionFactsServiceTest.cs b/test/Microsoft.CodeAnalysis.Razor.Workspaces.Test/DefaultRazorCompletionFactsServiceTest.cs
  99504. index d9b107f69ea..7cffe6dece1 100644
  99505. --- a/test/Microsoft.CodeAnalysis.Razor.Workspaces.Test/DefaultRazorCompletionFactsServiceTest.cs
  99506. +++ b/test/Microsoft.CodeAnalysis.Razor.Workspaces.Test/DefaultRazorCompletionFactsServiceTest.cs
  99507. @@ -178,7 +178,7 @@ namespace Microsoft.CodeAnalysis.Razor
  99508. public void IsDirectiveCompletableToken_ReturnsTrueForCSharpMarkerTokens()
  99509. {
  99510. // Arrange
  99511. - var csharpToken = SyntaxFactory.Token(SyntaxKind.Unknown, string.Empty);
  99512. + var csharpToken = SyntaxFactory.Token(SyntaxKind.Marker, string.Empty);
  99513. // Act
  99514. var result = DefaultRazorCompletionFactsService.IsDirectiveCompletableToken(csharpToken);
  99515. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test.Common/PartialParserTestBase.cs b/test/Microsoft.VisualStudio.Editor.Razor.Test.Common/PartialParserTestBase.cs
  99516. new file mode 100644
  99517. index 00000000000..ffbc4a41710
  99518. --- /dev/null
  99519. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test.Common/PartialParserTestBase.cs
  99520. @@ -0,0 +1,16 @@
  99521. +// Copyright (c) .NET Foundation. All rights reserved.
  99522. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  99523. +
  99524. +using System.Collections.Generic;
  99525. +
  99526. +namespace Microsoft.AspNetCore.Razor.Language.Legacy
  99527. +{
  99528. + public class PartialParserTestBase : ParserTestBase
  99529. + {
  99530. + internal override RazorSyntaxTree ParseBlock(RazorLanguageVersion version, string document, IEnumerable<DirectiveDescriptor> directives, bool designTime)
  99531. + {
  99532. + // Unused
  99533. + return null;
  99534. + }
  99535. + }
  99536. +}
  99537. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test.Common/Xunit/ForegroundDispatcherTestBase.cs b/test/Microsoft.VisualStudio.Editor.Razor.Test.Common/Xunit/ForegroundDispatcherTestBase.cs
  99538. index 1690577b82e..407a8426587 100644
  99539. --- a/test/Microsoft.VisualStudio.Editor.Razor.Test.Common/Xunit/ForegroundDispatcherTestBase.cs
  99540. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test.Common/Xunit/ForegroundDispatcherTestBase.cs
  99541. @@ -1,11 +1,12 @@
  99542. // Copyright (c) .NET Foundation. All rights reserved.
  99543. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  99544. +using Microsoft.AspNetCore.Razor.Language.Legacy;
  99545. using Microsoft.CodeAnalysis.Razor;
  99546. namespace Xunit
  99547. {
  99548. - public abstract class ForegroundDispatcherTestBase
  99549. + public abstract class ForegroundDispatcherTestBase : PartialParserTestBase
  99550. {
  99551. internal ForegroundDispatcher Dispatcher { get; } = new SingleThreadedForegroundDispatcher();
  99552. }
  99553. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/BraceSmartIndenterTest.cs b/test/Microsoft.VisualStudio.Editor.Razor.Test/BraceSmartIndenterTest.cs
  99554. index 270165997d2..5d7a1ef4921 100644
  99555. --- a/test/Microsoft.VisualStudio.Editor.Razor.Test/BraceSmartIndenterTest.cs
  99556. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/BraceSmartIndenterTest.cs
  99557. @@ -6,6 +6,7 @@ using System.Collections.Generic;
  99558. using Microsoft.AspNetCore.Razor.Language;
  99559. using Microsoft.AspNetCore.Razor.Language.Extensions;
  99560. using Microsoft.AspNetCore.Razor.Language.Legacy;
  99561. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  99562. using Microsoft.VisualStudio.Test;
  99563. using Microsoft.VisualStudio.Text;
  99564. using Microsoft.VisualStudio.Text.Editor;
  99565. @@ -13,7 +14,6 @@ using Microsoft.VisualStudio.Text.Operations;
  99566. using Moq;
  99567. using Xunit;
  99568. using ITextBuffer = Microsoft.VisualStudio.Text.ITextBuffer;
  99569. -using Span = Microsoft.AspNetCore.Razor.Language.Legacy.Span;
  99570. namespace Microsoft.VisualStudio.Editor.Razor
  99571. {
  99572. @@ -153,7 +153,7 @@ namespace Microsoft.VisualStudio.Editor.Razor
  99573. public void IsUnlinkedSpan_NullOwner_ReturnsTrue()
  99574. {
  99575. // Arrange
  99576. - Span owner = null;
  99577. + SyntaxNode owner = null;
  99578. // Act
  99579. var result = BraceSmartIndenter.IsUnlinkedSpan(owner);
  99580. @@ -533,12 +533,11 @@ namespace Microsoft.VisualStudio.Editor.Razor
  99581. options.Directives.Add(FunctionsDirective.Directive);
  99582. options.Directives.Add(SectionDirective.Directive);
  99583. }));
  99584. - syntaxTree.Root.LinkNodes();
  99585. return syntaxTree;
  99586. }
  99587. - private static Span ExtractSpan(int spanLocation, string content)
  99588. + private static SyntaxNode ExtractSpan(int spanLocation, string content)
  99589. {
  99590. var syntaxTree = GetSyntaxTree(content);
  99591. var span = syntaxTree.Root.LocateOwner(new SourceChange(new SourceSpan(spanLocation, 0), string.Empty));
  99592. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/DefaultRazorIndentationFactsServiceTest.cs b/test/Microsoft.VisualStudio.Editor.Razor.Test/DefaultRazorIndentationFactsServiceTest.cs
  99593. index eda1732e8a2..9be9e6f910f 100644
  99594. --- a/test/Microsoft.VisualStudio.Editor.Razor.Test/DefaultRazorIndentationFactsServiceTest.cs
  99595. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/DefaultRazorIndentationFactsServiceTest.cs
  99596. @@ -5,8 +5,7 @@ using System;
  99597. using System.Collections.Generic;
  99598. using System.Linq;
  99599. using Microsoft.AspNetCore.Razor.Language;
  99600. -using Microsoft.AspNetCore.Razor.Language.Legacy;
  99601. -using Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax;
  99602. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  99603. using Microsoft.VisualStudio.Text;
  99604. using Xunit;
  99605. @@ -34,9 +33,9 @@ namespace Microsoft.VisualStudio.Editor.Razor
  99606. public void IsCSharpOpenCurlyBrace_SpanWithLeftBrace_ReturnTrue()
  99607. {
  99608. // Arrange
  99609. - var childBuilder = new SpanBuilder(SourceLocation.Zero);
  99610. - childBuilder.Accept(SyntaxFactory.Token(SyntaxKind.LeftBrace, "{"));
  99611. - var child = childBuilder.Build();
  99612. + var builder = SyntaxListBuilder<SyntaxToken>.Create();
  99613. + builder.Add(SyntaxFactory.Token(SyntaxKind.LeftBrace, "{"));
  99614. + var child = SyntaxFactory.RazorMetaCode(builder.ToList());
  99615. // Act
  99616. var result = DefaultRazorIndentationFactsService.IsCSharpOpenCurlyBrace(child);
  99617. @@ -54,9 +53,9 @@ namespace Microsoft.VisualStudio.Editor.Razor
  99618. {
  99619. // Arrange
  99620. var symbolType = (SyntaxKind)symbolTypeObject;
  99621. - var childBuilder = new SpanBuilder(SourceLocation.Zero);
  99622. - childBuilder.Accept(SyntaxFactory.Token(symbolType, content));
  99623. - var child = childBuilder.Build();
  99624. + var builder = SyntaxListBuilder<SyntaxToken>.Create();
  99625. + builder.Add(SyntaxFactory.Token(symbolType, content));
  99626. + var child = SyntaxFactory.MarkupTextLiteral(builder.ToList());
  99627. // Act
  99628. var result = DefaultRazorIndentationFactsService.IsCSharpOpenCurlyBrace(child);
  99629. @@ -69,10 +68,10 @@ namespace Microsoft.VisualStudio.Editor.Razor
  99630. public void IsCSharpOpenCurlyBrace_MultipleSymbols_ReturnFalse()
  99631. {
  99632. // Arrange
  99633. - var childBuilder = new SpanBuilder(SourceLocation.Zero);
  99634. - childBuilder.Accept(SyntaxFactory.Token(SyntaxKind.Identifier, "hello"));
  99635. - childBuilder.Accept(SyntaxFactory.Token(SyntaxKind.Comma, ","));
  99636. - var child = childBuilder.Build();
  99637. + var builder = SyntaxListBuilder<SyntaxToken>.Create();
  99638. + builder.Add(SyntaxFactory.Token(SyntaxKind.Identifier, "hello"));
  99639. + builder.Add(SyntaxFactory.Token(SyntaxKind.Comma, ","));
  99640. + var child = SyntaxFactory.MarkupTextLiteral(builder.ToList());
  99641. // Act
  99642. var result = DefaultRazorIndentationFactsService.IsCSharpOpenCurlyBrace(child);
  99643. @@ -85,9 +84,9 @@ namespace Microsoft.VisualStudio.Editor.Razor
  99644. public void IsCSharpOpenCurlyBrace_SpanWithHtmlSymbol_ReturnFalse()
  99645. {
  99646. // Arrange
  99647. - var childBuilder = new SpanBuilder(SourceLocation.Zero);
  99648. - childBuilder.Accept(SyntaxFactory.Token(SyntaxKind.Text, "hello"));
  99649. - var child = childBuilder.Build();
  99650. + var builder = SyntaxListBuilder<SyntaxToken>.Create();
  99651. + builder.Add(SyntaxFactory.Token(SyntaxKind.Text, "hello"));
  99652. + var child = SyntaxFactory.MarkupTextLiteral(builder.ToList());
  99653. // Act
  99654. var result = DefaultRazorIndentationFactsService.IsCSharpOpenCurlyBrace(child);
  99655. @@ -100,10 +99,7 @@ namespace Microsoft.VisualStudio.Editor.Razor
  99656. public void IsCSharpOpenCurlyBrace_Blocks_ReturnFalse()
  99657. {
  99658. // Arrange
  99659. - var child = new BlockBuilder()
  99660. - {
  99661. - Type = BlockKindInternal.Markup,
  99662. - }.Build();
  99663. + var child = SyntaxFactory.MarkupBlock();
  99664. // Act
  99665. var result = DefaultRazorIndentationFactsService.IsCSharpOpenCurlyBrace(child);
  99666. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/DefaultRazorSyntaxFactsServiceTest.cs b/test/Microsoft.VisualStudio.Editor.Razor.Test/DefaultRazorSyntaxFactsServiceTest.cs
  99667. index 7888cb39a3a..8327e2856a0 100644
  99668. --- a/test/Microsoft.VisualStudio.Editor.Razor.Test/DefaultRazorSyntaxFactsServiceTest.cs
  99669. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/DefaultRazorSyntaxFactsServiceTest.cs
  99670. @@ -1,6 +1,7 @@
  99671. // Copyright (c) .NET Foundation. All rights reserved.
  99672. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  99673. +using System;
  99674. using System.Collections.Generic;
  99675. using Microsoft.AspNetCore.Razor.Language;
  99676. using Xunit;
  99677. @@ -88,33 +89,14 @@ namespace Microsoft.VisualStudio.Editor.Razor
  99678. .TagMatchingRuleDescriptor(rule => rule.RequireTagName("taghelper"))
  99679. .TypeName("TestTagHelper")
  99680. .Build();
  99681. - var engine = RazorProjectEngine.Create(builder =>
  99682. - {
  99683. - builder.AddTagHelpers(taghelper);
  99684. - builder.SetImportFeature(new TestImportProjectFeature());
  99685. - });
  99686. + var engine = RazorProjectEngine.Create();
  99687. - var sourceProjectItem = new TestRazorProjectItem("test.cshtml")
  99688. - {
  99689. - Content = source
  99690. - };
  99691. + var sourceDocument = TestRazorSourceDocument.Create(source, normalizeNewLines: true);
  99692. + var importDocument = TestRazorSourceDocument.Create("@addTagHelper *, TestAssembly", filePath: "import.cshtml", relativePath: "import.cshtml");
  99693. - var codeDocument = engine.ProcessDesignTime(sourceProjectItem);
  99694. + var codeDocument = engine.ProcessDesignTime(sourceDocument, importSources: new []{ importDocument }, new []{ taghelper });
  99695. return codeDocument;
  99696. }
  99697. -
  99698. - private class TestImportProjectFeature : RazorProjectEngineFeatureBase, IImportProjectFeature
  99699. - {
  99700. - public IReadOnlyList<RazorProjectItem> GetImports(RazorProjectItem projectItem)
  99701. - {
  99702. - var importProjectItem = new TestRazorProjectItem("import.cshtml")
  99703. - {
  99704. - Content = "@addTagHelper *, TestAssembly"
  99705. - };
  99706. -
  99707. - return new[] { importProjectItem };
  99708. - }
  99709. - }
  99710. }
  99711. }
  99712. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/DefaultVisualStudioRazorParserIntegrationTest.cs b/test/Microsoft.VisualStudio.Editor.Razor.Test/DefaultVisualStudioRazorParserIntegrationTest.cs
  99713. index 22c277aaa5b..8cb7f9ed7cf 100644
  99714. --- a/test/Microsoft.VisualStudio.Editor.Razor.Test/DefaultVisualStudioRazorParserIntegrationTest.cs
  99715. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/DefaultVisualStudioRazorParserIntegrationTest.cs
  99716. @@ -9,7 +9,7 @@ using System.Threading.Tasks;
  99717. using Microsoft.AspNetCore.Mvc.Razor.Extensions;
  99718. using Microsoft.AspNetCore.Razor.Language;
  99719. using Microsoft.AspNetCore.Razor.Language.Legacy;
  99720. -using Microsoft.CodeAnalysis;
  99721. +using Microsoft.AspNetCore.Razor.Language.Syntax;
  99722. using Microsoft.CodeAnalysis.Razor;
  99723. using Microsoft.CodeAnalysis.Razor.ProjectSystem;
  99724. using Microsoft.VisualStudio.Test;
  99725. @@ -27,13 +27,13 @@ namespace Microsoft.VisualStudio.Editor.Razor
  99726. public DefaultVisualStudioRazorParserIntegrationTest()
  99727. {
  99728. - Workspace = TestWorkspace.Create();
  99729. + Workspace = CodeAnalysis.TestWorkspace.Create();
  99730. ProjectSnapshot = new EphemeralProjectSnapshot(Workspace.Services, TestProjectPath);
  99731. }
  99732. private ProjectSnapshot ProjectSnapshot { get; }
  99733. - private Workspace Workspace { get; }
  99734. + private CodeAnalysis.Workspace Workspace { get; }
  99735. [ForegroundFact]
  99736. public async Task BufferChangeStartsFullReparseIfChangeOverlapsMultipleSpans()
  99737. @@ -70,7 +70,6 @@ namespace Microsoft.VisualStudio.Editor.Razor
  99738. var original = new StringTextSnapshot("foo @await Html baz");
  99739. using (var manager = CreateParserManager(original))
  99740. {
  99741. - var factory = new SpanFactory();
  99742. var changed = new StringTextSnapshot("foo @await Html. baz");
  99743. var edit = new TestEdit(15, 0, original, 1, changed, ".");
  99744. await manager.InitializeWithDocumentAsync(edit.OldSnapshot);
  99745. @@ -80,19 +79,14 @@ namespace Microsoft.VisualStudio.Editor.Razor
  99746. // Assert
  99747. Assert.Equal(2, manager.ParseCount);
  99748. - ParserTestBase.EvaluateParseTree(manager.CurrentSyntaxTree.Root, new MarkupBlock(
  99749. - factory.Markup("foo "),
  99750. - new ExpressionBlock(
  99751. - factory.CodeTransition(),
  99752. - factory.Code("await Html").AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharactersInternal.Whitespace | AcceptedCharactersInternal.NonWhitespace)),
  99753. - factory.Markup(". baz")));
  99754. + VerifyCurrentSyntaxTree(manager);
  99755. }
  99756. }
  99757. [ForegroundFact]
  99758. - public async Task ImplicitExpressionAcceptsDotlessCommitInsertionsInStatementBlockAfterIdentifiers()
  99759. + public async Task ImpExprAcceptsDCIInStmtBlkAfterIdentifiers()
  99760. {
  99761. - var factory = new SpanFactory();
  99762. + // ImplicitExpressionAcceptsDotlessCommitInsertionsInStatementBlockAfterIdentifiers
  99763. var changed = new StringTextSnapshot("@{" + Environment.NewLine
  99764. + " @DateTime." + Environment.NewLine
  99765. + "}");
  99766. @@ -107,22 +101,8 @@ namespace Microsoft.VisualStudio.Editor.Razor
  99767. {
  99768. manager.ApplyEdit(testEdit);
  99769. Assert.Equal(1, manager.ParseCount);
  99770. - ParserTestBase.EvaluateParseTree(manager.PartialParsingSyntaxTreeRoot, new MarkupBlock(
  99771. - factory.EmptyHtml(),
  99772. - new StatementBlock(
  99773. - factory.CodeTransition(),
  99774. - factory.MetaCode("{").Accepts(AcceptedCharactersInternal.None),
  99775. - factory.Code(Environment.NewLine + " ")
  99776. - .AsStatement()
  99777. - .AutoCompleteWith(autoCompleteString: null),
  99778. - new ExpressionBlock(
  99779. - factory.CodeTransition(),
  99780. - factory.Code(expectedCode)
  99781. - .AsImplicitExpression(CSharpCodeParser.DefaultKeywords, acceptTrailingDot: true)
  99782. - .Accepts(AcceptedCharactersInternal.NonWhitespace)),
  99783. - factory.Code(Environment.NewLine).AsStatement(),
  99784. - factory.MetaCode("}").Accepts(AcceptedCharactersInternal.None)),
  99785. - factory.EmptyHtml()));
  99786. +
  99787. + VerifyPartialParseTree(manager, changed.GetText(), expectedCode);
  99788. };
  99789. await manager.InitializeWithDocumentAsync(edit.OldSnapshot);
  99790. @@ -149,9 +129,9 @@ namespace Microsoft.VisualStudio.Editor.Razor
  99791. }
  99792. [ForegroundFact]
  99793. - public async Task ImplicitExpressionAcceptsDotlessCommitInsertionsInStatementBlock()
  99794. + public async Task ImpExprAcceptsDCIInStatementBlock()
  99795. {
  99796. - var factory = new SpanFactory();
  99797. + // ImpExprAcceptsDotlessCommitInsertionsInStatementBlock
  99798. var changed = new StringTextSnapshot("@{" + Environment.NewLine
  99799. + " @DateT." + Environment.NewLine
  99800. + "}");
  99801. @@ -166,22 +146,7 @@ namespace Microsoft.VisualStudio.Editor.Razor
  99802. {
  99803. manager.ApplyEdit(testEdit);
  99804. Assert.Equal(1, manager.ParseCount);
  99805. - ParserTestBase.EvaluateParseTree(manager.PartialParsingSyntaxTreeRoot, new MarkupBlock(
  99806. - factory.EmptyHtml(),
  99807. - new StatementBlock(
  99808. - factory.CodeTransition(),
  99809. - factory.MetaCode("{").Accepts(AcceptedCharactersInternal.None),
  99810. - factory.Code(Environment.NewLine + " ")
  99811. - .AsStatement()
  99812. - .AutoCompleteWith(autoCompleteString: null),
  99813. - new ExpressionBlock(
  99814. - factory.CodeTransition(),
  99815. - factory.Code(expectedCode)
  99816. - .AsImplicitExpression(CSharpCodeParser.DefaultKeywords, acceptTrailingDot: true)
  99817. - .Accepts(AcceptedCharactersInternal.NonWhitespace)),
  99818. - factory.Code(Environment.NewLine).AsStatement(),
  99819. - factory.MetaCode("}").Accepts(AcceptedCharactersInternal.None)),
  99820. - factory.EmptyHtml()));
  99821. + VerifyPartialParseTree(manager, changed.GetText(), expectedCode);
  99822. };
  99823. await manager.InitializeWithDocumentAsync(edit.OldSnapshot);
  99824. @@ -200,9 +165,9 @@ namespace Microsoft.VisualStudio.Editor.Razor
  99825. }
  99826. [ForegroundFact]
  99827. - public async Task ImplicitExpressionProvisionallyAcceptsDotlessCommitInsertions()
  99828. + public async Task ImpExprProvisionallyAcceptsDCI()
  99829. {
  99830. - var factory = new SpanFactory();
  99831. + // ImpExprProvisionallyAcceptsDotlessCommitInsertions
  99832. var changed = new StringTextSnapshot("foo @DateT. baz");
  99833. var original = new StringTextSnapshot("foo @DateT baz");
  99834. var edit = new TestEdit(10, 0, original, 1, changed, ".");
  99835. @@ -213,12 +178,7 @@ namespace Microsoft.VisualStudio.Editor.Razor
  99836. manager.ApplyEdit(testEdit);
  99837. Assert.Equal(1, manager.ParseCount);
  99838. - ParserTestBase.EvaluateParseTree(manager.PartialParsingSyntaxTreeRoot, new MarkupBlock(
  99839. - factory.Markup("foo "),
  99840. - new ExpressionBlock(
  99841. - factory.CodeTransition(),
  99842. - factory.Code(expectedCode).AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharactersInternal.NonWhitespace)),
  99843. - factory.Markup(" baz")));
  99844. + VerifyPartialParseTree(manager, testEdit.NewSnapshot.GetText(), expectedCode);
  99845. };
  99846. await manager.InitializeWithDocumentAsync(edit.OldSnapshot);
  99847. @@ -236,19 +196,14 @@ namespace Microsoft.VisualStudio.Editor.Razor
  99848. await manager.WaitForReparseAsync();
  99849. Assert.Equal(2, manager.ParseCount);
  99850. - ParserTestBase.EvaluateParseTree(manager.CurrentSyntaxTree.Root, new MarkupBlock(
  99851. - factory.Markup("foo "),
  99852. - new ExpressionBlock(
  99853. - factory.CodeTransition(),
  99854. - factory.Code("DateTime").AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharactersInternal.NonWhitespace)),
  99855. - factory.Markup(". baz")));
  99856. + VerifyCurrentSyntaxTree(manager);
  99857. }
  99858. }
  99859. [ForegroundFact]
  99860. - public async Task ImplicitExpressionProvisionallyAcceptsDotlessCommitInsertionsAfterIdentifiers()
  99861. + public async Task ImpExprProvisionallyAcceptsDCIAfterIdentifiers()
  99862. {
  99863. - var factory = new SpanFactory();
  99864. + // ImplicitExpressionProvisionallyAcceptsDotlessCommitInsertionsAfterIdentifiers
  99865. var changed = new StringTextSnapshot("foo @DateTime. baz");
  99866. var original = new StringTextSnapshot("foo @DateTime baz");
  99867. var edit = new TestEdit(13, 0, original, 1, changed, ".");
  99868. @@ -259,12 +214,7 @@ namespace Microsoft.VisualStudio.Editor.Razor
  99869. manager.ApplyEdit(testEdit);
  99870. Assert.Equal(1, manager.ParseCount);
  99871. - ParserTestBase.EvaluateParseTree(manager.PartialParsingSyntaxTreeRoot, new MarkupBlock(
  99872. - factory.Markup("foo "),
  99873. - new ExpressionBlock(
  99874. - factory.CodeTransition(),
  99875. - factory.Code(expectedCode).AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharactersInternal.NonWhitespace)),
  99876. - factory.Markup(" baz")));
  99877. + VerifyPartialParseTree(manager, testEdit.NewSnapshot.GetText(), expectedCode);
  99878. };
  99879. await manager.InitializeWithDocumentAsync(edit.OldSnapshot);
  99880. @@ -288,19 +238,14 @@ namespace Microsoft.VisualStudio.Editor.Razor
  99881. await manager.WaitForReparseAsync();
  99882. Assert.Equal(2, manager.ParseCount);
  99883. - ParserTestBase.EvaluateParseTree(manager.CurrentSyntaxTree.Root, new MarkupBlock(
  99884. - factory.Markup("foo "),
  99885. - new ExpressionBlock(
  99886. - factory.CodeTransition(),
  99887. - factory.Code("DateTime.Now").AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharactersInternal.NonWhitespace)),
  99888. - factory.Markup(". baz")));
  99889. + VerifyCurrentSyntaxTree(manager);
  99890. }
  99891. }
  99892. [ForegroundFact]
  99893. - public async Task ImplicitExpressionProvisionallyAcceptsCaseInsensitiveDotlessCommitInsertions_NewRoslynIntegration()
  99894. + public async Task ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration()
  99895. {
  99896. - var factory = new SpanFactory();
  99897. + // ImplicitExpressionProvisionallyAcceptsCaseInsensitiveDotlessCommitInsertions_NewRoslynIntegration
  99898. var original = new StringTextSnapshot("foo @date baz");
  99899. var changed = new StringTextSnapshot("foo @date. baz");
  99900. var edit = new TestEdit(9, 0, original, 1, changed, ".");
  99901. @@ -311,12 +256,7 @@ namespace Microsoft.VisualStudio.Editor.Razor
  99902. applyEdit();
  99903. Assert.Equal(1, manager.ParseCount);
  99904. - ParserTestBase.EvaluateParseTree(manager.PartialParsingSyntaxTreeRoot, new MarkupBlock(
  99905. - factory.Markup("foo "),
  99906. - new ExpressionBlock(
  99907. - factory.CodeTransition(),
  99908. - factory.Code(expectedCode).AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharactersInternal.NonWhitespace)),
  99909. - factory.Markup(" baz")));
  99910. + VerifyPartialParseTree(manager, changed.GetText(), expectedCode);
  99911. };
  99912. await manager.InitializeWithDocumentAsync(edit.OldSnapshot);
  99913. @@ -351,20 +291,15 @@ namespace Microsoft.VisualStudio.Editor.Razor
  99914. await manager.WaitForReparseAsync();
  99915. Assert.Equal(2, manager.ParseCount);
  99916. - ParserTestBase.EvaluateParseTree(manager.CurrentSyntaxTree.Root, new MarkupBlock(
  99917. - factory.Markup("foo "),
  99918. - new ExpressionBlock(
  99919. - factory.CodeTransition(),
  99920. - factory.Code("DateTime").AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharactersInternal.NonWhitespace)),
  99921. - factory.Markup(". baz")));
  99922. + VerifyCurrentSyntaxTree(manager);
  99923. }
  99924. }
  99925. [ForegroundFact]
  99926. - public async Task ImplicitExpressionRejectsChangeWhichWouldHaveBeenAcceptedIfLastChangeWasProvisionallyAcceptedOnDifferentSpan()
  99927. + public async Task ImpExprRejectsAcceptableChangeIfPrevWasProvisionallyAccepted()
  99928. {
  99929. + // ImplicitExpressionRejectsChangeWhichWouldHaveBeenAcceptedIfLastChangeWasProvisionallyAcceptedOnDifferentSpan
  99930. // Arrange
  99931. - var factory = new SpanFactory();
  99932. var dotTyped = new TestEdit(8, 0, new StringTextSnapshot("foo @foo @bar"), 1, new StringTextSnapshot("foo @foo. @bar"), ".");
  99933. var charTyped = new TestEdit(14, 0, new StringTextSnapshot("foo @foo. @bar"), 1, new StringTextSnapshot("foo @foo. @barb"), "b");
  99934. using (var manager = CreateParserManager(dotTyped.OldSnapshot))
  99935. @@ -379,29 +314,15 @@ namespace Microsoft.VisualStudio.Editor.Razor
  99936. // Assert
  99937. Assert.Equal(2, manager.ParseCount);
  99938. - ParserTestBase.EvaluateParseTree(manager.PartialParsingSyntaxTreeRoot,
  99939. - new MarkupBlock(
  99940. - factory.Markup("foo "),
  99941. - new ExpressionBlock(
  99942. - factory.CodeTransition(),
  99943. - factory.Code("foo")
  99944. - .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
  99945. - .Accepts(AcceptedCharactersInternal.NonWhitespace)),
  99946. - factory.Markup(". "),
  99947. - new ExpressionBlock(
  99948. - factory.CodeTransition(),
  99949. - factory.Code("barb")
  99950. - .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
  99951. - .Accepts(AcceptedCharactersInternal.NonWhitespace)),
  99952. - factory.EmptyHtml()));
  99953. + VerifyPartialParseTree(manager, charTyped.NewSnapshot.GetText());
  99954. }
  99955. }
  99956. [ForegroundFact]
  99957. - public async Task ImplicitExpressionAcceptsIdentifierTypedAfterDotIfLastChangeWasProvisionalAcceptanceOfDot()
  99958. + public async Task ImpExprAcceptsIdentifierTypedAfterDotIfLastChangeProvisional()
  99959. {
  99960. + // ImplicitExpressionAcceptsIdentifierTypedAfterDotIfLastChangeWasProvisionalAcceptanceOfDot
  99961. // Arrange
  99962. - var factory = new SpanFactory();
  99963. var dotTyped = new TestEdit(8, 0, new StringTextSnapshot("foo @foo bar"), 1, new StringTextSnapshot("foo @foo. bar"), ".");
  99964. var charTyped = new TestEdit(9, 0, new StringTextSnapshot("foo @foo. bar"), 1, new StringTextSnapshot("foo @foo.b bar"), "b");
  99965. using (var manager = CreateParserManager(dotTyped.OldSnapshot))
  99966. @@ -416,23 +337,14 @@ namespace Microsoft.VisualStudio.Editor.Razor
  99967. // Assert
  99968. Assert.Equal(1, manager.ParseCount);
  99969. - ParserTestBase.EvaluateParseTree(manager.PartialParsingSyntaxTreeRoot,
  99970. - new MarkupBlock(
  99971. - factory.Markup("foo "),
  99972. - new ExpressionBlock(
  99973. - factory.CodeTransition(),
  99974. - factory.Code("foo.b")
  99975. - .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
  99976. - .Accepts(AcceptedCharactersInternal.NonWhitespace)),
  99977. - factory.Markup(" bar")));
  99978. + VerifyPartialParseTree(manager, charTyped.NewSnapshot.GetText());
  99979. }
  99980. }
  99981. [ForegroundFact]
  99982. - public async Task ImplicitExpression_AcceptsParenthesisAtEnd_SingleEdit()
  99983. + public async Task ImpExpr_AcceptsParenthesisAtEnd_SingleEdit()
  99984. {
  99985. // Arrange
  99986. - var factory = new SpanFactory();
  99987. var edit = new TestEdit(8, 0, new StringTextSnapshot("foo @foo bar"), 2, new StringTextSnapshot("foo @foo() bar"), "()");
  99988. using (var manager = CreateParserManager(edit.OldSnapshot))
  99989. @@ -444,24 +356,14 @@ namespace Microsoft.VisualStudio.Editor.Razor
  99990. // Assert
  99991. Assert.Equal(1, manager.ParseCount);
  99992. - ParserTestBase.EvaluateParseTree(
  99993. - manager.PartialParsingSyntaxTreeRoot,
  99994. - new MarkupBlock(
  99995. - factory.Markup("foo "),
  99996. - new ExpressionBlock(
  99997. - factory.CodeTransition(),
  99998. - factory.Code("foo()")
  99999. - .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
  100000. - .Accepts(AcceptedCharactersInternal.NonWhitespace)),
  100001. - factory.Markup(" bar")));
  100002. + VerifyPartialParseTree(manager, edit.NewSnapshot.GetText());
  100003. }
  100004. }
  100005. [ForegroundFact]
  100006. - public async Task ImplicitExpression_AcceptsParenthesisAtEnd_TwoEdits()
  100007. + public async Task ImpExpr_AcceptsParenthesisAtEnd_TwoEdits()
  100008. {
  100009. // Arrange
  100010. - var factory = new SpanFactory();
  100011. var edit1 = new TestEdit(8, 0, new StringTextSnapshot("foo @foo bar"), 1, new StringTextSnapshot("foo @foo( bar"), "(");
  100012. var edit2 = new TestEdit(9, 0, new StringTextSnapshot("foo @foo( bar"), 1, new StringTextSnapshot("foo @foo() bar"), ")");
  100013. using (var manager = CreateParserManager(edit1.OldSnapshot))
  100014. @@ -476,33 +378,24 @@ namespace Microsoft.VisualStudio.Editor.Razor
  100015. // Assert
  100016. Assert.Equal(1, manager.ParseCount);
  100017. - ParserTestBase.EvaluateParseTree(
  100018. - manager.PartialParsingSyntaxTreeRoot,
  100019. - new MarkupBlock(
  100020. - factory.Markup("foo "),
  100021. - new ExpressionBlock(
  100022. - factory.CodeTransition(),
  100023. - factory.Code("foo()")
  100024. - .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
  100025. - .Accepts(AcceptedCharactersInternal.NonWhitespace)),
  100026. - factory.Markup(" bar")));
  100027. + VerifyPartialParseTree(manager, edit2.NewSnapshot.GetText());
  100028. }
  100029. }
  100030. [ForegroundFact]
  100031. - public async Task ImplicitExpressionCorrectlyTriggersReparseIfIfKeywordTyped()
  100032. + public async Task ImpExprCorrectlyTriggersReparseIfIfKeywordTyped()
  100033. {
  100034. await RunTypeKeywordTestAsync("if");
  100035. }
  100036. [ForegroundFact]
  100037. - public async Task ImplicitExpressionCorrectlyTriggersReparseIfDoKeywordTyped()
  100038. + public async Task ImpExprCorrectlyTriggersReparseIfDoKeywordTyped()
  100039. {
  100040. await RunTypeKeywordTestAsync("do");
  100041. }
  100042. [ForegroundFact]
  100043. - public async Task ImplicitExpressionCorrectlyTriggersReparseIfTryKeywordTyped()
  100044. + public async Task ImpExprCorrectlyTriggersReparseIfTryKeywordTyped()
  100045. {
  100046. await RunTypeKeywordTestAsync("try");
  100047. }
  100048. @@ -514,65 +407,84 @@ namespace Microsoft.VisualStudio.Editor.Razor
  100049. }
  100050. [ForegroundFact]
  100051. - public async Task ImplicitExpressionCorrectlyTriggersReparseIfForEachKeywordTyped()
  100052. + public async Task ImpExprCorrectlyTriggersReparseIfForEachKeywordTyped()
  100053. {
  100054. await RunTypeKeywordTestAsync("foreach");
  100055. }
  100056. [ForegroundFact]
  100057. - public async Task ImplicitExpressionCorrectlyTriggersReparseIfWhileKeywordTyped()
  100058. + public async Task ImpExprCorrectlyTriggersReparseIfWhileKeywordTyped()
  100059. {
  100060. await RunTypeKeywordTestAsync("while");
  100061. }
  100062. [ForegroundFact]
  100063. - public async Task ImplicitExpressionCorrectlyTriggersReparseIfSwitchKeywordTyped()
  100064. + public async Task ImpExprCorrectlyTriggersReparseIfSwitchKeywordTyped()
  100065. {
  100066. await RunTypeKeywordTestAsync("switch");
  100067. }
  100068. [ForegroundFact]
  100069. - public async Task ImplicitExpressionCorrectlyTriggersReparseIfLockKeywordTyped()
  100070. + public async Task ImpExprCorrectlyTriggersReparseIfLockKeywordTyped()
  100071. {
  100072. await RunTypeKeywordTestAsync("lock");
  100073. }
  100074. [ForegroundFact]
  100075. - public async Task ImplicitExpressionCorrectlyTriggersReparseIfUsingKeywordTyped()
  100076. + public async Task ImpExprCorrectlyTriggersReparseIfUsingKeywordTyped()
  100077. {
  100078. await RunTypeKeywordTestAsync("using");
  100079. }
  100080. [ForegroundFact]
  100081. - public async Task ImplicitExpressionCorrectlyTriggersReparseIfSectionKeywordTyped()
  100082. + public async Task ImpExprCorrectlyTriggersReparseIfSectionKeywordTyped()
  100083. {
  100084. await RunTypeKeywordTestAsync("section");
  100085. }
  100086. [ForegroundFact]
  100087. - public async Task ImplicitExpressionCorrectlyTriggersReparseIfInheritsKeywordTyped()
  100088. + public async Task ImpExprCorrectlyTriggersReparseIfInheritsKeywordTyped()
  100089. {
  100090. await RunTypeKeywordTestAsync("inherits");
  100091. }
  100092. [ForegroundFact]
  100093. - public async Task ImplicitExpressionCorrectlyTriggersReparseIfFunctionsKeywordTyped()
  100094. + public async Task ImpExprCorrectlyTriggersReparseIfFunctionsKeywordTyped()
  100095. {
  100096. await RunTypeKeywordTestAsync("functions");
  100097. }
  100098. [ForegroundFact]
  100099. - public async Task ImplicitExpressionCorrectlyTriggersReparseIfNamespaceKeywordTyped()
  100100. + public async Task ImpExprCorrectlyTriggersReparseIfNamespaceKeywordTyped()
  100101. {
  100102. await RunTypeKeywordTestAsync("namespace");
  100103. }
  100104. [ForegroundFact]
  100105. - public async Task ImplicitExpressionCorrectlyTriggersReparseIfClassKeywordTyped()
  100106. + public async Task ImpExprCorrectlyTriggersReparseIfClassKeywordTyped()
  100107. {
  100108. await RunTypeKeywordTestAsync("class");
  100109. }
  100110. + private void VerifyPartialParseTree(TestParserManager manager, string content, string expectedCode = null)
  100111. + {
  100112. + if (expectedCode != null)
  100113. + {
  100114. + // Verify if the syntax tree represents the expected input.
  100115. + var syntaxTreeContent = manager.PartialParsingSyntaxTreeRoot.ToFullString();
  100116. + Assert.Contains(expectedCode, syntaxTreeContent);
  100117. + }
  100118. +
  100119. + var sourceDocument = TestRazorSourceDocument.Create(content);
  100120. + var syntaxTree = RazorSyntaxTree.Create(manager.PartialParsingSyntaxTreeRoot, sourceDocument, manager.CurrentSyntaxTree.Diagnostics, manager.CurrentSyntaxTree.Options);
  100121. + BaselineTest(syntaxTree);
  100122. + }
  100123. +
  100124. + private void VerifyCurrentSyntaxTree(TestParserManager manager)
  100125. + {
  100126. + BaselineTest(manager.CurrentSyntaxTree);
  100127. + }
  100128. +
  100129. private TestParserManager CreateParserManager(ITextSnapshot originalSnapshot)
  100130. {
  100131. var textBuffer = new TestTextBuffer(originalSnapshot);
  100132. @@ -707,7 +619,7 @@ namespace Microsoft.VisualStudio.Editor.Razor
  100133. public RazorSyntaxTree CurrentSyntaxTree { get; private set; }
  100134. - public Block PartialParsingSyntaxTreeRoot => _parser._partialParser.SyntaxTreeRoot;
  100135. + public SyntaxNode PartialParsingSyntaxTreeRoot => _parser._partialParser.ModifiedSyntaxTreeRoot;
  100136. public async Task InitializeWithDocumentAsync(ITextSnapshot snapshot)
  100137. {
  100138. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/Microsoft.VisualStudio.Editor.Razor.Test.csproj b/test/Microsoft.VisualStudio.Editor.Razor.Test/Microsoft.VisualStudio.Editor.Razor.Test.csproj
  100139. index 014dbc821d5..0909a64e5ca 100644
  100140. --- a/test/Microsoft.VisualStudio.Editor.Razor.Test/Microsoft.VisualStudio.Editor.Razor.Test.csproj
  100141. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/Microsoft.VisualStudio.Editor.Razor.Test.csproj
  100142. @@ -12,6 +12,7 @@
  100143. </ItemGroup>
  100144. <ItemGroup>
  100145. + <EmbeddedResource Include="TestFiles\**\*" />
  100146. <None Include="xunit.runner.json" CopyToOutputDirectory="PreserveNewest" />
  100147. </ItemGroup>
  100148. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/RazorSyntaxTreePartialParserTest.cs b/test/Microsoft.VisualStudio.Editor.Razor.Test/RazorSyntaxTreePartialParserTest.cs
  100149. index 488f88f88c6..aede704a51a 100644
  100150. --- a/test/Microsoft.VisualStudio.Editor.Razor.Test/RazorSyntaxTreePartialParserTest.cs
  100151. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/RazorSyntaxTreePartialParserTest.cs
  100152. @@ -1,7 +1,6 @@
  100153. // Copyright (c) .NET Foundation. All rights reserved.
  100154. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  100155. -using System;
  100156. using System.Collections.Generic;
  100157. using Microsoft.AspNetCore.Mvc.Razor.Extensions;
  100158. using Microsoft.AspNetCore.Razor.Language;
  100159. @@ -12,8 +11,10 @@ using Xunit;
  100160. namespace Microsoft.VisualStudio.Editor.Razor
  100161. {
  100162. - public class RazorSyntaxTreePartialParserTest
  100163. + public class RazorSyntaxTreePartialParserTest : PartialParserTestBase
  100164. {
  100165. + private const string NewLine = "\r\n";
  100166. +
  100167. public static TheoryData TagHelperPartialParseRejectData
  100168. {
  100169. get
  100170. @@ -62,8 +63,6 @@ namespace Microsoft.VisualStudio.Editor.Razor
  100171. {
  100172. get
  100173. {
  100174. - var factory = new SpanFactory();
  100175. -
  100176. // change, (Block)expectedDocument, partialParseResult
  100177. return new TheoryData<TestEdit, PartialParseResultInternal>
  100178. {
  100179. @@ -131,75 +130,44 @@ namespace Microsoft.VisualStudio.Editor.Razor
  100180. }
  100181. [Fact]
  100182. - public void ImplicitExpressionAcceptsInnerInsertionsInStatementBlock()
  100183. + public void ImpExprAcceptsInnerInsertionsInStatementBlock()
  100184. {
  100185. // Arrange
  100186. - var factory = new SpanFactory();
  100187. - var changed = new StringTextSnapshot("@{" + Environment.NewLine
  100188. - + " @DateTime..Now" + Environment.NewLine
  100189. + var changed = new StringTextSnapshot("@{" + NewLine
  100190. + + " @DateTime..Now" + NewLine
  100191. + "}");
  100192. - var old = new StringTextSnapshot("@{" + Environment.NewLine
  100193. - + " @DateTime.Now" + Environment.NewLine
  100194. + var old = new StringTextSnapshot("@{" + NewLine
  100195. + + " @DateTime.Now" + NewLine
  100196. + "}");
  100197. // Act and Assert
  100198. - RunPartialParseTest(new TestEdit(17, 0, old, 1, changed, "."),
  100199. - new MarkupBlock(
  100200. - factory.EmptyHtml(),
  100201. - new StatementBlock(
  100202. - factory.CodeTransition(),
  100203. - factory.MetaCode("{").Accepts(AcceptedCharactersInternal.None),
  100204. - factory.Code(Environment.NewLine + " ")
  100205. - .AsStatement()
  100206. - .AutoCompleteWith(autoCompleteString: null),
  100207. - new ExpressionBlock(
  100208. - factory.CodeTransition(),
  100209. - factory.Code("DateTime..Now")
  100210. - .AsImplicitExpression(CSharpCodeParser.DefaultKeywords, acceptTrailingDot: true)
  100211. - .Accepts(AcceptedCharactersInternal.NonWhitespace)),
  100212. - factory.Code(Environment.NewLine).AsStatement(),
  100213. - factory.MetaCode("}").Accepts(AcceptedCharactersInternal.None)),
  100214. - factory.EmptyHtml()));
  100215. + RunPartialParseTest(new TestEdit(17, 0, old, 1, changed, "."));
  100216. }
  100217. [Fact]
  100218. - public void ImplicitExpressionAcceptsInnerInsertions()
  100219. + public void ImpExprAcceptsInnerInsertions()
  100220. {
  100221. // Arrange
  100222. - var factory = new SpanFactory();
  100223. var changed = new StringTextSnapshot("foo @DateTime..Now baz");
  100224. var old = new StringTextSnapshot("foo @DateTime.Now baz");
  100225. // Act and Assert
  100226. - RunPartialParseTest(new TestEdit(13, 0, old, 1, changed, "."),
  100227. - new MarkupBlock(
  100228. - factory.Markup("foo "),
  100229. - new ExpressionBlock(
  100230. - factory.CodeTransition(),
  100231. - factory.Code("DateTime..Now").AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharactersInternal.NonWhitespace)),
  100232. - factory.Markup(" baz")), additionalFlags: PartialParseResultInternal.Provisional);
  100233. + RunPartialParseTest(new TestEdit(13, 0, old, 1, changed, "."), additionalFlags: PartialParseResultInternal.Provisional);
  100234. }
  100235. [Fact]
  100236. - public void ImplicitExpressionAcceptsWholeIdentifierReplacement()
  100237. + public void ImpExprAcceptsWholeIdentifierReplacement()
  100238. {
  100239. // Arrange
  100240. - var factory = new SpanFactory();
  100241. var old = new StringTextSnapshot("foo @date baz");
  100242. var changed = new StringTextSnapshot("foo @DateTime baz");
  100243. // Act and Assert
  100244. - RunPartialParseTest(new TestEdit(5, 4, old, 8, changed, "DateTime"),
  100245. - new MarkupBlock(
  100246. - factory.Markup("foo "),
  100247. - new ExpressionBlock(
  100248. - factory.CodeTransition(),
  100249. - factory.Code("DateTime").AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharactersInternal.NonWhitespace)),
  100250. - factory.Markup(" baz")));
  100251. + RunPartialParseTest(new TestEdit(5, 4, old, 8, changed, "DateTime"));
  100252. }
  100253. [Fact]
  100254. - public void ImplicitExpressionRejectsWholeIdentifierReplacementToKeyword()
  100255. + public void ImpExprRejectsWholeIdentifierReplacementToKeyword()
  100256. {
  100257. // Arrange
  100258. var old = new StringTextSnapshot("foo @date baz");
  100259. @@ -211,7 +179,7 @@ namespace Microsoft.VisualStudio.Editor.Razor
  100260. }
  100261. [Fact]
  100262. - public void ImplicitExpressionRejectsWholeIdentifierReplacementToDirective()
  100263. + public void ImpExprRejectsWholeIdentifierReplacementToDirective()
  100264. {
  100265. // Arrange
  100266. var old = new StringTextSnapshot("foo @date baz");
  100267. @@ -223,327 +191,162 @@ namespace Microsoft.VisualStudio.Editor.Razor
  100268. }
  100269. [Fact]
  100270. - public void ImplicitExpressionAcceptsPrefixIdentifierReplacements_SingleSymbol()
  100271. + public void ImpExprAcceptsPrefixIdentifierReplacements_SingleSymbol()
  100272. {
  100273. // Arrange
  100274. - var factory = new SpanFactory();
  100275. var old = new StringTextSnapshot("foo @dTime baz");
  100276. var changed = new StringTextSnapshot("foo @DateTime baz");
  100277. // Act and Assert
  100278. - RunPartialParseTest(new TestEdit(5, 1, old, 4, changed, "Date"),
  100279. - new MarkupBlock(
  100280. - factory.Markup("foo "),
  100281. - new ExpressionBlock(
  100282. - factory.CodeTransition(),
  100283. - factory.Code("DateTime").AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharactersInternal.NonWhitespace)),
  100284. - factory.Markup(" baz")));
  100285. + RunPartialParseTest(new TestEdit(5, 1, old, 4, changed, "Date"));
  100286. }
  100287. [Fact]
  100288. - public void ImplicitExpressionAcceptsPrefixIdentifierReplacements_MultipleSymbols()
  100289. + public void ImpExprAcceptsPrefixIdentifierReplacements_MultipleSymbols()
  100290. {
  100291. // Arrange
  100292. - var factory = new SpanFactory();
  100293. var old = new StringTextSnapshot("foo @dTime.Now baz");
  100294. var changed = new StringTextSnapshot("foo @DateTime.Now baz");
  100295. // Act and Assert
  100296. - RunPartialParseTest(new TestEdit(5, 1, old, 4, changed, "Date"),
  100297. - new MarkupBlock(
  100298. - factory.Markup("foo "),
  100299. - new ExpressionBlock(
  100300. - factory.CodeTransition(),
  100301. - factory.Code("DateTime.Now").AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharactersInternal.NonWhitespace)),
  100302. - factory.Markup(" baz")));
  100303. + RunPartialParseTest(new TestEdit(5, 1, old, 4, changed, "Date"));
  100304. }
  100305. [Fact]
  100306. - public void ImplicitExpressionAcceptsSuffixIdentifierReplacements_SingleSymbol()
  100307. + public void ImpExprAcceptsSuffixIdentifierReplacements_SingleSymbol()
  100308. {
  100309. // Arrange
  100310. - var factory = new SpanFactory();
  100311. var old = new StringTextSnapshot("foo @Datet baz");
  100312. var changed = new StringTextSnapshot("foo @DateTime baz");
  100313. // Act and Assert
  100314. - RunPartialParseTest(new TestEdit(9, 1, old, 4, changed, "Time"),
  100315. - new MarkupBlock(
  100316. - factory.Markup("foo "),
  100317. - new ExpressionBlock(
  100318. - factory.CodeTransition(),
  100319. - factory.Code("DateTime").AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharactersInternal.NonWhitespace)),
  100320. - factory.Markup(" baz")));
  100321. + RunPartialParseTest(new TestEdit(9, 1, old, 4, changed, "Time"));
  100322. }
  100323. [Fact]
  100324. - public void ImplicitExpressionAcceptsSuffixIdentifierReplacements_MultipleSymbols()
  100325. + public void ImpExprAcceptsSuffixIdentifierReplacements_MultipleSymbols()
  100326. {
  100327. // Arrange
  100328. - var factory = new SpanFactory();
  100329. var old = new StringTextSnapshot("foo @DateTime.n baz");
  100330. var changed = new StringTextSnapshot("foo @DateTime.Now baz");
  100331. // Act and Assert
  100332. - RunPartialParseTest(new TestEdit(14, 1, old, 3, changed, "Now"),
  100333. - new MarkupBlock(
  100334. - factory.Markup("foo "),
  100335. - new ExpressionBlock(
  100336. - factory.CodeTransition(),
  100337. - factory.Code("DateTime.Now").AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharactersInternal.NonWhitespace)),
  100338. - factory.Markup(" baz")));
  100339. + RunPartialParseTest(new TestEdit(14, 1, old, 3, changed, "Now"));
  100340. }
  100341. [Fact]
  100342. - public void ImplicitExpressionAcceptsSurroundedIdentifierReplacements()
  100343. + public void ImpExprAcceptsSurroundedIdentifierReplacements()
  100344. {
  100345. // Arrange
  100346. - var factory = new SpanFactory();
  100347. var old = new StringTextSnapshot("foo @DateTime.n.ToString() baz");
  100348. var changed = new StringTextSnapshot("foo @DateTime.Now.ToString() baz");
  100349. // Act and Assert
  100350. - RunPartialParseTest(new TestEdit(14, 1, old, 3, changed, "Now"),
  100351. - new MarkupBlock(
  100352. - factory.Markup("foo "),
  100353. - new ExpressionBlock(
  100354. - factory.CodeTransition(),
  100355. - factory.Code("DateTime.Now.ToString()").AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharactersInternal.NonWhitespace)),
  100356. - factory.Markup(" baz")));
  100357. + RunPartialParseTest(new TestEdit(14, 1, old, 3, changed, "Now"));
  100358. }
  100359. [Fact]
  100360. - public void ImplicitExpressionProvisionallyAcceptsDeleteOfIdentifierPartsIfDotRemains()
  100361. + public void ImpExprProvisionallyAcceptsDeleteOfIdentifierPartsIfDotRemains()
  100362. {
  100363. - var factory = new SpanFactory();
  100364. var changed = new StringTextSnapshot("foo @User. baz");
  100365. var old = new StringTextSnapshot("foo @User.Name baz");
  100366. RunPartialParseTest(new TestEdit(10, 4, old, 0, changed, string.Empty),
  100367. - new MarkupBlock(
  100368. - factory.Markup("foo "),
  100369. - new ExpressionBlock(
  100370. - factory.CodeTransition(),
  100371. - factory.Code("User.").AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharactersInternal.NonWhitespace)),
  100372. - factory.Markup(" baz")),
  100373. additionalFlags: PartialParseResultInternal.Provisional);
  100374. }
  100375. [Fact]
  100376. - public void ImplicitExpressionAcceptsDeleteOfIdentifierPartsIfSomeOfIdentifierRemains()
  100377. + public void ImpExprAcceptsDeleteOfIdentifierPartsIfSomeOfIdentifierRemains()
  100378. {
  100379. - var factory = new SpanFactory();
  100380. var changed = new StringTextSnapshot("foo @Us baz");
  100381. var old = new StringTextSnapshot("foo @User baz");
  100382. - RunPartialParseTest(new TestEdit(7, 2, old, 0, changed, string.Empty),
  100383. - new MarkupBlock(
  100384. - factory.Markup("foo "),
  100385. - new ExpressionBlock(
  100386. - factory.CodeTransition(),
  100387. - factory.Code("Us").AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharactersInternal.NonWhitespace)),
  100388. - factory.Markup(" baz")));
  100389. + RunPartialParseTest(new TestEdit(7, 2, old, 0, changed, string.Empty));
  100390. }
  100391. [Fact]
  100392. - public void ImplicitExpressionProvisionallyAcceptsMultipleInsertionIfItCausesIdentifierExpansionAndTrailingDot()
  100393. + public void ImpExprProvisionalForMultipleInsertionIfItCausesIdentifierExpansionAndTrailingDot()
  100394. {
  100395. - var factory = new SpanFactory();
  100396. + // ImpExprProvisionallyAcceptsMultipleInsertionIfItCausesIdentifierExpansionAndTrailingDot
  100397. var changed = new StringTextSnapshot("foo @User. baz");
  100398. var old = new StringTextSnapshot("foo @U baz");
  100399. RunPartialParseTest(new TestEdit(6, 0, old, 4, changed, "ser."),
  100400. - new MarkupBlock(
  100401. - factory.Markup("foo "),
  100402. - new ExpressionBlock(
  100403. - factory.CodeTransition(),
  100404. - factory.Code("User.").AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharactersInternal.NonWhitespace)),
  100405. - factory.Markup(" baz")),
  100406. additionalFlags: PartialParseResultInternal.Provisional);
  100407. }
  100408. [Fact]
  100409. - public void ImplicitExpressionAcceptsMultipleInsertionIfItOnlyCausesIdentifierExpansion()
  100410. + public void ImpExprAcceptsMultipleInsertionIfItOnlyCausesIdentifierExpansion()
  100411. {
  100412. - var factory = new SpanFactory();
  100413. var changed = new StringTextSnapshot("foo @barbiz baz");
  100414. var old = new StringTextSnapshot("foo @bar baz");
  100415. - RunPartialParseTest(new TestEdit(8, 0, old, 3, changed, "biz"),
  100416. - new MarkupBlock(
  100417. - factory.Markup("foo "),
  100418. - new ExpressionBlock(
  100419. - factory.CodeTransition(),
  100420. - factory.Code("barbiz").AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharactersInternal.NonWhitespace)),
  100421. - factory.Markup(" baz")));
  100422. + RunPartialParseTest(new TestEdit(8, 0, old, 3, changed, "biz"));
  100423. }
  100424. [Fact]
  100425. - public void ImplicitExpressionAcceptsIdentifierExpansionAtEndOfNonWhitespaceCharacters()
  100426. + public void ImpExprAcceptsIdentifierExpansionAtEndOfNonWhitespaceCharacters()
  100427. {
  100428. - var factory = new SpanFactory();
  100429. - var changed = new StringTextSnapshot("@{" + Environment.NewLine
  100430. - + " @food" + Environment.NewLine
  100431. + var changed = new StringTextSnapshot("@{" + NewLine
  100432. + + " @food" + NewLine
  100433. + "}");
  100434. - var old = new StringTextSnapshot("@{" + Environment.NewLine
  100435. - + " @foo" + Environment.NewLine
  100436. + var old = new StringTextSnapshot("@{" + NewLine
  100437. + + " @foo" + NewLine
  100438. + "}");
  100439. - RunPartialParseTest(new TestEdit(10 + Environment.NewLine.Length, 0, old, 1, changed, "d"),
  100440. - new MarkupBlock(
  100441. - factory.EmptyHtml(),
  100442. - new StatementBlock(
  100443. - factory.CodeTransition(),
  100444. - factory.MetaCode("{").Accepts(AcceptedCharactersInternal.None),
  100445. - factory.Code(Environment.NewLine + " ")
  100446. - .AsStatement()
  100447. - .AutoCompleteWith(autoCompleteString: null),
  100448. - new ExpressionBlock(
  100449. - factory.CodeTransition(),
  100450. - factory.Code("food")
  100451. - .AsImplicitExpression(CSharpCodeParser.DefaultKeywords, acceptTrailingDot: true)
  100452. - .Accepts(AcceptedCharactersInternal.NonWhitespace)),
  100453. - factory.Code(Environment.NewLine).AsStatement(),
  100454. - factory.MetaCode("}").Accepts(AcceptedCharactersInternal.None)),
  100455. - factory.EmptyHtml()));
  100456. + RunPartialParseTest(new TestEdit(10 + NewLine.Length, 0, old, 1, changed, "d"));
  100457. }
  100458. [Fact]
  100459. - public void ImplicitExpressionAcceptsIdentifierAfterDotAtEndOfNonWhitespaceCharacters()
  100460. + public void ImpExprAcceptsIdentifierAfterDotAtEndOfNonWhitespaceCharacters()
  100461. {
  100462. - var factory = new SpanFactory();
  100463. - var changed = new StringTextSnapshot("@{" + Environment.NewLine
  100464. - + " @foo.d" + Environment.NewLine
  100465. + var changed = new StringTextSnapshot("@{" + NewLine
  100466. + + " @foo.d" + NewLine
  100467. + "}");
  100468. - var old = new StringTextSnapshot("@{" + Environment.NewLine
  100469. - + " @foo." + Environment.NewLine
  100470. + var old = new StringTextSnapshot("@{" + NewLine
  100471. + + " @foo." + NewLine
  100472. + "}");
  100473. - RunPartialParseTest(new TestEdit(11 + Environment.NewLine.Length, 0, old, 1, changed, "d"),
  100474. - new MarkupBlock(
  100475. - factory.EmptyHtml(),
  100476. - new StatementBlock(
  100477. - factory.CodeTransition(),
  100478. - factory.MetaCode("{").Accepts(AcceptedCharactersInternal.None),
  100479. - factory.Code(Environment.NewLine + " ")
  100480. - .AsStatement()
  100481. - .AutoCompleteWith(autoCompleteString: null),
  100482. - new ExpressionBlock(
  100483. - factory.CodeTransition(),
  100484. - factory.Code("foo.d")
  100485. - .AsImplicitExpression(CSharpCodeParser.DefaultKeywords, acceptTrailingDot: true)
  100486. - .Accepts(AcceptedCharactersInternal.NonWhitespace)),
  100487. - factory.Code(Environment.NewLine).AsStatement(),
  100488. - factory.MetaCode("}").Accepts(AcceptedCharactersInternal.None)),
  100489. - factory.EmptyHtml()));
  100490. + RunPartialParseTest(new TestEdit(11 + NewLine.Length, 0, old, 1, changed, "d"));
  100491. }
  100492. [Fact]
  100493. - public void ImplicitExpressionAcceptsDotAtEndOfNonWhitespaceCharacters()
  100494. + public void ImpExprAcceptsDotAtEndOfNonWhitespaceCharacters()
  100495. {
  100496. - var factory = new SpanFactory();
  100497. - var changed = new StringTextSnapshot("@{" + Environment.NewLine
  100498. - + " @foo." + Environment.NewLine
  100499. + var changed = new StringTextSnapshot("@{" + NewLine
  100500. + + " @foo." + NewLine
  100501. + "}");
  100502. - var old = new StringTextSnapshot("@{" + Environment.NewLine
  100503. - + " @foo" + Environment.NewLine
  100504. + var old = new StringTextSnapshot("@{" + NewLine
  100505. + + " @foo" + NewLine
  100506. + "}");
  100507. - RunPartialParseTest(new TestEdit(10 + Environment.NewLine.Length, 0, old, 1, changed, "."),
  100508. - new MarkupBlock(
  100509. - factory.EmptyHtml(),
  100510. - new StatementBlock(
  100511. - factory.CodeTransition(),
  100512. - factory.MetaCode("{").Accepts(AcceptedCharactersInternal.None),
  100513. - factory.Code(Environment.NewLine + " ")
  100514. - .AsStatement()
  100515. - .AutoCompleteWith(autoCompleteString: null),
  100516. - new ExpressionBlock(
  100517. - factory.CodeTransition(),
  100518. - factory.Code(@"foo.")
  100519. - .AsImplicitExpression(CSharpCodeParser.DefaultKeywords, acceptTrailingDot: true)
  100520. - .Accepts(AcceptedCharactersInternal.NonWhitespace)),
  100521. - factory.Code(Environment.NewLine).AsStatement(),
  100522. - factory.MetaCode("}").Accepts(AcceptedCharactersInternal.None)),
  100523. - factory.EmptyHtml()));
  100524. + RunPartialParseTest(new TestEdit(10 + NewLine.Length, 0, old, 1, changed, "."));
  100525. }
  100526. [Fact]
  100527. - public void ImplicitExpressionProvisionallyAcceptsDotAfterIdentifierInMarkup()
  100528. + public void ImpExprProvisionallyAcceptsDotAfterIdentifierInMarkup()
  100529. {
  100530. - var factory = new SpanFactory();
  100531. var changed = new StringTextSnapshot("foo @foo. bar");
  100532. var old = new StringTextSnapshot("foo @foo bar");
  100533. RunPartialParseTest(new TestEdit(8, 0, old, 1, changed, "."),
  100534. - new MarkupBlock(
  100535. - factory.Markup("foo "),
  100536. - new ExpressionBlock(
  100537. - factory.CodeTransition(),
  100538. - factory.Code("foo.")
  100539. - .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
  100540. - .Accepts(AcceptedCharactersInternal.NonWhitespace)),
  100541. - factory.Markup(" bar")),
  100542. additionalFlags: PartialParseResultInternal.Provisional);
  100543. }
  100544. [Fact]
  100545. - public void ImplicitExpressionAcceptsAdditionalIdentifierCharactersIfEndOfSpanIsIdentifier()
  100546. + public void ImpExprAcceptsAdditionalIdentifierCharactersIfEndOfSpanIsIdentifier()
  100547. {
  100548. - var factory = new SpanFactory();
  100549. var changed = new StringTextSnapshot("foo @foob bar");
  100550. var old = new StringTextSnapshot("foo @foo bar");
  100551. - RunPartialParseTest(new TestEdit(8, 0, old, 1, changed, "b"),
  100552. - new MarkupBlock(
  100553. - factory.Markup("foo "),
  100554. - new ExpressionBlock(
  100555. - factory.CodeTransition(),
  100556. - factory.Code("foob")
  100557. - .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
  100558. - .Accepts(AcceptedCharactersInternal.NonWhitespace)),
  100559. - factory.Markup(" bar")));
  100560. + RunPartialParseTest(new TestEdit(8, 0, old, 1, changed, "b"));
  100561. }
  100562. [Fact]
  100563. - public void ImplicitExpressionAcceptsAdditionalIdentifierStartCharactersIfEndOfSpanIsDot()
  100564. + public void ImpExprAcceptsAdditionalIdentifierStartCharactersIfEndOfSpanIsDot()
  100565. {
  100566. - var factory = new SpanFactory();
  100567. var changed = new StringTextSnapshot("@{@foo.b}");
  100568. var old = new StringTextSnapshot("@{@foo.}");
  100569. - RunPartialParseTest(new TestEdit(7, 0, old, 1, changed, "b"),
  100570. - new MarkupBlock(
  100571. - factory.EmptyHtml(),
  100572. - new StatementBlock(
  100573. - factory.CodeTransition(),
  100574. - factory.MetaCode("{").Accepts(AcceptedCharactersInternal.None),
  100575. - factory.EmptyCSharp()
  100576. - .AsStatement()
  100577. - .AutoCompleteWith(autoCompleteString: null),
  100578. - new ExpressionBlock(
  100579. - factory.CodeTransition(),
  100580. - factory.Code("foo.b")
  100581. - .AsImplicitExpression(CSharpCodeParser.DefaultKeywords, acceptTrailingDot: true)
  100582. - .Accepts(AcceptedCharactersInternal.NonWhitespace)),
  100583. - factory.EmptyCSharp().AsStatement(),
  100584. - factory.MetaCode("}").Accepts(AcceptedCharactersInternal.None)),
  100585. - factory.EmptyHtml()));
  100586. + RunPartialParseTest(new TestEdit(7, 0, old, 1, changed, "b"));
  100587. }
  100588. [Fact]
  100589. - public void ImplicitExpressionAcceptsDotIfTrailingDotsAreAllowed()
  100590. + public void ImpExprAcceptsDotIfTrailingDotsAreAllowed()
  100591. {
  100592. - var factory = new SpanFactory();
  100593. var changed = new StringTextSnapshot("@{@foo.}");
  100594. var old = new StringTextSnapshot("@{@foo}");
  100595. - RunPartialParseTest(new TestEdit(6, 0, old, 1, changed, "."),
  100596. - new MarkupBlock(
  100597. - factory.EmptyHtml(),
  100598. - new StatementBlock(
  100599. - factory.CodeTransition(),
  100600. - factory.MetaCode("{").Accepts(AcceptedCharactersInternal.None),
  100601. - factory.EmptyCSharp()
  100602. - .AsStatement()
  100603. - .AutoCompleteWith(autoCompleteString: null),
  100604. - new ExpressionBlock(
  100605. - factory.CodeTransition(),
  100606. - factory.Code("foo.")
  100607. - .AsImplicitExpression(CSharpCodeParser.DefaultKeywords, acceptTrailingDot: true)
  100608. - .Accepts(AcceptedCharactersInternal.NonWhitespace)),
  100609. - factory.EmptyCSharp().AsStatement(),
  100610. - factory.MetaCode("}").Accepts(AcceptedCharactersInternal.None)),
  100611. - factory.EmptyHtml()));
  100612. + RunPartialParseTest(new TestEdit(6, 0, old, 1, changed, "."));
  100613. }
  100614. private void RunPartialParseRejectionTest(TestEdit edit, PartialParseResultInternal additionalFlags = 0)
  100615. @@ -558,7 +361,7 @@ namespace Microsoft.VisualStudio.Editor.Razor
  100616. Assert.Equal(PartialParseResultInternal.Rejected | additionalFlags, result);
  100617. }
  100618. - private static void RunPartialParseTest(TestEdit edit, Block expectedTree, PartialParseResultInternal additionalFlags = 0)
  100619. + private void RunPartialParseTest(TestEdit edit, PartialParseResultInternal additionalFlags = 0)
  100620. {
  100621. var templateEngine = CreateProjectEngine();
  100622. var document = TestRazorCodeDocument.Create(edit.OldSnapshot.GetText());
  100623. @@ -568,7 +371,10 @@ namespace Microsoft.VisualStudio.Editor.Razor
  100624. var result = parser.Parse(edit.Change);
  100625. Assert.Equal(PartialParseResultInternal.Accepted | additionalFlags, result);
  100626. - ParserTestBase.EvaluateParseTree(parser.SyntaxTreeRoot, expectedTree);
  100627. +
  100628. + var newSource = TestRazorSourceDocument.Create(edit.NewSnapshot.GetText());
  100629. + var newSyntaxTree = RazorSyntaxTree.Create(parser.ModifiedSyntaxTreeRoot, newSource, parser.OriginalSyntaxTree.Diagnostics, parser.OriginalSyntaxTree.Options);
  100630. + BaselineTest(newSyntaxTree);
  100631. }
  100632. private static TestEdit CreateInsertionChange(string initialText, int insertionLocation, string insertionText)
  100633. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/AwaitPeriodInsertionAcceptedProvisionally.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/AwaitPeriodInsertionAcceptedProvisionally.cspans.txt
  100634. new file mode 100644
  100635. index 00000000000..bbc7c7dc726
  100636. --- /dev/null
  100637. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/AwaitPeriodInsertionAcceptedProvisionally.cspans.txt
  100638. @@ -0,0 +1,4 @@
  100639. +Markup span at (0:0,0 [4] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [20] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml)
  100640. +Transition span at (4:0,4 [1] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [11] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml)
  100641. +Code span at (5:0,5 [10] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml) (Accepts:AnyExceptNewline) - Parent: Expression block at (4:0,4 [11] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml)
  100642. +Markup span at (15:0,15 [5] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [20] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml)
  100643. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/AwaitPeriodInsertionAcceptedProvisionally.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/AwaitPeriodInsertionAcceptedProvisionally.stree.txt
  100644. new file mode 100644
  100645. index 00000000000..121b1377a98
  100646. --- /dev/null
  100647. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/AwaitPeriodInsertionAcceptedProvisionally.stree.txt
  100648. @@ -0,0 +1,19 @@
  100649. +RazorDocument - [0..20)::20 - [foo @await Html. baz]
  100650. + MarkupBlock - [0..20)::20
  100651. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  100652. + Text;[foo];
  100653. + Whitespace;[ ];
  100654. + CSharpCodeBlock - [4..15)::11
  100655. + CSharpImplicitExpression - [4..15)::11
  100656. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  100657. + Transition;[@];
  100658. + CSharpImplicitExpressionBody - [5..15)::10
  100659. + CSharpCodeBlock - [5..15)::10
  100660. + CSharpExpressionLiteral - [5..15)::10 - [await Html] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:AnyExceptNewline;ImplicitExpression[RTD];K20
  100661. + Keyword;[await];
  100662. + Whitespace;[ ];
  100663. + Identifier;[Html];
  100664. + MarkupTextLiteral - [15..20)::5 - [. baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  100665. + Text;[.];
  100666. + Whitespace;[ ];
  100667. + Text;[baz];
  100668. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStatementBlock.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStatementBlock.cspans.txt
  100669. new file mode 100644
  100670. index 00000000000..a4b12a97e62
  100671. --- /dev/null
  100672. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStatementBlock.cspans.txt
  100673. @@ -0,0 +1,9 @@
  100674. +Markup span at (0:0,0 [0] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [18] test.cshtml)
  100675. +Transition span at (0:0,0 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [18] test.cshtml)
  100676. +MetaCode span at (1:0,1 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [18] test.cshtml)
  100677. +Code span at (2:0,2 [6] test.cshtml) (Accepts:Any) - Parent: Statement block at (0:0,0 [18] test.cshtml)
  100678. +Transition span at (8:1,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (8:1,4 [7] test.cshtml)
  100679. +Code span at (9:1,5 [6] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (8:1,4 [7] test.cshtml)
  100680. +Code span at (15:1,11 [2] test.cshtml) (Accepts:Any) - Parent: Statement block at (0:0,0 [18] test.cshtml)
  100681. +MetaCode span at (17:2,0 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [18] test.cshtml)
  100682. +Markup span at (18:2,1 [0] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [18] test.cshtml)
  100683. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStatementBlock.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStatementBlock.stree.txt
  100684. new file mode 100644
  100685. index 00000000000..1160d352db2
  100686. --- /dev/null
  100687. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStatementBlock.stree.txt
  100688. @@ -0,0 +1,30 @@
  100689. +RazorDocument - [0..18)::18 - [@{LF @DateT.LF}]
  100690. + MarkupBlock - [0..18)::18
  100691. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  100692. + Marker;[];
  100693. + CSharpCodeBlock - [0..18)::18
  100694. + CSharpStatement - [0..18)::18
  100695. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  100696. + Transition;[@];
  100697. + CSharpStatementBody - [1..18)::17
  100698. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  100699. + LeftBrace;[{];
  100700. + CSharpCodeBlock - [2..17)::15
  100701. + CSharpStatementLiteral - [2..8)::6 - [LF ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  100702. + NewLine;[LF];
  100703. + Whitespace;[ ];
  100704. + CSharpCodeBlock - [8..15)::7
  100705. + CSharpImplicitExpression - [8..15)::7
  100706. + CSharpTransition - [8..9)::1 - Gen<None> - SpanEditHandler;Accepts:None
  100707. + Transition;[@];
  100708. + CSharpImplicitExpressionBody - [9..15)::6
  100709. + CSharpCodeBlock - [9..15)::6
  100710. + CSharpExpressionLiteral - [9..15)::6 - [DateT.] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K20
  100711. + Identifier;[DateT];
  100712. + Dot;[.];
  100713. + CSharpStatementLiteral - [15..17)::2 - [LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  100714. + NewLine;[LF];
  100715. + RazorMetaCode - [17..18)::1 - Gen<None> - SpanEditHandler;Accepts:None
  100716. + RightBrace;[}];
  100717. + MarkupTextLiteral - [18..18)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  100718. + Marker;[];
  100719. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStatementBlock_1.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStatementBlock_1.cspans.txt
  100720. new file mode 100644
  100721. index 00000000000..b2646ea53bb
  100722. --- /dev/null
  100723. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStatementBlock_1.cspans.txt
  100724. @@ -0,0 +1,9 @@
  100725. +Markup span at (0:0,0 [0] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [21] test.cshtml)
  100726. +Transition span at (0:0,0 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [21] test.cshtml)
  100727. +MetaCode span at (1:0,1 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [21] test.cshtml)
  100728. +Code span at (2:0,2 [6] test.cshtml) (Accepts:Any) - Parent: Statement block at (0:0,0 [21] test.cshtml)
  100729. +Transition span at (8:1,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (8:1,4 [10] test.cshtml)
  100730. +Code span at (9:1,5 [9] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (8:1,4 [10] test.cshtml)
  100731. +Code span at (18:1,14 [2] test.cshtml) (Accepts:Any) - Parent: Statement block at (0:0,0 [21] test.cshtml)
  100732. +MetaCode span at (20:2,0 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [21] test.cshtml)
  100733. +Markup span at (21:2,1 [0] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [21] test.cshtml)
  100734. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStatementBlock_1.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStatementBlock_1.stree.txt
  100735. new file mode 100644
  100736. index 00000000000..76908cbb40c
  100737. --- /dev/null
  100738. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStatementBlock_1.stree.txt
  100739. @@ -0,0 +1,30 @@
  100740. +RazorDocument - [0..21)::21 - [@{LF @DateTime.LF}]
  100741. + MarkupBlock - [0..21)::21
  100742. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  100743. + Marker;[];
  100744. + CSharpCodeBlock - [0..21)::21
  100745. + CSharpStatement - [0..21)::21
  100746. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  100747. + Transition;[@];
  100748. + CSharpStatementBody - [1..21)::20
  100749. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  100750. + LeftBrace;[{];
  100751. + CSharpCodeBlock - [2..20)::18
  100752. + CSharpStatementLiteral - [2..8)::6 - [LF ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  100753. + NewLine;[LF];
  100754. + Whitespace;[ ];
  100755. + CSharpCodeBlock - [8..18)::10
  100756. + CSharpImplicitExpression - [8..18)::10
  100757. + CSharpTransition - [8..9)::1 - Gen<None> - SpanEditHandler;Accepts:None
  100758. + Transition;[@];
  100759. + CSharpImplicitExpressionBody - [9..18)::9
  100760. + CSharpCodeBlock - [9..18)::9
  100761. + CSharpExpressionLiteral - [9..18)::9 - [DateTime.] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K20
  100762. + Identifier;[DateTime];
  100763. + Dot;[.];
  100764. + CSharpStatementLiteral - [18..20)::2 - [LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  100765. + NewLine;[LF];
  100766. + RazorMetaCode - [20..21)::1 - Gen<None> - SpanEditHandler;Accepts:None
  100767. + RightBrace;[}];
  100768. + MarkupTextLiteral - [21..21)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  100769. + Marker;[];
  100770. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStmtBlkAfterIdentifiers.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStmtBlkAfterIdentifiers.cspans.txt
  100771. new file mode 100644
  100772. index 00000000000..b2646ea53bb
  100773. --- /dev/null
  100774. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStmtBlkAfterIdentifiers.cspans.txt
  100775. @@ -0,0 +1,9 @@
  100776. +Markup span at (0:0,0 [0] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [21] test.cshtml)
  100777. +Transition span at (0:0,0 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [21] test.cshtml)
  100778. +MetaCode span at (1:0,1 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [21] test.cshtml)
  100779. +Code span at (2:0,2 [6] test.cshtml) (Accepts:Any) - Parent: Statement block at (0:0,0 [21] test.cshtml)
  100780. +Transition span at (8:1,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (8:1,4 [10] test.cshtml)
  100781. +Code span at (9:1,5 [9] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (8:1,4 [10] test.cshtml)
  100782. +Code span at (18:1,14 [2] test.cshtml) (Accepts:Any) - Parent: Statement block at (0:0,0 [21] test.cshtml)
  100783. +MetaCode span at (20:2,0 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [21] test.cshtml)
  100784. +Markup span at (21:2,1 [0] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [21] test.cshtml)
  100785. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStmtBlkAfterIdentifiers.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStmtBlkAfterIdentifiers.stree.txt
  100786. new file mode 100644
  100787. index 00000000000..76908cbb40c
  100788. --- /dev/null
  100789. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStmtBlkAfterIdentifiers.stree.txt
  100790. @@ -0,0 +1,30 @@
  100791. +RazorDocument - [0..21)::21 - [@{LF @DateTime.LF}]
  100792. + MarkupBlock - [0..21)::21
  100793. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  100794. + Marker;[];
  100795. + CSharpCodeBlock - [0..21)::21
  100796. + CSharpStatement - [0..21)::21
  100797. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  100798. + Transition;[@];
  100799. + CSharpStatementBody - [1..21)::20
  100800. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  100801. + LeftBrace;[{];
  100802. + CSharpCodeBlock - [2..20)::18
  100803. + CSharpStatementLiteral - [2..8)::6 - [LF ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  100804. + NewLine;[LF];
  100805. + Whitespace;[ ];
  100806. + CSharpCodeBlock - [8..18)::10
  100807. + CSharpImplicitExpression - [8..18)::10
  100808. + CSharpTransition - [8..9)::1 - Gen<None> - SpanEditHandler;Accepts:None
  100809. + Transition;[@];
  100810. + CSharpImplicitExpressionBody - [9..18)::9
  100811. + CSharpCodeBlock - [9..18)::9
  100812. + CSharpExpressionLiteral - [9..18)::9 - [DateTime.] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K20
  100813. + Identifier;[DateTime];
  100814. + Dot;[.];
  100815. + CSharpStatementLiteral - [18..20)::2 - [LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  100816. + NewLine;[LF];
  100817. + RazorMetaCode - [20..21)::1 - Gen<None> - SpanEditHandler;Accepts:None
  100818. + RightBrace;[}];
  100819. + MarkupTextLiteral - [21..21)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  100820. + Marker;[];
  100821. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStmtBlkAfterIdentifiers_1.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStmtBlkAfterIdentifiers_1.cspans.txt
  100822. new file mode 100644
  100823. index 00000000000..7a8781a06c4
  100824. --- /dev/null
  100825. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStmtBlkAfterIdentifiers_1.cspans.txt
  100826. @@ -0,0 +1,9 @@
  100827. +Markup span at (0:0,0 [0] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [22] test.cshtml)
  100828. +Transition span at (0:0,0 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [22] test.cshtml)
  100829. +MetaCode span at (1:0,1 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [22] test.cshtml)
  100830. +Code span at (2:0,2 [6] test.cshtml) (Accepts:Any) - Parent: Statement block at (0:0,0 [22] test.cshtml)
  100831. +Transition span at (8:1,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (8:1,4 [11] test.cshtml)
  100832. +Code span at (9:1,5 [10] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (8:1,4 [11] test.cshtml)
  100833. +Code span at (19:1,15 [2] test.cshtml) (Accepts:Any) - Parent: Statement block at (0:0,0 [22] test.cshtml)
  100834. +MetaCode span at (21:2,0 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [22] test.cshtml)
  100835. +Markup span at (22:2,1 [0] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [22] test.cshtml)
  100836. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStmtBlkAfterIdentifiers_1.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStmtBlkAfterIdentifiers_1.stree.txt
  100837. new file mode 100644
  100838. index 00000000000..c1c2a9d50ab
  100839. --- /dev/null
  100840. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStmtBlkAfterIdentifiers_1.stree.txt
  100841. @@ -0,0 +1,31 @@
  100842. +RazorDocument - [0..22)::22 - [@{LF @DateTime..LF}]
  100843. + MarkupBlock - [0..22)::22
  100844. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  100845. + Marker;[];
  100846. + CSharpCodeBlock - [0..22)::22
  100847. + CSharpStatement - [0..22)::22
  100848. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  100849. + Transition;[@];
  100850. + CSharpStatementBody - [1..22)::21
  100851. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  100852. + LeftBrace;[{];
  100853. + CSharpCodeBlock - [2..21)::19
  100854. + CSharpStatementLiteral - [2..8)::6 - [LF ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  100855. + NewLine;[LF];
  100856. + Whitespace;[ ];
  100857. + CSharpCodeBlock - [8..19)::11
  100858. + CSharpImplicitExpression - [8..19)::11
  100859. + CSharpTransition - [8..9)::1 - Gen<None> - SpanEditHandler;Accepts:None
  100860. + Transition;[@];
  100861. + CSharpImplicitExpressionBody - [9..19)::10
  100862. + CSharpCodeBlock - [9..19)::10
  100863. + CSharpExpressionLiteral - [9..19)::10 - [DateTime..] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K20
  100864. + Identifier;[DateTime];
  100865. + Dot;[.];
  100866. + Dot;[.];
  100867. + CSharpStatementLiteral - [19..21)::2 - [LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  100868. + NewLine;[LF];
  100869. + RazorMetaCode - [21..22)::1 - Gen<None> - SpanEditHandler;Accepts:None
  100870. + RightBrace;[}];
  100871. + MarkupTextLiteral - [22..22)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  100872. + Marker;[];
  100873. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStmtBlkAfterIdentifiers_2.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStmtBlkAfterIdentifiers_2.cspans.txt
  100874. new file mode 100644
  100875. index 00000000000..bf6002d7e6a
  100876. --- /dev/null
  100877. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStmtBlkAfterIdentifiers_2.cspans.txt
  100878. @@ -0,0 +1,9 @@
  100879. +Markup span at (0:0,0 [0] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [25] test.cshtml)
  100880. +Transition span at (0:0,0 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [25] test.cshtml)
  100881. +MetaCode span at (1:0,1 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [25] test.cshtml)
  100882. +Code span at (2:0,2 [6] test.cshtml) (Accepts:Any) - Parent: Statement block at (0:0,0 [25] test.cshtml)
  100883. +Transition span at (8:1,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (8:1,4 [14] test.cshtml)
  100884. +Code span at (9:1,5 [13] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (8:1,4 [14] test.cshtml)
  100885. +Code span at (22:1,18 [2] test.cshtml) (Accepts:Any) - Parent: Statement block at (0:0,0 [25] test.cshtml)
  100886. +MetaCode span at (24:2,0 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [25] test.cshtml)
  100887. +Markup span at (25:2,1 [0] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [25] test.cshtml)
  100888. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStmtBlkAfterIdentifiers_2.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStmtBlkAfterIdentifiers_2.stree.txt
  100889. new file mode 100644
  100890. index 00000000000..735fc2ee9ba
  100891. --- /dev/null
  100892. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsDCIInStmtBlkAfterIdentifiers_2.stree.txt
  100893. @@ -0,0 +1,32 @@
  100894. +RazorDocument - [0..25)::25 - [@{LF @DateTime.Now.LF}]
  100895. + MarkupBlock - [0..25)::25
  100896. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  100897. + Marker;[];
  100898. + CSharpCodeBlock - [0..25)::25
  100899. + CSharpStatement - [0..25)::25
  100900. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  100901. + Transition;[@];
  100902. + CSharpStatementBody - [1..25)::24
  100903. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  100904. + LeftBrace;[{];
  100905. + CSharpCodeBlock - [2..24)::22
  100906. + CSharpStatementLiteral - [2..8)::6 - [LF ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  100907. + NewLine;[LF];
  100908. + Whitespace;[ ];
  100909. + CSharpCodeBlock - [8..22)::14
  100910. + CSharpImplicitExpression - [8..22)::14
  100911. + CSharpTransition - [8..9)::1 - Gen<None> - SpanEditHandler;Accepts:None
  100912. + Transition;[@];
  100913. + CSharpImplicitExpressionBody - [9..22)::13
  100914. + CSharpCodeBlock - [9..22)::13
  100915. + CSharpExpressionLiteral - [9..22)::13 - [DateTime.Now.] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K20
  100916. + Identifier;[DateTime];
  100917. + Dot;[.];
  100918. + Identifier;[Now];
  100919. + Dot;[.];
  100920. + CSharpStatementLiteral - [22..24)::2 - [LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  100921. + NewLine;[LF];
  100922. + RazorMetaCode - [24..25)::1 - Gen<None> - SpanEditHandler;Accepts:None
  100923. + RightBrace;[}];
  100924. + MarkupTextLiteral - [25..25)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  100925. + Marker;[];
  100926. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsIdentifierTypedAfterDotIfLastChangeProvisional.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsIdentifierTypedAfterDotIfLastChangeProvisional.cspans.txt
  100927. new file mode 100644
  100928. index 00000000000..5532c30c0ea
  100929. --- /dev/null
  100930. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsIdentifierTypedAfterDotIfLastChangeProvisional.cspans.txt
  100931. @@ -0,0 +1,4 @@
  100932. +Markup span at (0:0,0 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [14] test.cshtml)
  100933. +Transition span at (4:0,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [6] test.cshtml)
  100934. +Code span at (5:0,5 [5] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [6] test.cshtml)
  100935. +Markup span at (10:0,10 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [14] test.cshtml)
  100936. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsIdentifierTypedAfterDotIfLastChangeProvisional.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsIdentifierTypedAfterDotIfLastChangeProvisional.stree.txt
  100937. new file mode 100644
  100938. index 00000000000..4c67833b23a
  100939. --- /dev/null
  100940. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprAcceptsIdentifierTypedAfterDotIfLastChangeProvisional.stree.txt
  100941. @@ -0,0 +1,18 @@
  100942. +RazorDocument - [0..14)::14 - [foo @foo.b bar]
  100943. + MarkupBlock - [0..14)::14
  100944. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  100945. + Text;[foo];
  100946. + Whitespace;[ ];
  100947. + CSharpCodeBlock - [4..10)::6
  100948. + CSharpImplicitExpression - [4..10)::6
  100949. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  100950. + Transition;[@];
  100951. + CSharpImplicitExpressionBody - [5..10)::5
  100952. + CSharpCodeBlock - [5..10)::5
  100953. + CSharpExpressionLiteral - [5..10)::5 - [foo.b] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  100954. + Identifier;[foo];
  100955. + Dot;[.];
  100956. + Identifier;[b];
  100957. + MarkupTextLiteral - [10..14)::4 - [ bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  100958. + Whitespace;[ ];
  100959. + Text;[bar];
  100960. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration.cspans.txt
  100961. new file mode 100644
  100962. index 00000000000..5532c30c0ea
  100963. --- /dev/null
  100964. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration.cspans.txt
  100965. @@ -0,0 +1,4 @@
  100966. +Markup span at (0:0,0 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [14] test.cshtml)
  100967. +Transition span at (4:0,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [6] test.cshtml)
  100968. +Code span at (5:0,5 [5] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [6] test.cshtml)
  100969. +Markup span at (10:0,10 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [14] test.cshtml)
  100970. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration.stree.txt
  100971. new file mode 100644
  100972. index 00000000000..6d2c0d315b7
  100973. --- /dev/null
  100974. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration.stree.txt
  100975. @@ -0,0 +1,17 @@
  100976. +RazorDocument - [0..14)::14 - [foo @date. baz]
  100977. + MarkupBlock - [0..14)::14
  100978. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  100979. + Text;[foo];
  100980. + Whitespace;[ ];
  100981. + CSharpCodeBlock - [4..10)::6
  100982. + CSharpImplicitExpression - [4..10)::6
  100983. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  100984. + Transition;[@];
  100985. + CSharpImplicitExpressionBody - [5..10)::5
  100986. + CSharpCodeBlock - [5..10)::5
  100987. + CSharpExpressionLiteral - [5..10)::5 - [date.] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  100988. + Identifier;[date];
  100989. + Dot;[.];
  100990. + MarkupTextLiteral - [10..14)::4 - [ baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  100991. + Whitespace;[ ];
  100992. + Text;[baz];
  100993. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration_1.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration_1.cspans.txt
  100994. new file mode 100644
  100995. index 00000000000..fde3c1b21c4
  100996. --- /dev/null
  100997. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration_1.cspans.txt
  100998. @@ -0,0 +1,4 @@
  100999. +Markup span at (0:0,0 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [13] test.cshtml)
  101000. +Transition span at (4:0,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [5] test.cshtml)
  101001. +Code span at (5:0,5 [4] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [5] test.cshtml)
  101002. +Markup span at (9:0,9 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [13] test.cshtml)
  101003. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration_1.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration_1.stree.txt
  101004. new file mode 100644
  101005. index 00000000000..65c5dd90d84
  101006. --- /dev/null
  101007. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration_1.stree.txt
  101008. @@ -0,0 +1,16 @@
  101009. +RazorDocument - [0..13)::13 - [foo @date baz]
  101010. + MarkupBlock - [0..13)::13
  101011. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101012. + Text;[foo];
  101013. + Whitespace;[ ];
  101014. + CSharpCodeBlock - [4..9)::5
  101015. + CSharpImplicitExpression - [4..9)::5
  101016. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101017. + Transition;[@];
  101018. + CSharpImplicitExpressionBody - [5..9)::4
  101019. + CSharpCodeBlock - [5..9)::4
  101020. + CSharpExpressionLiteral - [5..9)::4 - [date] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  101021. + Identifier;[date];
  101022. + MarkupTextLiteral - [9..13)::4 - [ baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101023. + Whitespace;[ ];
  101024. + Text;[baz];
  101025. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration_2.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration_2.cspans.txt
  101026. new file mode 100644
  101027. index 00000000000..f507cc79882
  101028. --- /dev/null
  101029. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration_2.cspans.txt
  101030. @@ -0,0 +1,4 @@
  101031. +Markup span at (0:0,0 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [17] test.cshtml)
  101032. +Transition span at (4:0,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [9] test.cshtml)
  101033. +Code span at (5:0,5 [8] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [9] test.cshtml)
  101034. +Markup span at (13:0,13 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [17] test.cshtml)
  101035. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration_2.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration_2.stree.txt
  101036. new file mode 100644
  101037. index 00000000000..e3ca47e5be8
  101038. --- /dev/null
  101039. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration_2.stree.txt
  101040. @@ -0,0 +1,16 @@
  101041. +RazorDocument - [0..17)::17 - [foo @DateTime baz]
  101042. + MarkupBlock - [0..17)::17
  101043. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101044. + Text;[foo];
  101045. + Whitespace;[ ];
  101046. + CSharpCodeBlock - [4..13)::9
  101047. + CSharpImplicitExpression - [4..13)::9
  101048. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101049. + Transition;[@];
  101050. + CSharpImplicitExpressionBody - [5..13)::8
  101051. + CSharpCodeBlock - [5..13)::8
  101052. + CSharpExpressionLiteral - [5..13)::8 - [DateTime] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  101053. + Identifier;[DateTime];
  101054. + MarkupTextLiteral - [13..17)::4 - [ baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101055. + Whitespace;[ ];
  101056. + Text;[baz];
  101057. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration_3.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration_3.cspans.txt
  101058. new file mode 100644
  101059. index 00000000000..1f69ba4ae4a
  101060. --- /dev/null
  101061. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration_3.cspans.txt
  101062. @@ -0,0 +1,4 @@
  101063. +Markup span at (0:0,0 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [18] test.cshtml)
  101064. +Transition span at (4:0,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [10] test.cshtml)
  101065. +Code span at (5:0,5 [9] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [10] test.cshtml)
  101066. +Markup span at (14:0,14 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [18] test.cshtml)
  101067. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration_3.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration_3.stree.txt
  101068. new file mode 100644
  101069. index 00000000000..e0897aa139d
  101070. --- /dev/null
  101071. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration_3.stree.txt
  101072. @@ -0,0 +1,17 @@
  101073. +RazorDocument - [0..18)::18 - [foo @DateTime. baz]
  101074. + MarkupBlock - [0..18)::18
  101075. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101076. + Text;[foo];
  101077. + Whitespace;[ ];
  101078. + CSharpCodeBlock - [4..14)::10
  101079. + CSharpImplicitExpression - [4..14)::10
  101080. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101081. + Transition;[@];
  101082. + CSharpImplicitExpressionBody - [5..14)::9
  101083. + CSharpCodeBlock - [5..14)::9
  101084. + CSharpExpressionLiteral - [5..14)::9 - [DateTime.] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  101085. + Identifier;[DateTime];
  101086. + Dot;[.];
  101087. + MarkupTextLiteral - [14..18)::4 - [ baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101088. + Whitespace;[ ];
  101089. + Text;[baz];
  101090. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration_4.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration_4.cspans.txt
  101091. new file mode 100644
  101092. index 00000000000..bb70fab58dc
  101093. --- /dev/null
  101094. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration_4.cspans.txt
  101095. @@ -0,0 +1,4 @@
  101096. +Markup span at (0:0,0 [4] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [18] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml)
  101097. +Transition span at (4:0,4 [1] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [9] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml)
  101098. +Code span at (5:0,5 [8] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [9] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml)
  101099. +Markup span at (13:0,13 [5] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [18] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml)
  101100. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration_4.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration_4.stree.txt
  101101. new file mode 100644
  101102. index 00000000000..21b54b9a93e
  101103. --- /dev/null
  101104. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAccCaseInsensitiveDCI_NewRoslynIntegration_4.stree.txt
  101105. @@ -0,0 +1,17 @@
  101106. +RazorDocument - [0..18)::18 - [foo @DateTime. baz]
  101107. + MarkupBlock - [0..18)::18
  101108. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101109. + Text;[foo];
  101110. + Whitespace;[ ];
  101111. + CSharpCodeBlock - [4..13)::9
  101112. + CSharpImplicitExpression - [4..13)::9
  101113. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101114. + Transition;[@];
  101115. + CSharpImplicitExpressionBody - [5..13)::8
  101116. + CSharpCodeBlock - [5..13)::8
  101117. + CSharpExpressionLiteral - [5..13)::8 - [DateTime] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  101118. + Identifier;[DateTime];
  101119. + MarkupTextLiteral - [13..18)::5 - [. baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101120. + Text;[.];
  101121. + Whitespace;[ ];
  101122. + Text;[baz];
  101123. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCI.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCI.cspans.txt
  101124. new file mode 100644
  101125. index 00000000000..ff044ef7399
  101126. --- /dev/null
  101127. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCI.cspans.txt
  101128. @@ -0,0 +1,4 @@
  101129. +Markup span at (0:0,0 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [15] test.cshtml)
  101130. +Transition span at (4:0,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [7] test.cshtml)
  101131. +Code span at (5:0,5 [6] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [7] test.cshtml)
  101132. +Markup span at (11:0,11 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [15] test.cshtml)
  101133. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCI.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCI.stree.txt
  101134. new file mode 100644
  101135. index 00000000000..6bf34481e74
  101136. --- /dev/null
  101137. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCI.stree.txt
  101138. @@ -0,0 +1,17 @@
  101139. +RazorDocument - [0..15)::15 - [foo @DateT. baz]
  101140. + MarkupBlock - [0..15)::15
  101141. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101142. + Text;[foo];
  101143. + Whitespace;[ ];
  101144. + CSharpCodeBlock - [4..11)::7
  101145. + CSharpImplicitExpression - [4..11)::7
  101146. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101147. + Transition;[@];
  101148. + CSharpImplicitExpressionBody - [5..11)::6
  101149. + CSharpCodeBlock - [5..11)::6
  101150. + CSharpExpressionLiteral - [5..11)::6 - [DateT.] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  101151. + Identifier;[DateT];
  101152. + Dot;[.];
  101153. + MarkupTextLiteral - [11..15)::4 - [ baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101154. + Whitespace;[ ];
  101155. + Text;[baz];
  101156. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCIAfterIdentifiers.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCIAfterIdentifiers.cspans.txt
  101157. new file mode 100644
  101158. index 00000000000..1f69ba4ae4a
  101159. --- /dev/null
  101160. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCIAfterIdentifiers.cspans.txt
  101161. @@ -0,0 +1,4 @@
  101162. +Markup span at (0:0,0 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [18] test.cshtml)
  101163. +Transition span at (4:0,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [10] test.cshtml)
  101164. +Code span at (5:0,5 [9] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [10] test.cshtml)
  101165. +Markup span at (14:0,14 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [18] test.cshtml)
  101166. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCIAfterIdentifiers.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCIAfterIdentifiers.stree.txt
  101167. new file mode 100644
  101168. index 00000000000..e0897aa139d
  101169. --- /dev/null
  101170. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCIAfterIdentifiers.stree.txt
  101171. @@ -0,0 +1,17 @@
  101172. +RazorDocument - [0..18)::18 - [foo @DateTime. baz]
  101173. + MarkupBlock - [0..18)::18
  101174. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101175. + Text;[foo];
  101176. + Whitespace;[ ];
  101177. + CSharpCodeBlock - [4..14)::10
  101178. + CSharpImplicitExpression - [4..14)::10
  101179. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101180. + Transition;[@];
  101181. + CSharpImplicitExpressionBody - [5..14)::9
  101182. + CSharpCodeBlock - [5..14)::9
  101183. + CSharpExpressionLiteral - [5..14)::9 - [DateTime.] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  101184. + Identifier;[DateTime];
  101185. + Dot;[.];
  101186. + MarkupTextLiteral - [14..18)::4 - [ baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101187. + Whitespace;[ ];
  101188. + Text;[baz];
  101189. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCIAfterIdentifiers_1.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCIAfterIdentifiers_1.cspans.txt
  101190. new file mode 100644
  101191. index 00000000000..dd485c7a79b
  101192. --- /dev/null
  101193. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCIAfterIdentifiers_1.cspans.txt
  101194. @@ -0,0 +1,4 @@
  101195. +Markup span at (0:0,0 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [19] test.cshtml)
  101196. +Transition span at (4:0,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [11] test.cshtml)
  101197. +Code span at (5:0,5 [10] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [11] test.cshtml)
  101198. +Markup span at (15:0,15 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [19] test.cshtml)
  101199. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCIAfterIdentifiers_1.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCIAfterIdentifiers_1.stree.txt
  101200. new file mode 100644
  101201. index 00000000000..45815be7ac7
  101202. --- /dev/null
  101203. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCIAfterIdentifiers_1.stree.txt
  101204. @@ -0,0 +1,18 @@
  101205. +RazorDocument - [0..19)::19 - [foo @DateTime.. baz]
  101206. + MarkupBlock - [0..19)::19
  101207. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101208. + Text;[foo];
  101209. + Whitespace;[ ];
  101210. + CSharpCodeBlock - [4..15)::11
  101211. + CSharpImplicitExpression - [4..15)::11
  101212. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101213. + Transition;[@];
  101214. + CSharpImplicitExpressionBody - [5..15)::10
  101215. + CSharpCodeBlock - [5..15)::10
  101216. + CSharpExpressionLiteral - [5..15)::10 - [DateTime..] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  101217. + Identifier;[DateTime];
  101218. + Dot;[.];
  101219. + Dot;[.];
  101220. + MarkupTextLiteral - [15..19)::4 - [ baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101221. + Whitespace;[ ];
  101222. + Text;[baz];
  101223. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCIAfterIdentifiers_2.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCIAfterIdentifiers_2.cspans.txt
  101224. new file mode 100644
  101225. index 00000000000..a0fd6078701
  101226. --- /dev/null
  101227. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCIAfterIdentifiers_2.cspans.txt
  101228. @@ -0,0 +1,4 @@
  101229. +Markup span at (0:0,0 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [22] test.cshtml)
  101230. +Transition span at (4:0,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [14] test.cshtml)
  101231. +Code span at (5:0,5 [13] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [14] test.cshtml)
  101232. +Markup span at (18:0,18 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [22] test.cshtml)
  101233. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCIAfterIdentifiers_2.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCIAfterIdentifiers_2.stree.txt
  101234. new file mode 100644
  101235. index 00000000000..37580001fc5
  101236. --- /dev/null
  101237. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCIAfterIdentifiers_2.stree.txt
  101238. @@ -0,0 +1,19 @@
  101239. +RazorDocument - [0..22)::22 - [foo @DateTime.Now. baz]
  101240. + MarkupBlock - [0..22)::22
  101241. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101242. + Text;[foo];
  101243. + Whitespace;[ ];
  101244. + CSharpCodeBlock - [4..18)::14
  101245. + CSharpImplicitExpression - [4..18)::14
  101246. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101247. + Transition;[@];
  101248. + CSharpImplicitExpressionBody - [5..18)::13
  101249. + CSharpCodeBlock - [5..18)::13
  101250. + CSharpExpressionLiteral - [5..18)::13 - [DateTime.Now.] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  101251. + Identifier;[DateTime];
  101252. + Dot;[.];
  101253. + Identifier;[Now];
  101254. + Dot;[.];
  101255. + MarkupTextLiteral - [18..22)::4 - [ baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101256. + Whitespace;[ ];
  101257. + Text;[baz];
  101258. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCIAfterIdentifiers_3.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCIAfterIdentifiers_3.cspans.txt
  101259. new file mode 100644
  101260. index 00000000000..96738128725
  101261. --- /dev/null
  101262. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCIAfterIdentifiers_3.cspans.txt
  101263. @@ -0,0 +1,4 @@
  101264. +Markup span at (0:0,0 [4] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [22] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml)
  101265. +Transition span at (4:0,4 [1] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [13] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml)
  101266. +Code span at (5:0,5 [12] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [13] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml)
  101267. +Markup span at (17:0,17 [5] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [22] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml)
  101268. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCIAfterIdentifiers_3.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCIAfterIdentifiers_3.stree.txt
  101269. new file mode 100644
  101270. index 00000000000..f5b1f5ad90b
  101271. --- /dev/null
  101272. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCIAfterIdentifiers_3.stree.txt
  101273. @@ -0,0 +1,19 @@
  101274. +RazorDocument - [0..22)::22 - [foo @DateTime.Now. baz]
  101275. + MarkupBlock - [0..22)::22
  101276. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101277. + Text;[foo];
  101278. + Whitespace;[ ];
  101279. + CSharpCodeBlock - [4..17)::13
  101280. + CSharpImplicitExpression - [4..17)::13
  101281. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101282. + Transition;[@];
  101283. + CSharpImplicitExpressionBody - [5..17)::12
  101284. + CSharpCodeBlock - [5..17)::12
  101285. + CSharpExpressionLiteral - [5..17)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  101286. + Identifier;[DateTime];
  101287. + Dot;[.];
  101288. + Identifier;[Now];
  101289. + MarkupTextLiteral - [17..22)::5 - [. baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101290. + Text;[.];
  101291. + Whitespace;[ ];
  101292. + Text;[baz];
  101293. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCI_1.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCI_1.cspans.txt
  101294. new file mode 100644
  101295. index 00000000000..1f69ba4ae4a
  101296. --- /dev/null
  101297. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCI_1.cspans.txt
  101298. @@ -0,0 +1,4 @@
  101299. +Markup span at (0:0,0 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [18] test.cshtml)
  101300. +Transition span at (4:0,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [10] test.cshtml)
  101301. +Code span at (5:0,5 [9] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [10] test.cshtml)
  101302. +Markup span at (14:0,14 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [18] test.cshtml)
  101303. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCI_1.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCI_1.stree.txt
  101304. new file mode 100644
  101305. index 00000000000..e0897aa139d
  101306. --- /dev/null
  101307. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCI_1.stree.txt
  101308. @@ -0,0 +1,17 @@
  101309. +RazorDocument - [0..18)::18 - [foo @DateTime. baz]
  101310. + MarkupBlock - [0..18)::18
  101311. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101312. + Text;[foo];
  101313. + Whitespace;[ ];
  101314. + CSharpCodeBlock - [4..14)::10
  101315. + CSharpImplicitExpression - [4..14)::10
  101316. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101317. + Transition;[@];
  101318. + CSharpImplicitExpressionBody - [5..14)::9
  101319. + CSharpCodeBlock - [5..14)::9
  101320. + CSharpExpressionLiteral - [5..14)::9 - [DateTime.] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  101321. + Identifier;[DateTime];
  101322. + Dot;[.];
  101323. + MarkupTextLiteral - [14..18)::4 - [ baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101324. + Whitespace;[ ];
  101325. + Text;[baz];
  101326. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCI_2.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCI_2.cspans.txt
  101327. new file mode 100644
  101328. index 00000000000..bb70fab58dc
  101329. --- /dev/null
  101330. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCI_2.cspans.txt
  101331. @@ -0,0 +1,4 @@
  101332. +Markup span at (0:0,0 [4] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [18] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml)
  101333. +Transition span at (4:0,4 [1] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [9] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml)
  101334. +Code span at (5:0,5 [8] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [9] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml)
  101335. +Markup span at (13:0,13 [5] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [18] C:\This\Path\Is\Just\For\Line\Pragmas.cshtml)
  101336. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCI_2.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCI_2.stree.txt
  101337. new file mode 100644
  101338. index 00000000000..21b54b9a93e
  101339. --- /dev/null
  101340. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprProvisionallyAcceptsDCI_2.stree.txt
  101341. @@ -0,0 +1,17 @@
  101342. +RazorDocument - [0..18)::18 - [foo @DateTime. baz]
  101343. + MarkupBlock - [0..18)::18
  101344. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101345. + Text;[foo];
  101346. + Whitespace;[ ];
  101347. + CSharpCodeBlock - [4..13)::9
  101348. + CSharpImplicitExpression - [4..13)::9
  101349. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101350. + Transition;[@];
  101351. + CSharpImplicitExpressionBody - [5..13)::8
  101352. + CSharpCodeBlock - [5..13)::8
  101353. + CSharpExpressionLiteral - [5..13)::8 - [DateTime] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  101354. + Identifier;[DateTime];
  101355. + MarkupTextLiteral - [13..18)::5 - [. baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101356. + Text;[.];
  101357. + Whitespace;[ ];
  101358. + Text;[baz];
  101359. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprRejectsAcceptableChangeIfPrevWasProvisionallyAccepted.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprRejectsAcceptableChangeIfPrevWasProvisionallyAccepted.cspans.txt
  101360. new file mode 100644
  101361. index 00000000000..1dcb39aed1a
  101362. --- /dev/null
  101363. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprRejectsAcceptableChangeIfPrevWasProvisionallyAccepted.cspans.txt
  101364. @@ -0,0 +1,7 @@
  101365. +Markup span at (0:0,0 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [15] test.cshtml)
  101366. +Transition span at (4:0,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [4] test.cshtml)
  101367. +Code span at (5:0,5 [3] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [4] test.cshtml)
  101368. +Markup span at (8:0,8 [2] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [15] test.cshtml)
  101369. +Transition span at (10:0,10 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (10:0,10 [5] test.cshtml)
  101370. +Code span at (11:0,11 [4] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (10:0,10 [5] test.cshtml)
  101371. +Markup span at (15:0,15 [0] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [15] test.cshtml)
  101372. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprRejectsAcceptableChangeIfPrevWasProvisionallyAccepted.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprRejectsAcceptableChangeIfPrevWasProvisionallyAccepted.stree.txt
  101373. new file mode 100644
  101374. index 00000000000..0618c938ce5
  101375. --- /dev/null
  101376. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExprRejectsAcceptableChangeIfPrevWasProvisionallyAccepted.stree.txt
  101377. @@ -0,0 +1,26 @@
  101378. +RazorDocument - [0..15)::15 - [foo @foo. @barb]
  101379. + MarkupBlock - [0..15)::15
  101380. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101381. + Text;[foo];
  101382. + Whitespace;[ ];
  101383. + CSharpCodeBlock - [4..8)::4
  101384. + CSharpImplicitExpression - [4..8)::4
  101385. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101386. + Transition;[@];
  101387. + CSharpImplicitExpressionBody - [5..8)::3
  101388. + CSharpCodeBlock - [5..8)::3
  101389. + CSharpExpressionLiteral - [5..8)::3 - [foo] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  101390. + Identifier;[foo];
  101391. + MarkupTextLiteral - [8..10)::2 - [. ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101392. + Text;[.];
  101393. + Whitespace;[ ];
  101394. + CSharpCodeBlock - [10..15)::5
  101395. + CSharpImplicitExpression - [10..15)::5
  101396. + CSharpTransition - [10..11)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101397. + Transition;[@];
  101398. + CSharpImplicitExpressionBody - [11..15)::4
  101399. + CSharpCodeBlock - [11..15)::4
  101400. + CSharpExpressionLiteral - [11..15)::4 - [barb] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  101401. + Identifier;[barb];
  101402. + MarkupTextLiteral - [15..15)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101403. + Marker;[];
  101404. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExpr_AcceptsParenthesisAtEnd_SingleEdit.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExpr_AcceptsParenthesisAtEnd_SingleEdit.cspans.txt
  101405. new file mode 100644
  101406. index 00000000000..5532c30c0ea
  101407. --- /dev/null
  101408. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExpr_AcceptsParenthesisAtEnd_SingleEdit.cspans.txt
  101409. @@ -0,0 +1,4 @@
  101410. +Markup span at (0:0,0 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [14] test.cshtml)
  101411. +Transition span at (4:0,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [6] test.cshtml)
  101412. +Code span at (5:0,5 [5] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [6] test.cshtml)
  101413. +Markup span at (10:0,10 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [14] test.cshtml)
  101414. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExpr_AcceptsParenthesisAtEnd_SingleEdit.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExpr_AcceptsParenthesisAtEnd_SingleEdit.stree.txt
  101415. new file mode 100644
  101416. index 00000000000..bd1f4a7947f
  101417. --- /dev/null
  101418. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExpr_AcceptsParenthesisAtEnd_SingleEdit.stree.txt
  101419. @@ -0,0 +1,18 @@
  101420. +RazorDocument - [0..14)::14 - [foo @foo() bar]
  101421. + MarkupBlock - [0..14)::14
  101422. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101423. + Text;[foo];
  101424. + Whitespace;[ ];
  101425. + CSharpCodeBlock - [4..10)::6
  101426. + CSharpImplicitExpression - [4..10)::6
  101427. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101428. + Transition;[@];
  101429. + CSharpImplicitExpressionBody - [5..10)::5
  101430. + CSharpCodeBlock - [5..10)::5
  101431. + CSharpExpressionLiteral - [5..10)::5 - [foo()] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  101432. + Identifier;[foo];
  101433. + LeftParenthesis;[(];
  101434. + RightParenthesis;[)];
  101435. + MarkupTextLiteral - [10..14)::4 - [ bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101436. + Whitespace;[ ];
  101437. + Text;[bar];
  101438. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExpr_AcceptsParenthesisAtEnd_TwoEdits.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExpr_AcceptsParenthesisAtEnd_TwoEdits.cspans.txt
  101439. new file mode 100644
  101440. index 00000000000..5532c30c0ea
  101441. --- /dev/null
  101442. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExpr_AcceptsParenthesisAtEnd_TwoEdits.cspans.txt
  101443. @@ -0,0 +1,4 @@
  101444. +Markup span at (0:0,0 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [14] test.cshtml)
  101445. +Transition span at (4:0,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [6] test.cshtml)
  101446. +Code span at (5:0,5 [5] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [6] test.cshtml)
  101447. +Markup span at (10:0,10 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [14] test.cshtml)
  101448. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExpr_AcceptsParenthesisAtEnd_TwoEdits.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExpr_AcceptsParenthesisAtEnd_TwoEdits.stree.txt
  101449. new file mode 100644
  101450. index 00000000000..bd1f4a7947f
  101451. --- /dev/null
  101452. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/DefaultVisualStudioRazorParserIntegrationTest/ImpExpr_AcceptsParenthesisAtEnd_TwoEdits.stree.txt
  101453. @@ -0,0 +1,18 @@
  101454. +RazorDocument - [0..14)::14 - [foo @foo() bar]
  101455. + MarkupBlock - [0..14)::14
  101456. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101457. + Text;[foo];
  101458. + Whitespace;[ ];
  101459. + CSharpCodeBlock - [4..10)::6
  101460. + CSharpImplicitExpression - [4..10)::6
  101461. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101462. + Transition;[@];
  101463. + CSharpImplicitExpressionBody - [5..10)::5
  101464. + CSharpCodeBlock - [5..10)::5
  101465. + CSharpExpressionLiteral - [5..10)::5 - [foo()] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  101466. + Identifier;[foo];
  101467. + LeftParenthesis;[(];
  101468. + RightParenthesis;[)];
  101469. + MarkupTextLiteral - [10..14)::4 - [ bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101470. + Whitespace;[ ];
  101471. + Text;[bar];
  101472. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsAdditionalIdentifierCharactersIfEndOfSpanIsIdentifier.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsAdditionalIdentifierCharactersIfEndOfSpanIsIdentifier.cspans.txt
  101473. new file mode 100644
  101474. index 00000000000..fde3c1b21c4
  101475. --- /dev/null
  101476. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsAdditionalIdentifierCharactersIfEndOfSpanIsIdentifier.cspans.txt
  101477. @@ -0,0 +1,4 @@
  101478. +Markup span at (0:0,0 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [13] test.cshtml)
  101479. +Transition span at (4:0,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [5] test.cshtml)
  101480. +Code span at (5:0,5 [4] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [5] test.cshtml)
  101481. +Markup span at (9:0,9 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [13] test.cshtml)
  101482. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsAdditionalIdentifierCharactersIfEndOfSpanIsIdentifier.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsAdditionalIdentifierCharactersIfEndOfSpanIsIdentifier.stree.txt
  101483. new file mode 100644
  101484. index 00000000000..aded3ab4640
  101485. --- /dev/null
  101486. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsAdditionalIdentifierCharactersIfEndOfSpanIsIdentifier.stree.txt
  101487. @@ -0,0 +1,16 @@
  101488. +RazorDocument - [0..13)::13 - [foo @foob bar]
  101489. + MarkupBlock - [0..13)::13
  101490. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101491. + Text;[foo];
  101492. + Whitespace;[ ];
  101493. + CSharpCodeBlock - [4..9)::5
  101494. + CSharpImplicitExpression - [4..9)::5
  101495. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101496. + Transition;[@];
  101497. + CSharpImplicitExpressionBody - [5..9)::4
  101498. + CSharpCodeBlock - [5..9)::4
  101499. + CSharpExpressionLiteral - [5..9)::4 - [foob] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  101500. + Identifier;[foob];
  101501. + MarkupTextLiteral - [9..13)::4 - [ bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101502. + Whitespace;[ ];
  101503. + Text;[bar];
  101504. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsAdditionalIdentifierStartCharactersIfEndOfSpanIsDot.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsAdditionalIdentifierStartCharactersIfEndOfSpanIsDot.cspans.txt
  101505. new file mode 100644
  101506. index 00000000000..896d435a91a
  101507. --- /dev/null
  101508. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsAdditionalIdentifierStartCharactersIfEndOfSpanIsDot.cspans.txt
  101509. @@ -0,0 +1,9 @@
  101510. +Markup span at (0:0,0 [0] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [9] test.cshtml)
  101511. +Transition span at (0:0,0 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [9] test.cshtml)
  101512. +MetaCode span at (1:0,1 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [9] test.cshtml)
  101513. +Code span at (2:0,2 [0] test.cshtml) (Accepts:Any) - Parent: Statement block at (0:0,0 [9] test.cshtml)
  101514. +Transition span at (2:0,2 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (2:0,2 [6] test.cshtml)
  101515. +Code span at (3:0,3 [5] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (2:0,2 [6] test.cshtml)
  101516. +Code span at (8:0,8 [0] test.cshtml) (Accepts:Any) - Parent: Statement block at (0:0,0 [9] test.cshtml)
  101517. +MetaCode span at (8:0,8 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [9] test.cshtml)
  101518. +Markup span at (9:0,9 [0] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [9] test.cshtml)
  101519. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsAdditionalIdentifierStartCharactersIfEndOfSpanIsDot.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsAdditionalIdentifierStartCharactersIfEndOfSpanIsDot.stree.txt
  101520. new file mode 100644
  101521. index 00000000000..2e075cbec51
  101522. --- /dev/null
  101523. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsAdditionalIdentifierStartCharactersIfEndOfSpanIsDot.stree.txt
  101524. @@ -0,0 +1,30 @@
  101525. +RazorDocument - [0..9)::9 - [@{@foo.b}]
  101526. + MarkupBlock - [0..9)::9
  101527. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101528. + Marker;[];
  101529. + CSharpCodeBlock - [0..9)::9
  101530. + CSharpStatement - [0..9)::9
  101531. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101532. + Transition;[@];
  101533. + CSharpStatementBody - [1..9)::8
  101534. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101535. + LeftBrace;[{];
  101536. + CSharpCodeBlock - [2..8)::6
  101537. + CSharpStatementLiteral - [2..2)::0 - [] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  101538. + Marker;[];
  101539. + CSharpCodeBlock - [2..8)::6
  101540. + CSharpImplicitExpression - [2..8)::6
  101541. + CSharpTransition - [2..3)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101542. + Transition;[@];
  101543. + CSharpImplicitExpressionBody - [3..8)::5
  101544. + CSharpCodeBlock - [3..8)::5
  101545. + CSharpExpressionLiteral - [3..8)::5 - [foo.b] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K20
  101546. + Identifier;[foo];
  101547. + Dot;[.];
  101548. + Identifier;[b];
  101549. + CSharpStatementLiteral - [8..8)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  101550. + Marker;[];
  101551. + RazorMetaCode - [8..9)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101552. + RightBrace;[}];
  101553. + MarkupTextLiteral - [9..9)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101554. + Marker;[];
  101555. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsDeleteOfIdentifierPartsIfSomeOfIdentifierRemains.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsDeleteOfIdentifierPartsIfSomeOfIdentifierRemains.cspans.txt
  101556. new file mode 100644
  101557. index 00000000000..b81086c3074
  101558. --- /dev/null
  101559. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsDeleteOfIdentifierPartsIfSomeOfIdentifierRemains.cspans.txt
  101560. @@ -0,0 +1,4 @@
  101561. +Markup span at (0:0,0 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [11] test.cshtml)
  101562. +Transition span at (4:0,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [3] test.cshtml)
  101563. +Code span at (5:0,5 [2] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [3] test.cshtml)
  101564. +Markup span at (7:0,7 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [11] test.cshtml)
  101565. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsDeleteOfIdentifierPartsIfSomeOfIdentifierRemains.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsDeleteOfIdentifierPartsIfSomeOfIdentifierRemains.stree.txt
  101566. new file mode 100644
  101567. index 00000000000..45f7d16abba
  101568. --- /dev/null
  101569. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsDeleteOfIdentifierPartsIfSomeOfIdentifierRemains.stree.txt
  101570. @@ -0,0 +1,16 @@
  101571. +RazorDocument - [0..11)::11 - [foo @Us baz]
  101572. + MarkupBlock - [0..11)::11
  101573. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101574. + Text;[foo];
  101575. + Whitespace;[ ];
  101576. + CSharpCodeBlock - [4..7)::3
  101577. + CSharpImplicitExpression - [4..7)::3
  101578. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101579. + Transition;[@];
  101580. + CSharpImplicitExpressionBody - [5..7)::2
  101581. + CSharpCodeBlock - [5..7)::2
  101582. + CSharpExpressionLiteral - [5..7)::2 - [Us] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  101583. + Identifier;[Us];
  101584. + MarkupTextLiteral - [7..11)::4 - [ baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101585. + Whitespace;[ ];
  101586. + Text;[baz];
  101587. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsDotAtEndOfNonWhitespaceCharacters.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsDotAtEndOfNonWhitespaceCharacters.cspans.txt
  101588. new file mode 100644
  101589. index 00000000000..2cee255e82f
  101590. --- /dev/null
  101591. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsDotAtEndOfNonWhitespaceCharacters.cspans.txt
  101592. @@ -0,0 +1,9 @@
  101593. +Markup span at (0:0,0 [0] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [16] test.cshtml)
  101594. +Transition span at (0:0,0 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [16] test.cshtml)
  101595. +MetaCode span at (1:0,1 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [16] test.cshtml)
  101596. +Code span at (2:0,2 [6] test.cshtml) (Accepts:Any) - Parent: Statement block at (0:0,0 [16] test.cshtml)
  101597. +Transition span at (8:1,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (8:1,4 [5] test.cshtml)
  101598. +Code span at (9:1,5 [4] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (8:1,4 [5] test.cshtml)
  101599. +Code span at (13:1,9 [2] test.cshtml) (Accepts:Any) - Parent: Statement block at (0:0,0 [16] test.cshtml)
  101600. +MetaCode span at (15:2,0 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [16] test.cshtml)
  101601. +Markup span at (16:2,1 [0] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [16] test.cshtml)
  101602. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsDotAtEndOfNonWhitespaceCharacters.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsDotAtEndOfNonWhitespaceCharacters.stree.txt
  101603. new file mode 100644
  101604. index 00000000000..b01b7b48a0f
  101605. --- /dev/null
  101606. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsDotAtEndOfNonWhitespaceCharacters.stree.txt
  101607. @@ -0,0 +1,30 @@
  101608. +RazorDocument - [0..16)::16 - [@{LF @foo.LF}]
  101609. + MarkupBlock - [0..16)::16
  101610. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101611. + Marker;[];
  101612. + CSharpCodeBlock - [0..16)::16
  101613. + CSharpStatement - [0..16)::16
  101614. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101615. + Transition;[@];
  101616. + CSharpStatementBody - [1..16)::15
  101617. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101618. + LeftBrace;[{];
  101619. + CSharpCodeBlock - [2..15)::13
  101620. + CSharpStatementLiteral - [2..8)::6 - [LF ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  101621. + NewLine;[LF];
  101622. + Whitespace;[ ];
  101623. + CSharpCodeBlock - [8..13)::5
  101624. + CSharpImplicitExpression - [8..13)::5
  101625. + CSharpTransition - [8..9)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101626. + Transition;[@];
  101627. + CSharpImplicitExpressionBody - [9..13)::4
  101628. + CSharpCodeBlock - [9..13)::4
  101629. + CSharpExpressionLiteral - [9..13)::4 - [foo.] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K20
  101630. + Identifier;[foo];
  101631. + Dot;[.];
  101632. + CSharpStatementLiteral - [13..15)::2 - [LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  101633. + NewLine;[LF];
  101634. + RazorMetaCode - [15..16)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101635. + RightBrace;[}];
  101636. + MarkupTextLiteral - [16..16)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101637. + Marker;[];
  101638. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsDotIfTrailingDotsAreAllowed.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsDotIfTrailingDotsAreAllowed.cspans.txt
  101639. new file mode 100644
  101640. index 00000000000..98730d67006
  101641. --- /dev/null
  101642. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsDotIfTrailingDotsAreAllowed.cspans.txt
  101643. @@ -0,0 +1,9 @@
  101644. +Markup span at (0:0,0 [0] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [8] test.cshtml)
  101645. +Transition span at (0:0,0 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [8] test.cshtml)
  101646. +MetaCode span at (1:0,1 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [8] test.cshtml)
  101647. +Code span at (2:0,2 [0] test.cshtml) (Accepts:Any) - Parent: Statement block at (0:0,0 [8] test.cshtml)
  101648. +Transition span at (2:0,2 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (2:0,2 [5] test.cshtml)
  101649. +Code span at (3:0,3 [4] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (2:0,2 [5] test.cshtml)
  101650. +Code span at (7:0,7 [0] test.cshtml) (Accepts:Any) - Parent: Statement block at (0:0,0 [8] test.cshtml)
  101651. +MetaCode span at (7:0,7 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [8] test.cshtml)
  101652. +Markup span at (8:0,8 [0] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [8] test.cshtml)
  101653. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsDotIfTrailingDotsAreAllowed.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsDotIfTrailingDotsAreAllowed.stree.txt
  101654. new file mode 100644
  101655. index 00000000000..dca9949e4e0
  101656. --- /dev/null
  101657. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsDotIfTrailingDotsAreAllowed.stree.txt
  101658. @@ -0,0 +1,29 @@
  101659. +RazorDocument - [0..8)::8 - [@{@foo.}]
  101660. + MarkupBlock - [0..8)::8
  101661. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101662. + Marker;[];
  101663. + CSharpCodeBlock - [0..8)::8
  101664. + CSharpStatement - [0..8)::8
  101665. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101666. + Transition;[@];
  101667. + CSharpStatementBody - [1..8)::7
  101668. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101669. + LeftBrace;[{];
  101670. + CSharpCodeBlock - [2..7)::5
  101671. + CSharpStatementLiteral - [2..2)::0 - [] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  101672. + Marker;[];
  101673. + CSharpCodeBlock - [2..7)::5
  101674. + CSharpImplicitExpression - [2..7)::5
  101675. + CSharpTransition - [2..3)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101676. + Transition;[@];
  101677. + CSharpImplicitExpressionBody - [3..7)::4
  101678. + CSharpCodeBlock - [3..7)::4
  101679. + CSharpExpressionLiteral - [3..7)::4 - [foo.] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K20
  101680. + Identifier;[foo];
  101681. + Dot;[.];
  101682. + CSharpStatementLiteral - [7..7)::0 - [] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  101683. + Marker;[];
  101684. + RazorMetaCode - [7..8)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101685. + RightBrace;[}];
  101686. + MarkupTextLiteral - [8..8)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101687. + Marker;[];
  101688. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsIdentifierAfterDotAtEndOfNonWhitespaceCharacters.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsIdentifierAfterDotAtEndOfNonWhitespaceCharacters.cspans.txt
  101689. new file mode 100644
  101690. index 00000000000..4455e62b9c0
  101691. --- /dev/null
  101692. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsIdentifierAfterDotAtEndOfNonWhitespaceCharacters.cspans.txt
  101693. @@ -0,0 +1,9 @@
  101694. +Markup span at (0:0,0 [0] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [17] test.cshtml)
  101695. +Transition span at (0:0,0 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [17] test.cshtml)
  101696. +MetaCode span at (1:0,1 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [17] test.cshtml)
  101697. +Code span at (2:0,2 [6] test.cshtml) (Accepts:Any) - Parent: Statement block at (0:0,0 [17] test.cshtml)
  101698. +Transition span at (8:1,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (8:1,4 [6] test.cshtml)
  101699. +Code span at (9:1,5 [5] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (8:1,4 [6] test.cshtml)
  101700. +Code span at (14:1,10 [2] test.cshtml) (Accepts:Any) - Parent: Statement block at (0:0,0 [17] test.cshtml)
  101701. +MetaCode span at (16:2,0 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [17] test.cshtml)
  101702. +Markup span at (17:2,1 [0] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [17] test.cshtml)
  101703. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsIdentifierAfterDotAtEndOfNonWhitespaceCharacters.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsIdentifierAfterDotAtEndOfNonWhitespaceCharacters.stree.txt
  101704. new file mode 100644
  101705. index 00000000000..c9546f0e8be
  101706. --- /dev/null
  101707. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsIdentifierAfterDotAtEndOfNonWhitespaceCharacters.stree.txt
  101708. @@ -0,0 +1,31 @@
  101709. +RazorDocument - [0..17)::17 - [@{LF @foo.dLF}]
  101710. + MarkupBlock - [0..17)::17
  101711. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101712. + Marker;[];
  101713. + CSharpCodeBlock - [0..17)::17
  101714. + CSharpStatement - [0..17)::17
  101715. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101716. + Transition;[@];
  101717. + CSharpStatementBody - [1..17)::16
  101718. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101719. + LeftBrace;[{];
  101720. + CSharpCodeBlock - [2..16)::14
  101721. + CSharpStatementLiteral - [2..8)::6 - [LF ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  101722. + NewLine;[LF];
  101723. + Whitespace;[ ];
  101724. + CSharpCodeBlock - [8..14)::6
  101725. + CSharpImplicitExpression - [8..14)::6
  101726. + CSharpTransition - [8..9)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101727. + Transition;[@];
  101728. + CSharpImplicitExpressionBody - [9..14)::5
  101729. + CSharpCodeBlock - [9..14)::5
  101730. + CSharpExpressionLiteral - [9..14)::5 - [foo.d] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K20
  101731. + Identifier;[foo];
  101732. + Dot;[.];
  101733. + Identifier;[d];
  101734. + CSharpStatementLiteral - [14..16)::2 - [LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  101735. + NewLine;[LF];
  101736. + RazorMetaCode - [16..17)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101737. + RightBrace;[}];
  101738. + MarkupTextLiteral - [17..17)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101739. + Marker;[];
  101740. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsIdentifierExpansionAtEndOfNonWhitespaceCharacters.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsIdentifierExpansionAtEndOfNonWhitespaceCharacters.cspans.txt
  101741. new file mode 100644
  101742. index 00000000000..2cee255e82f
  101743. --- /dev/null
  101744. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsIdentifierExpansionAtEndOfNonWhitespaceCharacters.cspans.txt
  101745. @@ -0,0 +1,9 @@
  101746. +Markup span at (0:0,0 [0] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [16] test.cshtml)
  101747. +Transition span at (0:0,0 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [16] test.cshtml)
  101748. +MetaCode span at (1:0,1 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [16] test.cshtml)
  101749. +Code span at (2:0,2 [6] test.cshtml) (Accepts:Any) - Parent: Statement block at (0:0,0 [16] test.cshtml)
  101750. +Transition span at (8:1,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (8:1,4 [5] test.cshtml)
  101751. +Code span at (9:1,5 [4] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (8:1,4 [5] test.cshtml)
  101752. +Code span at (13:1,9 [2] test.cshtml) (Accepts:Any) - Parent: Statement block at (0:0,0 [16] test.cshtml)
  101753. +MetaCode span at (15:2,0 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [16] test.cshtml)
  101754. +Markup span at (16:2,1 [0] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [16] test.cshtml)
  101755. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsIdentifierExpansionAtEndOfNonWhitespaceCharacters.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsIdentifierExpansionAtEndOfNonWhitespaceCharacters.stree.txt
  101756. new file mode 100644
  101757. index 00000000000..5fc6a5b2296
  101758. --- /dev/null
  101759. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsIdentifierExpansionAtEndOfNonWhitespaceCharacters.stree.txt
  101760. @@ -0,0 +1,29 @@
  101761. +RazorDocument - [0..16)::16 - [@{LF @foodLF}]
  101762. + MarkupBlock - [0..16)::16
  101763. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101764. + Marker;[];
  101765. + CSharpCodeBlock - [0..16)::16
  101766. + CSharpStatement - [0..16)::16
  101767. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101768. + Transition;[@];
  101769. + CSharpStatementBody - [1..16)::15
  101770. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101771. + LeftBrace;[{];
  101772. + CSharpCodeBlock - [2..15)::13
  101773. + CSharpStatementLiteral - [2..8)::6 - [LF ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  101774. + NewLine;[LF];
  101775. + Whitespace;[ ];
  101776. + CSharpCodeBlock - [8..13)::5
  101777. + CSharpImplicitExpression - [8..13)::5
  101778. + CSharpTransition - [8..9)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101779. + Transition;[@];
  101780. + CSharpImplicitExpressionBody - [9..13)::4
  101781. + CSharpCodeBlock - [9..13)::4
  101782. + CSharpExpressionLiteral - [9..13)::4 - [food] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K20
  101783. + Identifier;[food];
  101784. + CSharpStatementLiteral - [13..15)::2 - [LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  101785. + NewLine;[LF];
  101786. + RazorMetaCode - [15..16)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101787. + RightBrace;[}];
  101788. + MarkupTextLiteral - [16..16)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101789. + Marker;[];
  101790. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsInnerInsertions.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsInnerInsertions.cspans.txt
  101791. new file mode 100644
  101792. index 00000000000..a0fd6078701
  101793. --- /dev/null
  101794. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsInnerInsertions.cspans.txt
  101795. @@ -0,0 +1,4 @@
  101796. +Markup span at (0:0,0 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [22] test.cshtml)
  101797. +Transition span at (4:0,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [14] test.cshtml)
  101798. +Code span at (5:0,5 [13] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [14] test.cshtml)
  101799. +Markup span at (18:0,18 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [22] test.cshtml)
  101800. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsInnerInsertions.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsInnerInsertions.stree.txt
  101801. new file mode 100644
  101802. index 00000000000..26c7aa630ce
  101803. --- /dev/null
  101804. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsInnerInsertions.stree.txt
  101805. @@ -0,0 +1,19 @@
  101806. +RazorDocument - [0..22)::22 - [foo @DateTime..Now baz]
  101807. + MarkupBlock - [0..22)::22
  101808. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101809. + Text;[foo];
  101810. + Whitespace;[ ];
  101811. + CSharpCodeBlock - [4..18)::14
  101812. + CSharpImplicitExpression - [4..18)::14
  101813. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101814. + Transition;[@];
  101815. + CSharpImplicitExpressionBody - [5..18)::13
  101816. + CSharpCodeBlock - [5..18)::13
  101817. + CSharpExpressionLiteral - [5..18)::13 - [DateTime..Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  101818. + Identifier;[DateTime];
  101819. + Dot;[.];
  101820. + Dot;[.];
  101821. + Identifier;[Now];
  101822. + MarkupTextLiteral - [18..22)::4 - [ baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101823. + Whitespace;[ ];
  101824. + Text;[baz];
  101825. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsInnerInsertionsInStatementBlock.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsInnerInsertionsInStatementBlock.cspans.txt
  101826. new file mode 100644
  101827. index 00000000000..bf6002d7e6a
  101828. --- /dev/null
  101829. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsInnerInsertionsInStatementBlock.cspans.txt
  101830. @@ -0,0 +1,9 @@
  101831. +Markup span at (0:0,0 [0] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [25] test.cshtml)
  101832. +Transition span at (0:0,0 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [25] test.cshtml)
  101833. +MetaCode span at (1:0,1 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [25] test.cshtml)
  101834. +Code span at (2:0,2 [6] test.cshtml) (Accepts:Any) - Parent: Statement block at (0:0,0 [25] test.cshtml)
  101835. +Transition span at (8:1,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (8:1,4 [14] test.cshtml)
  101836. +Code span at (9:1,5 [13] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (8:1,4 [14] test.cshtml)
  101837. +Code span at (22:1,18 [2] test.cshtml) (Accepts:Any) - Parent: Statement block at (0:0,0 [25] test.cshtml)
  101838. +MetaCode span at (24:2,0 [1] test.cshtml) (Accepts:None) - Parent: Statement block at (0:0,0 [25] test.cshtml)
  101839. +Markup span at (25:2,1 [0] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [25] test.cshtml)
  101840. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsInnerInsertionsInStatementBlock.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsInnerInsertionsInStatementBlock.stree.txt
  101841. new file mode 100644
  101842. index 00000000000..a952d79b84a
  101843. --- /dev/null
  101844. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsInnerInsertionsInStatementBlock.stree.txt
  101845. @@ -0,0 +1,32 @@
  101846. +RazorDocument - [0..25)::25 - [@{LF @DateTime..NowLF}]
  101847. + MarkupBlock - [0..25)::25
  101848. + MarkupTextLiteral - [0..0)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101849. + Marker;[];
  101850. + CSharpCodeBlock - [0..25)::25
  101851. + CSharpStatement - [0..25)::25
  101852. + CSharpTransition - [0..1)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101853. + Transition;[@];
  101854. + CSharpStatementBody - [1..25)::24
  101855. + RazorMetaCode - [1..2)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101856. + LeftBrace;[{];
  101857. + CSharpCodeBlock - [2..24)::22
  101858. + CSharpStatementLiteral - [2..8)::6 - [LF ] - Gen<Stmt> - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[<null>];AtEOL
  101859. + NewLine;[LF];
  101860. + Whitespace;[ ];
  101861. + CSharpCodeBlock - [8..22)::14
  101862. + CSharpImplicitExpression - [8..22)::14
  101863. + CSharpTransition - [8..9)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101864. + Transition;[@];
  101865. + CSharpImplicitExpressionBody - [9..22)::13
  101866. + CSharpCodeBlock - [9..22)::13
  101867. + CSharpExpressionLiteral - [9..22)::13 - [DateTime..Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[ATD];K20
  101868. + Identifier;[DateTime];
  101869. + Dot;[.];
  101870. + Dot;[.];
  101871. + Identifier;[Now];
  101872. + CSharpStatementLiteral - [22..24)::2 - [LF] - Gen<Stmt> - SpanEditHandler;Accepts:Any
  101873. + NewLine;[LF];
  101874. + RazorMetaCode - [24..25)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101875. + RightBrace;[}];
  101876. + MarkupTextLiteral - [25..25)::0 - [] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101877. + Marker;[];
  101878. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsMultipleInsertionIfItOnlyCausesIdentifierExpansion.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsMultipleInsertionIfItOnlyCausesIdentifierExpansion.cspans.txt
  101879. new file mode 100644
  101880. index 00000000000..ff044ef7399
  101881. --- /dev/null
  101882. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsMultipleInsertionIfItOnlyCausesIdentifierExpansion.cspans.txt
  101883. @@ -0,0 +1,4 @@
  101884. +Markup span at (0:0,0 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [15] test.cshtml)
  101885. +Transition span at (4:0,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [7] test.cshtml)
  101886. +Code span at (5:0,5 [6] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [7] test.cshtml)
  101887. +Markup span at (11:0,11 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [15] test.cshtml)
  101888. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsMultipleInsertionIfItOnlyCausesIdentifierExpansion.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsMultipleInsertionIfItOnlyCausesIdentifierExpansion.stree.txt
  101889. new file mode 100644
  101890. index 00000000000..47e3a75e0c7
  101891. --- /dev/null
  101892. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsMultipleInsertionIfItOnlyCausesIdentifierExpansion.stree.txt
  101893. @@ -0,0 +1,16 @@
  101894. +RazorDocument - [0..15)::15 - [foo @barbiz baz]
  101895. + MarkupBlock - [0..15)::15
  101896. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101897. + Text;[foo];
  101898. + Whitespace;[ ];
  101899. + CSharpCodeBlock - [4..11)::7
  101900. + CSharpImplicitExpression - [4..11)::7
  101901. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101902. + Transition;[@];
  101903. + CSharpImplicitExpressionBody - [5..11)::6
  101904. + CSharpCodeBlock - [5..11)::6
  101905. + CSharpExpressionLiteral - [5..11)::6 - [barbiz] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  101906. + Identifier;[barbiz];
  101907. + MarkupTextLiteral - [11..15)::4 - [ baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101908. + Whitespace;[ ];
  101909. + Text;[baz];
  101910. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsPrefixIdentifierReplacements_MultipleSymbols.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsPrefixIdentifierReplacements_MultipleSymbols.cspans.txt
  101911. new file mode 100644
  101912. index 00000000000..58bb6d600ea
  101913. --- /dev/null
  101914. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsPrefixIdentifierReplacements_MultipleSymbols.cspans.txt
  101915. @@ -0,0 +1,4 @@
  101916. +Markup span at (0:0,0 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [21] test.cshtml)
  101917. +Transition span at (4:0,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [13] test.cshtml)
  101918. +Code span at (5:0,5 [12] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [13] test.cshtml)
  101919. +Markup span at (17:0,17 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [21] test.cshtml)
  101920. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsPrefixIdentifierReplacements_MultipleSymbols.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsPrefixIdentifierReplacements_MultipleSymbols.stree.txt
  101921. new file mode 100644
  101922. index 00000000000..0fbb9eb63da
  101923. --- /dev/null
  101924. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsPrefixIdentifierReplacements_MultipleSymbols.stree.txt
  101925. @@ -0,0 +1,18 @@
  101926. +RazorDocument - [0..21)::21 - [foo @DateTime.Now baz]
  101927. + MarkupBlock - [0..21)::21
  101928. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101929. + Text;[foo];
  101930. + Whitespace;[ ];
  101931. + CSharpCodeBlock - [4..17)::13
  101932. + CSharpImplicitExpression - [4..17)::13
  101933. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101934. + Transition;[@];
  101935. + CSharpImplicitExpressionBody - [5..17)::12
  101936. + CSharpCodeBlock - [5..17)::12
  101937. + CSharpExpressionLiteral - [5..17)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  101938. + Identifier;[DateTime];
  101939. + Dot;[.];
  101940. + Identifier;[Now];
  101941. + MarkupTextLiteral - [17..21)::4 - [ baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101942. + Whitespace;[ ];
  101943. + Text;[baz];
  101944. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsPrefixIdentifierReplacements_SingleSymbol.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsPrefixIdentifierReplacements_SingleSymbol.cspans.txt
  101945. new file mode 100644
  101946. index 00000000000..f507cc79882
  101947. --- /dev/null
  101948. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsPrefixIdentifierReplacements_SingleSymbol.cspans.txt
  101949. @@ -0,0 +1,4 @@
  101950. +Markup span at (0:0,0 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [17] test.cshtml)
  101951. +Transition span at (4:0,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [9] test.cshtml)
  101952. +Code span at (5:0,5 [8] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [9] test.cshtml)
  101953. +Markup span at (13:0,13 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [17] test.cshtml)
  101954. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsPrefixIdentifierReplacements_SingleSymbol.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsPrefixIdentifierReplacements_SingleSymbol.stree.txt
  101955. new file mode 100644
  101956. index 00000000000..e3ca47e5be8
  101957. --- /dev/null
  101958. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsPrefixIdentifierReplacements_SingleSymbol.stree.txt
  101959. @@ -0,0 +1,16 @@
  101960. +RazorDocument - [0..17)::17 - [foo @DateTime baz]
  101961. + MarkupBlock - [0..17)::17
  101962. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101963. + Text;[foo];
  101964. + Whitespace;[ ];
  101965. + CSharpCodeBlock - [4..13)::9
  101966. + CSharpImplicitExpression - [4..13)::9
  101967. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  101968. + Transition;[@];
  101969. + CSharpImplicitExpressionBody - [5..13)::8
  101970. + CSharpCodeBlock - [5..13)::8
  101971. + CSharpExpressionLiteral - [5..13)::8 - [DateTime] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  101972. + Identifier;[DateTime];
  101973. + MarkupTextLiteral - [13..17)::4 - [ baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101974. + Whitespace;[ ];
  101975. + Text;[baz];
  101976. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsSuffixIdentifierReplacements_MultipleSymbols.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsSuffixIdentifierReplacements_MultipleSymbols.cspans.txt
  101977. new file mode 100644
  101978. index 00000000000..58bb6d600ea
  101979. --- /dev/null
  101980. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsSuffixIdentifierReplacements_MultipleSymbols.cspans.txt
  101981. @@ -0,0 +1,4 @@
  101982. +Markup span at (0:0,0 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [21] test.cshtml)
  101983. +Transition span at (4:0,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [13] test.cshtml)
  101984. +Code span at (5:0,5 [12] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [13] test.cshtml)
  101985. +Markup span at (17:0,17 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [21] test.cshtml)
  101986. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsSuffixIdentifierReplacements_MultipleSymbols.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsSuffixIdentifierReplacements_MultipleSymbols.stree.txt
  101987. new file mode 100644
  101988. index 00000000000..0fbb9eb63da
  101989. --- /dev/null
  101990. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsSuffixIdentifierReplacements_MultipleSymbols.stree.txt
  101991. @@ -0,0 +1,18 @@
  101992. +RazorDocument - [0..21)::21 - [foo @DateTime.Now baz]
  101993. + MarkupBlock - [0..21)::21
  101994. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  101995. + Text;[foo];
  101996. + Whitespace;[ ];
  101997. + CSharpCodeBlock - [4..17)::13
  101998. + CSharpImplicitExpression - [4..17)::13
  101999. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  102000. + Transition;[@];
  102001. + CSharpImplicitExpressionBody - [5..17)::12
  102002. + CSharpCodeBlock - [5..17)::12
  102003. + CSharpExpressionLiteral - [5..17)::12 - [DateTime.Now] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  102004. + Identifier;[DateTime];
  102005. + Dot;[.];
  102006. + Identifier;[Now];
  102007. + MarkupTextLiteral - [17..21)::4 - [ baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  102008. + Whitespace;[ ];
  102009. + Text;[baz];
  102010. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsSuffixIdentifierReplacements_SingleSymbol.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsSuffixIdentifierReplacements_SingleSymbol.cspans.txt
  102011. new file mode 100644
  102012. index 00000000000..f507cc79882
  102013. --- /dev/null
  102014. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsSuffixIdentifierReplacements_SingleSymbol.cspans.txt
  102015. @@ -0,0 +1,4 @@
  102016. +Markup span at (0:0,0 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [17] test.cshtml)
  102017. +Transition span at (4:0,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [9] test.cshtml)
  102018. +Code span at (5:0,5 [8] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [9] test.cshtml)
  102019. +Markup span at (13:0,13 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [17] test.cshtml)
  102020. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsSuffixIdentifierReplacements_SingleSymbol.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsSuffixIdentifierReplacements_SingleSymbol.stree.txt
  102021. new file mode 100644
  102022. index 00000000000..e3ca47e5be8
  102023. --- /dev/null
  102024. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsSuffixIdentifierReplacements_SingleSymbol.stree.txt
  102025. @@ -0,0 +1,16 @@
  102026. +RazorDocument - [0..17)::17 - [foo @DateTime baz]
  102027. + MarkupBlock - [0..17)::17
  102028. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  102029. + Text;[foo];
  102030. + Whitespace;[ ];
  102031. + CSharpCodeBlock - [4..13)::9
  102032. + CSharpImplicitExpression - [4..13)::9
  102033. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  102034. + Transition;[@];
  102035. + CSharpImplicitExpressionBody - [5..13)::8
  102036. + CSharpCodeBlock - [5..13)::8
  102037. + CSharpExpressionLiteral - [5..13)::8 - [DateTime] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  102038. + Identifier;[DateTime];
  102039. + MarkupTextLiteral - [13..17)::4 - [ baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  102040. + Whitespace;[ ];
  102041. + Text;[baz];
  102042. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsSurroundedIdentifierReplacements.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsSurroundedIdentifierReplacements.cspans.txt
  102043. new file mode 100644
  102044. index 00000000000..805ec8e78e3
  102045. --- /dev/null
  102046. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsSurroundedIdentifierReplacements.cspans.txt
  102047. @@ -0,0 +1,4 @@
  102048. +Markup span at (0:0,0 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [32] test.cshtml)
  102049. +Transition span at (4:0,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [24] test.cshtml)
  102050. +Code span at (5:0,5 [23] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [24] test.cshtml)
  102051. +Markup span at (28:0,28 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [32] test.cshtml)
  102052. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsSurroundedIdentifierReplacements.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsSurroundedIdentifierReplacements.stree.txt
  102053. new file mode 100644
  102054. index 00000000000..04edbefa5c1
  102055. --- /dev/null
  102056. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsSurroundedIdentifierReplacements.stree.txt
  102057. @@ -0,0 +1,22 @@
  102058. +RazorDocument - [0..32)::32 - [foo @DateTime.Now.ToString() baz]
  102059. + MarkupBlock - [0..32)::32
  102060. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  102061. + Text;[foo];
  102062. + Whitespace;[ ];
  102063. + CSharpCodeBlock - [4..28)::24
  102064. + CSharpImplicitExpression - [4..28)::24
  102065. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  102066. + Transition;[@];
  102067. + CSharpImplicitExpressionBody - [5..28)::23
  102068. + CSharpCodeBlock - [5..28)::23
  102069. + CSharpExpressionLiteral - [5..28)::23 - [DateTime.Now.ToString()] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  102070. + Identifier;[DateTime];
  102071. + Dot;[.];
  102072. + Identifier;[Now];
  102073. + Dot;[.];
  102074. + Identifier;[ToString];
  102075. + LeftParenthesis;[(];
  102076. + RightParenthesis;[)];
  102077. + MarkupTextLiteral - [28..32)::4 - [ baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  102078. + Whitespace;[ ];
  102079. + Text;[baz];
  102080. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsWholeIdentifierReplacement.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsWholeIdentifierReplacement.cspans.txt
  102081. new file mode 100644
  102082. index 00000000000..f507cc79882
  102083. --- /dev/null
  102084. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsWholeIdentifierReplacement.cspans.txt
  102085. @@ -0,0 +1,4 @@
  102086. +Markup span at (0:0,0 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [17] test.cshtml)
  102087. +Transition span at (4:0,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [9] test.cshtml)
  102088. +Code span at (5:0,5 [8] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [9] test.cshtml)
  102089. +Markup span at (13:0,13 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [17] test.cshtml)
  102090. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsWholeIdentifierReplacement.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsWholeIdentifierReplacement.stree.txt
  102091. new file mode 100644
  102092. index 00000000000..e3ca47e5be8
  102093. --- /dev/null
  102094. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprAcceptsWholeIdentifierReplacement.stree.txt
  102095. @@ -0,0 +1,16 @@
  102096. +RazorDocument - [0..17)::17 - [foo @DateTime baz]
  102097. + MarkupBlock - [0..17)::17
  102098. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  102099. + Text;[foo];
  102100. + Whitespace;[ ];
  102101. + CSharpCodeBlock - [4..13)::9
  102102. + CSharpImplicitExpression - [4..13)::9
  102103. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  102104. + Transition;[@];
  102105. + CSharpImplicitExpressionBody - [5..13)::8
  102106. + CSharpCodeBlock - [5..13)::8
  102107. + CSharpExpressionLiteral - [5..13)::8 - [DateTime] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  102108. + Identifier;[DateTime];
  102109. + MarkupTextLiteral - [13..17)::4 - [ baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  102110. + Whitespace;[ ];
  102111. + Text;[baz];
  102112. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprProvisionalForMultipleInsertionIfItCausesIdentifierExpansionAndTrailingDot.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprProvisionalForMultipleInsertionIfItCausesIdentifierExpansionAndTrailingDot.cspans.txt
  102113. new file mode 100644
  102114. index 00000000000..5532c30c0ea
  102115. --- /dev/null
  102116. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprProvisionalForMultipleInsertionIfItCausesIdentifierExpansionAndTrailingDot.cspans.txt
  102117. @@ -0,0 +1,4 @@
  102118. +Markup span at (0:0,0 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [14] test.cshtml)
  102119. +Transition span at (4:0,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [6] test.cshtml)
  102120. +Code span at (5:0,5 [5] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [6] test.cshtml)
  102121. +Markup span at (10:0,10 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [14] test.cshtml)
  102122. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprProvisionalForMultipleInsertionIfItCausesIdentifierExpansionAndTrailingDot.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprProvisionalForMultipleInsertionIfItCausesIdentifierExpansionAndTrailingDot.stree.txt
  102123. new file mode 100644
  102124. index 00000000000..f236120f41b
  102125. --- /dev/null
  102126. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprProvisionalForMultipleInsertionIfItCausesIdentifierExpansionAndTrailingDot.stree.txt
  102127. @@ -0,0 +1,17 @@
  102128. +RazorDocument - [0..14)::14 - [foo @User. baz]
  102129. + MarkupBlock - [0..14)::14
  102130. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  102131. + Text;[foo];
  102132. + Whitespace;[ ];
  102133. + CSharpCodeBlock - [4..10)::6
  102134. + CSharpImplicitExpression - [4..10)::6
  102135. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  102136. + Transition;[@];
  102137. + CSharpImplicitExpressionBody - [5..10)::5
  102138. + CSharpCodeBlock - [5..10)::5
  102139. + CSharpExpressionLiteral - [5..10)::5 - [User.] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  102140. + Identifier;[User];
  102141. + Dot;[.];
  102142. + MarkupTextLiteral - [10..14)::4 - [ baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  102143. + Whitespace;[ ];
  102144. + Text;[baz];
  102145. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprProvisionallyAcceptsDeleteOfIdentifierPartsIfDotRemains.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprProvisionallyAcceptsDeleteOfIdentifierPartsIfDotRemains.cspans.txt
  102146. new file mode 100644
  102147. index 00000000000..5532c30c0ea
  102148. --- /dev/null
  102149. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprProvisionallyAcceptsDeleteOfIdentifierPartsIfDotRemains.cspans.txt
  102150. @@ -0,0 +1,4 @@
  102151. +Markup span at (0:0,0 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [14] test.cshtml)
  102152. +Transition span at (4:0,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [6] test.cshtml)
  102153. +Code span at (5:0,5 [5] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [6] test.cshtml)
  102154. +Markup span at (10:0,10 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [14] test.cshtml)
  102155. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprProvisionallyAcceptsDeleteOfIdentifierPartsIfDotRemains.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprProvisionallyAcceptsDeleteOfIdentifierPartsIfDotRemains.stree.txt
  102156. new file mode 100644
  102157. index 00000000000..f236120f41b
  102158. --- /dev/null
  102159. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprProvisionallyAcceptsDeleteOfIdentifierPartsIfDotRemains.stree.txt
  102160. @@ -0,0 +1,17 @@
  102161. +RazorDocument - [0..14)::14 - [foo @User. baz]
  102162. + MarkupBlock - [0..14)::14
  102163. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  102164. + Text;[foo];
  102165. + Whitespace;[ ];
  102166. + CSharpCodeBlock - [4..10)::6
  102167. + CSharpImplicitExpression - [4..10)::6
  102168. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  102169. + Transition;[@];
  102170. + CSharpImplicitExpressionBody - [5..10)::5
  102171. + CSharpCodeBlock - [5..10)::5
  102172. + CSharpExpressionLiteral - [5..10)::5 - [User.] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  102173. + Identifier;[User];
  102174. + Dot;[.];
  102175. + MarkupTextLiteral - [10..14)::4 - [ baz] - Gen<Markup> - SpanEditHandler;Accepts:Any
  102176. + Whitespace;[ ];
  102177. + Text;[baz];
  102178. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprProvisionallyAcceptsDotAfterIdentifierInMarkup.cspans.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprProvisionallyAcceptsDotAfterIdentifierInMarkup.cspans.txt
  102179. new file mode 100644
  102180. index 00000000000..fde3c1b21c4
  102181. --- /dev/null
  102182. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprProvisionallyAcceptsDotAfterIdentifierInMarkup.cspans.txt
  102183. @@ -0,0 +1,4 @@
  102184. +Markup span at (0:0,0 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [13] test.cshtml)
  102185. +Transition span at (4:0,4 [1] test.cshtml) (Accepts:None) - Parent: Expression block at (4:0,4 [5] test.cshtml)
  102186. +Code span at (5:0,5 [4] test.cshtml) (Accepts:NonWhitespace) - Parent: Expression block at (4:0,4 [5] test.cshtml)
  102187. +Markup span at (9:0,9 [4] test.cshtml) (Accepts:Any) - Parent: Markup block at (0:0,0 [13] test.cshtml)
  102188. diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprProvisionallyAcceptsDotAfterIdentifierInMarkup.stree.txt b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprProvisionallyAcceptsDotAfterIdentifierInMarkup.stree.txt
  102189. new file mode 100644
  102190. index 00000000000..fd089e0db93
  102191. --- /dev/null
  102192. +++ b/test/Microsoft.VisualStudio.Editor.Razor.Test/TestFiles/ParserTests/RazorSyntaxTreePartialParserTest/ImpExprProvisionallyAcceptsDotAfterIdentifierInMarkup.stree.txt
  102193. @@ -0,0 +1,17 @@
  102194. +RazorDocument - [0..13)::13 - [foo @foo. bar]
  102195. + MarkupBlock - [0..13)::13
  102196. + MarkupTextLiteral - [0..4)::4 - [foo ] - Gen<Markup> - SpanEditHandler;Accepts:Any
  102197. + Text;[foo];
  102198. + Whitespace;[ ];
  102199. + CSharpCodeBlock - [4..9)::5
  102200. + CSharpImplicitExpression - [4..9)::5
  102201. + CSharpTransition - [4..5)::1 - Gen<None> - SpanEditHandler;Accepts:None
  102202. + Transition;[@];
  102203. + CSharpImplicitExpressionBody - [5..9)::4
  102204. + CSharpCodeBlock - [5..9)::4
  102205. + CSharpExpressionLiteral - [5..9)::4 - [foo.] - Gen<Expr> - ImplicitExpressionEditHandler;Accepts:NonWhitespace;ImplicitExpression[RTD];K20
  102206. + Identifier;[foo];
  102207. + Dot;[.];
  102208. + MarkupTextLiteral - [9..13)::4 - [ bar] - Gen<Markup> - SpanEditHandler;Accepts:Any
  102209. + Whitespace;[ ];
  102210. + Text;[bar];