/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 1 Ġ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 . pm 2 0 Ċ Ċ import Ġorg . gradle . api . Named Domain Object Container Ċ import Ġorg . gradle . api . Named Domain Object Provider Ċ import Ġorg . gradle . api . Plugin Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . api . component . Software Component Factory Ċ import Ġorg . gradle . api . plugins . Java Base Plugin Ċ import Ġorg . gradle . api . publish . Publishing Extension Ċ import Ġorg . gradle . api . publish . maven . Maven Publication Ċ import Ġorg . gradle . tool ing . provider . model . Tool ing Model Builder Registry Ċ import Ġorg . gradle . util . Gradle Version Ċ import Ġorg . jetbrains . kotlin . gradle . dsl . Kotlin TopLevel Extension Ċ import Ġorg . jetbrains . kotlin . gradle . dsl . pm 2 0 Extension Ċ import Ġorg . jetbrains . kotlin . gradle . internal . customize Kotlin Dependencies Ċ import Ġorg . jetbrains . kotlin . gradle . k pm . idea . Ide a Kotlin Project Model Builder Ċ import Ġorg . jetbrains . kotlin . gradle . k pm . idea . default Ċ import Ġorg . jetbrains . kotlin . gradle . k pm . idea . locate Or Register Build Ide a Kotlin Project Model Task Ċ import Ġorg . jetbrains . kotlin . gradle . utils . check Gradle Compatibility Ċ import Ġjavax . inject . Inject Ċ Ċ abstract Ġclass ĠKotlin Pm 2 0 Gradle Plugin Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġ@ Inject Ġprivate Ġval Ġsoftware Component Factory : ĠSoftware Component Factory , ĊĠĠĠ Ġ@ Inject Ġprivate Ġval Ġtool ing Model Builder Registry : ĠTool ing Model Builder Registry Ċ ) Ġ: ĠPlugin < Project > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġapply ( project : ĠProject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Gradle Compatibility (" the ĠKotlin ĠMulti platform Ġplugin ", ĠGradle Version . version (" 6 . 1 ")) ĊĊĠĠĠĠĠĠĠ Ġ// ĠGradle Ġsets Ġup Ġthe Ġattribute Ġschema Ġfor Ġconsuming ĠJVM Ġdependencies Ġin Ġthe ĠJava Base Plugin ĊĠĠĠĠĠĠĠ Ġproject . plugins . apply ( Java Base Plugin :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġcreate Default Modules ( project ) ĊĠĠĠĠĠĠĠ Ġcustomize Kotlin Dependencies ( project ) ĊĠĠĠĠĠĠĠ Ġregister Default Variant Factories ( project ) ĊĠĠĠĠĠĠĠ Ġsetup Fragments Metadata For K pm Modules ( project ) ĊĠĠĠĠĠĠĠ Ġsetup K pm Modules Publication ( project ) ĊĠĠĠĠĠĠĠ Ġsetup Tool ing Model Builder ( project ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Default Modules ( project : ĠProject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġproject . pm 2 0 Extension . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodules . create ( Kotlin Gradle Module . MAIN _ MODULE _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodules . create ( Kotlin Gradle Module . TEST _ MODULE _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Ġ{ Ġmake Public () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Publication For Module ( module : ĠKotlin Gradle Module ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Ġ= Ġmodule . project ĊĊĠĠĠĠĠĠĠ Ġval Ġmetadata Elements Ġ= Ġproject . configurations . get ByName ( metadata Elements Configuration Name ( module )) ĊĠĠĠĠĠĠĠ Ġval Ġsource Elements Ġ= Ġproject . configurations . get ByName ( source Elements Configuration Name ( module )) ĊĊĠĠĠĠĠĠĠ Ġval Ġcomponent Name Ġ= Ġroot Publication Component Name ( module ) ĊĠĠĠĠĠĠĠ Ġval Ġroot Software Component Ġ= Ġsoftware Component Factory . ad hoc ( component Name ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject . components . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . add Variants From Configuration ( metadata Elements ) Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . add Variants From Configuration ( source Elements ) Ġ{ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmodule . if Made Public Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmetadata Dependency Configuration Ġ= Ġresol vable Metadata Configuration ( module ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject . plugin Manager . with Plugin (" maven - publish ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . extensions . getBy Type ( Publishing Extension :: class . java ). publications . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaven Publication :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġpublication Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublication . from ( root Software Component ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublication . version Mapping Ġ{ Ġversion Mapping Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion Mapping . all Variants Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . from Resolution Of ( metadata Dependency Configuration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Tool ing Model Builder ( project : ĠProject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtool ing Model Builder Registry . register ( project . pm 2 0 Extension . idea Kotlin Project Model Builder ) ĊĠĠĠĠĠĠĠ Ġproject . locate Or Register Build Ide a Kotlin Project Model Task () ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġroot Publication Component Name ( module : ĠKotlin Gradle Module ) Ġ= ĊĠĠĠ Ġmodule . dis amb igu ate Name (" root ") Ċ Ċ open Ġclass ĠKotlin Pm 2 0 Project Extension ( project : ĠProject ) Ġ: ĠKotlin TopLevel Extension ( project ) Ġ{ ĊĊĠĠĠ Ġinternal Ġval Ġk pm Model Container Ġ= ĠDefault K pm Gradle Project Model Container . create ( project ) ĊĊĠĠĠ Ġinternal Ġval Ġidea Kotlin Project Model Builder Ġby Ġlazy Ġ{ ĠIde a Kotlin Project Model Builder . default ( this ) Ġ} ĊĊĠĠĠ Ġval Ġmodules : ĠNamed Domain Object Container < Kotlin Gradle Module > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġproject . k pm Modules ĊĊĠĠĠ Ġ@ Suppress (" unused ") Ġ// ĠDSL Ġfunction ĊĠĠĠ Ġfun Ġmain And Test ( configure : ĠKotlin Gradle Module . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmain ( configure ) ĊĠĠĠĠĠĠĠ Ġtest ( configure ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġmain : ĠKotlin Gradle Module ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmodules . get ByName ( Kotlin Gradle Module . MAIN _ MODULE _ NAME ) ĊĊĠĠĠ Ġval Ġtest : ĠKotlin Gradle Module ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmodules . get ByName ( Kotlin Gradle Module . TEST _ MODULE _ NAME ) ĊĊĠĠĠ Ġfun Ġmain ( configure : ĠKotlin Gradle Module . () Ġ-> ĠUnit Ġ= Ġ{ Ġ}) Ġ= Ġmain . apply ( configure ) ĊĠĠĠ Ġfun Ġtest ( configure : ĠKotlin Gradle Module . () Ġ-> ĠUnit Ġ= Ġ{ Ġ}) Ġ= Ġtest . apply ( configure ) ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġ@ Jvm Name (" is Allow Common izer ") ĊĠĠĠ Ġinternal Ġfun Ġis Allow Common izer For Ide (@ Suppress (" UNUSED _ PARAMETER ") Ġproject : ĠProject ): ĠBoolean Ġ= Ġfalse Ċ } Ċ Ċ val ĠKotlin Gradle Module . jvm : ĠKotlin Jvm Variant ĊĠĠĠ Ġget () Ġ= Ġfragments . maybe Create (" jvm ", ĠKotlin Jvm Variant :: class . java ) Ċ Ċ fun ĠKotlin Gradle Module . jvm ( configure : ĠKotlin Jvm Variant . () Ġ-> ĠUnit ): ĠKotlin Jvm Variant Ġ= Ġj vm . apply ( configure ) Ċ Ċ fun ĠKotlin Pm 2 0 Project Extension . jvm ( configure : ĠKotlin Fragment Slice < Kotlin Jvm Variant >. () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġval Ġget OrCreate Variant : ĠKotlin Gradle Module . () Ġ-> ĠKotlin Jvm Variant Ġ= Ġ{ Ġj vm Ġ} ĊĠĠĠ Ġmain And Test Ġ{ Ġget OrCreate Variant ( this ) Ġ} ĊĠĠĠ Ġval Ġslice Ġ= ĠKotlin Fragment Slice ( this , Ġget OrCreate Variant ) ĊĠĠĠ Ġconfigure ( slice ) Ċ } Ċ Ċ open Ġclass ĠKotlin Fragment Slice < T Ġ: ĠKotlin Gradle Fragment >( ĊĠĠĠ Ġval Ġpm 2 0 Project Extension : ĠKotlin Pm 2 0 Project Extension , ĊĠĠĠ Ġval Ġget OrCreate Fragment : Ġ( Kotlin Gradle Module ) Ġ-> ĠT Ċ ) Ġ{ ĊĠĠĠ Ġfun Ġin Main ( configure : ĠT . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpm 2 0 Project Extension . modules . get ByName ( Kotlin Gradle Module . MAIN _ MODULE _ NAME ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget OrCreate Fragment ( this ). configure () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġin Test ( configure : ĠT . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpm 2 0 Project Extension . modules . get ByName ( Kotlin Gradle Module . TEST _ MODULE _ NAME ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget OrCreate Fragment ( this ). configure () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġin Main And Test ( configure : ĠT . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpm 2 0 Project Extension . main And Test Ġ{ Ġget OrCreate Fragment ( this ). configure () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġin All Modules ( configure : ĠT . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpm 2 0 Project Extension . modules . all Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget OrCreate Fragment ( it ). configure () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġin Module ( moduleName : ĠString , Ġconfigure : ĠT . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpm 2 0 Project Extension . modules . get ByName ( moduleName ). apply Ġ{ Ġget OrCreate Fragment ( this ). configure () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġin Module ( module : ĠNamed Domain Object Provider < Kotlin Gradle Module >, Ġconfigure : ĠT . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmodule . get (). apply Ġ{ Ġin Module ( this , Ġconfigure ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġin Module ( module : ĠKotlin Gradle Module , Ġconfigure : ĠT . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget OrCreate Fragment ( module ). configure () ĊĠĠĠ Ġ} Ċ } Ċ