/* Ċ Ġ* Ġ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 . refactor ing . pull Up Ċ Ċ import Ġcom . intellij . openapi . util . Key Ċ import Ġcom . intellij . psi .* Ċ import Ġcom . intellij . psi . search . sear ches . References Search Ċ import Ġcom . intellij . refactor ing . enc aps ulate Fields .* Ċ import Ġcom . intellij . refactor ing . member Pull Up . Java Pull Up Helper Ċ import Ġcom . intellij . refactor ing . member Pull Up . Pull Up Data Ċ import Ġcom . intellij . refactor ing . member Pull Up . Pull Up Helper Ċ import Ġcom . intellij . refactor ing . util . Doc Comment Policy Ċ import Ġcom . intellij . refactor ing . util . Ref actor ing Util Ċ import Ġcom . intellij . refactor ing . util . class Members . Member Info Ċ import Ġcom . intellij . util . Visibility Util Ċ import Ġorg . jetbrains . kotlin . as Java . un wrapped Ċ import Ġorg . jetbrains . kotlin . idea . code Insight . short en . addTo Short ening Wait Set Ċ import Ġorg . jetbrains . kotlin . idea . core . get OrCreate Companion Object Ċ import Ġorg . jetbrains . kotlin . idea . refactor ing . j 2 k Ċ import Ġorg . jetbrains . kotlin . idea . refactor ing . j 2 k Text Ċ import Ġorg . jetbrains . kotlin . idea . core . setVisibility Ċ import Ġorg . jetbrains . kotlin . idea . refactor ing . safe Delete . remove Override Modifier Ċ import Ġorg . jetbrains . kotlin . lexer . Kt Tokens Ċ import Ġorg . jetbrains . kotlin . load . java . Jvm Ab i Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ import Ġjava . util .* Ċ Ċ class ĠJava To Kotlin Pre conversion Pull Up Helper ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdata : ĠPull Up Data , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdummy Target Class : ĠPsi Class , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġjava Helper : ĠJava Pull Up Helper Ċ ) Ġ: ĠPull Up Helper < Member Info > Ġby Ġjava Helper Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmembers To Dummy Declarations Ġ= ĠHashMap < Psi Member , ĠK t Element >() ĊĊĠĠĠ Ġprivate Ġval Ġencaps ulate Fields Descriptor Ġ= Ġobject : ĠEn caps ulate Fields Descriptor Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Selected Fields (): ĠArray < out ĠField Descriptor >? Ġ= ĠarrayOf () ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis To En caps ulate Get () Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis To En caps ulate Set () Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis ToUse Accessors When Accessible () Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Fields Visibility () Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Accessors Visibility () Ġ= ĠPsi Modifier . PUBLIC ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Target Class () Ġ= Ġdummy Target Class ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Javadoc Policy () Ġ= ĠDoc Comment Policy . AS IS ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġfields To Usage s Ġ= ĠHashMap < Psi Field , ĠList < En caps ulate Field Usage Info >>() ĊĠĠĠ Ġprivate Ġval Ġdummy Accessor ByName Ġ= ĠHashMap < String , ĠPsi Method >() ĊĊĠĠĠ Ġprivate Ġval Ġj vm Static Annotation Ġ= ĠK t Psi Factory ( data . source Class . project ). create Annotation Entry ("@ kotlin . jvm . Jvm Static ") ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠPsi Member . original Member : ĠPsi Member ? Ġby ĠCopy able Psi UserData Property ( Key . create (" ORIGIN AL _ MEMBER ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcollect Field References To En caps ulate ( member : ĠPsi Field ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhelper Ġ= ĠEn caps ulate Field Helper . get Helper ( member . language ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval ĠfieldName Ġ= Ġmember . name ĊĠĠĠĠĠĠĠ Ġval Ġgetter Name Ġ= ĠJ vm Ab i . getter Name ( fieldName ) ĊĠĠĠĠĠĠĠ Ġval Ġsetter Name Ġ= ĠJ vm Ab i . setter Name ( fieldName ) ĊĠĠĠĠĠĠĠ Ġval Ġgetter Ġ= Ġhelper . generate Method Prototype ( member , Ġgetter Name , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġval Ġsetter Ġ= Ġhelper . generate Method Prototype ( member , Ġsetter Name , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġfield Descriptor Ġ= ĠField Descriptor Impl ( member , Ġgetter Name , Ġsetter Name , Ġgetter , Ġsetter ) ĊĠĠĠĠĠĠĠ Ġgetter ?. let Ġ{ Ġdummy Accessor ByName [ getter Name ] Ġ= Ġdummy Target Class . add ( it ) Ġas ĠPsi Method Ġ} ĊĠĠĠĠĠĠĠ Ġsetter ?. let Ġ{ Ġdummy Accessor ByName [ setter Name ] Ġ= Ġdummy Target Class . add ( it ) Ġas ĠPsi Method Ġ} ĊĠĠĠĠĠĠĠ Ġfields To Usage s [ member ] Ġ= ĠReferences Search ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. search ( member ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġhelper . create Usage ( enc aps ulate Fields Descriptor , Ġfield Descriptor , Ġit ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmove ( info : ĠMember Info , Ġsubstit utor : ĠPsi Subst it utor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmember Ġ= Ġinfo . member ĊĠĠĠĠĠĠĠ Ġval Ġmoving Super Interface Ġ= Ġmember Ġis ĠPsi Class Ġ&& Ġinfo . overrides Ġ== Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! moving Super Interface ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmember . original Member Ġ= Ġmember ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( info . is Static ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . is To Abstract Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( member Ġis ĠPsi Field Ġ&& Ġ! info . is Static ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollect Field References To En caps ulate ( member ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsuper Interface Count Ġ= ĠgetCurrent Super Interface Count () ĊĊĠĠĠĠĠĠĠ Ġval Ġadjusted Subst it utor Ġ= Ġsubstit utor . subst itution Map . entries . fold ( subst it utor ) Ġ{ Ġsubst , Ġ( type Parameter , Ġtype ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubstit uted Upper Bound Ġ= Ġsubstit utor . substitute ( Psi Intersection Type . create Intersection (* type Parameter . super Types )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubst . put ( type Parameter , Ġsubstit uted Upper Bound ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġsubst ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġjava Helper . move ( info , Ġadjusted Subst it utor ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( info . is Static ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmember . remove Override Modifier () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtarget Class Ġ= Ġdata . target Class . un wrapped Ġas ĠK t Class ĊĠĠĠĠĠĠĠ Ġif Ġ( member . has Modifier Property ( Psi Modifier . AB STR ACT ) Ġ&& Ġ! moving Super Interface ) Ġtarget Class . make Abstract () ĊĊĠĠĠĠĠĠĠ Ġval Ġpsi Factory Ġ= ĠK t Psi Factory ( member . project ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( moving Super Interface ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( getCurrent Super Interface Count () Ġ== Ġsuper Interface Count ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Text Ġ= ĠRefactor ing Util . find Reference To Class ( dummy Target Class . implements List , Ġmember Ġas ĠPsi Class )?. j 2 k Text () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Class . add Super TypeList Entry ( psi Factory . create Super Type Entry ( type Text )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmember Owner Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmember . has Modifier Property ( Psi Modifier . STATIC ) Ġ&& Ġmember Ġ! is ĠPsi Class Ġ-> Ġtarget Class . get OrCreate Companion Object () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtarget Class ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdummy Declaration Ġ: ĠK t Named Declaration Ġ= Ġwhen Ġ( member ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPsi Field Ġ-> Ġpsi Factory . create Property (" val Ġfoo Ġ= Ġ 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPsi Method Ġ-> Ġpsi Factory . create Function (" fun Ġfoo () Ġ= Ġ 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPsi Class Ġ-> Ġpsi Factory . createClass (" class ĠFoo ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġpost Process Member () Ġcall Ġorder Ġis Ġun stable Ġso Ġin Ġorder Ġto Ġstabil ize Ġresulting Ġmember Ġorder Ġwe Ġadd Ġd um m ies Ġto Ġtarget Ġclass ĊĠĠĠĠĠĠĠ Ġ// Ġand Ġreplace Ġthem Ġafter Ġpost processing ĊĠĠĠĠĠĠĠ Ġmembers To Dummy Declarations [ member ] Ġ= Ġadd Member To Target ( dummy Declaration , Ġmember Owner ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetCurrent Super Interface Count () Ġ= Ġdummy Target Class . implements List ?. reference Elements ?. size Ġ?: Ġ 0 ĊĊĠĠĠ Ġoverride Ġfun Ġpost Process Member ( member : ĠPsi Member ) Ġ{ ĊĠĠĠĠĠĠĠ Ġjava Helper . post Process Member ( member ) ĊĊĠĠĠĠĠĠĠ Ġval Ġoriginal Member Ġ= Ġmember . original Member Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġoriginal Member . original Member Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġtarget Class Ġ= Ġdata . target Class . un wrapped Ġas ? ĠK t Class Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġconverted Declaration Ġ= Ġmember . j 2 k () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( member Ġis ĠPsi Field Ġ|| Ġmember Ġis ĠPsi Method ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvisibility Modifier Ġ= ĠVisibility Util . get Visibility Modifier ( member . modifier List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( visibility Modifier Ġ== ĠPsi Modifier . PROTECT ED Ġ|| Ġvisibility Modifier Ġ== ĠPsi Modifier . PACKAGE _ LOCAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconverted Declaration . setVisibility ( Kt Tokens . PUBLIC _ KEYWORD ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnew Declaration Ġ= Ġmembers To Dummy Declarations [ original Member ]?. replace ( converted Declaration ) Ġas ĠK t Named Declaration ĊĠĠĠĠĠĠĠ Ġif Ġ( target Class . is Interface ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Declaration . remove Modifier ( Kt Tokens . AB STR ACT _ KEYWORD ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( member . has Modifier Property ( Psi Modifier . STATIC ) Ġ&& Ġnew Declaration Ġis ĠK t Named Function ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Declaration . add Annotation With Space ( jvm Static Annotation ). addTo Short ening Wait Set () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( original Member Ġis ĠPsi Field ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusage s Ġ= Ġfields To Usage s [ original Member ] Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( usage Ġin Ġusage s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Descriptor Ġ= Ġusage . field Descriptor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Light Class Ġ= Ġ( usage . reference ?. resolve () Ġas ? ĠPsi Field )?. containing Class Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgetter Ġ= Ġtarget Light Class . find Method By Signature ( field Descriptor . getter Prototype , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsetter Ġ= Ġtarget Light Class . find Method By Signature ( field Descriptor . setter Prototype , Ġfalse ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEn caps ulate Field Helper ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Helper ( usage . element !!. language ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . process Usage ( usage , Ġencaps ulate Fields Descriptor , Ġsetter , Ġgetter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }