/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 0 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . util . deleg ator patch er Ċ Ċ import Ġjava . io . File Ċ import Ġjava . util .* Ċ Ċ enum Ġclass ĠMode Ġ{ Ġ// ĠSee Ġkotlin c - deleg ator / README ĊĠĠĠ ĠM VN , Ġ// ĠCompilation Ġin Ġ" binary Ġdependency Ġon Ġthe Ġcompiler Ġfrom Ġmaven Ġartifacts " Ġmode . ĠAny ĠIDEA Ġrelease Ġbranch Ġ( master , Ġ 2 0 3 , Ġ 2 0 2 , Ġ 2 0 1 , Ġ...) ĊĠĠĠ ĠSRC , Ġ// ĠCompilation Ġin Ġ" source Ġdependency Ġon Ġthe Ġcompiler " Ġmode . ĠAny Ġ` kt - ` Ġbranch Ċ } Ċ Ċ object ĠConfig Ġ{ ĊĠĠĠ Ġprivate Ġval Ġproperties Ġ= ĠProperties () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresource Name Ġ= Ġ" model . properties " ĊĠĠĠĠĠĠĠ Ġval Ġmodel Resource Ġ= ĠConfig :: class . java . getResource ("/ $ resourceName ") Ġ?: Ġerror (" Can 't Ġfind Ġresource Ġ'$ resourceName '") ĊĠĠĠĠĠĠĠ Ġmodel Resource . open Stream (). use Ġ{ Ġproperties . load ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmvn Version Ġ= Ġproperties . getProperty (" kotlin c . version ") ĊĠĠĠ Ġprivate Ġconst Ġval ĠBO OT STR AP _ K OT LIN _ COMPILER _ VERSION Ġ= Ġ" 1 . 4 . 2 5 5 - SNAPSHOT " ĊĠĠĠ Ġfun Ġget Kotlin c Version ( mode : ĠMode ): ĠString Ġ= Ġwhen Ġ( mode ) Ġ{ ĊĠĠĠĠĠĠĠ ĠMode . MV N Ġ-> Ġmvn Version ĊĠĠĠĠĠĠĠ ĠMode . SRC Ġ-> ĠBO OT STR AP _ K OT LIN _ COMPILER _ VERSION ĊĠĠĠ Ġ} Ċ } Ċ Ċ const Ġval ĠMODULE _ DIR Ġ= Ġ"\ $ MODULE _ DIR \ $" Ċ const Ġval ĠM AV EN _ REPOSITORY Ġ= Ġ"\ $ MA VEN _ REPOSITORY \ $" Ċ const Ġval ĠPROJECT _ DIR Ġ= Ġ"\ $ PROJECT _ DIR \ $" Ċ const Ġval ĠTHIS _ MODULE _ NAME Ġ= Ġ" util . deleg ator - patch er " Ċ Ċ enum Ġclass ĠLibrary Level Ġ{ ĊĠĠĠ ĠMODULE , ĠPROJECT Ċ } Ċ Ċ class ĠMaven Artifact ( ĊĠĠĠ Ġprivate Ġval ĠgroupId : ĠString , ĊĠĠĠ Ġval Ġartifact Id : ĠString , ĊĠĠĠ Ġval Ġfix ated Version : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġprivate Ġval Ġdependencies : ĠList < Maven Artifact > Ġ= Ġempty List () Ċ ) Ġ{ ĊĠĠĠ Ġval Ġflat Map Dependencies : ĠList < Maven Artifact > Ġby Ġlazy Ġ{ ĠlistOf ( this ) Ġ+ Ġdependencies . flatMap Ġ{ Ġit . flatMap Dependencies Ġ} Ġ} ĊĠĠĠ Ġfun Ġget Bootstrap Artifact Jar ( mode : ĠMode , Ġlibrary Level : ĠLibrary Level ) Ġ= Ġget Bootstrap Artifact Jar Internal ( getVersion ( mode ), Ġlibrary Level ) ĊĠĠĠ Ġfun Ġget Maven Artifact Jar ( mode : ĠMode ) Ġ= Ġget Maven Artifact Jar Internal ( getVersion ( mode )) ĊĠĠĠ Ġfun Ġget Maven Artifact Sources ( mode : ĠMode ) Ġ= Ġ"$ MA VEN _ REPOSITORY /${ get Artifact Path Relative To Maven Repo ( getVersion ( mode )) }- sources . jar " ĊĠĠĠ Ġfun Ġcoordinates ( mode : ĠMode ) Ġ= Ġ"$ groupId :$ artifactId :${ getVersion ( mode )}" ĊĠĠĠ Ġfun Ġpatch Project Model File ( xml : ĠFile , Ġlibrary Level : ĠLibrary Level , Ġmode : ĠMode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġxml . read Text () ĊĠĠĠĠĠĠĠ Ġval Ġreplacement Ġ= ĠRegex . escape Replacement ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMode . MV N Ġ-> Ġget Maven Artifact Jar Internal ( Config . get Kotlin c Version ( mode )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMode . SRC Ġ-> Ġget Bootstrap Artifact Jar Internal ( Config . get Kotlin c Version ( mode ), Ġlibrary Level ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġbin Mode Regex . replace ( text , Ġreplacement ) ĊĠĠĠĠĠĠĠ Ġsrc Mode Module Level Regex . replace ( text , Ġreplacement ) ĊĠĠĠĠĠĠĠ Ġsrc Mode Project Level Regex . replace ( text , Ġreplacement ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġversion Regex Ġ= Ġ""" [\ d \ w \ .\ - ]+ ? """ ĊĠĠĠ Ġprivate Ġval Ġbin Mode Regex Ġ= ĠRegex ( getM aven Artifact Jar Internal (" VERSION "). escape (). replace (" VERSION ", Ġversion Regex )) ĊĠĠĠ Ġprivate Ġval Ġsrc Mode Project Level Regex Ġ= ĠRegex ( get Bootstrap Artifact Jar Internal (" VERSION ", ĠLibrary Level . PROJECT ). escape (). replace (" VERSION ", Ġversion Regex )) ĊĠĠĠ Ġprivate Ġval Ġsrc Mode Module Level Regex Ġ= ĠRegex ( get Bootstrap Artifact Jar Internal (" VERSION ", ĠLibrary Level . MODULE ). escape (). replace (" VERSION ", Ġversion Regex )) ĊĠĠĠ Ġprivate Ġfun Ġget Version ( mode : ĠMode ): ĠString Ġ= Ġfix ated Version Ġ?: ĠConfig . get Kotlin c Version ( mode ) ĊĠĠĠ Ġprivate Ġfun Ġget Artifact Path Relative To Maven Repo ( version : ĠString ) Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ ĠgroupId . replace (".", Ġ"/ "), ĊĠĠĠĠĠĠĠ Ġartifact Id , ĊĠĠĠĠĠĠĠ Ġversion , ĊĠĠĠĠĠĠĠ Ġ"$ artifactId -$ version " ĊĠĠĠ Ġ). join ToString ("/") ĊĠĠĠ Ġprivate Ġfun Ġget Artifact Prefix Jar Internal ( version : ĠString ) Ġ= Ġ"${ get Artifact Path Relative To Maven Repo ( version )}. jar " ĊĠĠĠ Ġprivate Ġfun Ġget Maven Artifact Jar Internal ( version : ĠString ) Ġ= Ġ"$ MA VEN _ REPOSITORY /${ get Artifact Prefix Jar Internal ( version )}" ĊĠĠĠ Ġprivate Ġfun Ġget Bootstrap Artifact Jar Internal ( version : ĠString , Ġlibrary Level : ĠLibrary Level ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( groupId Ġ!= Ġ" org . jetbrains . kotlin ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Maven Artifact Jar Internal ( version ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrelative To Kotlin Ide Ġ= Ġ" kotlin c / prepare / ide - plugin - dependencies /$ artifactId / build / libs /$ artifactId -$ version . jar " ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( library Level ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLibrary Level . PROJECT Ġ-> Ġ"$ PROJECT _ DIR /$ relative To Kotlin Ide " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLibrary Level . MODULE Ġ-> Ġ"$ MODULE _ DIR / ../../../ $ relative To Kotlin Ide " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun ĠString . escape () Ġ= Ġreplace (".", Ġ"\\ . "). replace ("$ ", Ġ"\\ $ "). replace ("/", Ġ"\\ /") Ċ } Ċ Ċ class ĠDeleg ator ( ĊĠĠĠ Ġprivate Ġval Ġidentifier : ĠString , ĊĠĠĠ Ġprivate Ġval Ġmaven Artifact : ĠMaven Artifact , ĊĠĠĠ Ġprivate Ġval Ġlibrary Level : ĠLibrary Level , ĊĠĠĠ Ġprivate Ġval Ġkotlin c Test Modules : ĠList < String > Ġ= Ġempty List (), ĊĠĠĠ Ġprivate Ġval Ġforce M vn Mode Only : ĠBoolean Ġ= Ġfalse Ċ ) Ġ{ ĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġidentifier : ĠString , ĊĠĠĠĠĠĠĠ ĠgroupId : ĠString Ġ= Ġ" org . jetbrains . kotlin ", ĊĠĠĠĠĠĠĠ Ġlibrary Level : ĠLibrary Level Ġ= ĠLibrary Level . MODULE , ĊĠĠĠĠĠĠĠ Ġkotlin c Test Modules : ĠList < String > Ġ= Ġempty List () ĊĠĠĠ Ġ) Ġ: Ġthis ( identifier , ĠMaven Artifact ( groupId , Ġ"$ identifier - for - ide "), Ġlibrary Level , Ġkotlin c Test Modules ) ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Module I ml Content ( project Root : ĠFile , Ġmode : ĠMode ) Ġ= Ġ""" ĊĠĠĠĠĠĠĠ Ġ| <? xml Ġversion =" 1 . 0 " Ġencoding =" UTF - 8 "?> ĊĠĠĠĠĠĠĠ Ġ|< module Ġtype =" JAVA _ MODULE " Ġversion =" 4 "> ĊĠĠĠĠĠĠĠ Ġ| Ġ Ġ< component Ġname =" New Module Root Manager " Ġinherit - compiler - output =" true "> ĊĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ< exclude - output Ġ/> ĊĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ< content Ġurl =" file :// $ MODULE _ DIR " Ġ/> ĊĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ< order Entry Ġtype =" inherited J dk " Ġ/> ĊĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ< order Entry Ġtype =" source Folder " Ġfor Tests =" false " Ġ/> ĊĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ${ getModule Library ( project Root , Ġmode )} ĊĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ${ get Kotlin c Modules ( project Root , Ġmode )} ĊĠĠĠĠĠĠĠ Ġ| Ġ Ġ</ component > ĊĠĠĠĠĠĠĠ Ġ| </ module > ĊĠĠĠ Ġ""" . trim Margin With Interpol ations (). line Sequence (). filter Ġ{ Ġit . isNotBlank () Ġ}. join ToString ("\ n ") ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Project Library I ml Content ( mode : ĠMode ) Ġ= Ġ""" ĊĠĠĠĠĠĠĠ Ġ| <? xml Ġversion =" 1 . 0 " Ġencoding =" UTF - 8 "?> ĊĠĠĠĠĠĠĠ Ġ|< component Ġname =" library Table "> ĊĠĠĠĠĠĠĠ Ġ| Ġ Ġ${ get Library With Actual J ars ( mode )} ĊĠĠĠĠĠĠĠ Ġ| </ component > ĊĠĠĠ Ġ""" . trim Margin With Interpol ations (). line Sequence (). filter Ġ{ Ġit . isNotBlank () Ġ}. join ToString ("\ n ") ĊĊĠĠĠ Ġprivate Ġfun Ġget Module Library ( project Root : ĠFile , Ġmode : ĠMode ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscope Ġ= Ġif Ġ( get Kotlin c Modules ( project Root , Ġmode ). isNotBlank ()) Ġ" Ġscope =\" RUNTIME \"" Ġelse Ġ"" ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( library Level ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLibrary Level . MODULE Ġ-> Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|< order Entry Ġtype =" module - library " Ġexported ="" $ scope > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġ${ get Library With Actual J ars ( mode )} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| </ order Entry > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin With Interpol ations () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLibrary Level . PROJECT Ġ-> Ġ""" < order Entry Ġtype =" library " Ġexported ="" $ scope Ġname =" kotlin c .$ identifier " Ġlevel =" project " Ġ/> """ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Kotlin c Modules ( project Root : ĠFile , Ġmode : ĠMode ) Ġ= Ġwhen Ġ( mode ) Ġ{ ĊĠĠĠĠĠĠĠ ĠMode . MV N Ġ-> Ġ"" ĊĠĠĠĠĠĠĠ ĠMode . SRC Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkotlin Main Modules Ġ= Ġmaven Artifact . flatMap Dependencies ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Root . resolve (" kotlin c / build / artifacts - for - ide - to - modules - mapping /${ it . artifactId }. txt ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . exists () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . read Lines () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ" kotlin ${ it . replace (" :", Ġ". ") }. main " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( kotlin Main Modules Ġ+ Ġkotlin c Test Modules ). join ToString ("\ n ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" < order Entry Ġtype =" module " Ġmodule - name ="$ it " Ġexported ="" Ġscope =" PROVIDED " Ġ/> """ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Library With Actual J ars ( mode : ĠMode ) Ġ= Ġwhen Ġ( mode ) Ġ{ ĊĠĠĠĠĠĠĠ ĠMode . MV N Ġ-> Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|< library Ġname =" kotlin c .$ identifier " Ġtype =" repository "> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġ< properties Ġ${ if Ġ( maven Artifact . flatMap Dependencies . size Ġ> Ġ 1 ) Ġ"" Ġelse Ġ" include - trans itive - deps =\" false \" Ġ"} maven - id ="${ maven Artifact . coordinates ( mode )}" Ġ/> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġ< CLASSES > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ${ get Classes ( mode )} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġ</ CLASSES > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġ< J AV AD OC Ġ/> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġ< SOURCES > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ${ get Sources For M vn Mode ()} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġ</ SOURCES > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| </ library > ĊĠĠĠĠĠĠĠ Ġ""" . trim Margin With Interpol ations () ĊĠĠĠĠĠĠĠ ĠMode . SRC Ġ-> Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|< library Ġname =" kotlin c .$ identifier "> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġ< CLASSES > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ${ get Classes ( mode )} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġ</ CLASSES > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġ< J AV AD OC Ġ/> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġ< SOURCES Ġ/> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| </ library > ĊĠĠĠĠĠĠĠ Ġ""" . trim Margin With Interpol ations () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Sources For M vn Mode () Ġ= Ġmaven Artifact . flatMap Dependencies . join ToString ("\ n ") Ġ{ ĊĠĠĠĠĠĠĠ Ġ""" < root Ġurl =" jar ://${ it . getM aven Artifact Sources ( Mode . MV N )} ! /" Ġ/> """ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Classes ( mode : ĠMode ) Ġ= Ġmaven Artifact . flatMap Dependencies . join ToString ("\ n ") Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMode . SRC Ġ-> Ġ""" < root Ġurl =" jar ://${ it . get Bootstrap Artifact Jar ( mode , Ġlibrary Level )} ! /" Ġ/> """ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMode . MV N Ġ-> Ġ""" < root Ġurl =" jar ://${ it . getM aven Artifact Jar ( mode )} ! /" Ġ/> """ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpatch Project Model Files ( project Root : ĠFile , Ġkotlin Root : ĠFile , Ġ_ mode : ĠMode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmode Ġ= Ġif Ġ( force M vn Mode Only ) ĠMode . MV N Ġelse Ġ_ mode ĊĠĠĠĠĠĠĠ Ġval Ġdot Ide a Ġ= Ġproject Root . resolve (". idea ") ĊĠĠĠĠĠĠĠ Ġif Ġ( library Level Ġ== ĠLibrary Level . PROJECT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlibrary Xml Ġ= Ġdot Ide a . resolve (" libraries / kotlin c _${ identifier . replace ("- ", Ġ"_ ") }. xml ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( library Xml . exists ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlibrary Xml . write Text ( generate Project Library I ml Content ( mode )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmodule I ml Ġ= Ġkotlin Root . resolve (" kotlin c - deleg ator /$ identifier / kotlin c - deleg ator .$ identifier . im l ") ĊĠĠĠĠĠĠĠ Ġcheck ( module I ml . exists ()) ĊĠĠĠĠĠĠĠ Ġmodule I ml . write Text ( generate Module I ml Content ( project Root , Ġmode )) ĊĠĠĠĠĠĠĠ Ġdot Ide a . walk Top Down (). filter Ġ{ Ġit . extension Ġ== Ġ" xml " Ġ}. forEach Ġ{ Ġxml Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmaven Artifact . patch Project Model File ( xml , Ġlibrary Level , Ġmode ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠ Ġval Ġmode Ġ= ĠMode . valueOf ( args . single (). toUpperCase ()) ĊĠĠĠ Ġval Ġproject Root Public Ġ= Ġgenerate Sequence ( File (". "). canonical File ) Ġ{ Ġit . parent File Ġ}. first Ġ{ Ġit . resolve (" kotlin . intellij - kotlin . im l "). exists () Ġ} ĊĠĠĠ Ġval Ġproject Root Private Ġ= Ġproject Root Public . resolve (" .. "). take If Ġ{ Ġit . resolve (" kotlin . kotlin - ide . im l "). exists () Ġ} ĊĠĠĠ Ġfor Ġ(( project Root , Ġkotlin Root ) Ġin ĠlistOf NotNull ( project Root Public Ġto Ġproject Root Public , Ġproject Root Private ?. let Ġ{ Ġit Ġto Ġit . resolve (" kotlin ") Ġ})) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdeleg ators Dir Ġ= Ġkotlin Root . resolve (" kotlin c - deleg ator ") ĊĠĠĠĠĠĠĠ Ġval Ġreal Modules Ġ= Ġdeleg ators Dir . list Files () !!. filter Ġ{ Ġit . isDirectory Ġ&& Ġit . name Ġ!= ĠTHIS _ MODULE _ NAME Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdeleg ators Ġ= Ġget Deleg ators ( project Root , Ġmode ) ĊĠĠĠĠĠĠĠ Ġcheck ( deleg ators . size Ġ== Ġreal Modules . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" deleg ators Ġsize Ġ(${ deleg ators . size }) Ġand Ġmodules Ġnumber Ġ(${ real Modules . size }) Ġare Ġexpected Ġto Ġbe Ġequal " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( mode Ġ== ĠMode . SRC ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" --- ĠRunning Ġkotlin c Ġgradle ! Ġ--- ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġj ars For Ide Ġtask Ġwill Ġproduce Ġartifacts - for - ide - to - modules - mapping ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexit Code Ġ= ĠProcess Builder ("./ gradle w ", Ġ" j ars For Ide ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. directory ( project Root . resolve (" kotlin c ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. inherit IO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. waitFor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( exit Code Ġ== Ġ 0 ) Ġ{ Ġ" kotlin c Ġgradle Ġfailed Ġwith Ġexit Code Ġ$ exit Code " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" --- ĠEn ded Ġrunning Ġkotlin c Ġgradle Ġ--- ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdeleg ators . forEach Ġ{ Ġit . patch Project Model Files ( project Root , Ġkotlin Root , Ġmode ) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠString . trim Margin With Interpol ations (): ĠString Ġ{ ĊĠĠĠ Ġval Ġregex Ġ= ĠRegex (""" ^ (\ s *\ | )( \ s * ). *$ """) ĊĠĠĠ Ġval Ġout Ġ= Ġmutable ListOf < String >() ĊĠĠĠ Ġvar Ġprev Indent Ġ= Ġ"" ĊĠĠĠ Ġfor Ġ( line Ġin Ġlines ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatch Result Ġ= Ġregex . match Ent ire ( line ) ĊĠĠĠĠĠĠĠ Ġif Ġ( match Result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . add ( line . remove Prefix ( match Result . group Values [ 1 ])) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev Indent Ġ= Ġmatch Result . group Values [ 2 ] ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . add ( prev Indent Ġ+ Ġline ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġout . join ToString ("\ n ") Ċ } Ċ