/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 1 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . py . translate . declaration Ċ Ċ import Ġorg . jetbrains . kotlin . js . backend . ast .* Ċ import Ġorg . jetbrains . kotlin . js . backend . ast . metadata .* Ċ import Ġorg . jetbrains . kotlin . py . translate . context . N amer Ċ import Ġorg . jetbrains . kotlin . py . translate . utils . Js Ast Utils . assignment Ċ import Ġorg . jetbrains . kotlin . py . translate . utils . Js Ast Utils . pure F qn Ċ import Ġorg . jetbrains . kotlin . py . translate . utils . name Ċ Ċ fun Ġ< T Ġ: ĠJs Node > Ġtransform Coroutine Metadata To Special Functions ( node : ĠT ): ĠT Ġ{ ĊĠĠĠ Ġval Ġvisitor Ġ= Ġobject Ġ: ĠJs Visitor WithContext Impl () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġend Visit ( x : ĠJs Name Ref , Ġctx : ĠJs Context < in ĠJs Expression >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspecial Function Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx . coroutine Controller Ġ-> ĠSpecial Function . COR OUT INE _ CONTROLLER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx . coroutine Receiver Ġ-> ĠSpecial Function . COR OUT INE _ RECE IVER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx . coroutine Result Ġ-> ĠSpecial Function . COR OUT INE _ RESULT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( special Function Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarguments Ġ= ĠlistOf NotNull ( x . qual ifier ). to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . replace Me ( Js Invocation ( special Function . ref (), Ġ* arguments ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynthetic Ġ= Ġx . synt hetic ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġside Effects Ġ= Ġx . side Effects ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġx . source ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . end Visit ( x , Ġctx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġend Visit ( x : ĠJs Expression , Ġctx : ĠJs Context < in ĠJs Expression >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x . is Suspend ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx . is Suspend Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . replace Me ( Js Invocation ( Special Function . SUS PEND _ CALL . ref (), Ġx ). source ( x . source )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ( x : ĠJs Binary Operation , Ġctx : ĠJs Context < in ĠJs Expression >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlhs Ġ= Ġx . arg 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lhs Ġis ĠJs Name Ref Ġ&& Ġlhs . coroutine Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarguments Ġ= ĠlistOf ( accept ( x . arg 2 )) Ġ+ ĠlistOf NotNull ( lhs . qual ifier ?. let Ġ{ Ġaccept ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . replace Me ( Js Invocation ( Special Function . SET _ COR OUT INE _ RESULT . ref (), Ġarguments ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynthetic Ġ= Ġx . synt hetic ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġside Effects Ġ= Ġx . side Effects ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġx . source ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . visit ( x , Ġctx ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġvisitor . accept ( node ) Ċ } Ċ Ċ private Ġfun ĠSpecial Function . ref () Ġ= Ġpure F qn ( Js Dynamic Scope . declare Name ( suggest ed Name ). also Ġ{ Ġit . special Function Ġ= Ġthis Ġ}, ĠN amer . kotlin Object ()) Ċ Ċ fun Ġ< T Ġ: ĠJs Node > Ġtransform Special Functions To Coroutine Metadata ( node : ĠT ): ĠT Ġ{ ĊĠĠĠ Ġval Ġvisitor Ġ= Ġobject Ġ: ĠJs Visitor WithContext Impl () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġend Visit ( x : ĠJs Invocation , Ġctx : ĠJs Context < in ĠJs Expression >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx . qual ifier . name ?. special Function ?. let Ġ{ Ġspecial Function Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreplacement Ġ= Ġwhen Ġ( special Function ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSpecial Function . COR OUT INE _ CONTROLLER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJs Name Ref ("\ $\ $ controller \ $\ $", Ġx . arguments . get OrNull ( 0 )). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Controller Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSpecial Function . COR OUT INE _ RECE IVER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJs Name Ref ("\ $ this \ $", Ġx . arguments . get OrNull ( 0 )). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Receiver Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSpecial Function . COR OUT INE _ RESULT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJs Name Ref ("\ $ result \ $", Ġx . arguments . get OrNull ( 0 )). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Result Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSpecial Function . SUS PEND _ CALL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx . arguments [ 0 ]. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Suspend Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSpecial Function . SET _ COR OUT INE _ RESULT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlhs Ġ= ĠJs Name Ref ("\ $ result \ $", Ġx . arguments . get OrNull ( 1 )). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Result Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassignment ( lhs , Ġx . arguments [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplacement ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . source Ġ= Ġx . source ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . side Effects Ġ= Ġx . side Effects ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . synt hetic Ġ= Ġx . synt hetic ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . replace Me ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġvisitor . accept ( node ) Ċ }