/* Ċ Ġ* ĠFor Loop . kt Ċ Ġ* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 Ġapache ju ice Ċ Ġ* ĠThis Ġfile Ġis Ġpart Ġof ĠP ret zel Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġ< http :// www . apache . org / licenses / LICENSE - 2 . 0 > Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . pret zel . core . ast . statement Ċ Ċ import Ġcom . pret zel . core . analysis . Analysis Context Ċ import Ġcom . pret zel . core . ast . Code Node Ċ import Ġcom . pret zel . core . ast . expr . Expression Ċ import Ġcom . pret zel . core . ast . symbols . Simple Symbol Ċ import Ġcom . pret zel . core . ast . visit . Node Visitor Ċ import Ġcom . pret zel . core . lexer . Span Ċ Ċ sealed Ġclass ĠFor Loop ( span : ĠSpan , Ġbody : ĠBlock ) Ġ: ĠLoop ( span , Ġbody ) Ġ{ ĊĠĠĠ Ġoverride Ġval Ġis Control Flow Statement : ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġoverride Ġval Ġhas Block Body : ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġoverride Ġval Ġallow O mitted Body : ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġoverride Ġval Ġhas O mitted Body : ĠBoolean Ġ= Ġbody . body . isEmpty () ĊĠĠĠ Ġoverride Ġval Ġcan Throw : ĠBoolean Ġ= Ġbody . can Throw ĊĊĠĠĠ Ġclass ĠFor Each Loop ( val Ġreceiver : ĠSimple Symbol , Ġval Ġsource : ĠExpression , Ġbody : ĠBlock , Ġspan : ĠSpan ) Ġ: ĠFor Loop ( span , Ġbody ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġis Executed Fore ver : ĠBoolean Ġ= Ġfalse Ġ// Ġno Ġway Ġto Ġknow Ġ( yet ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" ForEach Loop [$ receiver Ġ$ source ]" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< T > Ġaccept ( visitor : ĠNode Visitor < T >): ĠT Ġ= Ġvisitor . visit ForEach Loop ( this ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcheck ( ctx : ĠAnalysis Context ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . checked Ġ= Ġif Ġ( this . checked ) Ġreturn Ġthis . passed Ġelse Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpass Ġ= Ġreceiver . check ( ctx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpass Ġ= Ġsource . check ( ctx ) Ġ&& Ġpass ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpass Ġ= Ġbody . check ( ctx ) Ġ&& Ġpass ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . passed Ġ= Ġpass ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpass ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠTr ad itional For Loop ( val Ġinitializer : ĠCode Node ?, Ġval Ġcondition : ĠExpression ?, Ġval Ġupdate : ĠExpression ?, Ġbody : ĠBlock , Ġsource Range : ĠSpan ) Ġ: ĠFor Loop ( source Range , Ġbody ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġis Executed Fore ver : ĠBoolean Ġ= Ġcondition ?. is Always True Ġ?: Ġfalse ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" Tr ad itional For Loop [$ initializer ; Ġ$ condition ; Ġ$ update ]" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< T > Ġaccept ( visitor : ĠNode Visitor < T >): ĠT Ġ= Ġvisitor . visit Tr ad itional For Loop ( this ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcheck ( ctx : ĠAnalysis Context ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . checked Ġ= Ġif Ġ( this . checked ) Ġreturn Ġthis . passed Ġelse Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpass Ġ= Ġinitializer ?. check ( ctx ) Ġ?: Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpass Ġ= Ġ( condition ?. check ( ctx ) Ġ?: Ġtrue ) Ġ&& Ġpass ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpass Ġ= Ġ( update ?. check ( ctx ) Ġ?: Ġtrue ) Ġ&& Ġpass ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpass Ġ= Ġbody . check ( ctx ) Ġ&& Ġpass ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . passed Ġ= Ġpass ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpass ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }