// ĠCopyright Ġ 2 0 0 0 - 2 0 2 1 ĠJetBrains Ġs . r . o . Ġand Ġcontributors . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ċ package Ġorg . jetbrains . kotlin . idea . ins pe ctions Ċ Ċ import Ġcom . intellij . code Inspection . Local Quick Fix Ċ import Ġcom . intellij . code Inspection . Problem Descriptor Ċ import Ġcom . intellij . code Inspection . Problem Highlight Type Ċ import Ġcom . intellij . code Inspection . Problems Holder Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġorg . jetbrains . kotlin . builtins . get Receiver Type From FunctionType Ċ import Ġorg . jetbrains . kotlin . descriptors . Callable Member Descriptor Ċ import Ġorg . jetbrains . kotlin . idea . Kotlin Bundle Ċ import Ġorg . jetbrains . kotlin . idea . cache s . resolve . analyze Ċ import Ġorg . jetbrains . kotlin . idea . cache s . resolve . resolve To Call Ċ import Ġorg . jetbrains . kotlin . idea . ins pe ctions . collections . is Calling Ċ import Ġorg . jetbrains . kotlin . name . Fq Name Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . get Strict Parent OfType Ċ import Ġorg . jetbrains . kotlin . resolve . Binding Context Ċ import Ġorg . jetbrains . kotlin . resolve . Binding Context . REFERENCE _ TARGET Ċ import Ġorg . jetbrains . kotlin . resolve . calls . call Util . getParameter For Argument Ċ import Ġorg . jetbrains . kotlin . resolve . calls . call Util . get Resolved Call Ċ import Ġorg . jetbrains . kotlin . resolve . calls . call Util . getType Ċ import Ġorg . jetbrains . kotlin . types . Kotlin Type Ċ Ċ class ĠSimpl ify Nested Each In Scope Function Inspection Ġ: ĠAbstract Kotlin Inspection () Ġ{ ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġscope Functions Ġ= Ġmap Of (" also " Ġto ĠlistOf ( Fq Name (" kotlin . also ")), Ġ" apply " Ġto ĠlistOf ( Fq Name (" kotlin . apply "))) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġiterate Functions Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" forEach " Ġto ĠlistOf ( Fq Name (" kotlin . collections . forEach "), ĠF q Name (" kotlin . text . forEach ")), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" on Each " Ġto ĠlistOf ( Fq Name (" kotlin . collections . on Each "), ĠF q Name (" kotlin . text . on Each ")) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠK t Call Expression . get Calling ShortName OrNull ( short Names To Fq Names : ĠMap < String , ĠList < Fq Name >> ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshort Name Ġ= Ġcal lee Expression ?. text Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnames Ġ= Ġshort Names To Fq Names [ short Name ] Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Ġ= Ġthis . resolve To Call () Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( names . any ( call :: is Calling )) Ġshort Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠK t Call Expression . single Lambda Expression (): ĠK t Lambda Expression ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . value Arguments . single OrNull ()?. get Argument Expression ()?. unpack Label And Lambda Expression ()?. second ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠK t Expression . unpack Label And Lambda Expression (): ĠPair < Kt Labeled Expression ?, ĠK t Lambda Expression ?> Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Lambda Expression Ġ-> Ġnull Ġto Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Labeled Expression Ġ-> Ġthis Ġto Ġbase Expression ?. unpack Label And Lambda Expression ()?. second ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Annotated Expression Ġ-> Ġbase Expression ?. unpack Label And Lambda Expression () Ġ?: Ġ( null Ġto Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull Ġto Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠK t Call Expression . get Receiver Type ( context : ĠBinding Context ): ĠKotlin Type ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcal lee Ġ= Ġcal lee Expression Ġas ? ĠK t Name Reference Expression Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcal lee Descriptor Ġ= Ġcontext [ REFERENCE _ TARGET , Ġcal lee ] Ġas ? ĠCallable Member Descriptor Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( callee Descriptor . dispatch Receiver Parameter Ġ?: Ġcal lee Descriptor . extension Receiver Parameter )?. type ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠI g no res Ġtype Ġparameters ĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠKotlin Type . isAssignableFrom ( subtype : ĠKotlin Type ) Ġ= Ġconstructor Ġin Ġsubtype . all Sup ert ypes (). map ( Kotlin Type :: constructor ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠKotlin Type . all Sup ert ypes (): ĠSet < Kotlin Type > Ġ= Ġconstructor . sup ert ypes . flatMap To ( HashSet ()) Ġ{ Ġit . all Sup ert ypes () Ġ} Ġ+ Ġthis ĊĊĠĠĠĠĠĠĠ Ġprivate Ġabstract Ġclass ĠReference Tree Visitor Ġ: ĠK t Tree Visitor Void () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġreferenced Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprotected Ġset ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġclass ĠLabel Reference Visitor ( val Ġlabel Name : ĠString ) Ġ: ĠReference Tree Visitor () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Expression With Label ( expression : ĠK t Expression With Label ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression . getLabel Name () Ġ== Ġlabel Name ) Ġreferenced Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġclass ĠParameter Reference Tree Visitor ( name : ĠString ?) Ġ: ĠReference Tree Visitor () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġname Ġ?: Ġ" it " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Simple Name Expression ( expression : ĠK t Simple Name Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression . get Referenced Name () Ġ== Ġname ) Ġreferenced Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Lambda Expression ( lambda Expression : ĠK t Lambda Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġparse Ġreference Ġwhen Ġname Ġis Ġshadow ed Ġin Ġlambda ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lambda Expression . value Parameters . none Ġ{ Ġit . name Ġ== Ġname Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Lambda Expression ( lambda Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġclass ĠImp licit This Reference Visitor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatch Type : ĠKotlin Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext : ĠBinding Context , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Types : ĠList < Kotlin Type > Ġ= Ġempty List () ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠReference Tree Visitor () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun ĠKotlin Type . type Matches Out erm ost This (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! this . isAssignableFrom ( match Type )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis Types . none Ġ{ Ġthis . isAssignableFrom ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit This Expression ( expression : ĠK t This Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression . label Qualifier Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreferenced Ġ= Ġtrue Ġ// ĠBe Ġsafe Ġto Ġprevent Ġfalse Ġposit ives ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Dot Qualified Expression ( expression : ĠK t Dot Qualified Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġlabel @{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Expression Ġ= Ġexpression . receiver Expression Ġas ? ĠK t This Expression Ġ?: Ġreturn @ label ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Expression Ġ= Ġexpression . selector Expression Ġas ? ĠK t Call Expression Ġ?: Ġreturn @ label ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Expression . label Qualifier Ġ!= Ġnull ) Ġreturn @ label ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call Expression . get Receiver Type ( context )?. type Matches Out erm ost This () Ġ== Ġtrue ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Dot Qualified Expression ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Call Expression ( expression : ĠK t Call Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression . get Strict Parent OfType < Kt Dot Qualified Expression >() Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression . get Receiver Type ( context )?. type Matches Out erm ost This () Ġ== Ġtrue ) Ġreferenced Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . single Lambda Expression ()?. let Ġ{ Ġlambda Expression Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlambda Receiver Type Ġ= Ġlambda Expression . getType ( context )?. get Receiver Type From FunctionType () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvisitor Ġ= ĠImp licit This Reference Visitor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatch Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis Types . let Ġ{ Ġif Ġ( lambda Receiver Type Ġ!= Ġnull ) Ġit . plus ( lambda Receiver Type ) Ġelse Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlambda Expression . body Expression ?. accept Children ( visitor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( visitor . referenced ) Ġreferenced Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġsuper . visit Call Expression ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbuild Visitor ( holder : ĠPro blems Holder , Ġis On The Fly : ĠBoolean ) Ġ= Ġcall Expression Visitor ( fun ( call Expression ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscope Function ShortName Ġ= Ġcall Expression . get Calling ShortName OrNull ( scope Functions ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġarg Ġ= Ġcall Expression . value Arguments . single OrNull () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġ( label Expression , Ġlambda Expression ) Ġ= Ġwhen Ġ( arg ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Lambda Argument Ġ-> Ġarg . get Argument Expression ()?. unpack Label And Lambda Expression () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġinner Expression Ġ= Ġlambda Expression ?. body Expression ?. statements ?. single OrNull () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġinner Call Expression Ġ= Ġwhen Ġ( inner Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Dot Qualified Expression Ġ-> Ġinner Expression . selector Expression Ġas ? ĠK t Call Expression Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Call Expression Ġ-> Ġinner Expression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġinner Call ShortName Ġ= Ġinner Call Expression . get Calling ShortName OrNull ( iterate Functions ) Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġcall Expression . analyze () ĊĊĠĠĠĠĠĠĠ Ġval Ġlambda Type Ġ= Ġcall Expression . get Resolved Call ( context )?. getParameter For Argument ( arg )?. type ?. arguments ?. first ()?. type Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval ĠforEach Lambda Ġ= Ġinner Call Expression . single Lambda Expression () ĊĊĠĠĠĠĠĠĠ Ġval Ġvisitor s : ĠList < Reference Tree Visitor > Ġ= ĠlistOf NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLabel Reference Visitor ( label Expression ?. getLabel Name () Ġ?: Ġscope Function ShortName ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( scope Function ShortName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" also " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inner Expression Ġ! is ĠK t Dot Qualified Expression ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceiver Expression Ġ= Ġinner Expression . receiver Expression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( receiver Expression Ġ! is ĠK t Reference Expression ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter Name Ġ= Ġlambda Expression . value Parameters . single OrNull ()?. name Ġ?: Ġ" it " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! receiver Expression . text Matches ( parameter Name )) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( forEach Lambda Ġ!= Ġnull Ġ&& Ġ( forEach Lambda . value Parameters . single OrNull ()?. name Ġ?: Ġ" it ") Ġ== Ġparameter Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ// ĠParameter Ġfrom Ġouter Ġlambda Ġis Ġshadow ed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠParameter Reference Tree Visitor ( parameter Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" apply " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceiver Type Ġ= Ġinner Call Expression . get Receiver Type ( context ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! receiver Type . isAssignableFrom ( lambda Type )) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inner Expression Ġis ĠK t Dot Qualified Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceiver Expression Ġ= Ġinner Expression . receiver Expression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( receiver Expression Ġ! is ĠK t This Expression ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlabel Name Ġ= Ġreceiver Expression . getLabel Name () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( label Name Ġ!= Ġnull Ġ&& Ġlabel Name Ġ!= Ġ( label Expression ?. getLabel Name () Ġ?: Ġscope Function ShortName )) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImp licit This Reference Visitor ( lambda Type , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġinner Call Expression . single Lambda Expression ()?. body Expression ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisitor s . forEach ( it :: accept ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( visitor s . any ( Reference Tree Visitor :: referenced )) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġholder . register Problem ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Expression . callee Expression Ġ?: Ġreturn , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Bundle . message (" nested . 1 . call . in . 0 . could . be . simpl ified . to . 2 ", Ġscope Function ShortName , Ġinner Call ShortName , Ġ" on Each "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProblem Highlight Type . GENERIC _ ERROR _ OR _ WARNING , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNested ForEach Fix ( inner Call ShortName ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġprivate Ġclass ĠNested ForEach Fix ( val ĠforEach Call : ĠString ) Ġ: ĠLocal Quick Fix Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetName () Ġ= ĠKotlin Bundle . message (" simplify . call . fix . text ", ĠforEach Call , Ġ" on Each ") ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Family Name () Ġ= ĠKotlin Bundle . message (" replace . 0 . with . 1 ", Ġ" nested Ġcalls ", Ġ" on Each ") ĊĊĠĠĠĠĠĠĠ Ġprivate Ġclass ĠReplace Label Visitor ( val Ġfactory : ĠK t Psi Factory ) Ġ: ĠK t Tree Visitor Void () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Expression With Label ( expression : ĠK t Expression With Label ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression . getLabel Name () Ġ!= Ġ" forEach ") Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpression Text Ġ= Ġexpression . text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfactory . create Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Text . replace Range ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Text . indexOf ('@ ') Ġ+ Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Text . length , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" on Each " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply Fix ( project : ĠProject , Ġdescriptor : ĠProblem Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Expression Ġ= Ġdescriptor . psi Element . parent Ġas ? ĠK t Call Expression Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġouter Block Ġ= Ġcall Expression . value Arguments . single OrNull () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( label , Ġlambda ) Ġ= Ġouter Block . get Argument Expression ()?. unpack Label And Lambda Expression () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġeach Call Ġ= Ġwhen Ġ( val Ġstatement Ġ= Ġlambda ?. body Expression ?. statements ?. single OrNull ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Dot Qualified Expression Ġ-> Ġstatement . selector Expression Ġas ? ĠK t Call Expression Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Call Expression Ġ-> Ġstatement ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfactory Ġ= ĠK t Psi Factory ( project ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinner Block Ġ= Ġeach Call . value Arguments . single OrNull () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( label ?. label Qualifier Ġ== Ġnull Ġ&& Ġeach Call . callee Expression ?. text Ġ== Ġ" forEach ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Block . accept ( Replace Label Visitor ( factory )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinner Block Expression Ġ= Ġinner Block . get Argument Expression () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inner Block Expression Ġ!= Ġnull Ġ&& ĠK t Psi Util . de parent hesize ( inner Block Expression ) Ġis ĠK t Callable Reference Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Expression . replace ( factory . create Expression By Pattern (" on Each ($ 0 )", Ġinner Block Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġouter Block . replace ( inner Block ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . psi Element . replace ( factory . create Expression (" on Each ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }