/* Ċ Ġ* Ġ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 . j 2 k Ċ Ċ import Ġjava . io . File Ċ import Ġcom . intellij . openapi . util . io . File Util Ċ import Ġjava . util . regex . Pattern Ċ import Ġcom . intellij . test Framework . Light Platform TestCase Ċ import Ġcom . intellij . psi . code Style . Code Style Manager Ċ import Ġorg . jetbrains . kotlin . test . Jet TestUtils Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . command . Write Command Action Ċ import Ġorg . jetbrains . kotlin . test . util . trim Indent Ċ import Ġorg . jetbrains . kotlin . idea . j 2 k . J 2 k Post Processor Ċ import Ġorg . jetbrains . kotlin . idea . Jet With J dk And Runtime Light Project Descriptor Ċ import Ġcom . intellij . psi . Psi Java File Ċ import Ġorg . jetbrains . kotlin . psi . Jet File Ċ import Ġorg . jetbrains . kotlin . idea . j 2 k . Ide a Resolver For Converter Ċ Ċ public Ġabstract Ġclass ĠAbstract Java To Kotlin Converter Single File Test Ġ: ĠAbstract Java To Kotlin Converter Test () Ġ{ ĊĠĠĠ Ġval Ġtest Header Pattern Ġ= ĠPattern . compile ("// ( element | expression | statement | method | class | file | comp )\ n ") ĊĊĠĠĠ Ġpublic Ġfun Ġdo Test ( java Path : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Ġ= ĠLight Platform TestCase . getProject () !! ĊĠĠĠĠĠĠĠ Ġval Ġjava File Ġ= ĠFile ( java Path ) ĊĠĠĠĠĠĠĠ Ġval Ġfile Contents Ġ= ĠFile Util . load File ( java File , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġval Ġmatcher Ġ= Ġtest Header Pattern . matcher ( file Contents ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( prefix , Ġjava Code ) Ġ= Ġif Ġ( matcher . find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( matcher . group (). trim (). substring ( 2 ), Ġmatcher . replace First ("")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" file ", Ġfile Contents ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġparse Boolean ( text : ĠString ): ĠBoolean Ġ= Ġwhen Ġ( text ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" true " Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" false " Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unknown Ġoption Ġvalue : Ġ$ text ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġsettings Ġ= ĠConverter Settings . default Settings . copy () ĊĠĠĠĠĠĠĠ Ġval Ġdirectives Ġ= ĠJet TestUtils . parse Directives ( java Code ) ĊĠĠĠĠĠĠĠ Ġfor Ġ(( name , Ġvalue ) Ġin Ġdirectives ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" force NotNull Types " Ġ-> Ġsettings . force NotNull Types Ġ= Ġparse Boolean ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" specify Local Variable Type ByDefault " Ġ-> Ġsettings . specify Local Variable Type ByDefault Ġ= Ġparse Boolean ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" specify FieldType ByDefault " Ġ-> Ġsettings . specify FieldType ByDefault Ġ= Ġparse Boolean ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" open ByDefault " Ġ-> Ġsettings . open ByDefault Ġ= Ġparse Boolean ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unknown Ġoption : Ġ$ name ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġraw Converted Ġ= Ġwhen Ġ( prefix ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" element " Ġ-> Ġelement To Kotlin ( java Code , Ġsettings , Ġproject ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" expression " Ġ-> Ġexpression To Kotlin ( java Code , Ġsettings , Ġproject ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" statement " Ġ-> Ġstatement To Kotlin ( java Code , Ġsettings , Ġproject ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" method " Ġ-> Ġmethod To Kotlin ( java Code , Ġsettings , Ġproject ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" class " Ġ-> Ġfile To Kotlin ( java Code , Ġsettings , Ġproject ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" file " Ġ-> Ġfile To Kotlin ( java Code , Ġsettings , Ġproject ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Specify Ġwhat Ġis Ġit : Ġfile , Ġclass , Ġmethod , Ġstatement Ġor Ġexpression Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" using Ġthe Ġfirst Ġline Ġof Ġtest Ġdata Ġfile ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġre format In Fun Ġ= Ġprefix Ġin Ġset Of (" element ", Ġ" expression ", Ġ" statement ") ĊĊĠĠĠĠĠĠĠ Ġvar Ġactual Ġ= Ġre format ( raw Converted , Ġproject , Ġre format In Fun ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( prefix Ġ== Ġ" file ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual Ġ= Ġadd Errors Dump ( create Kotlin File ( actual )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġkotlin Path Ġ= Ġjava Path . replace (". java ", Ġ". kt ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected File Ġ= ĠFile ( kotlin Path ) ĊĠĠĠĠĠĠĠ ĠJet TestUtils . assertEquals ToFile ( expected File , Ġactual ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġre format ( text : ĠString , Ġproject : ĠProject , Ġin Fun Context : ĠBoolean ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtext To Format Ġ= Ġif Ġ( in Fun Context ) Ġ" fun Ġconverted Temp () Ġ{\ n $ text \ n }" Ġelse Ġtext ĊĊĠĠĠĠĠĠĠ Ġval Ġconverted File Ġ= ĠJet TestUtils . create File (" converted ", Ġtext To Format , Ġproject ) ĊĠĠĠĠĠĠĠ ĠWrite Command Action . run Write Command Action ( project ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCode Style Manager . getInstance ( project ) !!. re format ( converted File ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġre formatted Text Ġ= Ġconverted File . getText () !! ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( in Fun Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre formatted Text . remove First Line (). remove Last Line (). trim Indent () ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre formatted Text ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġelement To Kotlin ( text : ĠString , Ġsettings : ĠConverter Settings , Ġproject : ĠProject ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile With Text Ġ= Ġcreate Java File ( text ) ĊĠĠĠĠĠĠĠ Ġval Ġconverter Ġ= ĠJava To Kotlin Converter ( project , Ġsettings , ĠFiles Conversion Scope ( listOf ( file With Text )), ĠIde a Reference Searcher , ĠIde a Resolver For Converter ) ĊĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġfile With Text . getFirst Child () !! ĊĠĠĠĠĠĠĠ Ġreturn Ġconverter . elements To Kotlin ( listOf ( element Ġto ĠJ 2 k Post Processor ( file With Text ))) [ 0 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfile To Kotlin ( text : ĠString , Ġsettings : ĠConverter Settings , Ġproject : ĠProject ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate Java File ( text ) ĊĠĠĠĠĠĠĠ Ġval Ġconverter Ġ= ĠJava To Kotlin Converter ( project , Ġsettings , ĠFiles Conversion Scope ( listOf ( file )), ĠIde a Reference Searcher , ĠIde a Resolver For Converter ) ĊĠĠĠĠĠĠĠ Ġreturn Ġconverter . elements To Kotlin ( listOf ( file Ġto ĠJ 2 k Post Processor ( file ))) [ 0 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmethod To Kotlin ( text : ĠString , Ġsettings : ĠConverter Settings , Ġproject : ĠProject ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġfile To Kotlin (" final Ġclass ĠC Ġ{" Ġ+ Ġtext Ġ+ Ġ" }", Ġsettings , Ġproject ). replaceAll (" class ĠC Ġ\\ {", Ġ"") ĊĠĠĠĠĠĠĠ Ġreturn Ġresult . substring ( 0 , Ġ( result . lastIndexOf (" } ")) ). trim () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstatement To Kotlin ( text : ĠString , Ġsettings : ĠConverter Settings , Ġproject : ĠProject ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmethod To Kotlin (" void Ġmain () Ġ{" Ġ+ Ġtext Ġ+ Ġ" }", Ġsettings , Ġproject ) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult . substring ( 0 , Ġresult . lastIndexOf (" } ")). replace First (" fun Ġmain \\ (\\ ) Ġ\\ {", Ġ""). trim () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexpression To Kotlin ( code : ĠString , Ġsettings : ĠConverter Settings , Ġproject : ĠProject ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġstatement To Kotlin (" final ĠObject Ġo Ġ=" Ġ+ Ġcode Ġ+ Ġ" }", Ġsettings , Ġproject ) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult . replace First (" val Ġo : Any \\ ? Ġ= Ġ", Ġ""). replace First (" val Ġo : Any Ġ= Ġ", Ġ""). replace First (" val Ġo Ġ= Ġ", Ġ""). trim () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Project Descriptor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ= ĠJet With J dk And Runtime Light Project Descriptor . INSTANCE ĊĊĠĠĠ Ġprivate Ġfun ĠString . remove First Line (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlast NewLine Ġ= ĠindexOf ('\ n ') ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( last NewLine Ġ== Ġ- 1 ) Ġ"" Ġelse Ġsubstring ( last NewLine ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString . remove Last Line (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlast NewLine Ġ= Ġlast IndexOf ('\ n ') ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( last NewLine Ġ== Ġ- 1 ) Ġ"" Ġelse Ġsubstring ( 0 , Ġlast NewLine ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Java File ( text : ĠString ): ĠPsi Java File Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmy Fixture . configure By Text (" converter Test File . java ", Ġtext ) Ġas ĠPsi Java File ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Kotlin File ( text : ĠString ): ĠJet File Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmy Fixture . configure By Text (" converter Test File . kt ", Ġtext ) Ġas ĠJet File ĊĠĠĠ Ġ} Ċ } Ċ