ï»¿ /* Ċ Ġ* Ġ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 . gradle . plugin . mpp Ċ Ċ import Ġorg . gradle . api . Named Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . api . artifacts . Configuration Ċ import Ġorg . gradle . api . artifacts . Dependency Ċ import Ġorg . gradle . api . artifacts . Module Dependency Ċ import Ġorg . gradle . api . artifacts . Project Dependency Ċ import Ġorg . gradle . api . artifacts . result . Resolved Component Result Ċ import Ġorg . gradle . api . attributes . Attribute Ċ import Ġorg . gradle . api . attributes . Attribute Container Ċ import Ġorg . jetbrains . kotlin . gradle . dsl .* Ċ import Ġorg . jetbrains . kotlin . gradle . dsl . kotlin Extension Ċ import Ġorg . jetbrains . kotlin . gradle . dsl . multi platform Extension OrNull Ċ import Ġorg . jetbrains . kotlin . gradle . plugin .* Ċ import Ġorg . jetbrains . kotlin . gradle . plugin . mpp . pm 2 0 .* Ċ import Ġorg . jetbrains . kotlin . gradle . plugin . sources . Default Language Settings Builder Ċ import Ġorg . jetbrains . kotlin . gradle . plugin . sources . Kotlin Dependency Scope Ċ import Ġorg . jetbrains . kotlin . gradle . plugin . sources . get Visible Source Sets From Associate Comp il ations Ċ import Ġorg . jetbrains . kotlin . gradle . utils . get Or Put Root Project Property Ċ import Ġorg . jetbrains . kotlin . project . model .* Ċ Ċ class ĠProject Structure Metadata Module Builder Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmodules Cache Ġ= Ġmutable Map Of < Kotlin Module Identifier , ĠKotlin Module >() ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Module From Project Structure Metadata ( ĊĠĠĠĠĠĠĠ Ġcomponent : ĠResolved Component Result , ĊĠĠĠĠĠĠĠ Ġmetadata : ĠKotlin Project Structure Metadata ĊĠĠĠ Ġ): ĠKotlin Module Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodule Data Ġ= ĠBasic Kotlin Module ( component . to Single Module Identifier ()). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata . source Set Names By Variant Name . keys . forEach Ġ{ Ġvariant Name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragments . add ( Basic Kotlin Module Variant ( this @ apply , Ġvariant Name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġfragment ( source SetName : ĠString ): ĠBasic Kotlin Module Fragment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fragments . none Ġ{ Ġit . fragment Name Ġ== Ġsource SetName Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragments . add ( Basic Kotlin Module Fragment ( this @ apply , Ġsource SetName )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfragment ByName ( source SetName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata . source Set Names By Variant Name . forEach Ġ{ Ġ( variant Name , Ġsource Sets ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariant Ġ= Ġfragment ByName ( variant Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Sets . forEach Ġ{ Ġsource SetName Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariant . direct Ref ines Dependencies . add ( fragment ( source SetName )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata . source Set Module Dependencies . forEach Ġ{ Ġ( source SetName , Ġdependencies ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Ġ= Ġfragment ( source SetName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies . forEach Ġ{ Ġdependency Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . declared Module Dependencies . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Module Dependency ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaven Module Identifier ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependency . groupId . or Empty (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependency . module Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ/* ĠTODO Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata . source Sets Dep ends On Relation . forEach Ġ{ Ġ( depend ing , Ġdependencies ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdepending Fragment Ġ= Ġfragment ( depend ing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies . forEach Ġ{ Ġdependency Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdepending Fragment . direct Ref ines Dependencies . add ( fragment ( dependency )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠExternal Imported Kotlin Module ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Data , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Data . fragments . filter To ( mutable Set Of ()) Ġ{ Ġit . fragment Name Ġin Ġmetadata . host Specific Source Sets Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Module ( component : ĠResolved Component Result , Ġproject Structure Metadata : ĠKotlin Project Structure Metadata ): ĠKotlin Module Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodule Id Ġ= Ġcomponent . to Single Module Identifier () ĊĠĠĠĠĠĠĠ Ġreturn Ġmodules Cache . get Or Put ( module Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Module From Project Structure Metadata ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Structure Metadata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġdetect Modules ( targets : ĠIterable < Kotlin Target >, Ġsource Sets : ĠIterable < Kotlin Source Set >): ĠMap < String , ĠList < Kotlin Compilation <* >>> Ġ{ ĊĠĠĠ Ġ// ĠD SU - like Ġapproach : Ġall Ġcompil ations Ġand Ġsource Ġsets Ġthat Ġare Ġreachable Ġvia Ġdepends On Ġedges Ġare Ġconsidered Ġa Ġsingle Ġmodule ĊĊĠĠĠ Ġval Ġcompil ations Ġ= Ġtargets . flatMap Ġ{ Ġit . comp il ations Ġ} ĊĊĠĠĠ Ġval Ġds u Ġ= Ġmutable Map Of < Any , ĠAny >(). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġcompil ations . forEach Ġ{ Ġput ( it , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġsource Sets . forEach Ġ{ Ġput ( it , Ġit ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget ( item : ĠAny ): ĠAny Ġ= ĊĠĠĠĠĠĠĠ Ġds u . getValue ( item ). let Ġ{ Ġleader Ġ-> Ġif Ġ( leader Ġ=== Ġitem ) Ġleader Ġelse Ġget ( leader ). also Ġ{ Ġds u [ item ] Ġ= Ġit Ġ} Ġ} ĊĊĠĠĠ Ġfun Ġunion ( item : ĠAny , Ġother : ĠAny ) Ġ= Ġds u . put ( get ( item ), Ġget ( other )) ĊĊĠĠĠ Ġsource Sets . forEach Ġ{ Ġsource Set Ġ-> ĊĠĠĠĠĠĠĠ Ġsource Set . depends On . forEach Ġ{ Ġother Ġ-> Ġunion ( source Set , Ġother ) Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġcompil ations . forEach Ġ{ Ġcompilation Ġ-> ĊĠĠĠĠĠĠĠ Ġcompilation . kotlin Source Sets . forEach Ġ{ Ġunion ( compilation , Ġit ) Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġunique Compilation Names Counter Ġ= Ġmutable Map Of < Set < String >, ĠInt >() ĊĊĠĠĠ Ġfun ĠmoduleName ( comp il ations : ĠIterable < Kotlin Compilation <* >> ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnames Ġ= Ġcompil ations . map Ġ{ Ġit . name Ġ}. to Sorted Set () ĊĠĠĠĠĠĠĠ Ġval Ġunique Number Ġ= Ġunique Compilation Names Counter . put ( names , Ġunique Compilation Names Counter [ names ]?. plus ( 1 ) Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġnames . join ToString ("- ") Ġ+ Ġ( unique Number ?. let Ġ{ Ġ"- $ it " Ġ} Ġ?: Ġ"") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġcompil ations . groupBy Ġ{ Ġget ( it ) Ġ}. values . associate By Ġ{ ĠmoduleName ( it ) Ġ} Ċ } Ċ Ċ @ Suppress (" unused ") Ċ class ĠGradle Project Module Builder ( private Ġval Ġadd In ferred Source Set Visibility As Explicit : ĠBoolean ) Ġ{ ĊĠĠĠ Ġprivate Ġfun Ġget Modules From Pm 2 0 Project ( project : ĠProject ) Ġ= Ġproject . pm 2 0 Extension . modules . toList () ĊĊĠĠĠ Ġfun Ġbuild Modules From Project ( project : ĠProject ): ĠList < Kotlin Module > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( project . top Level Extension Ġis ĠKotlin Pm 2 0 Project Extension ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Modules From Pm 2 0 Project ( project ) ĊĊĠĠĠĠĠĠĠ Ġval Ġextension Ġ= Ġproject . multi platform Extension OrNull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġproject . kotlin Extension ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġval Ġtargets Ġ= Ġwhen Ġ( extension ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠKotlin Multi platform Extension Ġ-> Ġextension . targets . filter Ġ{ Ġit . name Ġ!= ĠKotlin Multi platform Plugin . METADATA _ TARGET _ NAME Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠKotlin Single Target Extension Ġ-> ĠlistOf ( extension . target ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmodule Compilation Cluster Ġ= Ġdetect Modules ( targets , Ġextension . source Sets ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpublished Variants By Compilation Ġ= Ġtargets . flatMap Ġ{ Ġtarget Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( target Ġas ? ĠAbstract Kotlin Target )?. kotlin Components . or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġcomponent Ġ-> Ġ( component Ġas ? ĠKotlin Variant )?. us ages . or Empty () Ġ} ĊĠĠĠĠĠĠĠ Ġ}. groupBy Ġ{ Ġit . compilation Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmodule By Fragment Ġ= Ġmutable Map Of < Kotlin Module Fragment , ĠKotlin Module >() ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmodule Compilation Cluster . entries . map Ġ{ Ġ( classifier , Ġcompil ations To Include ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Sets To Include Ġ= Ġcompil ations To Include . flatMap To ( mutable Set Of ()) Ġ{ Ġit . all Kotlin Source Sets Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodule Identifier Ġ= ĠLocal Module Identifier ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . current Build Id (). name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclassifier . take If Ġ{ Ġit Ġ!= ĠKotlin Compilation . MAIN _ COMPI L ATION _ NAME Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠBasic Kotlin Module ( module Identifier ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariant To Compilation Ġ= Ġmutable Map Of < Basic Kotlin Module Fragment , ĠKotlin Compilation <* >>() ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompil ations To Include . forEach Ġ{ Ġcompilation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠA Ġcompilation Ġmay Ġbe Ġexposed Ġas Ġmore Ġthan Ġone Ġvariant , Ġso Ġwe Ġcollect Ġall Ġof Ġits Ġnames ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariant Names Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublished Variants By Compilation [ compilation ]?. filter Ġ{ Ġit . include Into Project Structure Metadata Ġ} ?. map Ġ{ Ġit . name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠlistOf ( compilation . default Source SetName ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariant Names . forEach Ġ{ Ġvariant Name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariant Ġ= ĠBasic Kotlin Module Variant ( this @ apply , Ġvariant Name , ĠDefault Language Settings Builder ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule By Fragment [ variant ] Ġ= Ġthis @ apply ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariant To Compilation [ variant ] Ġ= Ġcompilation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragments . add ( variant ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO ĠThe Ġattributes Ġfrom Ġthe Ġcompile Ġdependencies Ġconfiguration Ġmight Ġdiffer Ġfrom Ġexposed Ġattributes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompile Dependencies Configuration Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . configurations . get ByName ( compilation . compile Dependency Configuration Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompile Dependencies Configuration . attributes . keySet (). forEach Ġ{ Ġkey Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariant . variant Attributes [ Kotlin Attribute Key ( key . name )] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute String ( compile Dependencies Configuration . attributes , Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOnce Ġall Ġfragments Ġare Ġcreated , Ġadd Ġdependencies Ġbetween Ġthem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Sets To Include . forEach Ġ{ Ġsource Set Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting Variant Ġ= Ġfragments . filter Is Instance < Basic Kotlin Module Variant >(). find Ġ{ Ġit . fragment Name Ġ== Ġsource Set . name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Ġ= Ġexisting Variant Ġ?: ĠBasic Kotlin Module Fragment ( this @ apply , Ġsource Set . name , Ġsource Set . language Settings ). also Ġ{ Ġfragments . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule By Fragment [ fragment ] Ġ= Ġthis @ apply ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . kotlin Source Roots Ġ= Ġsource Set . kotlin . source Directories . toList () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFIXME : ĠKotlin / Native Ġimplementation - effective - api Ġdependencies Ġare Ġmissing Ġhere . ĠIntro duce Ġdependency Ġscopes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequested Dependencies ( project , Ġsource Set , ĠlistOf ( Kotlin Dependency Scope . API _ SCOPE )). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodule Dependency Ġ= Ġit . to Module Dependency ( project ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . declared Module Dependencies . add ( module Dependency ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragments . forEach Ġ{ Ġfragment Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Set Ġ= Ġextension . source Sets . find ByName ( fragment . fragment Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġvariant To Compilation . getValue ( fragment ). default Source Set ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Set . depends On . forEach Ġ{ Ġdependency Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Fragment Ġ= Ġfragment ByName ( dependency . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . direct Ref ines Dependencies . add ( dependency Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġfragment ByName ( name : ĠString ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . as Sequence (). flatMap Ġ{ Ġit . fragments . as Sequence () Ġ}. first Ġ{ Ġit . fragment Name Ġ== Ġname Ġ} ĊĊĠĠĠĠĠĠĠ Ġtargets . flatMap Ġ{ Ġit . comp il ations Ġ}. forEach Ġ{ Ġcompilation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariant Ġ= Ġfragment ByName ( compilation . default Source SetName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompilation . associate With . forEach Ġ{ Ġassociate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġassociate Variant Ġ= Ġfragment ByName ( associate . default Source SetName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariant . declared Module Dependencies . add ( Kotlin Module Dependency ( associate Variant . containing Module . module Identifier )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( add In ferred Source Set Visibility As Explicit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject . kotlin Extension . source Sets . forEach Ġ{ Ġsource Set Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Ġ= Ġfragment ByName ( source Set . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Visible Source Sets From Associate Comp il ations ( project , Ġsource Set ). forEach Ġ{ Ġdependency Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Fragment Ġ= Ġfragment ByName ( dependency . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . declared Module Dependencies . add ( Kotlin Module Dependency ( dependency Fragment . containing Module . module Identifier )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T Ġ: ĠAny > Ġattribute String ( container : ĠAttribute Container , Ġattribute Key : ĠAttribute < T >): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġcontainer . getAttribute ( attribute Key ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNamed Ġ-> Ġvalue . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġvalue . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun ĠDependency . to Module Dependency ( ĊĠĠĠ Ġproject : ĠProject Ċ ): ĠKotlin Module Dependency Ġ{ ĊĠĠĠ Ġreturn ĠKotlin Module Dependency ( ĊĠĠĠĠĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠProject Dependency Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Module Identifier ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . current Build Id (). name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependency Project . path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Class ifiers From Capabilities ( requested Capabilities ). single () Ġ// ĠFIXME Ġmultiple Ġcapabilities ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠModule Dependency Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaven Module Identifier ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup . or Empty (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Class ifiers From Capabilities ( requested Capabilities ). single () Ġ// ĠFIXME Ġmultiple Ġcapabilities ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠMaven Module Identifier ( group . or Empty (), Ġname , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ċ } Ċ Ċ private Ġfun ĠBasic Kotlin Module . fragment ByName ( name : ĠString ) Ġ= ĊĠĠĠ Ġfragments . single Ġ{ Ġit . fragment Name Ġ== Ġname Ġ} Ċ Ċ class ĠC aching Module Variant Resolver ( private Ġval Ġactual Resolver : ĠModule Variant Resolver ) Ġ: ĠModule Variant Resolver Ġ{ ĊĠĠĠ Ġprivate Ġval Ġresult Cache By Request ing Variant : ĠMutable Map < Kotlin Module Variant , ĠMutable Map < Kotlin Module , ĠVariant Resolution >> Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġoverride Ġfun Ġget Ch osen Variant ( request ing Variant : ĠKotlin Module Variant , Ġdependency Module : ĠKotlin Module ): ĠVariant Resolution Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Cache Ġ= Ġresult Cache By Request ing Variant . get Or Put ( request ing Variant ) Ġ{ Ġmutable Map Of () Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult Cache . get Or Put ( dependency Module ) Ġ{ Ġactual Resolver . get Ch osen Variant ( request ing Variant , Ġdependency Module ) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠGradle Module Variant Resolver Ġ: ĠModule Variant Resolver Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget Ch osen Variant ( request ing Variant : ĠKotlin Module Variant , Ġdependency Module : ĠKotlin Module ): ĠVariant Resolution Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġmaybe Ġimprove Ġthis Ġbehavior ? ĠCurrently Ġit Ġcontr ad ict s Ġdependency Ġresolution Ġin Ġthat Ġit Ġmay Ġreturn Ġa Ġchosen Ġvariant Ġfor Ġan ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġun requested Ġdependency . ĠThis Ġworkaround Ġis Ġneeded Ġfor Ġsynthetic Ġmodules Ġwhich Ġwere Ġnot Ġproduced Ġfrom Ġmodule Ġmetadata , Ġso Ġmaybe ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġthose Ġmodules Ġshould Ġbe Ġmarked Ġsomehow ĊĠĠĠĠĠĠĠ Ġif Ġ( dependency Module Ġis ĠExternal Plain Kotlin Module ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠVariant Resolution . from Matching Variants ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequesting Variant , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependency Module , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( dependency Module . single Variant ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( request ing Variant Ġ! is ĠKotlin Gradle Variant ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠVariant Resolution . Unknown ( request ing Variant , Ġdependency Module ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmodule Ġ= Ġrequesting Variant . containing Module ĊĠĠĠĠĠĠĠ Ġval Ġproject Ġ= Ġmodule . project ĊĠĠĠĠĠĠĠ Ġval Ġresolved Variant Provider Ġ= ĠResolved M pp Variants Provider . get ( project ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġimplementation Ġcan Ġonly Ġresolve Ġvariants Ġfor Ġthe Ġcurrent Ġproject 's ĠKotlin Module ĊĠĠĠĠĠĠĠ Ġrequire ( module . re presents Project ( project )) ĊĊĠĠĠĠĠĠĠ Ġval Ġcompile Classpath Ġ= Ġget Compile Dependencies Configuration For Variant ( project , Ġrequesting Variant ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdependency Module Id Ġ= Ġdependency Module . module Identifier ĊĠĠĠĠĠĠĠ Ġ// ĠFIXME Ġcheck Ġcomposite Ġbuilds , Ġit 's Ġlikely Ġthat Ġresolved Variant Provider Ġfails Ġon Ġthem ? ĊĠĠĠĠĠĠĠ Ġval Ġresolved Gradle Variant Name Ġ= Ġresolved Variant Provider . get Resolved Variant Name ( dependency Module Id , Ġcompile Classpath ) ĊĠĠĠĠĠĠĠ Ġval Ġkotlin Variant Name Ġ= Ġwhen Ġ( dependency Module ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠKotlin Gradle Module Ġ-> Ġdependency Module . variants . single Ġ{ Ġresolved Gradle Variant Name Ġin Ġit . gradle Variant Names Ġ}. name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġresolved Gradle Variant Name ?. let (:: kotlin Variant Name From Published Variant Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Variant Ġ= Ġdependency Module . variants . single OrNull Ġ{ Ġit . fragment Name Ġ== Ġkotlin Variant Name Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( result Variant Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVariant Resolution . No Variant Match ( request ing Variant , Ġdependency Module ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVariant Resolution . Variant Match ( request ing Variant , Ġdependency Module , Ġresult Variant ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Compile Dependencies Configuration For Variant ( project : ĠProject , Ġrequesting Variant : ĠKotlin Module Variant ): ĠConfiguration Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( project . top Level Extension ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠKotlin Multi platform Extension , Ġis ĠKotlin Single Target Extension Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtargets Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . multi platform Extension OrNull ?. targets Ġ?: ĠlistOf (( project . kotlin Extension Ġas ĠKotlin Single Target Extension ). target ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompilation Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtargets . filter Is Instance < Abstract Kotlin Target >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . kotlin Components . filter Is Instance < Kotlin Variant >() Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . us ages Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġit . name Ġ== Ġrequesting Variant . fragment Name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . compilation ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġtargets . as Sequence (). flatMap Ġ{ Ġit . comp il ations . as Sequence () Ġ}. single Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . default Source SetName Ġ== Ġrequesting Variant . fragment Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ// ĠTODO : Ġgeneral ize Ġthe Ġmapping ĠPM 2 . 0 Ġ< -> ĠM PP ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġerror (" could Ġnot Ġfind Ġa Ġcompilation Ġthat Ġproduces Ġthe Ġvariant Ġ$ request ing Variant Ġin Ġ$ project ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . configurations . get ByName ( compilation . compile Dependency Configuration Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠKotlin Pm 2 0 Project Extension Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( request ing Variant Ġas ĠKotlin Gradle Variant ). compile Dependency Configuration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" could Ġnot Ġfind Ġthe Ġcompile Ġdependencies Ġconfiguration Ġfor Ġvariant Ġ$ request ing Variant ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġget For Current Build ( project : ĠProject ): ĠModule Variant Resolver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextra PropertyName Ġ= Ġ" org . jetbrains . kotlin . dependency Resolution . variant Resolver .${ project . get Kotlin Plugin Version () }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġproject . get Or Put Root Project Property ( extra PropertyName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC aching Module Variant Resolver ( Gradle Module Variant Resolver ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }