/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 5 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* Ġ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 Ġorg . jetbrains . kotlin . idea . intent ions . br an ched Transform ations Ċ Ċ import Ġcom . intellij . openapi . editor . Editor Ċ import Ġcom . intellij . openapi . file Editor . File Document Manager Ċ import Ġcom . intellij . psi . search . Local Search Scope Ċ import Ġcom . intellij . psi . search . sear ches . References Search Ċ import Ġorg . jetbrains . kotlin . Kt Node Types Ċ import Ġorg . jetbrains . kotlin . idea . cache s . resolve . analyze Ċ import Ġorg . jetbrains . kotlin . idea . cache s . resolve . find Module Descriptor Ċ import Ġorg . jetbrains . kotlin . idea . cache s . resolve . get Resolution Facade Ċ import Ġorg . jetbrains . kotlin . idea . cache s . resolve . resolve To Call Ċ import Ġorg . jetbrains . kotlin . idea . core . Kotlin Name Suggest er Ċ import Ġorg . jetbrains . kotlin . idea . core . re placed Ċ import Ġorg . jetbrains . kotlin . idea . intent ions . get Left Most Receiver Expression Ċ import Ġorg . jetbrains . kotlin . idea . intent ions . replace First Receiver Ċ import Ġorg . jetbrains . kotlin . idea . refactor ing . inline . Kotlin Inline Val Handler Ċ import Ġorg . jetbrains . kotlin . idea . refactor ing . intro duce . intro duce Variable . Kotlin Intro duce Variable Handler Ċ import Ġorg . jetbrains . kotlin . idea . refactor ing . is Multi Line Ċ import Ġorg . jetbrains . kotlin . idea . references . main Reference Ċ import Ġorg . jetbrains . kotlin . idea . resolve . frontend Service Ċ import Ġorg . jetbrains . kotlin . idea . util . get Resolution Scope Ċ import Ġorg . jetbrains . kotlin . incremental . components . No Lookup Location Ċ import Ġorg . jetbrains . kotlin . lexer . Kt Tokens Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ import Ġorg . jetbrains . kotlin . resolve . Binding Context Ċ import Ġorg . jetbrains . kotlin . resolve . Descriptor Utils Ċ import Ġorg . jetbrains . kotlin . resolve . calls . call Util . get Resolved Call Ċ import Ġorg . jetbrains . kotlin . resolve . calls . call Util . getType Ċ import Ġorg . jetbrains . kotlin . resolve . calls . resolved Call Util . get Implicit Receiver Value Ċ import Ġorg . jetbrains . kotlin . resolve . calls . smart casts . Data Flow Value Ċ import Ġorg . jetbrains . kotlin . resolve . calls . smart casts . Data Flow Value Factory Ċ import Ġorg . jetbrains . kotlin . resolve . scopes . re ceiv ers . Implicit Receiver Ċ import Ġorg . jetbrains . kotlin . resolve . scopes . utils . find Variable Ċ import Ġorg . jetbrains . kotlin . types . Type Utils Ċ import Ġorg . jetbrains . kotlin . types . type Util . is Subtype Of Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . constant Ċ Ċ fun ĠK t Binary Expression . expression Comp ared To Null (): ĠK t Expression ? Ġ{ ĊĠĠĠ Ġval Ġoperation Token Ġ= Ġthis . operation Token ĊĠĠĠ Ġif Ġ( operation Token Ġ!= ĠK t Tokens . EQ EQ Ġ&& Ġoperation Token Ġ!= ĠK t Tokens . EX CLE Q ) Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġright Ġ= Ġthis . right Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġval Ġleft Ġ= Ġthis . left Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġright IsNull Ġ= Ġright . isNull Expression () ĊĠĠĠ Ġval Ġleft IsNull Ġ= Ġleft . isNull Expression () ĊĠĠĠ Ġif Ġ( left IsNull Ġ== Ġright IsNull ) Ġreturn Ġnull ĊĠĠĠ Ġreturn Ġif Ġ( left IsNull ) Ġright Ġelse Ġleft Ċ } Ċ Ċ fun ĠK t Expression . unwrap Block Or Parent hesis (): ĠK t Expression Ġ{ ĊĠĠĠ Ġval Ġinner Expression Ġ= ĠK t Psi Util . safe De parent hesize ( this , Ġtrue ) ĊĠĠĠ Ġif Ġ( inner Expression Ġis ĠK t Block Expression ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstatement Ġ= Ġinner Expression . statements . single OrNull () Ġ?: Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġreturn ĠK t Psi Util . safe De parent hesize ( statement , Ġtrue ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġinner Expression Ċ } Ċ Ċ fun ĠK t Expression ?. is T rivial Statement Body (): ĠBoolean Ġ= Ġwhen Ġ( this ?. unwrap Block Or Parent hesis ()) Ġ{ ĊĠĠĠ Ġis ĠK t If Expression , Ġis ĠK t Block Expression Ġ-> Ġfalse ĊĠĠĠ Ġelse Ġ-> Ġtrue Ċ } Ċ Ċ fun ĠK t Expression ?. isNull Expression (): ĠBoolean Ġ= Ġthis ?. unwrap Block Or Parent hesis ()?. node ?. elementType Ġ== ĠK t Node Types . NULL Ċ Ċ fun ĠK t Expression ?. isNull Expression OrEmpty Block (): ĠBoolean Ġ= ĊĠĠĠ Ġthis . isNull Expression () Ġ|| Ġthis Ġis ĠK t Block Expression Ġ&& Ġthis . statements . isEmpty () Ċ Ċ fun ĠK t Throw Expression . throws NullPointerException With No Arguments (): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġthrown Expression Ġ= Ġthis . throw n Expression Ġas ? ĠK t Call Expression Ġ?: Ġreturn Ġfalse ĊĊĠĠĠ Ġval Ġname Expression Ġ= Ġthrown Expression . callee Expression Ġas ? ĠK t Name Reference Expression Ġ?: Ġreturn Ġfalse ĊĠĠĠ Ġval Ġdescriptor Ġ= Ġname Expression . resolve To Call ()?. result ing Descriptor ĊĠĠĠ Ġval Ġdecl Descriptor Ġ= Ġdescriptor ?. containing Declaration Ġ?: Ġreturn Ġfalse ĊĊĠĠĠ Ġval Ġexception Name Ġ= ĠDescriptor Utils . getF q Name ( decl Descriptor ). asString () ĊĠĠĠ Ġreturn Ġexception Name Ġin Ġconstant Ġ{ ĊĠĠĠĠĠĠĠ Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin . Kotlin NullPointerException ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin . NullPointerException ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" java . lang . NullPointerException " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ġ&& Ġthrown Expression . value Arguments . isEmpty () Ċ } Ċ Ċ fun ĠK t Expression . evalu ates To ( other : ĠK t Expression ): ĠBoolean Ġ= ĊĠĠĠ Ġthis . unwrap Block Or Parent hesis (). text Ġ== Ġother . text Ċ Ċ fun ĠK t Expression . convertTo If NotNull Expression ( ĊĠĠĠ Ġcondition L hs : ĠK t Expression , ĊĠĠĠ Ġthen Clause : ĠK t Expression , ĊĠĠĠ Ġelse Clause : ĠK t Expression ? Ċ ): ĠK t If Expression Ġ{ ĊĠĠĠ Ġval Ġcondition Ġ= ĠK t Psi Factory ( this ). create Expression By Pattern ("$ 0 Ġ!= Ġnull ", Ġcondition L hs ) ĊĠĠĠ Ġreturn Ġthis . convertTo If Statement ( condition , Ġthen Clause , Ġelse Clause ) Ċ } Ċ Ċ fun ĠK t Expression . convertTo If Null Expression ( condition L hs : ĠK t Expression , Ġthen Clause : ĠK t Expression ): ĠK t If Expression Ġ{ ĊĠĠĠ Ġval Ġcondition Ġ= ĠK t Psi Factory ( this ). create Expression By Pattern ("$ 0 Ġ== Ġnull ", Ġcondition L hs ) ĊĠĠĠ Ġreturn Ġthis . convertTo If Statement ( condition , Ġthen Clause ) Ċ } Ċ Ċ fun ĠK t Expression . convertTo If Statement ( condition : ĠK t Expression , Ġthen Clause : ĠK t Expression , Ġelse Clause : ĠK t Expression ? Ġ= Ġnull ): ĠK t If Expression Ġ= ĊĠĠĠ Ġreplaced ( Kt Psi Factory ( this ). create If ( condition , Ġthen Clause , Ġelse Clause )) Ċ Ċ fun ĠK t If Expression . intro duce Value For Condition ( occ urrence In Then Clause : ĠK t Expression , Ġeditor : ĠEditor ?) Ġ{ ĊĠĠĠ Ġval Ġproject Ġ= Ġthis . project ĊĠĠĠ Ġval Ġcondition Ġ= Ġcondition ĊĠĠĠ Ġval Ġoccurrence In Conditional Ġ= Ġwhen Ġ( condition ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠK t Binary Expression Ġ-> Ġcondition . left ĊĠĠĠĠĠĠĠ Ġis ĠK t Is Expression Ġ-> Ġcondition . left Hand Side ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠAssertionError (" Only Ġbinary Ġ/ Ġis Ġexpressions Ġare Ġsupported Ġhere : Ġ${ condition ?. text }") ĊĠĠĠ Ġ} !! ĊĠĠĠ ĠKotlin Intro duce Variable Handler . do Ref actor ing ( ĊĠĠĠĠĠĠĠ Ġproject , ĊĠĠĠĠĠĠĠ Ġeditor , ĊĠĠĠĠĠĠĠ Ġoccurrence In Conditional , ĊĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠ ĠlistOf ( occ urrence In Conditional , Ġoccurrence In Then Clause ), Ġnull ĊĠĠĠ Ġ) Ċ } Ċ Ċ fun ĠK t Name Reference Expression . inline If Declared Loc ally And Only Used Once With Prompt ( editor : ĠEditor ?) Ġ{ ĊĠĠĠ Ġval Ġdeclaration Ġ= Ġthis . main Reference . resolve () Ġas ? ĠK t Property Ġ?: Ġreturn ĊĊĠĠĠ Ġval Ġen closing Element Ġ= ĠK t Psi Util . get En closing Element For Local Declaration ( declaration ) ĊĠĠĠ Ġval Ġis Local Ġ= Ġen closing Element Ġ!= Ġnull ĊĠĠĠ Ġif Ġ(! is Local ) Ġreturn ĊĊĠĠĠ Ġval Ġscope Ġ= ĠLocal Search Scope ( enc lo sing Element !! ) ĊĊĠĠĠ Ġval Ġreferences Ġ= ĠReferences Search . search ( declaration , Ġscope ). findAll () ĊĠĠĠ Ġif Ġ( references . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ ĠKotlin Inline Val Handler (). inline Element ( this . project , Ġeditor , Ġdeclaration ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠK t Safe Qualified Expression . inline Receiver If Applicable With Prompt ( editor : ĠEditor ?) Ġ{ ĊĠĠĠ Ġ( this . receiver Expression Ġas ? ĠK t Name Reference Expression )?. inline If Declared Loc ally And Only Used Once With Prompt ( editor ) Ċ } Ċ Ċ fun ĠK t Binary Expression . inline Left Side If Applicable With Prompt ( editor : ĠEditor ?) Ġ{ ĊĠĠĠ Ġ( this . left Ġas ? ĠK t Name Reference Expression )?. inline If Declared Loc ally And Only Used Once With Prompt ( editor ) Ċ } Ċ Ċ fun ĠK t Post fix Expression . inline Base Expression If Applicable With Prompt ( editor : ĠEditor ?) Ġ{ ĊĠĠĠ Ġ( this . base Expression Ġas ? ĠK t Name Reference Expression )?. inline If Declared Loc ally And Only Used Once With Prompt ( editor ) Ċ } Ċ Ċ // ĠI . e . Ġstable Ġval / var / receiver Ċ // ĠWe Ġexclude Ġstable Ġcomplex Ġexpressions Ġhere , Ġbecause Ġwe Ġdon 't Ġdo Ġsmart casts Ġon Ġthem Ġ( even Ġthough Ġthey Ġare Ġstable ) Ċ fun ĠK t Expression . is Stable Simple Expression ( context : ĠBinding Context Ġ= Ġthis . analyze ()): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġdata Flow Value Ġ= Ġthis . to Data Flow Value ( context ) ĊĠĠĠ Ġreturn Ġdata Flow Value ?. is Stable Ġ== Ġtrue Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Flow Value . kind Ġ!= ĠData Flow Value . Kind . ST ABLE _ COMPLEX _ EXPRESSION Ċ Ċ } Ċ Ċ fun ĠK t Expression . is Stable Val ( context : ĠBinding Context Ġ= Ġthis . analyze ()): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġthis . to Data Flow Value ( context )?. kind Ġ== ĠData Flow Value . Kind . ST ABLE _ VALUE Ċ } Ċ Ċ private Ġfun ĠK t Expression . to Data Flow Value ( context : ĠBinding Context ): ĠData Flow Value ? Ġ{ ĊĠĠĠ Ġval Ġexpression Type Ġ= Ġthis . getType ( context ) Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġval Ġdata Flow Value Factory Ġ= Ġthis . get Resolution Facade (). frontend Service < Data Flow Value Factory >() ĊĠĠĠ Ġreturn Ġdata Flow Value Factory . create Data Flow Value ( this , Ġexpression Type , Ġcontext , Ġfind Module Descriptor ()) Ċ } Ċ Ċ data Ġclass ĠIf Then To Select Data ( ĊĠĠĠ Ġval Ġcontext : ĠBinding Context , ĊĠĠĠ Ġval Ġcondition : ĠK t Operation Expression , ĊĠĠĠ Ġval Ġreceiver Expression : ĠK t Expression , ĊĠĠĠ Ġval Ġbase Clause : ĠK t Expression ?, ĊĠĠĠ Ġval Ġneg ated Clause : ĠK t Expression ? Ċ ) Ġ{ ĊĠĠĠ Ġinternal Ġfun Ġbase Clause Evalu ates To Receiver () Ġ= ĊĠĠĠĠĠĠĠ Ġbase Clause ?. evalu ates To ( receiver Expression ) Ġ== Ġtrue ĊĊĠĠĠ Ġinternal Ġfun Ġreplaced Base Clause ( factory : ĠK t Psi Factory ): ĠK t Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġbase Clause Ġ?: Ġerror (" Base Ġclause Ġmust Ġbe Ġnot - null Ġhere ") ĊĠĠĠĠĠĠĠ Ġval Ġnew Receiver Ġ= Ġ( condition Ġas ? ĠK t Is Expression )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfactory . create Expression By Pattern ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ 0 Ġas ? Ġ$ 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . left Hand Side , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . type Reference !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( base Clause Evalu ates To Receiver ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( condition Ġis ĠK t Is Expression ) Ġnew Receiver !! Ġelse Ġbase Clause ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcondition Ġis ĠK t Is Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Clause Ġis ĠK t Dot Qualified Expression Ġ-> Ġbase Clause . replace First Receiver ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfactory , Ġnew Receiver !! , Ġsafe Access Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Implicit Receiver () Ġ-> Ġfactory . create Expression By Pattern ("$ 0 ? .$ 1 ", Ġnew Receiver !! , Ġbase Clause ). insert Safe Calls ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfactory ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Clause Ġis ĠK t Call Expression Ġ-> Ġreplaced Base Clause With Let ( base Clause , Ġnew Receiver !! , Ġfactory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Illegal Ġstate ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Implicit Receiver () Ġ-> Ġfactory . create Expression By Pattern (" this ? .$ 0 ", Ġbase Clause ). insert Safe Calls ( factory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Clause Ġis ĠK t Call Expression Ġ-> Ġreplaced Base Clause With Let ( base Clause , Ġreceiver Expression , Ġfactory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġbase Clause . insert Safe Calls ( factory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġget Implicit Receiver (): ĠImp licit Receiver ? Ġ= Ġbase Clause . get Resolved Call ( context )?. get Implicit Receiver Value () ĊĊĠĠĠ Ġinternal Ġfun Ġhas Implicit Receiver (): ĠBoolean Ġ= Ġget Implicit Receiver () Ġ!= Ġnull ĊĊĠĠĠ Ġprivate Ġfun Ġreplaced Base Clause With Let ( base Clause : ĠK t Call Expression , Ġreceiver : ĠK t Expression , Ġfactory : ĠK t Psi Factory ): ĠK t Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġneed Explicit Parameter Ġ= Ġbase Clause . value Arguments . any Ġ{ Ġit . get Argument Expression ()?. text Ġ== Ġ" it " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġparameter Name Ġ= Ġif Ġ( need Explicit Parameter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscope Ġ= Ġbase Clause . get Resolution Scope () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Name Suggest er . suggest Name ByName (" it ") Ġ{ Ġscope . find Variable ( Name . identifier ( it ), ĠNo Lookup Location . FROM _ IDE ) Ġ== Ġnull Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" it " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfactory . build Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Expression ( receiver ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Fixed Text (" ?. let Ġ{ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( need Explicit Parameter ) Ġappend Fixed Text (" Ġ$ parameter Name Ġ-> ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Expression ( base Clause . callee Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Fixed Text (" (" ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Clause . value Arguments . forEach Indexed Ġ{ Ġindex , Ġarg Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ!= Ġ 0 ) Ġappend Fixed Text (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarg Expression Ġ= Ġarg . get Argument Expression () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arg Expression ?. evalu ates To ( receiver Expression ) Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Fixed Text ( parameter Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Expression ( arg Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Fixed Text (" ) Ġ} ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun ĠK t If Expression . build Select Transformation Data (): ĠIf Then To Select Data ? Ġ{ ĊĠĠĠ Ġval Ġcontext Ġ= Ġanalyze () ĊĊĠĠĠ Ġval Ġcondition Ġ= Ġcondition Ġas ? ĠK t Operation Expression Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġval Ġthen Clause Ġ= Ġthen ?. unwrap Block Or Parent hesis () ĊĠĠĠ Ġval Ġelse Clause Ġ= Ġ` else ` ?. unwrap Block Or Parent hesis () ĊĠĠĠ Ġval Ġreceiver Expression Ġ= Ġcondition . checked Expression () Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġ( base Clause , Ġneg ated Clause ) Ġ= Ġwhen Ġ( condition ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠK t Binary Expression Ġ-> Ġwhen Ġ( condition . operation Token ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠK t Tokens . EQ EQ Ġ-> Ġelse Clause Ġto Ġthen Clause ĊĠĠĠĠĠĠĠĠĠĠĠ ĠK t Tokens . EX CLE Q Ġ-> Ġthen Clause Ġto Ġelse Clause ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠK t Is Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Type Ġ= Ġcontext [ Binding Context . TYPE , Ġcondition . type Reference ] Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Type Utils . is Nullable Type ( target Type )) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġthe Ġfollowing Ġcheck Ġcan Ġbe Ġremoved Ġafter Ġfix Ġof ĠK T - 1 4 5 7 6 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Type Ġ= Ġreceiver Expression . getType ( context ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! target Type . is Subtype Of ( original Type )) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( condition . is Neg ated ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġelse Clause Ġto Ġthen Clause ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġthen Clause Ġto Ġelse Clause ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠIf Then To Select Data ( context , Ġcondition , Ġreceiver Expression , Ġbase Clause , Ġneg ated Clause ) Ċ } Ċ Ċ internal Ġfun ĠK t Expression ?. is Clause Transform able To Let Only () Ġ= ĊĠĠĠ Ġthis Ġis ĠK t Call Expression Ġ&& Ġresolve To Call ()?. get Implicit Receiver Value () Ġ== Ġnull Ċ Ċ internal Ġfun ĠK t If Expression . shouldBe Trans formed (): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġcondition Ġ= Ġcondition ĊĠĠĠ Ġreturn Ġwhen Ġ( condition ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠK t Binary Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Clause Ġ= Ġ( if Ġ( condition . operation Token Ġ== ĠK t Tokens . EQ EQ ) Ġ` else ` Ġelse Ġthen )?. unwrap Block Or Parent hesis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! base Clause . is Clause Transform able To Let Only () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠK t Is Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Clause Ġ= Ġ( if Ġ( condition . is Neg ated ) Ġ` else ` Ġelse Ġthen )?. unwrap Block Or Parent hesis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Clause . is Clause Transform able To Let Only () Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! is Multi Line () Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġbase Clause Ġ! is ĠK t Dot Qualified Expression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠK t Expression . checked Expression () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġis ĠK t Binary Expression Ġ-> Ġexpression Comp ared To Null () ĊĠĠĠ Ġis ĠK t Is Expression Ġ-> Ġleft Hand Side ĊĠĠĠ Ġelse Ġ-> Ġnull Ċ } Ċ Ċ internal Ġfun ĠK t Expression . has Nullable Type ( context : ĠBinding Context ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġtype Ġ= ĠgetType ( context ) Ġ?: Ġreturn Ġtrue ĊĠĠĠ Ġreturn ĠType Utils . is Nullable Type ( type ) Ċ } Ċ Ċ internal Ġfun ĠK t Expression . has First Receiver Of ( receiver : ĠK t Expression ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġactual Receiver Ġ= Ġ( this Ġas ? ĠK t Dot Qualified Expression )?. get Left Most Receiver Expression () Ġ?: Ġreturn Ġfalse ĊĠĠĠ Ġreturn Ġactual Receiver . evalu ates To ( receiver ) Ċ } Ċ Ċ private Ġfun ĠK t Expression . insert Safe Calls ( factory : ĠK t Psi Factory ): ĠK t Expression Ġ{ ĊĠĠĠ Ġif Ġ( this Ġ! is ĠK t Qualified Expression ) Ġreturn Ġthis ĊĠĠĠ Ġval Ġreplaced Ġ= Ġ( if Ġ( this Ġis ĠK t Dot Qualified Expression ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . re placed ( factory . create Expression By Pattern ("$ 0 ? .$ 1 ", Ġreceiver Expression , Ġselector Expression !! )) ĊĠĠĠ Ġ} Ġelse Ġthis ) Ġas ĠK t Qualified Expression ĊĠĠĠ Ġreplaced . receiver Expression . let Ġ{ Ġit . replace ( it . insert Safe Calls ( factory )) Ġ} ĊĠĠĠ Ġreturn Ġreplaced Ċ } Ċ Ċ // ĠReturns Ġ- 1 Ġif Ġcannot Ġobtain Ġa Ġdocument Ċ internal Ġfun ĠK t Expression . line Count (): ĠInt Ġ{ ĊĠĠĠ Ġval Ġfile Ġ= Ġcontaining File ?. virtual File Ġ?: Ġreturn Ġ- 1 ĊĠĠĠ Ġval Ġdocument Ġ= ĠFile Document Manager . getInstance (). getDocument ( file ) Ġ?: Ġreturn Ġ- 1 ĊĠĠĠ Ġreturn Ġdocument . get LineNumber ( text Range . end Offset ) Ġ- Ġdocument . get LineNumber ( text Range . start Offset ) Ġ+ Ġ 1 Ċ } Ċ Ċ internal Ġfun ĠK t Expression . is One Lin er (): ĠBoolean Ġ= Ġline Count () Ġ== Ġ 1 Ċ Ċ internal Ġfun ĠK t Expression . is Else If () Ġ= Ġparent . node . elementType Ġ== ĠK t Node Types . ELSE Ċ