/* Ċ Ġ* Ġ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 Ċ Ċ import Ġcom . intellij . openapi . editor . Editor Ċ import Ġcom . intellij . openapi . util . text . StringUtil Ċ import Ġcom . intellij . psi . util . Psi Util Core Ċ import Ġorg . jetbrains . kotlin . builtins . Kotlin Built Ins Ċ import Ġorg . jetbrains . kotlin . idea . cache s . resolve . analyze Ċ import Ġorg . jetbrains . kotlin . idea . core . re placed Ċ import Ġorg . jetbrains . kotlin . idea . ins pe ctions . Int ention Based Inspection Ċ import Ġorg . jetbrains . kotlin . lexer . Kt Tokens Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ import Ġorg . jetbrains . kotlin . resolve . constants . evaluate . Constant Expression Evaluator Ċ import Ġorg . jetbrains . kotlin . resolve . lazy . Body Resolve Mode Ċ Ċ class ĠConvert ToString Template Inspection Ġ: ĠInt ention Based Inspection < Kt Binary Expression >( ĊĠĠĠĠĠĠĠ ĠConvert ToString Template Int ention (), ĊĠĠĠĠĠĠĠ Ġ{ ĠConvert ToString Template Int ention (). should Suggest To Convert ( it ) Ġ} Ċ ) Ċ Ċ class ĠConvert ToString Template Int ention Ġ: ĠSelf Target ing Offset In dependent Int ention < Kt Binary Expression >( Kt Binary Expression :: class . java , Ġ" Convert Ġconcat enation Ġto Ġtemplate ") Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġis Applicable To ( element : ĠK t Binary Expression ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Applicable To No Parent Check ( element )) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġelement . parent ĊĠĠĠĠĠĠĠ Ġif Ġ( parent Ġis ĠK t Binary Expression Ġ&& Ġis Applicable To No Parent Check ( parent )) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġapply To ( element : ĠK t Binary Expression , Ġeditor : ĠEditor ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġelement . re placed ( build Replacement ( element )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshould Suggest To Convert ( expression : ĠK t Binary Expression ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġentries Ġ= Ġbuild Replacement ( expression ). entries ĊĠĠĠĠĠĠĠ Ġreturn Ġentries . none Ġ{ Ġit Ġis ĠK t Block String Template Entry Ġ} Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! entries . all Ġ{ Ġit Ġis ĠK t Literal String Template Entry Ġ|| Ġit Ġis ĠK t Escape String Template Entry Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġentries . count Ġ{ Ġit Ġis ĠK t Literal String Template Entry Ġ} Ġ> Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Applicable To No Parent Check ( expression : ĠK t Binary Expression ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( expression . operation Token Ġ!= ĠK t Tokens . PLUS ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġexpression Type Ġ= Ġexpression . analyze ( Body Resolve Mode . PAR TIAL ). getType ( expression ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! Kotlin Built Ins . isString ( expression Type )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġis Suit able ( expression ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Suit able ( expression : ĠK t Expression ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( expression Ġis ĠK t Binary Expression Ġ&& Ġexpression . operation Token Ġ== ĠK t Tokens . PLUS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġis Suit able ( expression . left Ġ?: Ġreturn Ġfalse ) Ġ&& Ġis Suit able ( expression . right Ġ?: Ġreturn Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Psi Util Core . has Error Element Child ( expression )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( expression . text Contains ('\ n ')) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Replacement ( expression : ĠK t Binary Expression ): ĠK t String Template Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġright Text Ġ= Ġbuild Text ( expression . right , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfold ( expression . left , Ġright Text , ĠK t Psi Factory ( expression )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfold ( left : ĠK t Expression ?, Ġright : ĠString , Ġfactory : ĠK t Psi Factory ): ĠK t String Template Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġforce Br aces Ġ= Ġ! right . isEmpty () Ġ&& Ġright . first () Ġ!= Ġ'$ ' Ġ&& Ġright . first (). is Java Identifier Part () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( left Ġis ĠK t Binary Expression Ġ&& Ġis Applicable To No Parent Check ( left )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Right Ġ= Ġbuild Text ( left . right , Ġforce Br aces ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfold ( left . left , Ġleft Right Ġ+ Ġright , Ġfactory ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Text Ġ= Ġbuild Text ( left , Ġforce Br aces ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfactory . create Expression ("\" $ left Text $ right \" ") Ġas ĠK t String Template Expression ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Text ( expr : ĠK t Expression ?, Ġforce Br aces : ĠBoolean ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( expr Ġ== Ġnull ) Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġval Ġexpression Ġ= ĠK t Psi Util . safe De parent hesize ( expr ) ĊĠĠĠĠĠĠĠ Ġval Ġexpression Text Ġ= Ġexpression . text ĊĠĠĠĠĠĠĠ Ġwhen Ġ( expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Constant Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbinding Context Ġ= Ġexpression . analyze ( Body Resolve Mode . PAR TIAL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġbinding Context . getType ( expression ) !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Kotlin Built Ins . is Char ( type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġexpression Text . remove Prefix ("' "). remove Suffix ("' ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstant Ġ= ĠConstant Expression Evaluator . get Constant ( expression , Ġbinding Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstring Value Ġ= Ġconstant ?. getValue ( type ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stringValue Ġ== Ġexpression Text ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠString Util . escape String Characters ( stringValue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t String Template Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Ġ= Ġif Ġ( expression Text . startsWith ("\" \" \" ") Ġ&& Ġexpression Text . endsWith ("\" \"\ "" )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġun quoted Ġ= Ġexpression Text . substring ( 3 , Ġexpression Text . length Ġ- Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString Util . escape String Characters ( un quoted ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString Util . un quote String ( expression Text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( force Br aces Ġ&& Ġbase . endsWith ('$ ')) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbase . drop Last ( 1 ) Ġ+ Ġ"\\ $" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbase ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Name Reference Expression Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"$ " Ġ+ Ġ( if Ġ( force Br aces ) Ġ" {$ expression Text }" Ġelse Ġexpression Text ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ"\ ${ $ expression Text }" ĊĠĠĠ Ġ} Ċ } Ċ