/******************************************************************************* Ċ Ġ* ĠCopyright Ġ 2 0 0 0 - 2 0 1 6 Ġ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 . ui . editor s . quick assist Ċ Ċ import Ġcom . intellij . openapi . util . Text Range Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi WhiteSpace Ċ import Ġcom . intellij . psi . util . Psi Tree Util Ċ import Ġorg . eclipse . j face . text . ID ocument Ċ import Ġorg . eclipse . j face . text . Text Utilities Ċ import Ġorg . jetbrains . kotlin . builtins . Default Built Ins Ċ import Ġorg . jetbrains . kotlin . builtins . Kotlin Built Ins Ċ import Ġorg . jetbrains . kotlin . core . formatting . code Style Ċ import Ġorg . jetbrains . kotlin . eclipse . ui . utils . get Binding Context Ċ import Ġorg . jetbrains . kotlin . idea . util . Ide Descriptor Render ers Ċ import Ġorg . jetbrains . kotlin . lexer . Kt Tokens Ċ import Ġorg . jetbrains . kotlin . psi . Kt Binary Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Block Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Callable Declaration Ċ import Ġorg . jetbrains . kotlin . psi . Kt Declaration Ċ import Ġorg . jetbrains . kotlin . psi . Kt Declaration With Body Ċ import Ġorg . jetbrains . kotlin . psi . Kt Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Function Literal Ċ import Ġorg . jetbrains . kotlin . psi . Kt Loop Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Named Function Ċ import Ġorg . jetbrains . kotlin . psi . Kt Property Accessor Ċ import Ġorg . jetbrains . kotlin . psi . Kt Psi Factory Ċ import Ġorg . jetbrains . kotlin . psi . Kt Return Expression Ċ import Ġorg . jetbrains . kotlin . resolve . Binding Context Ċ import Ġorg . jetbrains . kotlin . types . Kotlin Type Ċ import Ġorg . jetbrains . kotlin . ui . editor s . Kotlin Editor Ċ import Ġorg . jetbrains . kotlin . ui . editor s . selection . handlers . siblings Ċ import Ġorg . jetbrains . kotlin . ui . formatter . format Code Ċ import Ġorg . jetbrains . kotlin . types . isError Ċ Ċ public Ġclass ĠKotlin ConvertTo Expression Body Ass ist Proposal ( editor : ĠKotlin Editor ) Ġ: ĠKotlin Quick Ass ist Proposal ( editor ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġis Applicable ( psi Element : ĠPsi Element ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdeclaration Ġ= ĠPsi Tree Util . getParent OfType ( psi Element , ĠK t Declaration With Body :: class . java ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġget Binding Context ( declaration . get Containing Kt File ()) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġcalc Value ( declaration , Ġcontext ) ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue Ġ!= Ġnull Ġ&& Ġ! contains Return ( value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Display String (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Convert Ġto Ġexpression Ġbody " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġapply ( document : ĠID ocument , Ġpsi Element : ĠPsi Element ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdeclaration Ġ= ĠPsi Tree Util . getParent OfType ( psi Element , ĠK t Declaration With Body :: class . java ) !! ĊĠĠĠĠĠĠĠ Ġval Ġanalysis Result With Provider Ġ= Ġget Analysis Result With Provider ( declaration . get Containing Kt File ()) ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġanalysis Result With Provider . analysis Result . binding Context ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġcalc Value ( declaration , Ġcontext ) !! ĊĊĠĠĠĠĠĠĠ Ġval Ġset Unit Type : ĠBoolean Ġ= Ġif Ġ(! declaration . has Declared ReturnType () Ġ&& Ġdeclaration Ġis ĠK t Named Function ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Type Ġ= Ġcontext . getType ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Type Ġ!= Ġnull Ġ&& Ġ! Kotlin Built Ins . is Unit ( valueType ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreplace Body ( declaration , Ġvalue , Ġeditor ) ĊĊĠĠĠĠĠĠĠ Ġval Ġomit Type Ġ= Ġ( declaration . has Declared ReturnType () Ġ|| Ġset Unit Type ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration Ġis ĠK t Callable Declaration ĊĊĠĠĠĠĠĠĠ Ġinsert And Select Type ( declaration , Ġset Unit Type , Ġomit Type , Ġeditor ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreplace Body ( declaration : ĠK t Declaration With Body , Ġnew Body : ĠK t Expression , Ġeditor : ĠKotlin Editor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġdeclaration . getBody Expression () !! ĊĠĠĠĠĠĠĠ Ġval Ġpsi Factory Ġ= ĠK t Psi Factory ( declaration ) ĊĠĠĠĠĠĠĠ Ġval Ġeq Token Ġ= Ġpsi Factory . create EQ (). getText () ĊĊĠĠĠĠĠĠĠ Ġval Ġline Delimiter Ġ= ĠText Utilities . getDefault Line Delimiter ( editor . java Editor . get Viewer (). getDocument ()) ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġeditor . eclipse File Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġvalue Text Ġ= Ġformat Code ( new Body . node . text , Ġfile . name , Ġpsi Factory , Ġfile . project . code Style ) ĊĊĠĠĠĠĠĠĠ Ġreplace ( body , Ġ"$ eq Token Ġ$ value Text ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinsert And Select Type ( declaration : ĠK t Declaration With Body , Ġset Unit Type : ĠBoolean , Ġomit Type : ĠBoolean , Ġeditor : ĠKotlin Editor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġdeclaration . getBody Expression () !! ĊĊĠĠĠĠĠĠĠ Ġif Ġ( omit Type Ġ&& Ġ! set Unit Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcallable Declaration Ġ= Ġdeclaration Ġas ĠK t Callable Declaration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ref Ġ= Ġcallable Declaration . getType Reference () !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolon Ġ= Ġcallable Declaration . get Colon () !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Ġ= ĠText Range ( getStart Offset ( colon , Ġeditor ), Ġget End Offset ( type Ref , Ġeditor )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeditor . java Editor . select And Re veal ( range . getStart Offset (), Ġrange . getLength ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( set Unit Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement To Place Type After Ġ= Ġbody . siblings ( forward Ġ= Ġfalse , Ġwith It self Ġ= Ġfalse ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Ġ{ Ġit Ġ! is ĠPsi WhiteSpace Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġget End Offset ( element To Place Type After , Ġeditor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstring To Insert Ġ= Ġ": Ġ${ Default Built Ins . Instance . get Unit Type (). toString () }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsert After ( element To Place Type After , Ġstring To Insert ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( omit Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeditor . java Editor . select And Re veal ( offset , Ġstring To Insert . length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalc Value ( declaration : ĠK t Declaration With Body , Ġcontext : ĠBinding Context ): ĠK t Expression ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( declaration Ġis ĠK t Function Literal ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġdeclaration . getBody Expression () ĊĠĠĠĠĠĠĠ Ġif Ġ(! declaration . has Block Body () Ġ|| Ġbody Ġ! is ĠK t Block Expression ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġstatement Ġ= Ġbody . getState ments (). single OrNull () Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġwhen Ġ( statement ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Return Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstatement . get Returned Expression () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO : ĠI MO Ġthis Ġis Ġnot Ġgood Ġcode , Ġthere Ġshould Ġbe Ġa Ġway Ġto Ġdetect Ġthat ĠK t Expression Ġdoes Ġnot Ġhave Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Declaration , Ġis ĠK t Loop Expression Ġ-> Ġreturn Ġnull Ġ// Ġis ĠK t Expression Ġbut Ġdoes Ġnot Ġhave Ġvalue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( statement Ġis ĠK t Binary Expression Ġ&& Ġstatement . get Operation Token () Ġ== ĠK t Tokens . EQ ) Ġreturn Ġnull Ġ// Ġassignment Ġdoes Ġnot Ġhave Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpression Type Ġ= Ġcontext . getType ( statement ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Kotlin Built Ins . is Unit ( expression Type ) Ġ&& Ġ! Kotlin Built Ins . is Nothing ( expression Type )) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstatement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcontains Return ( element : ĠPsi Element ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( element Ġis ĠK t Return Expression ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ// TODO : Ġwould Ġbe Ġbetter Ġto Ġhave Ġsome Ġinterface Ġof Ġdeclaration Ġwhere Ġreturn Ġcan Ġbe Ġused ĊĠĠĠĠĠĠĠ Ġif Ġ( element Ġis ĠK t Named Function Ġ|| Ġelement Ġis ĠK t Property Accessor ) Ġreturn Ġfalse Ġ// Ġcan Ġhappen Ġinside ĊĊĠĠĠĠĠĠĠ Ġvar Ġchild Ġ= Ġelement . getFirst Child () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( child Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( contains Return ( child )) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Ġ= Ġchild . getNext Sibling () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠK t Callable Declaration . setType ( type : ĠKotlin Type ) Ġ{ ĊĠĠĠ Ġif Ġ( type . isError ) Ġreturn ĊĠĠĠ Ġval Ġtype Reference Ġ= ĠK t Psi Factory ( getProject ()). create Type ( Ide Descriptor Render ers . SOURCE _ CODE . render Type ( type )) ĊĠĠĠ Ġset Type Reference ( type Reference ) Ċ }